packages feed

hwhile (empty) → 0.1.1.0

raw patch · 19 files changed

+4986/−0 lines, 19 filesdep +Cabaldep +arraydep +basesetup-changed

Dependencies added: Cabal, array, base, containers, filepath, haskeline, hwhile, mtl, repline

Files

+ LICENSE view
@@ -0,0 +1,674 @@+              GNU GENERAL PUBLIC LICENSE+                Version 3, 29 June 2007++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>+ Everyone is permitted to copy and distribute verbatim copies+ of this license document, but changing it is not allowed.++                     Preamble++  The GNU General Public License is a free, copyleft license for+software and other kinds of works.++  The licenses for most software and other practical works are designed+to take away your freedom to share and change the works.  By contrast,+the GNU General Public License is intended to guarantee your freedom to+share and change all versions of a program--to make sure it remains free+software for all its users.  We, the Free Software Foundation, use the+GNU General Public License for most of our software; it applies also to+any other work released this way by its authors.  You can apply it to+your programs, too.++  When we speak of free software, we are referring to freedom, not+price.  Our General Public Licenses are designed to make sure that you+have the freedom to distribute copies of free software (and charge for+them if you wish), 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 prevent others from denying you+these rights or asking you to surrender the rights.  Therefore, you have+certain responsibilities if you distribute copies of the software, or if+you modify it: responsibilities to respect the freedom of others.++  For example, if you distribute copies of such a program, whether+gratis or for a fee, you must pass on to the recipients the same+freedoms that you received.  You must make sure that they, too, receive+or can get the source code.  And you must show them these terms so they+know their rights.++  Developers that use the GNU GPL protect your rights with two steps:+(1) assert copyright on the software, and (2) offer you this License+giving you legal permission to copy, distribute and/or modify it.++  For the developers' and authors' protection, the GPL clearly explains+that there is no warranty for this free software.  For both users' and+authors' sake, the GPL requires that modified versions be marked as+changed, so that their problems will not be attributed erroneously to+authors of previous versions.++  Some devices are designed to deny users access to install or run+modified versions of the software inside them, although the manufacturer+can do so.  This is fundamentally incompatible with the aim of+protecting users' freedom to change the software.  The systematic+pattern of such abuse occurs in the area of products for individuals to+use, which is precisely where it is most unacceptable.  Therefore, we+have designed this version of the GPL to prohibit the practice for those+products.  If such problems arise substantially in other domains, we+stand ready to extend this provision to those domains in future versions+of the GPL, as needed to protect the freedom of users.++  Finally, every program is threatened constantly by software patents.+States should not allow patents to restrict development and use of+software on general-purpose computers, but in those that do, we wish to+avoid the special danger that patents applied to a free program could+make it effectively proprietary.  To prevent this, the GPL assures that+patents cannot be used to render the program non-free.++  The precise terms and conditions for copying, distribution and+modification follow.++                TERMS AND CONDITIONS++  0. Definitions.++  "This License" refers to version 3 of the GNU General Public License.++  "Copyright" also means copyright-like laws that apply to other kinds of+works, such as semiconductor masks.++  "The Program" refers to any copyrightable work licensed under this+License.  Each licensee is addressed as "you".  "Licensees" and+"recipients" may be individuals or organizations.++  To "modify" a work means to copy from or adapt all or part of the work+in a fashion requiring copyright permission, other than the making of an+exact copy.  The resulting work is called a "modified version" of the+earlier work or a work "based on" the earlier work.++  A "covered work" means either the unmodified Program or a work based+on the Program.++  To "propagate" a work means to do anything with it that, without+permission, would make you directly or secondarily liable for+infringement under applicable copyright law, except executing it on a+computer or modifying a private copy.  Propagation includes copying,+distribution (with or without modification), making available to the+public, and in some countries other activities as well.++  To "convey" a work means any kind of propagation that enables other+parties to make or receive copies.  Mere interaction with a user through+a computer network, with no transfer of a copy, is not conveying.++  An interactive user interface displays "Appropriate Legal Notices"+to the extent that it includes a convenient and prominently visible+feature that (1) displays an appropriate copyright notice, and (2)+tells the user that there is no warranty for the work (except to the+extent that warranties are provided), that licensees may convey the+work under this License, and how to view a copy of this License.  If+the interface presents a list of user commands or options, such as a+menu, a prominent item in the list meets this criterion.++  1. Source Code.++  The "source code" for a work means the preferred form of the work+for making modifications to it.  "Object code" means any non-source+form of a work.++  A "Standard Interface" means an interface that either is an official+standard defined by a recognized standards body, or, in the case of+interfaces specified for a particular programming language, one that+is widely used among developers working in that language.++  The "System Libraries" of an executable work include anything, other+than the work as a whole, that (a) is included in the normal form of+packaging a Major Component, but which is not part of that Major+Component, and (b) serves only to enable use of the work with that+Major Component, or to implement a Standard Interface for which an+implementation is available to the public in source code form.  A+"Major Component", in this context, means a major essential component+(kernel, window system, and so on) of the specific operating system+(if any) on which the executable work runs, or a compiler used to+produce the work, or an object code interpreter used to run it.++  The "Corresponding Source" for a work in object code form means all+the source code needed to generate, install, and (for an executable+work) run the object code and to modify the work, including scripts to+control those activities.  However, it does not include the work's+System Libraries, or general-purpose tools or generally available free+programs which are used unmodified in performing those activities but+which are not part of the work.  For example, Corresponding Source+includes interface definition files associated with source files for+the work, and the source code for shared libraries and dynamically+linked subprograms that the work is specifically designed to require,+such as by intimate data communication or control flow between those+subprograms and other parts of the work.++  The Corresponding Source need not include anything that users+can regenerate automatically from other parts of the Corresponding+Source.++  The Corresponding Source for a work in source code form is that+same work.++  2. Basic Permissions.++  All rights granted under this License are granted for the term of+copyright on the Program, and are irrevocable provided the stated+conditions are met.  This License explicitly affirms your unlimited+permission to run the unmodified Program.  The output from running a+covered work is covered by this License only if the output, given its+content, constitutes a covered work.  This License acknowledges your+rights of fair use or other equivalent, as provided by copyright law.++  You may make, run and propagate covered works that you do not+convey, without conditions so long as your license otherwise remains+in force.  You may convey covered works to others for the sole purpose+of having them make modifications exclusively for you, or provide you+with facilities for running those works, provided that you comply with+the terms of this License in conveying all material for which you do+not control copyright.  Those thus making or running the covered works+for you must do so exclusively on your behalf, under your direction+and control, on terms that prohibit them from making any copies of+your copyrighted material outside their relationship with you.++  Conveying under any other circumstances is permitted solely under+the conditions stated below.  Sublicensing is not allowed; section 10+makes it unnecessary.++  3. Protecting Users' Legal Rights From Anti-Circumvention Law.++  No covered work shall be deemed part of an effective technological+measure under any applicable law fulfilling obligations under article+11 of the WIPO copyright treaty adopted on 20 December 1996, or+similar laws prohibiting or restricting circumvention of such+measures.++  When you convey a covered work, you waive any legal power to forbid+circumvention of technological measures to the extent such circumvention+is effected by exercising rights under this License with respect to+the covered work, and you disclaim any intention to limit operation or+modification of the work as a means of enforcing, against the work's+users, your or third parties' legal rights to forbid circumvention of+technological measures.++  4. Conveying Verbatim Copies.++  You may convey 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;+keep intact all notices stating that this License and any+non-permissive terms added in accord with section 7 apply to the code;+keep intact all notices of the absence of any warranty; and give all+recipients a copy of this License along with the Program.++  You may charge any price or no price for each copy that you convey,+and you may offer support or warranty protection for a fee.++  5. Conveying Modified Source Versions.++  You may convey a work based on the Program, or the modifications to+produce it from the Program, in the form of source code under the+terms of section 4, provided that you also meet all of these conditions:++    a) The work must carry prominent notices stating that you modified+    it, and giving a relevant date.++    b) The work must carry prominent notices stating that it is+    released under this License and any conditions added under section+    7.  This requirement modifies the requirement in section 4 to+    "keep intact all notices".++    c) You must license the entire work, as a whole, under this+    License to anyone who comes into possession of a copy.  This+    License will therefore apply, along with any applicable section 7+    additional terms, to the whole of the work, and all its parts,+    regardless of how they are packaged.  This License gives no+    permission to license the work in any other way, but it does not+    invalidate such permission if you have separately received it.++    d) If the work has interactive user interfaces, each must display+    Appropriate Legal Notices; however, if the Program has interactive+    interfaces that do not display Appropriate Legal Notices, your+    work need not make them do so.++  A compilation of a covered work with other separate and independent+works, which are not by their nature extensions of the covered work,+and which are not combined with it such as to form a larger program,+in or on a volume of a storage or distribution medium, is called an+"aggregate" if the compilation and its resulting copyright are not+used to limit the access or legal rights of the compilation's users+beyond what the individual works permit.  Inclusion of a covered work+in an aggregate does not cause this License to apply to the other+parts of the aggregate.++  6. Conveying Non-Source Forms.++  You may convey a covered work in object code form under the terms+of sections 4 and 5, provided that you also convey the+machine-readable Corresponding Source under the terms of this License,+in one of these ways:++    a) Convey the object code in, or embodied in, a physical product+    (including a physical distribution medium), accompanied by the+    Corresponding Source fixed on a durable physical medium+    customarily used for software interchange.++    b) Convey the object code in, or embodied in, a physical product+    (including a physical distribution medium), accompanied by a+    written offer, valid for at least three years and valid for as+    long as you offer spare parts or customer support for that product+    model, to give anyone who possesses the object code either (1) a+    copy of the Corresponding Source for all the software in the+    product that is covered by this License, on a durable physical+    medium customarily used for software interchange, for a price no+    more than your reasonable cost of physically performing this+    conveying of source, or (2) access to copy the+    Corresponding Source from a network server at no charge.++    c) Convey individual copies of the object code with a copy of the+    written offer to provide the Corresponding Source.  This+    alternative is allowed only occasionally and noncommercially, and+    only if you received the object code with such an offer, in accord+    with subsection 6b.++    d) Convey the object code by offering access from a designated+    place (gratis or for a charge), and offer equivalent access to the+    Corresponding Source in the same way through the same place at no+    further charge.  You need not require recipients to copy the+    Corresponding Source along with the object code.  If the place to+    copy the object code is a network server, the Corresponding Source+    may be on a different server (operated by you or a third party)+    that supports equivalent copying facilities, provided you maintain+    clear directions next to the object code saying where to find the+    Corresponding Source.  Regardless of what server hosts the+    Corresponding Source, you remain obligated to ensure that it is+    available for as long as needed to satisfy these requirements.++    e) Convey the object code using peer-to-peer transmission, provided+    you inform other peers where the object code and Corresponding+    Source of the work are being offered to the general public at no+    charge under subsection 6d.++  A separable portion of the object code, whose source code is excluded+from the Corresponding Source as a System Library, need not be+included in conveying the object code work.++  A "User Product" is either (1) a "consumer product", which means any+tangible personal property which is normally used for personal, family,+or household purposes, or (2) anything designed or sold for incorporation+into a dwelling.  In determining whether a product is a consumer product,+doubtful cases shall be resolved in favor of coverage.  For a particular+product received by a particular user, "normally used" refers to a+typical or common use of that class of product, regardless of the status+of the particular user or of the way in which the particular user+actually uses, or expects or is expected to use, the product.  A product+is a consumer product regardless of whether the product has substantial+commercial, industrial or non-consumer uses, unless such uses represent+the only significant mode of use of the product.++  "Installation Information" for a User Product means any methods,+procedures, authorization keys, or other information required to install+and execute modified versions of a covered work in that User Product from+a modified version of its Corresponding Source.  The information must+suffice to ensure that the continued functioning of the modified object+code is in no case prevented or interfered with solely because+modification has been made.++  If you convey an object code work under this section in, or with, or+specifically for use in, a User Product, and the conveying occurs as+part of a transaction in which the right of possession and use of the+User Product is transferred to the recipient in perpetuity or for a+fixed term (regardless of how the transaction is characterized), the+Corresponding Source conveyed under this section must be accompanied+by the Installation Information.  But this requirement does not apply+if neither you nor any third party retains the ability to install+modified object code on the User Product (for example, the work has+been installed in ROM).++  The requirement to provide Installation Information does not include a+requirement to continue to provide support service, warranty, or updates+for a work that has been modified or installed by the recipient, or for+the User Product in which it has been modified or installed.  Access to a+network may be denied when the modification itself materially and+adversely affects the operation of the network or violates the rules and+protocols for communication across the network.++  Corresponding Source conveyed, and Installation Information provided,+in accord with this section must be in a format that is publicly+documented (and with an implementation available to the public in+source code form), and must require no special password or key for+unpacking, reading or copying.++  7. Additional Terms.++  "Additional permissions" are terms that supplement the terms of this+License by making exceptions from one or more of its conditions.+Additional permissions that are applicable to the entire Program shall+be treated as though they were included in this License, to the extent+that they are valid under applicable law.  If additional permissions+apply only to part of the Program, that part may be used separately+under those permissions, but the entire Program remains governed by+this License without regard to the additional permissions.++  When you convey a copy of a covered work, you may at your option+remove any additional permissions from that copy, or from any part of+it.  (Additional permissions may be written to require their own+removal in certain cases when you modify the work.)  You may place+additional permissions on material, added by you to a covered work,+for which you have or can give appropriate copyright permission.++  Notwithstanding any other provision of this License, for material you+add to a covered work, you may (if authorized by the copyright holders of+that material) supplement the terms of this License with terms:++    a) Disclaiming warranty or limiting liability differently from the+    terms of sections 15 and 16 of this License; or++    b) Requiring preservation of specified reasonable legal notices or+    author attributions in that material or in the Appropriate Legal+    Notices displayed by works containing it; or++    c) Prohibiting misrepresentation of the origin of that material, or+    requiring that modified versions of such material be marked in+    reasonable ways as different from the original version; or++    d) Limiting the use for publicity purposes of names of licensors or+    authors of the material; or++    e) Declining to grant rights under trademark law for use of some+    trade names, trademarks, or service marks; or++    f) Requiring indemnification of licensors and authors of that+    material by anyone who conveys the material (or modified versions of+    it) with contractual assumptions of liability to the recipient, for+    any liability that these contractual assumptions directly impose on+    those licensors and authors.++  All other non-permissive additional terms are considered "further+restrictions" within the meaning of section 10.  If the Program as you+received it, or any part of it, contains a notice stating that it is+governed by this License along with a term that is a further+restriction, you may remove that term.  If a license document contains+a further restriction but permits relicensing or conveying under this+License, you may add to a covered work material governed by the terms+of that license document, provided that the further restriction does+not survive such relicensing or conveying.++  If you add terms to a covered work in accord with this section, you+must place, in the relevant source files, a statement of the+additional terms that apply to those files, or a notice indicating+where to find the applicable terms.++  Additional terms, permissive or non-permissive, may be stated in the+form of a separately written license, or stated as exceptions;+the above requirements apply either way.++  8. Termination.++  You may not propagate or modify a covered work except as expressly+provided under this License.  Any attempt otherwise to propagate or+modify it is void, and will automatically terminate your rights under+this License (including any patent licenses granted under the third+paragraph of section 11).++  However, if you cease all violation of this License, then your+license from a particular copyright holder is reinstated (a)+provisionally, unless and until the copyright holder explicitly and+finally terminates your license, and (b) permanently, if the copyright+holder fails to notify you of the violation by some reasonable means+prior to 60 days after the cessation.++  Moreover, your license from a particular copyright holder is+reinstated permanently if the copyright holder notifies you of the+violation by some reasonable means, this is the first time you have+received notice of violation of this License (for any work) from that+copyright holder, and you cure the violation prior to 30 days after+your receipt of the notice.++  Termination of your rights under this section does not terminate the+licenses of parties who have received copies or rights from you under+this License.  If your rights have been terminated and not permanently+reinstated, you do not qualify to receive new licenses for the same+material under section 10.++  9. Acceptance Not Required for Having Copies.++  You are not required to accept this License in order to receive or+run a copy of the Program.  Ancillary propagation of a covered work+occurring solely as a consequence of using peer-to-peer transmission+to receive a copy likewise does not require acceptance.  However,+nothing other than this License grants you permission to propagate or+modify any covered work.  These actions infringe copyright if you do+not accept this License.  Therefore, by modifying or propagating a+covered work, you indicate your acceptance of this License to do so.++  10. Automatic Licensing of Downstream Recipients.++  Each time you convey a covered work, the recipient automatically+receives a license from the original licensors, to run, modify and+propagate that work, subject to this License.  You are not responsible+for enforcing compliance by third parties with this License.++  An "entity transaction" is a transaction transferring control of an+organization, or substantially all assets of one, or subdividing an+organization, or merging organizations.  If propagation of a covered+work results from an entity transaction, each party to that+transaction who receives a copy of the work also receives whatever+licenses to the work the party's predecessor in interest had or could+give under the previous paragraph, plus a right to possession of the+Corresponding Source of the work from the predecessor in interest, if+the predecessor has it or can get it with reasonable efforts.++  You may not impose any further restrictions on the exercise of the+rights granted or affirmed under this License.  For example, you may+not impose a license fee, royalty, or other charge for exercise of+rights granted under this License, and you may not initiate litigation+(including a cross-claim or counterclaim in a lawsuit) alleging that+any patent claim is infringed by making, using, selling, offering for+sale, or importing the Program or any portion of it.++  11. Patents.++  A "contributor" is a copyright holder who authorizes use under this+License of the Program or a work on which the Program is based.  The+work thus licensed is called the contributor's "contributor version".++  A contributor's "essential patent claims" are all patent claims+owned or controlled by the contributor, whether already acquired or+hereafter acquired, that would be infringed by some manner, permitted+by this License, of making, using, or selling its contributor version,+but do not include claims that would be infringed only as a+consequence of further modification of the contributor version.  For+purposes of this definition, "control" includes the right to grant+patent sublicenses in a manner consistent with the requirements of+this License.++  Each contributor grants you a non-exclusive, worldwide, royalty-free+patent license under the contributor's essential patent claims, to+make, use, sell, offer for sale, import and otherwise run, modify and+propagate the contents of its contributor version.++  In the following three paragraphs, a "patent license" is any express+agreement or commitment, however denominated, not to enforce a patent+(such as an express permission to practice a patent or covenant not to+sue for patent infringement).  To "grant" such a patent license to a+party means to make such an agreement or commitment not to enforce a+patent against the party.++  If you convey a covered work, knowingly relying on a patent license,+and the Corresponding Source of the work is not available for anyone+to copy, free of charge and under the terms of this License, through a+publicly available network server or other readily accessible means,+then you must either (1) cause the Corresponding Source to be so+available, or (2) arrange to deprive yourself of the benefit of the+patent license for this particular work, or (3) arrange, in a manner+consistent with the requirements of this License, to extend the patent+license to downstream recipients.  "Knowingly relying" means you have+actual knowledge that, but for the patent license, your conveying the+covered work in a country, or your recipient's use of the covered work+in a country, would infringe one or more identifiable patents in that+country that you have reason to believe are valid.++  If, pursuant to or in connection with a single transaction or+arrangement, you convey, or propagate by procuring conveyance of, a+covered work, and grant a patent license to some of the parties+receiving the covered work authorizing them to use, propagate, modify+or convey a specific copy of the covered work, then the patent license+you grant is automatically extended to all recipients of the covered+work and works based on it.++  A patent license is "discriminatory" if it does not include within+the scope of its coverage, prohibits the exercise of, or is+conditioned on the non-exercise of one or more of the rights that are+specifically granted under this License.  You may not convey a covered+work if you are a party to an arrangement with a third party that is+in the business of distributing software, under which you make payment+to the third party based on the extent of your activity of conveying+the work, and under which the third party grants, to any of the+parties who would receive the covered work from you, a discriminatory+patent license (a) in connection with copies of the covered work+conveyed by you (or copies made from those copies), or (b) primarily+for and in connection with specific products or compilations that+contain the covered work, unless you entered into that arrangement,+or that patent license was granted, prior to 28 March 2007.++  Nothing in this License shall be construed as excluding or limiting+any implied license or other defenses to infringement that may+otherwise be available to you under applicable patent law.++  12. No Surrender of Others' Freedom.++  If conditions are imposed on you (whether by court order, agreement or+otherwise) that contradict the conditions of this License, they do not+excuse you from the conditions of this License.  If you cannot convey a+covered work so as to satisfy simultaneously your obligations under this+License and any other pertinent obligations, then as a consequence you may+not convey it at all.  For example, if you agree to terms that obligate you+to collect a royalty for further conveying from those to whom you convey+the Program, the only way you could satisfy both those terms and this+License would be to refrain entirely from conveying the Program.++  13. Use with the GNU Affero General Public License.++  Notwithstanding any other provision of this License, you have+permission to link or combine any covered work with a work licensed+under version 3 of the GNU Affero General Public License into a single+combined work, and to convey the resulting work.  The terms of this+License will continue to apply to the part which is the covered work,+but the special requirements of the GNU Affero General Public License,+section 13, concerning interaction through a network will apply to the+combination as such.++  14. Revised Versions of this License.++  The Free Software Foundation may publish revised and/or new versions of+the GNU 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 that a certain numbered version of the GNU General+Public License "or any later version" applies to it, you have the+option of following the terms and conditions either of that numbered+version or of any later version published by the Free Software+Foundation.  If the Program does not specify a version number of the+GNU General Public License, you may choose any version ever published+by the Free Software Foundation.++  If the Program specifies that a proxy can decide which future+versions of the GNU General Public License can be used, that proxy's+public statement of acceptance of a version permanently authorizes you+to choose that version for the Program.++  Later license versions may give you additional or different+permissions.  However, no additional obligations are imposed on any+author or copyright holder as a result of your choosing to follow a+later version.++  15. Disclaimer of Warranty.++  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.++  16. Limitation of Liability.++  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS+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.++  17. Interpretation of Sections 15 and 16.++  If the disclaimer of warranty and limitation of liability provided+above cannot be given local legal effect according to their terms,+reviewing courts shall apply local law that most closely approximates+an absolute waiver of all civil liability in connection with the+Program, unless a warranty or assumption of liability accompanies a+copy of the Program in return for a fee.++              END OF TERMS AND CONDITIONS++     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 the public, 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+state the exclusion of warranty; and each file should have at least+the "copyright" line and a pointer to where the full notice is found.++    <one line to give the program's name and a brief idea of what it does.>+    Copyright (C) <year>  <name of author>++    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 3 of the License, 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, see <http://www.gnu.org/licenses/>.++Also add information on how to contact you by electronic and paper mail.++  If the program does terminal interaction, make it output a short+notice like this when it starts in an interactive mode:++    <program>  Copyright (C) <year>  <name of author>+    This program 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, your program's commands+might be different; for a GUI interface, you would use an "about box".++  You should also get your employer (if you work as a programmer) or school,+if any, to sign a "copyright disclaimer" for the program, if necessary.+For more information on this, and how to apply and follow the GNU GPL, see+<http://www.gnu.org/licenses/>.++  The GNU General Public License does not permit incorporating your program+into proprietary programs.  If your program is a subroutine library, you+may consider it more useful to permit linking proprietary applications with+the library.  If this is what you want to do, use the GNU Lesser General+Public License instead of this License.  But first, please read+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+ README.md view
@@ -0,0 +1,139 @@+## HWhile+HWhile is an interpreter for a simple While language originally used by Neil+Jones in his book “Computability and Complexity". The While language is a simple+imperative programming language with while-loops, assignment and conditionals.+It has a single data type: binary trees. The HWhile interpreter is written in+Haskell.++This current implementation also includes syntactic sugar such as switch+statements, macros, list notation, equality, and natural number literals. It+therefore supports (almost fully) the version of While used in Bernhard Reus’+textbook [Limits of Computation - From a Programming Perspective](http:limits.bernhardreus.com)+and has been developed in co-operation with Bernhard to support students on the+corresponding module at Sussex University.+This version also allows one to translate while programs into programs as data.+For this to work,  all the syntax sugar (extensions) of a While program has to+be removed again.++More about the syntax and the semantics (and usage) of the While language can be+found in Bernhard’s textbook (Chapter 3-5).++### Syntax+The grammar below gives exactly the concrete syntax of this implementation:++    PROG  ::= ID read ID BLOCK write ID+    +    BLOCK ::= { CMDS }+            | {}++    CMDS  ::= CMD ; CMD+            | CMD++    CMD   ::= ID := EXP                     // Assignment+            | while EXP BLOCK               // While loops+            | if EXP BLOCK else BLOCK       // If-then-else statements+            | if EXP BLOCK                  // If-then statements+            | ID := <ID> EXP                // Macro calls+            | switch EXP { CASES            // Switch statements++    CASES ::= case EXP : CMDS CASES+            | default : CMDS }+            | }++    EXP   ::= LIT+            | cons EXP EXP+            | hd EXP+            | tl EXP+            | (EXP)+            | EXP = EXP+            | ID+            | []+            | [ EXP LIST++    LIST  ::= , EXP LIST+            | ]+          +    LIT   ::= nil+            | true+            | false+            | <LIT.LIT>+            | NAT+            | @asgn+            | @:=+            | @doAsgn+            | @while+            | @doWhile+            | @if+            | @doIf+            | @var+            | @quote+            | @hd+            | @doHd+            | @tl+            | @doTl+            | @cons+            | @doCons+          +    NAT   ::= 0|[1-9][0-9]++          +    ID    ::= [a-zA-Z_'][a-zA-Z0-9_']*++Command line input must conform to the following grammar:++    INP    ::= nil+            | true+            | false+            | <LIT.LIT>+            | NAT+            | []+            | [ INP INPLST+            | @asgn+            | @:=+            | @doAsgn+            | @while+            | @doWhile+            | @if+            | @doIf+            | @var+            | @quote+            | @hd+            | @doHd+            | @tl+            | @doTl+            | @cons+            | @doCons++    INPLST ::= , INP INPLST+            | ]++### Instructions++#### Installing Prerequisites+All the tools required to compile and run HWhile are included in the +[Haskell Platform](http://www.haskell.org/platform/).++Note that you may need to add the Haskell Platform's binaries to your system's+path variable.++#### Installing HWhile+Once the Haskell Platform is installed and configured correctly, you can install+HWhile by running:++    stack install hwhile++This will download HWhile and its depenencies (if necessary) and compile and+install them.++#### Invocation+If installed correctly, HWhile can be run with the command:++    hwhile <FLAG> <FILE> <EXPR>        ( Mac & Linux )+    hwhile.exe <FLAG> <FILE> <EXPR>    ( Windows     )++For example:++    hwhile -i examples/count.while "[1, 2, 3]"         ( Mac & Linux )+    hwhile.exe -i examples/count.while "[1, 2, 3]"     ( Windows     )++This example takes a list of numbers as its argument and outputs their sum, so+you should see `6` as the output.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ dist/build/Lexer.hs view
@@ -0,0 +1,937 @@+{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}+{-# LANGUAGE CPP,MagicHash #-}+{-# LINE 1 "src/lib/Lexer.x" #-}++module Lexer+    ( Token (..)+    , TokenType (..)+    , tkLineNo+    , tkCharNo+    , tkPath+    , tkVarName+    , scan+    , prettyPrintToken+    ) where++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Array.Base (unsafeAt)+#else+import Array+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+{-# LINE 1 "templates/wrappers.hs" #-}+{-# LINE 1 "templates/wrappers.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 9 "<command-line>" #-}+# 1 "/usr/include/stdc-predef.h" 1 3 4++# 17 "/usr/include/stdc-predef.h" 3 4++++++++++++++++++++++++++++++++++++++++++++{-# LINE 9 "<command-line>" #-}+{-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}++++++++++++++++++{-# LINE 9 "<command-line>" #-}+{-# LINE 1 "templates/wrappers.hs" #-}+-- -----------------------------------------------------------------------------+-- Alex wrapper code.+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.+++++++import Data.Word (Word8)+{-# LINE 28 "templates/wrappers.hs" #-}++import Data.Char (ord)+import qualified Data.Bits++-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.+utf8Encode :: Char -> [Word8]+utf8Encode = map fromIntegral . go . ord+ where+  go oc+   | oc <= 0x7f       = [oc]++   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]++   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]+   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)+                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]++++type Byte = Word8++-- -----------------------------------------------------------------------------+-- The input type+++type AlexInput = (AlexPosn,     -- current position,+                  Char,         -- previous char+                  [Byte],       -- pending bytes on current char+                  String)       -- current input string++ignorePendingBytes :: AlexInput -> AlexInput+ignorePendingBytes (p,c,_ps,s) = (p,c,[],s)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar (_p,c,_bs,_s) = c++alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)+alexGetByte (p,c,(b:bs),s) = Just (b,(p,c,bs,s))+alexGetByte (_,_,[],[]) = Nothing+alexGetByte (p,_,[],(c:s))  = let p' = alexMove p c+                                  (b:bs) = utf8Encode c+                              in p' `seq`  Just (b, (p', c, bs, s))+++{-# LINE 102 "templates/wrappers.hs" #-}++{-# LINE 120 "templates/wrappers.hs" #-}++{-# LINE 138 "templates/wrappers.hs" #-}++-- -----------------------------------------------------------------------------+-- Token positions++-- `Posn' records the location of a token in the input text.  It has three+-- fields: the address (number of chacaters preceding the token), line number+-- and column of a token within the file. `start_pos' gives the position of the+-- start of the file and `eof_pos' a standard encoding for the end of file.+-- `move_pos' calculates the new position after traversing a given character,+-- assuming the usual eight character tab stops.+++data AlexPosn = AlexPn !Int !Int !Int+        deriving (Eq,Show)++alexStartPos :: AlexPosn+alexStartPos = AlexPn 0 1 1++alexMove :: AlexPosn -> Char -> AlexPosn+alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+alex_tab_size-1) `div` alex_tab_size)*alex_tab_size+1)+alexMove (AlexPn a l _) '\n' = AlexPn (a+1) (l+1)   1+alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)+++-- -----------------------------------------------------------------------------+-- Default monad++{-# LINE 274 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Monad (with ByteString input)++{-# LINE 379 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Basic wrapper++{-# LINE 406 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Basic wrapper, ByteString version++{-# LINE 425 "templates/wrappers.hs" #-}++{-# LINE 440 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Posn wrapper++-- Adds text positions to the basic model.+++--alexScanTokens :: String -> [token]+alexScanTokens str0 = go (alexStartPos,'\n',[],str0)+  where go inp__@(pos,_,_,str) =+          case alexScan inp__ 0 of+                AlexEOF -> []+                AlexError ((AlexPn _ line column),_,_,_) -> error $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)+                AlexSkip  inp__' _ln     -> go inp__'+                AlexToken inp__' len act -> act pos (take len str) : go inp__'++++-- -----------------------------------------------------------------------------+-- Posn wrapper, ByteString version++{-# LINE 473 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- GScan wrapper++-- For compatibility with previous versions of Alex, and because we can.++alex_tab_size :: Int+alex_tab_size = 8+alex_base :: AlexAddr+alex_base = AlexA#+  "\x01\x00\x00\x00\x76\x00\x00\x00\x44\x00\x00\x00\x1d\x00\x00\x00\x1e\x00\x00\x00\x1f\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00\x4a\x00\x00\x00\x28\x00\x00\x00\xf6\x00\x00\x00\x76\x01\x00\x00\x17\x00\x00\x00\x19\x00\x00\x00\x25\x00\x00\x00\x26\x00\x00\x00\x22\x00\x00\x00\x27\x00\x00\x00\x29\x00\x00\x00\x2a\x00\x00\x00\xf6\x01\x00\x00\x76\x02\x00\x00\xf6\x02\x00\x00\x1b\x00\x00\x00\x67\x03\x00\x00\x00\x00\x00\x00\xe7\x03\x00\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x28\x04\x00\x00\x00\x00\x00\x00\x99\x04\x00\x00\x00\x00\x00\x00\x0a\x05\x00\x00\x0a\x06\x00\x00\xca\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x06\x00\x00\x00\x00\x00\x00\x4c\x06\x00\x00\x2e\x00\x00\x00\x2f\x00\x00\x00\x23\x00\x00\x00\x36\x00\x00\x00\x37\x00\x00\x00\x22\x07\x00\x00\x22\x08\x00\x00\x8d\x06\x00\x00\x00\x00\x00\x00\xa2\x08\x00\x00\x62\x08\x00\x00\x00\x00\x00\x00\x38\x00\x00\x00\x39\x00\x00\x00\x42\x00\x00\x00\x43\x00\x00\x00\x3a\x00\x00\x00\x34\x00\x00\x00\x35\x00\x00\x00\x3b\x00\x00\x00\x3c\x00\x00\x00\x58\x09\x00\x00\x5a\x09\x00\x00\x00\x00\x00\x00\x2e\x0a\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x4b\x09\x00\x00\x00\x00\x00\x00\x0a\x0b\x00\x00\x61\x0b\x00\x00\xb8\x0b\x00\x00\x0f\x0c\x00\x00\x66\x0c\x00\x00\xbd\x0c\x00\x00\x14\x0d\x00\x00\x6b\x0d\x00\x00\xc2\x0d\x00\x00\x19\x0e\x00\x00\x70\x0e\x00\x00\xc7\x0e\x00\x00\x1e\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x0f\x00\x00\xcc\x0f\x00\x00\x23\x10\x00\x00\x7a\x10\x00\x00\xd1\x10\x00\x00\x28\x11\x00\x00\x7f\x11\x00\x00\xd6\x11\x00\x00\x2d\x12\x00\x00\x84\x12\x00\x00\xdb\x12\x00\x00\x32\x13\x00\x00\x89\x13\x00\x00\xe0\x13\x00\x00\x37\x14\x00\x00\x8e\x14\x00\x00\xe5\x14\x00\x00\x3c\x15\x00\x00\x93\x15\x00\x00\xea\x15\x00\x00\x41\x16\x00\x00\x98\x16\x00\x00\xef\x16\x00\x00\x46\x17\x00\x00\x9d\x17\x00\x00\xf4\x17\x00\x00\x4b\x18\x00\x00\xa2\x18\x00\x00\xf9\x18\x00\x00\x50\x19\x00\x00\xa7\x19\x00\x00\xfe\x19\x00\x00\x55\x1a\x00\x00\xac\x1a\x00\x00\x03\x1b\x00\x00\x5a\x1b\x00\x00\xb1\x1b\x00\x00\x08\x1c\x00\x00\x5f\x1c\x00\x00\xb6\x1c\x00\x00\x0d\x1d\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x1f\x0a\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA#+  "\x00\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x42\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x46\x00\x47\x00\x9c\x00\x9c\x00\x4e\x00\x9c\x00\x45\x00\x9b\x00\x99\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x50\x00\x53\x00\x4c\x00\x51\x00\x4d\x00\x9c\x00\x9d\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x4a\x00\x9c\x00\x4b\x00\x9c\x00\x9c\x00\x9c\x00\x88\x00\x88\x00\x7e\x00\x87\x00\x8c\x00\x85\x00\x88\x00\x97\x00\x93\x00\x88\x00\x88\x00\x88\x00\x88\x00\x77\x00\x88\x00\x88\x00\x88\x00\x81\x00\x86\x00\x96\x00\x88\x00\x88\x00\x8a\x00\x88\x00\x88\x00\x88\x00\x48\x00\x9c\x00\x49\x00\x9c\x00\x9c\x00\x61\x00\x64\x00\x65\x00\x69\x00\x6e\x00\x6f\x00\x40\x00\x3f\x00\x3c\x00\x08\x00\x0f\x00\x09\x00\x15\x00\x30\x00\x2f\x00\x13\x00\x0a\x00\x3a\x00\x3d\x00\x11\x00\x10\x00\x2e\x00\x05\x00\x2d\x00\x2c\x00\x67\x00\x66\x00\x07\x00\x06\x00\x38\x00\x44\x00\x01\x00\x1d\x00\x04\x00\x03\x00\x6d\x00\x6c\x00\x6b\x00\x6a\x00\x31\x00\x63\x00\x62\x00\x4f\x00\x68\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x36\x00\x0c\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x16\x00\x23\x00\x23\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x26\x00\x18\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x1c\x00\x1b\x00\x1b\x00\x1b\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x32\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x0c\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x0d\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x25\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x26\x00\x18\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x1c\x00\x1b\x00\x1b\x00\x1b\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x0d\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x17\x00\x21\x00\x21\x00\x21\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x14\x00\x12\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x39\x00\x00\x00\x0b\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x26\x00\x18\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x1c\x00\x1b\x00\x1b\x00\x1b\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x54\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x57\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x59\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x5c\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x5e\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x5f\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x60\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x98\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x95\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x72\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x73\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x92\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x75\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x76\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x79\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x91\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x90\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x8f\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x7b\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x8e\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x8d\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x80\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x8b\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x83\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x89\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x84\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x7f\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x82\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x7d\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x7a\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x78\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x74\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x94\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x71\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x70\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x5d\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x5b\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x5a\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x58\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x56\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x7c\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x55\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x52\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA#+  "\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x3d\x00\x65\x00\x65\x00\x65\x00\x73\x00\x73\x00\x67\x00\x67\x00\x61\x00\x73\x00\x41\x00\x73\x00\x43\x00\x69\x00\x69\x00\x75\x00\x6f\x00\x48\x00\x49\x00\x68\x00\x68\x00\x6f\x00\x74\x00\x6f\x00\x6f\x00\x66\x00\x66\x00\x6e\x00\x6e\x00\x54\x00\x29\x00\x2a\x00\x57\x00\x6c\x00\x6c\x00\x6c\x00\x6c\x00\x64\x00\x64\x00\x2a\x00\x6e\x00\x6e\x00\x3d\x00\x72\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\x68\x00\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x74\x00\xff\xff\x76\x00\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA#+  "\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x28\x00\x28\x00\x2a\x00\x2a\x00\x31\x00\x31\x00\x31\x00\x34\x00\x34\x00\x37\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x41\x00\x41\x00\x41\x00\x9c\x00\x9c\x00\x9c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_accept = listArray (0 :: Int, 157)+  [ AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccNone+  , AlexAccSkip+  , AlexAccSkip+  , AlexAccSkip+  , AlexAcc 88+  , AlexAcc 87+  , AlexAcc 86+  , AlexAcc 85+  , AlexAcc 84+  , AlexAcc 83+  , AlexAcc 82+  , AlexAcc 81+  , AlexAcc 80+  , AlexAcc 79+  , AlexAcc 78+  , AlexAcc 77+  , AlexAcc 76+  , AlexAcc 75+  , AlexAcc 74+  , AlexAcc 73+  , AlexAcc 72+  , AlexAcc 71+  , AlexAcc 70+  , AlexAcc 69+  , AlexAcc 68+  , AlexAcc 67+  , AlexAcc 66+  , AlexAcc 65+  , AlexAcc 64+  , AlexAcc 63+  , AlexAcc 62+  , AlexAcc 61+  , AlexAcc 60+  , AlexAcc 59+  , AlexAcc 58+  , AlexAcc 57+  , AlexAcc 56+  , AlexAcc 55+  , AlexAcc 54+  , AlexAcc 53+  , AlexAcc 52+  , AlexAcc 51+  , AlexAcc 50+  , AlexAcc 49+  , AlexAcc 48+  , AlexAcc 47+  , AlexAcc 46+  , AlexAcc 45+  , AlexAcc 44+  , AlexAcc 43+  , AlexAcc 42+  , AlexAcc 41+  , AlexAcc 40+  , AlexAcc 39+  , AlexAcc 38+  , AlexAcc 37+  , AlexAcc 36+  , AlexAcc 35+  , AlexAcc 34+  , AlexAcc 33+  , AlexAcc 32+  , AlexAcc 31+  , AlexAcc 30+  , AlexAcc 29+  , AlexAcc 28+  , AlexAcc 27+  , AlexAcc 26+  , AlexAcc 25+  , AlexAcc 24+  , AlexAcc 23+  , AlexAcc 22+  , AlexAcc 21+  , AlexAcc 20+  , AlexAcc 19+  , AlexAcc 18+  , AlexAcc 17+  , AlexAcc 16+  , AlexAcc 15+  , AlexAcc 14+  , AlexAcc 13+  , AlexAcc 12+  , AlexAcc 11+  , AlexAcc 10+  , AlexAcc 9+  , AlexAcc 8+  , AlexAcc 7+  , AlexAcc 6+  , AlexAcc 5+  , AlexAcc 4+  , AlexAcc 3+  , AlexAcc 2+  , AlexAcc 1+  , AlexAcc 0+  ]++alex_actions = array (0 :: Int, 89)+  [ (88,alex_action_3)+  , (87,alex_action_4)+  , (86,alex_action_5)+  , (85,alex_action_6)+  , (84,alex_action_7)+  , (83,alex_action_8)+  , (82,alex_action_9)+  , (81,alex_action_10)+  , (80,alex_action_11)+  , (79,alex_action_12)+  , (78,alex_action_13)+  , (77,alex_action_14)+  , (76,alex_action_15)+  , (75,alex_action_16)+  , (74,alex_action_17)+  , (73,alex_action_18)+  , (72,alex_action_19)+  , (71,alex_action_20)+  , (70,alex_action_21)+  , (69,alex_action_22)+  , (68,alex_action_23)+  , (67,alex_action_24)+  , (66,alex_action_25)+  , (65,alex_action_26)+  , (64,alex_action_27)+  , (63,alex_action_28)+  , (62,alex_action_29)+  , (61,alex_action_30)+  , (60,alex_action_31)+  , (59,alex_action_32)+  , (58,alex_action_33)+  , (57,alex_action_34)+  , (56,alex_action_35)+  , (55,alex_action_36)+  , (54,alex_action_37)+  , (53,alex_action_38)+  , (52,alex_action_39)+  , (51,alex_action_40)+  , (50,alex_action_41)+  , (49,alex_action_42)+  , (48,alex_action_43)+  , (47,alex_action_44)+  , (46,alex_action_45)+  , (45,alex_action_46)+  , (44,alex_action_46)+  , (43,alex_action_46)+  , (42,alex_action_46)+  , (41,alex_action_46)+  , (40,alex_action_46)+  , (39,alex_action_46)+  , (38,alex_action_46)+  , (37,alex_action_46)+  , (36,alex_action_46)+  , (35,alex_action_46)+  , (34,alex_action_46)+  , (33,alex_action_46)+  , (32,alex_action_46)+  , (31,alex_action_46)+  , (30,alex_action_46)+  , (29,alex_action_46)+  , (28,alex_action_46)+  , (27,alex_action_46)+  , (26,alex_action_46)+  , (25,alex_action_46)+  , (24,alex_action_46)+  , (23,alex_action_46)+  , (22,alex_action_46)+  , (21,alex_action_46)+  , (20,alex_action_46)+  , (19,alex_action_46)+  , (18,alex_action_46)+  , (17,alex_action_46)+  , (16,alex_action_46)+  , (15,alex_action_46)+  , (14,alex_action_46)+  , (13,alex_action_46)+  , (12,alex_action_46)+  , (11,alex_action_46)+  , (10,alex_action_46)+  , (9,alex_action_46)+  , (8,alex_action_46)+  , (7,alex_action_46)+  , (6,alex_action_46)+  , (5,alex_action_46)+  , (4,alex_action_47)+  , (3,alex_action_48)+  , (2,alex_action_49)+  , (1,alex_action_49)+  , (0,alex_action_49)+  ]++{-# LINE 76 "src/lib/Lexer.x" #-}+++newtype Token = Token (FilePath, TokenType, AlexPosn) deriving Show++data TokenType+    = TkDot+    | TkOpenBrc+    | TkClosBrc+    | TkOpenCur+    | TkClosCur+    | TkOpenSqu+    | TkClosSqu+    | TkOpenAng+    | TkClosAng+    | TkComma+    | TkColon+    | TkIsEq+    | TkAssign+    | TkNil+    | TkSemiCo+    | TkCons+    | TkHd+    | TkTl+    | TkWhile+    | TkSwitch+    | TkCase+    | TkDefault+    | TkIf+    | TkElse+    | TkRead+    | TkWrite+    | TkTrue+    | TkFalse+    | TkAtomAsgn+    | TkAtomDoAsgn+    | TkAtomWhile+    | TkAtomDoWhile+    | TkAtomIf+    | TkAtomDoIf+    | TkAtomVar+    | TkAtomQuote+    | TkAtomHd+    | TkAtomDoHd+    | TkAtomTl+    | TkAtomDoTl+    | TkAtomCons+    | TkAtomDoCons+    | ITkVar String+    | ITkInt Int+    | ITkErr String+    deriving (Show, Eq)++-- Main scanning function. Wraps makeGVars and alexScanTokens.+scan :: String -> FilePath -> [Token]+scan s fp = map (\t -> t fp) (alexScanTokens s)++-- The default implementation is not quite sufficient - it is more useful for+-- tokens to be equal regardless of position+instance Eq Token where+    (==) (Token (_, tyA, _)) (Token (_, tyB, _)) = tyA == tyB++-- Get the number of lines into the file that the text produced this token+-- occurred+tkLineNo :: Token -> Int+tkLineNo tok = case tok of Token (_, _, (AlexPn _ line char)) -> line++-- Get the number of characters into the line that the text that produced this+-- token occurred+tkCharNo :: Token -> Int+tkCharNo tok = case tok of Token (_, _, (AlexPn _ line char)) -> char++-- get the variable name in an ITkVar token. Fails if the token isn't an ITkVar.+tkVarName :: Token -> String+tkVarName (Token (_, ITkVar s, _)) = s+tkVarName _                        = error "Not an ITkVar token"++-- Get the file path that a token came from+tkPath :: Token -> FilePath+tkPath (Token (fp, _, _)) = fp++-- Get a pretty string representation of a token for error message purposes+prettyPrintToken :: Token -> String+prettyPrintToken t = case t of+    Token (_, TkDot         , _) -> "'.'"+    Token (_, TkOpenBrc     , _) -> "'('"+    Token (_, TkClosBrc     , _) -> "')'"+    Token (_, TkOpenCur     , _) -> "'{'"+    Token (_, TkClosCur     , _) -> "'}'"+    Token (_, TkOpenSqu     , _) -> "'['"+    Token (_, TkClosSqu     , _) -> "']'"+    Token (_, TkOpenAng     , _) -> "'<'"+    Token (_, TkClosAng     , _) -> "'>'"+    Token (_, TkComma       , _) -> "','"+    Token (_, TkIsEq        , _) -> "'='"+    Token (_, TkAssign      , _) -> "':='"+    Token (_, TkNil         , _) -> "'nil'"+    Token (_, TkSemiCo      , _) -> "';'"+    Token (_, TkCons        , _) -> "'cons'"+    Token (_, TkHd          , _) -> "'hd'"+    Token (_, TkTl          , _) -> "'tl'"+    Token (_, TkWhile       , _) -> "'while'"+    Token (_, TkIf          , _) -> "'if'"+    Token (_, TkElse        , _) -> "'else'"+    Token (_, TkRead        , _) -> "'read'"+    Token (_, TkWrite       , _) -> "'write'" +    Token (_, TkTrue        , _) -> "'true'" +    Token (_, TkFalse       , _) -> "'false'" +    Token (_, TkAtomAsgn    , _) -> "'@:=' (or '@asgn')"+    Token (_, TkAtomDoAsgn  , _) -> "'@doAsgn'"+    Token (_, TkAtomWhile   , _) -> "'@while'"+    Token (_, TkAtomDoWhile , _) -> "'@doWhile'"+    Token (_, TkAtomIf      , _) -> "'@if'"+    Token (_, TkAtomDoIf    , _) -> "'@doIf'"+    Token (_, TkAtomVar     , _) -> "'@var'"+    Token (_, TkAtomQuote   , _) -> "'@quote'"+    Token (_, TkAtomHd      , _) -> "'@hd'"+    Token (_, TkAtomDoHd    , _) -> "'@doHd'"+    Token (_, TkAtomTl      , _) -> "'@tl'"+    Token (_, TkAtomDoTl    , _) -> "'@doTl'"+    Token (_, TkAtomCons    , _) -> "'@cons'"+    Token (_, TkAtomDoCons  , _) -> "'@doCons'"+    Token (_, ITkVar   s    , _) -> "variable  '" ++ s ++ "'"+    Token (_, ITkInt   i    , _) -> "integer  '" ++ show i ++ "'"+    Token (_, ITkErr   s    , _) -> s++alex_action_3 =  \p s fp -> Token ( fp , TkDot           , p ) +alex_action_4 =  \p s fp -> Token ( fp , TkOpenBrc       , p ) +alex_action_5 =  \p s fp -> Token ( fp , TkClosBrc       , p ) +alex_action_6 =  \p s fp -> Token ( fp , TkOpenCur       , p ) +alex_action_7 =  \p s fp -> Token ( fp , TkClosCur       , p ) +alex_action_8 =  \p s fp -> Token ( fp , TkOpenSqu       , p ) +alex_action_9 =  \p s fp -> Token ( fp , TkClosSqu       , p ) +alex_action_10 =  \p s fp -> Token ( fp , TkOpenAng       , p ) +alex_action_11 =  \p s fp -> Token ( fp , TkClosAng       , p ) +alex_action_12 =  \p s fp -> Token ( fp , TkComma         , p ) +alex_action_13 =  \p s fp -> Token ( fp , TkAssign        , p ) +alex_action_14 =  \p s fp -> Token ( fp , TkColon         , p ) +alex_action_15 =  \p s fp -> Token ( fp , TkIsEq          , p ) +alex_action_16 =  \p s fp -> Token ( fp , TkNil           , p ) +alex_action_17 =  \p s fp -> Token ( fp , TkSemiCo        , p ) +alex_action_18 =  \p s fp -> Token ( fp , TkCons          , p ) +alex_action_19 =  \p s fp -> Token ( fp , TkHd            , p ) +alex_action_20 =  \p s fp -> Token ( fp , TkTl            , p ) +alex_action_21 =  \p s fp -> Token ( fp , TkWhile         , p ) +alex_action_22 =  \p s fp -> Token ( fp , TkSwitch        , p ) +alex_action_23 =  \p s fp -> Token ( fp , TkCase          , p ) +alex_action_24 =  \p s fp -> Token ( fp , TkDefault       , p ) +alex_action_25 =  \p s fp -> Token ( fp , TkIf            , p ) +alex_action_26 =  \p s fp -> Token ( fp , TkElse          , p ) +alex_action_27 =  \p s fp -> Token ( fp , TkRead          , p ) +alex_action_28 =  \p s fp -> Token ( fp , TkWrite         , p ) +alex_action_29 =  \p s fp -> Token ( fp , TkTrue          , p ) +alex_action_30 =  \p s fp -> Token ( fp , TkFalse         , p ) +alex_action_31 =  \p s fp -> Token ( fp , TkAtomAsgn      , p ) +alex_action_32 =  \p s fp -> Token ( fp , TkAtomAsgn      , p ) +alex_action_33 =  \p s fp -> Token ( fp , TkAtomDoAsgn    , p ) +alex_action_34 =  \p s fp -> Token ( fp , TkAtomWhile     , p ) +alex_action_35 =  \p s fp -> Token ( fp , TkAtomDoWhile   , p ) +alex_action_36 =  \p s fp -> Token ( fp , TkAtomIf        , p ) +alex_action_37 =  \p s fp -> Token ( fp , TkAtomDoIf      , p ) +alex_action_38 =  \p s fp -> Token ( fp , TkAtomVar       , p ) +alex_action_39 =  \p s fp -> Token ( fp , TkAtomQuote     , p ) +alex_action_40 =  \p s fp -> Token ( fp , TkAtomHd        , p ) +alex_action_41 =  \p s fp -> Token ( fp , TkAtomDoHd      , p ) +alex_action_42 =  \p s fp -> Token ( fp , TkAtomTl        , p ) +alex_action_43 =  \p s fp -> Token ( fp , TkAtomDoTl      , p ) +alex_action_44 =  \p s fp -> Token ( fp , TkAtomCons      , p ) +alex_action_45 =  \p s fp -> Token ( fp , TkAtomDoCons    , p ) +alex_action_46 =  \p s fp -> Token ( fp , ITkVar s        , p ) +alex_action_47 =  \p s fp -> Token ( fp , ITkInt (read s) , p ) +alex_action_48 =  \p s fp -> Token ( fp , ITkInt (read s) , p ) +alex_action_49 =  \p s fp -> Token ( fp , ITkErr s        , p ) +{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 10 "<command-line>" #-}+# 1 "/usr/include/stdc-predef.h" 1 3 4++# 17 "/usr/include/stdc-predef.h" 3 4++++++++++++++++++++++++++++++++++++++++++++{-# LINE 10 "<command-line>" #-}+{-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}++++++++++++++++++{-# LINE 10 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++{-# LINE 21 "templates/GenericTemplate.hs" #-}++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define GTE(n,m) (tagToEnum# (n >=# m))+#define EQ(n,m) (tagToEnum# (n ==# m))+#else+#define GTE(n,m) (n >=# m)+#define EQ(n,m) (n ==# m)+#endif+{-# LINE 51 "templates/GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+  narrow16Int# i+  where+        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+        low  = int2Word# (ord# (indexCharOffAddr# arr off'))+        off' = off *# 2#+#else+  indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+  narrow32Int# i+  where+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+                     (b2 `uncheckedShiftL#` 16#) `or#`+                     (b1 `uncheckedShiftL#` 8#) `or#` b0)+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))+   off' = off *# 4#+#else+  indexInt32OffAddr# arr off+#endif+++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+  = AlexEOF+  | AlexError  !AlexInput+  | AlexSkip   !AlexInput !Int+  | AlexToken  !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input__ (I# (sc))+  = alexScanUser undefined input__ (I# (sc))++alexScanUser user__ input__ (I# (sc))+  = case alex_scan_tkn user__ input__ 0# input__ sc AlexNone of+  (AlexNone, input__') ->+    case alexGetByte input__ of+      Nothing ->++++                                   AlexEOF+      Just _ ->++++                                   AlexError input__'++  (AlexLastSkip input__'' len, _) ->++++    AlexSkip input__'' len++  (AlexLastAcc k input__''' len, _) ->++++    AlexToken input__''' len (alex_actions ! k)+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user__ orig_input len input__ s last_acc =+  input__ `seq` -- strict in the input+  let+  new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))+  in+  new_acc `seq`+  case alexGetByte input__ of+     Nothing -> (new_acc, input__)+     Just (c, new_input) ->++++      case fromIntegral c of { (I# (ord_c)) ->+        let+                base   = alexIndexInt32OffAddr alex_base s+                offset = (base +# ord_c)+                check  = alexIndexInt16OffAddr alex_check offset++                new_s = if GTE(offset,0#) && EQ(check,ord_c)+                          then alexIndexInt16OffAddr alex_table offset+                          else alexIndexInt16OffAddr alex_deflt s+        in+        case new_s of+            -1# -> (new_acc, input__)+                -- on an error, we want to keep the input *before* the+                -- character that failed, not after.+            _ -> alex_scan_tkn user__ orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)+                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)+                        new_input new_s new_acc+      }+  where+        check_accs (AlexAccNone) = last_acc+        check_accs (AlexAcc a  ) = AlexLastAcc a input__ (I# (len))+        check_accs (AlexAccSkip) = AlexLastSkip  input__ (I# (len))+{-# LINE 198 "templates/GenericTemplate.hs" #-}++data AlexLastAcc+  = AlexNone+  | AlexLastAcc !Int !AlexInput !Int+  | AlexLastSkip     !AlexInput !Int++data AlexAcc user+  = AlexAccNone+  | AlexAcc Int+  | AlexAccSkip
+ dist/build/SourceParser.hs view
@@ -0,0 +1,1146 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -XMagicHash -XBangPatterns -XTypeSynonymInstances -XFlexibleInstances -cpp #-}+#if __GLASGOW_HASKELL__ >= 710+{-# OPTIONS_GHC -XPartialTypeSignatures #-}+#endif+module SourceParser where++import Lexer+import PureSyntax+import SugarSyntax++import Control.Monad.Except+import qualified Data.Array as Happy_Data_Array+import qualified Data.Bits as Bits+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.8++newtype HappyAbsSyn  = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn7 :: (SuProgram) -> (HappyAbsSyn )+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> (SuProgram)+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: (Name) -> (HappyAbsSyn )+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> (Name)+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: (Expression) -> (HappyAbsSyn )+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> (Expression)+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (ETree) -> (HappyAbsSyn )+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (ETree)+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: ([Expression]) -> (HappyAbsSyn )+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> ([Expression])+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: ([Expression]) -> (HappyAbsSyn )+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> ([Expression])+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (SuCommand) -> (HappyAbsSyn )+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn ) -> (SuCommand)+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (SuBlock) -> (HappyAbsSyn )+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn ) -> (SuBlock)+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: (SuBlock) -> (HappyAbsSyn )+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> (SuBlock)+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (([(Expression, SuBlock)], SuBlock)) -> (HappyAbsSyn )+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn ) -> (([(Expression, SuBlock)], SuBlock))+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: (ETree) -> (HappyAbsSyn )+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn ) -> (ETree)+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (ETree) -> (HappyAbsSyn )+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn ) -> (ETree)+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: ([ETree]) -> (HappyAbsSyn )+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn ) -> ([ETree])+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: ([ETree]) -> (HappyAbsSyn )+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn ) -> ([ETree])+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyInTok :: (Token) -> (HappyAbsSyn )+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn ) -> (Token)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyExpList :: HappyAddr+happyExpList = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x40\x14\x3a\x80\xff\xff\x01\x00\x00\x00\x80\x11\x00\x00\x01\x00\x00\x50\x08\x00\xfe\xff\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x04\x00\xff\xff\x02\x00\x00\x50\x08\x00\xfe\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x0a\x1d\xc0\xff\xff\x00\x00\x40\x14\x3a\x80\xff\xff\x01\x00\x80\x28\x74\x00\xff\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x0a\x1d\xc0\xff\xff\x00\x00\x40\x1c\x3a\x80\xff\xff\x01\x00\x00\x20\x04\x00\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xd0\x01\xfc\xff\x0f\x00\x00\x44\xa1\x03\xf8\xff\x1f\x00\x00\x88\x42\x07\xf0\xff\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xa9\x03\xf8\xff\x1f\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x80\x00\x00\x00\x00\x00\x00\x80\x28\x74\x00\xff\xff\x03\x00\x00\x04\x02\x00\x00\x00\x00\x00\x00\x08\x04\x00\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x88\x42\x07\xf0\xff\x3f\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x42\x00\xf0\xff\x2f\x00\x00\x00\x85\x00\xe0\xff\x5f\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x10\x02\x80\xff\xff\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x23\x00\x00\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x28\x74\x00\xff\xff\x03\x00\x00\x40\x08\x00\xfe\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x28\x74\x00\xff\xff\x03\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x42\x07\xf0\xff\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x04\x00\x40\x00\x00\x00\x00\xc0\x08\x00\x80\x00\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x00\x10\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++{-# NOINLINE happyExpListPerState #-}+happyExpListPerState st =+    token_strs_expected+  where token_strs = ["error","%dummy","%start_parseProg","%start_parseExpr","%start_parseComm","%start_parseLVal","PROGRAM","VAR","EXPR","ATOM","EXPLIST","RESTEXPLIST","COMMAND","BLOCK","CMDS","SWITCHCONT","VAL","LVAL","LVALLIST","RESTLVALLIST","Dot","OpenBrc","ClosBrc","OpenCur","ClosCur","OpenSqu","ClosSqu","OpenAng","ClosAng","Comma","IsEq","Assign","Nil","SemiCo","Cons","Hd","Tl","While","Switch","Case","Default","Colon","If","Else","Read","Write","True","False","AtAsgn","AtDoAsgn","AtWhile","AtDoWhile","AtIf","AtDoIf","AtVar","AtQuote","AtHd","AtDoHd","AtTl","AtDoTl","AtCons","AtDoCons","Var","Int","%eof"]+        bit_start = st * 65+        bit_end = (st + 1) * 65+        read_bit = readArrayBit happyExpList+        bits = map read_bit [bit_start..bit_end - 1]+        bits_indexed = zip bits [0..64]+        token_strs_expected = concatMap f bits_indexed+        f (False, _) = []+        f (True, nr) = [token_strs !! nr]++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\xdd\xff\x55\x00\x2d\x00\xf7\x00\xdd\xff\xf1\xff\x00\x00\x00\x00\xe9\xff\x00\x00\xd2\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x01\x00\x55\x00\x55\x00\x55\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x55\x00\xff\xff\x53\x01\x00\x00\x55\x00\x55\x00\x55\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x2a\x00\x2c\x00\x0e\x00\x00\x00\x08\x00\x55\x00\xe1\x00\x06\x01\x62\x01\x80\x00\x32\x00\x52\x00\x00\x00\x16\x00\x3e\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\x4f\x00\x2e\x01\x00\x00\x1d\x01\xfd\xff\x51\x00\x5f\x00\x00\x00\x00\x00\x00\x00\xab\x00\x53\x01\x5f\x00\x65\x00\x0e\x00\x7f\x00\x00\x00\x00\x00\xab\x00\x6e\x00\x77\x00\x82\x00\x00\x00\x8c\x00\x90\x00\x52\x00\x7a\x00\x83\x00\x00\x00\x00\x00\xab\x00\x00\x00\x2d\x00\x2d\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x2d\x00\xaa\x00\x00\x00\xa5\x00\x00\x00\x00\x00\xfd\xff\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x03\x00\x5d\x00\x3d\x00\x31\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\xb3\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xff\x00\x88\x01\x00\x00\x04\x01\x23\x01\x27\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\xba\x00\x00\x00\x00\x00\x3b\x01\xb9\x00\x00\x00\xe0\x00\x5b\x01\x00\x00\xb7\x00\x00\x00\xe5\x00\xe3\x00\x00\x00\x00\x00\xb6\x00\x85\x01\x00\x00\x2b\x01\x00\x00\x30\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x01\x89\x01\x00\x00\x00\x00\x07\x01\x08\x01\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x00\x00\x00\x0a\x01\x00\x00\x00\x00\x83\x01\x00\x00\x67\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x01\x00\x00\x00\x00"#++happyAdjustOffset :: Happy_GHC_Exts.Int# -> Happy_GHC_Exts.Int#+happyAdjustOffset off = off++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\xc6\xff\x00\x00\xc7\xff\x00\x00\x00\x00\xcc\xff\xc9\xff\xc8\xff\xf1\xff\xf0\xff\xef\xff\xee\xff\xed\xff\xec\xff\xeb\xff\xea\xff\xe9\xff\xe8\xff\xe7\xff\xe6\xff\xe5\xff\xe4\xff\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xff\x00\x00\xcd\xff\xf3\xff\xf2\xff\x00\x00\x00\x00\x00\x00\xd2\xff\x00\x00\x00\x00\x00\x00\xcf\xff\xce\xff\xd0\xff\x00\x00\xf5\xff\xf6\xff\x00\x00\x00\x00\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xff\x00\x00\x00\x00\xc4\xff\xc2\xff\x00\x00\x00\x00\xdf\xff\x00\x00\xdd\xff\x00\x00\x00\x00\xdb\xff\xf4\xff\xf7\xff\xe2\xff\xe0\xff\x00\x00\x00\x00\xf9\xff\x00\x00\x00\x00\x00\x00\xda\xff\xd4\xff\x00\x00\x00\x00\xd6\xff\x00\x00\xd9\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xff\xcb\xff\x00\x00\xd8\xff\x00\x00\x00\x00\x00\x00\xdc\xff\xe1\xff\xd1\xff\x00\x00\x00\x00\xd7\xff\xde\xff\xfb\xff\xd3\xff\x00\x00\xd5\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x02\x00\x05\x00\x00\x00\x01\x00\x06\x00\x07\x00\x08\x00\x2b\x00\x0b\x00\x19\x00\x03\x00\x0d\x00\x0b\x00\x0f\x00\x10\x00\x11\x00\x14\x00\x15\x00\x0b\x00\x16\x00\x07\x00\x2d\x00\x0c\x00\x0a\x00\x0b\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x01\x00\x2d\x00\x2d\x00\x06\x00\x01\x00\x08\x00\x01\x00\x03\x00\x0b\x00\x06\x00\x0d\x00\x08\x00\x0f\x00\x10\x00\x11\x00\x0b\x00\x0c\x00\x01\x00\x12\x00\x13\x00\x2b\x00\x04\x00\x06\x00\x17\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x2b\x00\x07\x00\x0b\x00\x06\x00\x0a\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x03\x00\x0f\x00\x10\x00\x11\x00\x0a\x00\x01\x00\x18\x00\x0b\x00\x0b\x00\x0c\x00\x06\x00\x09\x00\x08\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x04\x00\x16\x00\x0e\x00\x06\x00\x05\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x03\x00\x0f\x00\x10\x00\x11\x00\x0a\x00\x01\x00\x1a\x00\x09\x00\x0b\x00\x0c\x00\x06\x00\x09\x00\x08\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x2b\x00\x05\x00\x0b\x00\x06\x00\x01\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x03\x00\x0f\x00\x10\x00\x11\x00\x0a\x00\x01\x00\x05\x00\x07\x00\x0b\x00\x0c\x00\x06\x00\x0d\x00\x08\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x06\x00\x07\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0a\x00\x04\x00\x01\x00\x07\x00\x0d\x00\x0a\x00\x07\x00\x09\x00\x0b\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x06\x00\x2c\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0a\x00\x04\x00\x01\x00\x05\x00\xff\xff\x0a\x00\x07\x00\xff\xff\x0b\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x05\x00\x2c\x00\x01\x00\x02\x00\x03\x00\x04\x00\x01\x00\x02\x00\x03\x00\x04\x00\x01\x00\x0a\x00\x03\x00\x12\x00\x13\x00\x0a\x00\x09\x00\xff\xff\x17\x00\x0a\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x2b\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0d\x00\x01\x00\x02\x00\x03\x00\x04\x00\x0a\x00\x04\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0b\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\x2c\x00\x01\x00\x02\x00\x03\x00\x04\x00\x01\x00\x02\x00\x03\x00\x04\x00\x03\x00\x0a\x00\xff\xff\x03\x00\x03\x00\x0a\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\x0a\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x29\x00\x5a\x00\x32\x00\x05\x00\x2a\x00\x39\x00\x2b\x00\x07\x00\x3b\x00\x43\x00\x50\x00\x2c\x00\x3b\x00\x2d\x00\x2e\x00\x2f\x00\x5b\x00\x5c\x00\x3b\x00\x6f\x00\x52\x00\xff\xff\x3f\x00\x53\x00\x3b\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x07\x00\x32\x00\x29\x00\x54\x00\xff\xff\xff\xff\x2a\x00\x1e\x00\x2b\x00\x48\x00\x07\x00\x3b\x00\x5c\x00\x2c\x00\x5d\x00\x2d\x00\x2e\x00\x2f\x00\x08\x00\x09\x00\x1e\x00\x21\x00\x22\x00\x07\x00\x4c\x00\x1f\x00\x23\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x07\x00\x32\x00\x29\x00\x07\x00\x46\x00\x3b\x00\x2a\x00\x47\x00\x2b\x00\x23\x00\x24\x00\x25\x00\x26\x00\x2c\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x27\x00\x1e\x00\x58\x00\x3b\x00\x40\x00\x09\x00\x5c\x00\x6e\x00\x70\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x07\x00\x32\x00\x29\x00\x4c\x00\x6a\x00\x69\x00\x2a\x00\x68\x00\x4a\x00\x23\x00\x3d\x00\x25\x00\x26\x00\x2c\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x27\x00\x1e\x00\x64\x00\x67\x00\x3f\x00\x09\x00\x5c\x00\x66\x00\x6f\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x07\x00\x32\x00\x29\x00\x07\x00\x74\x00\x3b\x00\x2a\x00\x05\x00\x2b\x00\x23\x00\x3c\x00\x25\x00\x26\x00\x2c\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x27\x00\x1e\x00\x50\x00\x4d\x00\x61\x00\x09\x00\x5c\x00\x44\x00\x74\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x07\x00\x32\x00\x0b\x00\x42\x00\x0c\x00\x23\x00\x3b\x00\x25\x00\x26\x00\x0d\x00\x23\x00\x39\x00\x25\x00\x26\x00\x27\x00\x4c\x00\x43\x00\x4a\x00\x64\x00\x27\x00\x62\x00\x58\x00\x3b\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x0b\x00\x1e\x00\x0c\x00\x23\x00\x37\x00\x25\x00\x26\x00\x0d\x00\x23\x00\x35\x00\x25\x00\x26\x00\x27\x00\x4d\x00\x72\x00\x6c\x00\x00\x00\x27\x00\x6b\x00\x00\x00\x3b\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x5f\x00\x1e\x00\x23\x00\x34\x00\x25\x00\x26\x00\x23\x00\x33\x00\x25\x00\x26\x00\x5f\x00\x27\x00\x25\x00\x21\x00\x22\x00\x27\x00\x75\x00\x00\x00\x23\x00\x36\x00\x2b\x00\x23\x00\x54\x00\x25\x00\x26\x00\x2c\x00\x23\x00\x4e\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x07\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x07\x00\x32\x00\x2b\x00\x23\x00\x48\x00\x25\x00\x26\x00\x2c\x00\x23\x00\x56\x00\x25\x00\x26\x00\x27\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x3b\x00\x30\x00\x31\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x00\x00\x32\x00\x23\x00\x6a\x00\x25\x00\x26\x00\x23\x00\x71\x00\x25\x00\x26\x00\x07\x00\x27\x00\x00\x00\x25\x00\x25\x00\x27\x00\x00\x00\x00\x00\x60\x00\x09\x00\x36\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (4, 61) [+	(4 , happyReduce_4),+	(5 , happyReduce_5),+	(6 , happyReduce_6),+	(7 , happyReduce_7),+	(8 , happyReduce_8),+	(9 , happyReduce_9),+	(10 , happyReduce_10),+	(11 , happyReduce_11),+	(12 , happyReduce_12),+	(13 , happyReduce_13),+	(14 , happyReduce_14),+	(15 , happyReduce_15),+	(16 , happyReduce_16),+	(17 , happyReduce_17),+	(18 , happyReduce_18),+	(19 , happyReduce_19),+	(20 , happyReduce_20),+	(21 , happyReduce_21),+	(22 , happyReduce_22),+	(23 , happyReduce_23),+	(24 , happyReduce_24),+	(25 , happyReduce_25),+	(26 , happyReduce_26),+	(27 , happyReduce_27),+	(28 , happyReduce_28),+	(29 , happyReduce_29),+	(30 , happyReduce_30),+	(31 , happyReduce_31),+	(32 , happyReduce_32),+	(33 , happyReduce_33),+	(34 , happyReduce_34),+	(35 , happyReduce_35),+	(36 , happyReduce_36),+	(37 , happyReduce_37),+	(38 , happyReduce_38),+	(39 , happyReduce_39),+	(40 , happyReduce_40),+	(41 , happyReduce_41),+	(42 , happyReduce_42),+	(43 , happyReduce_43),+	(44 , happyReduce_44),+	(45 , happyReduce_45),+	(46 , happyReduce_46),+	(47 , happyReduce_47),+	(48 , happyReduce_48),+	(49 , happyReduce_49),+	(50 , happyReduce_50),+	(51 , happyReduce_51),+	(52 , happyReduce_52),+	(53 , happyReduce_53),+	(54 , happyReduce_54),+	(55 , happyReduce_55),+	(56 , happyReduce_56),+	(57 , happyReduce_57),+	(58 , happyReduce_58),+	(59 , happyReduce_59),+	(60 , happyReduce_60),+	(61 , happyReduce_61)+	]++happy_n_terms = 46 :: Int+happy_n_nonterms = 14 :: Int++happyReduce_4 = happyReduce 6# 0# happyReduction_4+happyReduction_4 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut8 happy_x_1 of { happy_var_1 -> +	case happyOut8 happy_x_3 of { happy_var_3 -> +	case happyOut14 happy_x_4 of { happy_var_4 -> +	case happyOut8 happy_x_6 of { happy_var_6 -> +	happyIn7+		 (SuProgram happy_var_1 happy_var_3 happy_var_4 happy_var_6+	) `HappyStk` happyRest}}}}++happyReduce_5 = happySpecReduce_1  1# happyReduction_5+happyReduction_5 happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	happyIn8+		 (Name (tkPath happy_var_1, tkVarName happy_var_1)+	)}++happyReduce_6 = happySpecReduce_3  2# happyReduction_6+happyReduction_6 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut9 happy_x_3 of { happy_var_3 -> +	happyIn9+		 (Cons happy_var_2 happy_var_3+	)}}++happyReduce_7 = happySpecReduce_1  2# happyReduction_7+happyReduction_7 happy_x_1+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> +	happyIn9+		 (Var happy_var_1+	)}++happyReduce_8 = happySpecReduce_3  2# happyReduction_8+happyReduction_8 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	happyIn9+		 (happy_var_2+	)}++happyReduce_9 = happySpecReduce_2  2# happyReduction_9+happyReduction_9 happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	happyIn9+		 (Hd happy_var_2+	)}++happyReduce_10 = happySpecReduce_2  2# happyReduction_10+happyReduction_10 happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	happyIn9+		 (Tl happy_var_2+	)}++happyReduce_11 = happySpecReduce_3  2# happyReduction_11+happyReduction_11 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_1 of { happy_var_1 -> +	case happyOut9 happy_x_3 of { happy_var_3 -> +	happyIn9+		 (IsEq happy_var_1 happy_var_3+	)}}++happyReduce_12 = happySpecReduce_1  2# happyReduction_12+happyReduction_12 happy_x_1+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> +	happyIn9+		 (expFromHaskellList happy_var_1+	)}++happyReduce_13 = happySpecReduce_1  2# happyReduction_13+happyReduction_13 happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	happyIn9+		 (Lit happy_var_1+	)}++happyReduce_14 = happySpecReduce_1  3# happyReduction_14+happyReduction_14 happy_x_1+	 =  happyIn10+		 (intToTree  2+	)++happyReduce_15 = happySpecReduce_1  3# happyReduction_15+happyReduction_15 happy_x_1+	 =  happyIn10+		 (intToTree  3+	)++happyReduce_16 = happySpecReduce_1  3# happyReduction_16+happyReduction_16 happy_x_1+	 =  happyIn10+		 (intToTree  5+	)++happyReduce_17 = happySpecReduce_1  3# happyReduction_17+happyReduction_17 happy_x_1+	 =  happyIn10+		 (intToTree  7+	)++happyReduce_18 = happySpecReduce_1  3# happyReduction_18+happyReduction_18 happy_x_1+	 =  happyIn10+		 (intToTree 11+	)++happyReduce_19 = happySpecReduce_1  3# happyReduction_19+happyReduction_19 happy_x_1+	 =  happyIn10+		 (intToTree 13+	)++happyReduce_20 = happySpecReduce_1  3# happyReduction_20+happyReduction_20 happy_x_1+	 =  happyIn10+		 (intToTree 17+	)++happyReduce_21 = happySpecReduce_1  3# happyReduction_21+happyReduction_21 happy_x_1+	 =  happyIn10+		 (intToTree 19+	)++happyReduce_22 = happySpecReduce_1  3# happyReduction_22+happyReduction_22 happy_x_1+	 =  happyIn10+		 (intToTree 23+	)++happyReduce_23 = happySpecReduce_1  3# happyReduction_23+happyReduction_23 happy_x_1+	 =  happyIn10+		 (intToTree 29+	)++happyReduce_24 = happySpecReduce_1  3# happyReduction_24+happyReduction_24 happy_x_1+	 =  happyIn10+		 (intToTree 31+	)++happyReduce_25 = happySpecReduce_1  3# happyReduction_25+happyReduction_25 happy_x_1+	 =  happyIn10+		 (intToTree 37+	)++happyReduce_26 = happySpecReduce_1  3# happyReduction_26+happyReduction_26 happy_x_1+	 =  happyIn10+		 (intToTree 41+	)++happyReduce_27 = happySpecReduce_1  3# happyReduction_27+happyReduction_27 happy_x_1+	 =  happyIn10+		 (intToTree 43+	)++happyReduce_28 = happySpecReduce_2  4# happyReduction_28+happyReduction_28 happy_x_2+	happy_x_1+	 =  happyIn11+		 ([]+	)++happyReduce_29 = happySpecReduce_3  4# happyReduction_29+happyReduction_29 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut12 happy_x_3 of { happy_var_3 -> +	happyIn11+		 (happy_var_2 : happy_var_3+	)}}++happyReduce_30 = happySpecReduce_3  5# happyReduction_30+happyReduction_30 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut12 happy_x_3 of { happy_var_3 -> +	happyIn12+		 (happy_var_2 : happy_var_3+	)}}++happyReduce_31 = happySpecReduce_1  5# happyReduction_31+happyReduction_31 happy_x_1+	 =  happyIn12+		 ([]+	)++happyReduce_32 = happySpecReduce_3  6# happyReduction_32+happyReduction_32 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut8 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut9 happy_x_3 of { happy_var_3 -> +	happyIn13+		 (SuAssign (Info (tkPath happy_var_2, tkLineNo happy_var_2)) happy_var_1 happy_var_3+	)}}}++happyReduce_33 = happyReduce 6# 6# happyReduction_33+happyReduction_33 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut8 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 -> +	case happyOut8 happy_x_4 of { happy_var_4 -> +	case happyOut9 happy_x_6 of { happy_var_6 -> +	happyIn13+		 (Macro    (Info (tkPath happy_var_2, tkLineNo happy_var_2)) happy_var_1 (nameName happy_var_4) happy_var_6+	) `HappyStk` happyRest}}}}++happyReduce_34 = happySpecReduce_3  6# happyReduction_34+happyReduction_34 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut14 happy_x_3 of { happy_var_3 -> +	happyIn13+		 (SuWhile  (Info (tkPath happy_var_1, tkLineNo happy_var_1)) happy_var_2 happy_var_3+	)}}}++happyReduce_35 = happyReduce 5# 6# happyReduction_35+happyReduction_35 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut14 happy_x_3 of { happy_var_3 -> +	case happyOut14 happy_x_5 of { happy_var_5 -> +	happyIn13+		 (SuIfElse (Info (tkPath happy_var_1, tkLineNo happy_var_1)) happy_var_2 happy_var_3 happy_var_5+	) `HappyStk` happyRest}}}}++happyReduce_36 = happySpecReduce_3  6# happyReduction_36+happyReduction_36 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut14 happy_x_3 of { happy_var_3 -> +	happyIn13+		 (SuIfElse (Info (tkPath happy_var_1, tkLineNo happy_var_1)) happy_var_2 happy_var_3 []+	)}}}++happyReduce_37 = happyReduce 4# 6# happyReduction_37+happyReduction_37 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut16 happy_x_4 of { happy_var_4 -> +	happyIn13+		 (Switch   (Info (tkPath happy_var_1, tkLineNo happy_var_1)) happy_var_2 (fst happy_var_4) (snd happy_var_4)+	) `HappyStk` happyRest}}}++happyReduce_38 = happySpecReduce_2  7# happyReduction_38+happyReduction_38 happy_x_2+	happy_x_1+	 =  happyIn14+		 ([]+	)++happyReduce_39 = happySpecReduce_3  7# happyReduction_39+happyReduction_39 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut15 happy_x_2 of { happy_var_2 -> +	happyIn14+		 (happy_var_2+	)}++happyReduce_40 = happySpecReduce_3  8# happyReduction_40+happyReduction_40 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut13 happy_x_1 of { happy_var_1 -> +	case happyOut15 happy_x_3 of { happy_var_3 -> +	happyIn15+		 (happy_var_1 : happy_var_3+	)}}++happyReduce_41 = happySpecReduce_1  8# happyReduction_41+happyReduction_41 happy_x_1+	 =  case happyOut13 happy_x_1 of { happy_var_1 -> +	happyIn15+		 ([happy_var_1]+	)}++happyReduce_42 = happyReduce 5# 9# happyReduction_42+happyReduction_42 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut9 happy_x_2 of { happy_var_2 -> +	case happyOut15 happy_x_4 of { happy_var_4 -> +	case happyOut16 happy_x_5 of { happy_var_5 -> +	happyIn16+		 (((happy_var_2, happy_var_4) : fst happy_var_5, snd happy_var_5)+	) `HappyStk` happyRest}}}++happyReduce_43 = happySpecReduce_1  9# happyReduction_43+happyReduction_43 happy_x_1+	 =  happyIn16+		 (([]               , []    )+	)++happyReduce_44 = happyReduce 4# 9# happyReduction_44+happyReduction_44 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut15 happy_x_3 of { happy_var_3 -> +	happyIn16+		 (([]               , happy_var_3    )+	) `HappyStk` happyRest}++happyReduce_45 = happySpecReduce_1  10# happyReduction_45+happyReduction_45 happy_x_1+	 =  happyIn17+		 (ENil+	)++happyReduce_46 = happyReduce 5# 10# happyReduction_46+happyReduction_46 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut17 happy_x_2 of { happy_var_2 -> +	case happyOut17 happy_x_4 of { happy_var_4 -> +	happyIn17+		 (ECons happy_var_2 happy_var_4+	) `HappyStk` happyRest}}++happyReduce_47 = happySpecReduce_1  10# happyReduction_47+happyReduction_47 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Token ( _, ITkInt happy_var_1     , _ )) -> +	happyIn17+		 (intToTree happy_var_1+	)}++happyReduce_48 = happySpecReduce_1  10# happyReduction_48+happyReduction_48 happy_x_1+	 =  happyIn17+		 (intToTree 1+	)++happyReduce_49 = happySpecReduce_1  10# happyReduction_49+happyReduction_49 happy_x_1+	 =  happyIn17+		 (intToTree 0+	)++happyReduce_50 = happySpecReduce_1  10# happyReduction_50+happyReduction_50 happy_x_1+	 =  case happyOut10 happy_x_1 of { happy_var_1 -> +	happyIn17+		 (happy_var_1+	)}++happyReduce_51 = happySpecReduce_1  11# happyReduction_51+happyReduction_51 happy_x_1+	 =  happyIn18+		 (ENil+	)++happyReduce_52 = happyReduce 5# 11# happyReduction_52+happyReduction_52 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut18 happy_x_2 of { happy_var_2 -> +	case happyOut18 happy_x_4 of { happy_var_4 -> +	happyIn18+		 (ECons happy_var_2 happy_var_4+	) `HappyStk` happyRest}}++happyReduce_53 = happySpecReduce_1  11# happyReduction_53+happyReduction_53 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Token ( _, ITkInt happy_var_1     , _ )) -> +	happyIn18+		 (intToTree happy_var_1+	)}++happyReduce_54 = happySpecReduce_1  11# happyReduction_54+happyReduction_54 happy_x_1+	 =  happyIn18+		 (intToTree 1+	)++happyReduce_55 = happySpecReduce_1  11# happyReduction_55+happyReduction_55 happy_x_1+	 =  happyIn18+		 (intToTree 0+	)++happyReduce_56 = happySpecReduce_1  11# happyReduction_56+happyReduction_56 happy_x_1+	 =  case happyOut19 happy_x_1 of { happy_var_1 -> +	happyIn18+		 (treeFromHaskellList happy_var_1+	)}++happyReduce_57 = happySpecReduce_1  11# happyReduction_57+happyReduction_57 happy_x_1+	 =  case happyOut10 happy_x_1 of { happy_var_1 -> +	happyIn18+		 (happy_var_1+	)}++happyReduce_58 = happySpecReduce_2  12# happyReduction_58+happyReduction_58 happy_x_2+	happy_x_1+	 =  happyIn19+		 ([]+	)++happyReduce_59 = happySpecReduce_3  12# happyReduction_59+happyReduction_59 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut18 happy_x_2 of { happy_var_2 -> +	case happyOut20 happy_x_3 of { happy_var_3 -> +	happyIn19+		 (happy_var_2 : happy_var_3+	)}}++happyReduce_60 = happySpecReduce_3  13# happyReduction_60+happyReduction_60 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut18 happy_x_2 of { happy_var_2 -> +	case happyOut20 happy_x_3 of { happy_var_3 -> +	happyIn20+		 (happy_var_2 : happy_var_3+	)}}++happyReduce_61 = happySpecReduce_1  13# happyReduction_61+happyReduction_61 happy_x_1+	 =  happyIn20+		 ([]+	)++happyNewToken action sts stk [] =+	happyDoAction 45# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+	let cont i = happyDoAction i tk action sts stk tks in+	case tk of {+	Token ( _, TkDot         , _ ) -> cont 1#;+	Token ( _, TkOpenBrc     , _ ) -> cont 2#;+	Token ( _, TkClosBrc     , _ ) -> cont 3#;+	Token ( _, TkOpenCur     , _ ) -> cont 4#;+	Token ( _, TkClosCur     , _ ) -> cont 5#;+	Token ( _, TkOpenSqu     , _ ) -> cont 6#;+	Token ( _, TkClosSqu     , _ ) -> cont 7#;+	Token ( _, TkOpenAng     , _ ) -> cont 8#;+	Token ( _, TkClosAng     , _ ) -> cont 9#;+	Token ( _, TkComma       , _ ) -> cont 10#;+	Token ( _, TkIsEq        , _ ) -> cont 11#;+	Token ( _, TkAssign      , _ ) -> cont 12#;+	Token ( _, TkNil         , _ ) -> cont 13#;+	Token ( _, TkSemiCo      , _ ) -> cont 14#;+	Token ( _, TkCons        , _ ) -> cont 15#;+	Token ( _, TkHd          , _ ) -> cont 16#;+	Token ( _, TkTl          , _ ) -> cont 17#;+	Token ( _, TkWhile       , _ ) -> cont 18#;+	Token ( _, TkSwitch      , _ ) -> cont 19#;+	Token ( _, TkCase        , _ ) -> cont 20#;+	Token ( _, TkDefault     , _ ) -> cont 21#;+	Token ( _, TkColon       , _ ) -> cont 22#;+	Token ( _, TkIf          , _ ) -> cont 23#;+	Token ( _, TkElse        , _ ) -> cont 24#;+	Token ( _, TkRead        , _ ) -> cont 25#;+	Token ( _, TkWrite       , _ ) -> cont 26#;+	Token ( _, TkTrue        , _ ) -> cont 27#;+	Token ( _, TkFalse       , _ ) -> cont 28#;+	Token ( _, TkAtomAsgn    , _ ) -> cont 29#;+	Token ( _, TkAtomDoAsgn  , _ ) -> cont 30#;+	Token ( _, TkAtomWhile   , _ ) -> cont 31#;+	Token ( _, TkAtomDoWhile , _ ) -> cont 32#;+	Token ( _, TkAtomIf      , _ ) -> cont 33#;+	Token ( _, TkAtomDoIf    , _ ) -> cont 34#;+	Token ( _, TkAtomVar     , _ ) -> cont 35#;+	Token ( _, TkAtomQuote   , _ ) -> cont 36#;+	Token ( _, TkAtomHd      , _ ) -> cont 37#;+	Token ( _, TkAtomDoHd    , _ ) -> cont 38#;+	Token ( _, TkAtomTl      , _ ) -> cont 39#;+	Token ( _, TkAtomDoTl    , _ ) -> cont 40#;+	Token ( _, TkAtomCons    , _ ) -> cont 41#;+	Token ( _, TkAtomDoCons  , _ ) -> cont 42#;+	Token ( _, ITkVar _      , _ ) -> cont 43#;+	Token ( _, ITkInt happy_dollar_dollar     , _ ) -> cont 44#;+	_ -> happyError' ((tk:tks), [])+	}++happyError_ explist 45# tk tks = happyError' (tks, explist)+happyError_ explist _ tk tks = happyError' ((tk:tks), explist)++happyThen :: () => ExceptT String IO a -> (a -> ExceptT String IO b) -> ExceptT String IO b+happyThen = (>>=)+happyReturn :: () => a -> ExceptT String IO a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> ExceptT String IO a+happyReturn1 = \a tks -> (return) a+happyError' :: () => ([(Token)], [String]) -> ExceptT String IO a+happyError' = (\(tokens, _) -> parseError tokens)+parseProg tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut7 x))++parseExpr tks = happySomeParser where+ happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut9 x))++parseComm tks = happySomeParser where+ happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut13 x))++parseLVal tks = happySomeParser where+ happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut18 x))++happySeq = happyDontSeq+++parseError :: [Token] -> ExceptT String IO a+parseError [] = throwError "Parse error: reached end of file while parsing"+parseError (tok : rest) = throwError $ concat+    [ "Parse error: "+    , (prettyPrintToken tok)+    , " in program/macro '"+    , tkPath tok+    , "', at line "+    , (show (tkLineNo tok))+    , ", char "+    , (show (tkCharNo tok))+    ]+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 11 "<command-line>" #-}+# 1 "/usr/include/stdc-predef.h" 1 3 4++# 17 "/usr/include/stdc-predef.h" 3 4++++++++++++++++++++++++++++++++++++++++++++{-# LINE 11 "<command-line>" #-}+{-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}++++++++++++++++++{-# LINE 11 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp ++++++++++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif+{-# LINE 43 "templates/GenericTemplate.hs" #-}++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList++++++++{-# LINE 65 "templates/GenericTemplate.hs" #-}++{-# LINE 75 "templates/GenericTemplate.hs" #-}++{-# LINE 84 "templates/GenericTemplate.hs" #-}++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser).  We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+        happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = +        (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+        = {- nothing -}+++          case action of+                0#           -> {- nothing -}+                                     happyFail (happyExpListPerState ((Happy_GHC_Exts.I# (st)) :: Int)) i tk st+                -1#          -> {- nothing -}+                                     happyAccept i tk st+                n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}++                                                   (happyReduceArr Happy_Data_Array.! rule) i tk st+                                                   where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+                n                 -> {- nothing -}+++                                     happyShift new_state i tk st+                                     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+   where off    = happyAdjustOffset (indexShortOffAddr happyActOffsets st)+         off_i  = (off Happy_GHC_Exts.+#  i)+         check  = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+                  then EQ(indexShortOffAddr happyCheck off_i, i)+                  else False+         action+          | check     = indexShortOffAddr happyTable off_i+          | otherwise = indexShortOffAddr happyDefActions st+++++indexShortOffAddr (HappyA# arr) off =+        Happy_GHC_Exts.narrow16Int# i+  where+        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+        off' = off Happy_GHC_Exts.*# 2#+++++{-# INLINE happyLt #-}+happyLt x y = LT(x,y)+++readArrayBit arr bit =+    Bits.testBit (Happy_GHC_Exts.I# (indexShortOffAddr arr ((unbox_int bit) `Happy_GHC_Exts.iShiftRA#` 4#))) (bit `mod` 16)+  where unbox_int (Happy_GHC_Exts.I# x) = x+++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++{-# LINE 180 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+--     trace "shifting the error token" $+     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+     = let r = fn v1 in+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+     = let r = fn v1 v2 in+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+     = let r = fn v1 v2 v3 in+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+         sts1@((HappyCons (st1@(action)) (_))) ->+                let r = fn stk in  -- it doesn't hurt to always seq here...+                happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+      case happyDrop k (HappyCons (st) (sts)) of+        sts1@((HappyCons (st1@(action)) (_))) ->+          let drop_stk = happyDropStk k stk in+          happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+     = happyFail [] 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+      case happyDrop k (HappyCons (st) (sts)) of+        sts1@((HappyCons (st1@(action)) (_))) ->+         let drop_stk = happyDropStk k stk++             off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st1)+             off_i = (off Happy_GHC_Exts.+#  nt)+             new_state = indexShortOffAddr happyTable off_i+++++          in+          happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = +   {- nothing -}+   happyDoAction j tk new_state+   where off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st)+         off_i = (off Happy_GHC_Exts.+#  nt)+         new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) =+     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+--      trace "failing" $ +        happyError_ explist i tk++{-  We don't need state discarding for our restricted implementation of+    "error".  In fact, it can cause some bogus parses, so I've disabled it+    for now --SDM++-- discard a state+happyFail  0# tk old_st (HappyCons ((action)) (sts)) +                                                (saved_tok `HappyStk` _ `HappyStk` stk) =+--      trace ("discarding state, depth " ++ show (length stk))  $+        happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+--                       save the old token and carry on.+happyFail explist i tk (action) sts stk =+--      trace "entering error recovery" $+        happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing.  If the --strict flag is given, then Happy emits +--      happySeq = happyDoSeq+-- otherwise it emits+--      happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq   a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template.  GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.+++{-# NOINLINE happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.
+ hwhile.cabal view
@@ -0,0 +1,66 @@+name:                   hwhile+version:                0.1.1.0+synopsis:               An implementation of Neil D. Jones' While language+license:                GPL-3+license-file:           LICENSE+author:                 Alex Jeffery+maintainer:             apjeffery136@gmail.com+category:               Language+build-type:             Simple+extra-source-files:     README.md+cabal-version:          >=1.10++Description:+  An implementation of Neil D. Jones' While language. Developed in collaboration+  with Dr. Bernhard Reus (University of Sussex, UK) for use in the Limits of+  Computing module.++Source-Repository head+  Type: git+  Location: git@github.com:alexj136/HWhile.git++library+  default-language:     Haskell2010+  hs-source-dirs:       src/lib+  build-depends:        base >=4.8 && <4.11,+                        containers >=0.5 && <0.6,+                        array >=0.5 && <0.6,+                        filepath,+                        haskeline,+                        repline,+                        mtl+  exposed-modules:      Lexer,+                        SourceParser,+                        SugarSyntax,+                        DesugarSI,+                        InterSyntax,+                        DesugarIP,+                        PureSyntax,+                        PureInterpreter,+                        LoggingInterpreter,+                        REPL,+                        Unparser++executable hwhile+  default-language:     Haskell2010+  hs-source-dirs:       src/exec+  build-depends:        base >=4.8 && <4.11,+                        containers >=0.5 && <0.6,+                        array >=0.5 && <0.6,+                        filepath,+                        mtl,+                        hwhile+  build-tools:          alex, happy+  main-is:              Main.hs++Test-Suite hwhile-testsuite+  default-language:     Haskell2010+  hs-source-dirs:       src/test+  build-depends:        base >=4.8 && <4.11,+                        containers >=0.5 && <0.6,+                        array >=0.5 && <0.6,+                        Cabal,+                        mtl,+                        hwhile+  type:                 exitcode-stdio-1.0+  main-is:              UnitTests.hs
+ src/exec/Main.hs view
@@ -0,0 +1,180 @@+module Main where++import qualified PureSyntax         as PS+import Lexer (scan)+import SourceParser (parseLVal)+import SugarSyntax+import DesugarSI+import qualified DesugarIP          as IP+import qualified PureInterpreter    as I+import qualified LoggingInterpreter as LI+import Unparser+import REPL+import qualified Data.Map           as M+import qualified Data.Set           as S+import System.Exit+import System.Environment (getArgs)+import System.FilePath+import Data.List (intersperse)+import Control.Monad.Except+import Control.Monad.State.Strict (runStateT)++noArgsMessage :: String+noArgsMessage = "No arguments supplied. Run 'hwhile -h' for help."++badArgsMessage :: String+badArgsMessage = "Invalid argument(s) supplied. Run 'hwhile -h' for help."++versionMessage :: String+versionMessage = "HWhile version 0.1.1.0"++helpMessage :: String+helpMessage = concat $ (intersperse "\n") $+    [ "HWhile: a Haskell implementation of the while language, by Alex Jeffery."+    , "Usage:"+    , "    hwhile -h                    - Print this message and exit."+    , "    hwhile -r                    - Enter interactive mode."+    , "    hwhile -v                    - Print HWhile's version number and"+    , "                                   exit."+    , "    hwhile <FLAG> <FILE> <EXPR>  - Run the program in <FILE> with input"+    , "                                   <EXPR>. Note that <EXPR> may require"+    , "                                   surrounding \"double quotes\"."+    , "                                   Program output will be displayed in"+    , "                                   the format specified by the chosen"+    , "                                   <FLAG>."+    , "Possible flags:"+    , "    [NOTHING] - Display output as a while tree."+    , "    -i        - Display output as an integer. If the output is not a"+    , "                valid integer, 'E' will be displayed."+    , "    -iv       - Display output as an integer. If the output is not a"+    , "                valid integer, it will be displayed as a while tree."+    , "    -l        - Display output as a list of while trees."+    , "    -li       - Display output as a list of integers. Invalid elements"+    , "                will all display as 'E'."+    , "    -liv      - Display output as a list of integers. Invalid elements"+    , "                will all display as while trees."+    , "    -L        - Display output as a nested list of integers. Valid"+    , "                integers will display as such, and invalid integers will"+    , "                display as nested lists of integers."+    , "    -La       - Display output as a nested list of atoms and integers."+    , "                Valid atoms will display as such, invalid atoms that are"+    , "                valid integers will display as integers, and invalid"+    , "                integers will display as nested lists of atoms and"+    , "                integers."+    , "    -d        - Display outputs as while trees, with debugging log"+    , "    -di       - Display outputs as integers, with debugging log. If"+    , "                outputs are not valid integers, 'E' will be displayed."+    , "    -div      - Display outputs as integers. If outputs are not valid"+    , "                integers, they will display as while trees."+    , "    -dl       - Display outputs as lists of while trees, with debugging"+    , "                log."+    , "    -dli      - Display outputs as lists of integers, with debugging"+    , "                log. Invalid elements will display as 'E'."+    , "    -dliv     - Display outputs as lists of integers, with debugging"+    , "                log. Invalid elements will display as while trees."+    , "    -dL       - Display outputs as nested lists of integers, with"+    , "                debugging log. Valid integers will display as such, and"+    , "                invalid integers will display as nested lists of"+    , "                integers."+    , "    -dLa      - Display outputs as nested lists of atoms and integers,"+    , "                with debugging log. Valid atoms will display as such,"+    , "                invalid atoms that are valid integers will display as"+    , "                integers, and invalid integers will display as nested"+    , "                lists of atoms and integers."+    , "    -u        - Run the unparser on the given program. In this mode, no"+    , "                argument expression should be supplied."+    ]++-- Compute a function to display an expression in a certain way according to the+-- given command line argument.+getShowFunctionAndInterpreterFunction ::+    Maybe String ->+    Maybe (PS.ETree -> String, PS.ETree -> PS.Program -> IO PS.ETree)+getShowFunctionAndInterpreterFunction flagStr = case flagStr of+    Nothing      -> Just (show                                               , \t p -> return (I.evalProg t p))+    Just "-i"    -> Just (\tree -> maybe "E" show $ PS.parseInt tree         , \t p -> return (I.evalProg t p))+    Just "-iv"   -> Just (\tree -> maybe (show tree) show $ PS.parseInt tree , \t p -> return (I.evalProg t p))+    Just "-l"    -> Just (show . PS.toHaskellList                            , \t p -> return (I.evalProg t p))+    Just "-li"   -> Just (PS.showIntListTree False                           , \t p -> return (I.evalProg t p))+    Just "-liv"  -> Just (PS.showIntListTree True                            , \t p -> return (I.evalProg t p))+    Just "-L"    -> Just (PS.showNestedIntListTree                           , \t p -> return (I.evalProg t p))+    Just "-La"   -> Just (PS.showNestedAtomIntListTree                       , \t p -> return (I.evalProg t p))+    Just "-d"    -> let sfn = show                                               in Just (sfn, LI.evalProg sfn)+    Just "-di"   -> let sfn = \tree -> maybe "E" show $ PS.parseInt tree         in Just (sfn, LI.evalProg sfn)+    Just "-div"  -> let sfn = \tree -> maybe (show tree) show $ PS.parseInt tree in Just (sfn, LI.evalProg sfn)+    Just "-dl"   -> let sfn = show . PS.toHaskellList                            in Just (sfn, LI.evalProg sfn)+    Just "-dli"  -> let sfn = PS.showIntListTree False                           in Just (sfn, LI.evalProg sfn)+    Just "-dliv" -> let sfn = PS.showIntListTree True                            in Just (sfn, LI.evalProg sfn)+    Just "-dL"   -> let sfn = PS.showNestedIntListTree                           in Just (sfn, LI.evalProg sfn)+    Just "-dLa"  -> let sfn = PS.showNestedAtomIntListTree                       in Just (sfn, LI.evalProg sfn)+    Just _       -> Nothing++main :: IO ()+main = do+    result <- runExceptT exceptMain+    case result of+        Left errorMsg -> do putStrLn errorMsg ; exitFailure+        Right ()      -> exitSuccess++-- Parse the command structure to pass appropriate arguments to doRun, or quit+-- with an error/help message.+exceptMain :: ExceptT String IO ()+exceptMain = do+    args <- lift getArgs+    if (length args) == 0 then do+        lift $ putStrLn noArgsMessage+    else if (args !! 0) == "-r" then do+        lift $ runStateT runREPL emptyREPLState+        return ()+    else if (args !! 0) == "-h" then do+        lift $ putStrLn helpMessage+    else if (args !! 0) == "-v" then do+        lift $ putStrLn versionMessage+    else if (length args) == 2 && (args !! 0) == "-u" then do+        let mainFile = args !! 1+        doUnparse mainFile+    else if (length args) == 2 then do+        let mainFile         = args !! 0+        let argStr           = args !! 1+        doRun Nothing mainFile argStr+    else if (length args) == 3 then do+        let flagStr  = args !! 0+        let mainFile = args !! 1+        let argStr   = args !! 2+        doRun (Just flagStr) mainFile argStr+    else+        lift $ putStrLn badArgsMessage++doUnparse :: FilePath -> ExceptT String IO ()+doUnparse mainFile =+    let mainFileDir      = takeDirectory mainFile+        mainFileBaseName = takeBaseName mainFile+    in do+        prog <- loadProg mainFileDir mainFileBaseName []+        maybe (lift (putStrLn "E")) (lift . putStrLn)+            (PS.showProgramTree (unparse (IP.desugarProg prog)))++doRun :: Maybe String -> FilePath -> String -> ExceptT String IO ()+doRun flagStr mainFile argStr =+    let mainFileDir      = takeDirectory mainFile+        mainFileBaseName = takeBaseName mainFile+    in case getShowFunctionAndInterpreterFunction flagStr of+        Nothing -> lift $ putStrLn badArgsMessage+        Just (showFunction, interpreterFunction) -> do+            result <- runFromParts mainFileDir mainFileBaseName argStr+                interpreterFunction+            lift $ putStrLn $ showFunction $ result++-- Run a program given the search path, file path, argument string and+-- interpreting function+runFromParts ::+    FilePath                                -> -- The search path file+    FilePath                                -> -- The main file to run+    String                                  -> -- The argument string+    (PS.ETree -> PS.Program -> IO PS.ETree) -> -- The interpreting function+    ExceptT String IO PS.ETree                 -- The result of the execution+runFromParts dir fileBaseName argStr interpret = do+    prog <- loadProg dir fileBaseName []+    let argTokens  = scan argStr "+IMPL+"+    argTree <- parseLVal argTokens+    lift $ interpret argTree (IP.desugarProg prog)
+ src/lib/DesugarIP.hs view
@@ -0,0 +1,24 @@+module DesugarIP ( desugarProg ) where++import PureSyntax+import InterSyntax++-- Desugar a program, that is, convert it to pure while syntax+desugarProg :: InProgram -> Program+desugarProg ( InProgram n r blk w ) = Program n r (desugarBlock blk) w++-- Desugar a block+desugarBlock :: InBlock -> Block+desugarBlock = concat . map desugarComm++-- Desugar a command+desugarComm :: InCommand -> Block+desugarComm suComm = case suComm of+    InAssign _ x exp -> [ Assign x exp ]+    InWhile  _ gd blk -> [ While gd (desugarBlock blk) ]+    InIfElse _ gd bt bf -> [ IfElse gd (desugarBlock bt) (desugarBlock bf) ]+    InSwitch _ e [] def -> desugarBlock def+    InSwitch i e ( ( matchE , blk ) : cases ) def -> let+        desugaredBlk  = desugarBlock blk+        desugaredRest = desugarComm  ( InSwitch i e cases def )+        in [ IfElse ( IsEq e matchE ) desugaredBlk desugaredRest ]
+ src/lib/DesugarSI.hs view
@@ -0,0 +1,101 @@+module DesugarSI (loadProg, desugarProg, desugarBlock, desugarComm) where++import System.FilePath (pathSeparator)+import SourceParser (parseProg)+import Lexer (scan)+import PureSyntax+import InterSyntax+import SugarSyntax+import qualified Data.Set as S+import Control.Monad.Except+import Control.Exception (try)+import Control.Exception.Base (SomeException)+import Control.Arrow (left)++-- Given its directory, base name, a macro call stack and macro seed, load a+-- program from disk, returning it with the macro seed after unparsing etc.+-- Also check for macro recursion or non-matching file+prog names, failing if+-- either is found.+loadProg ::+    FilePath   -> -- The directory we look for files to open+    FilePath   -> -- The file we want to load+    [FilePath] -> -- The 'macro stack'. Prevents recursion thusly: every time we+                  -- recurse into loading a new macro, we push the name of the+                  -- previous macro on the stack, and then check that the+                  -- new macro is not already somewhere on the stack. If it is,+                  -- we've found recursion so we quit. Otherwise, we pop the+                  -- current macro off the stack when we finish it.+    ExceptT String IO InProgram  -- The loaded program+loadProg dir fileBaseName macroStack =+    if fileBaseName `elem` macroStack then+        throwError "Recursive macros detected."+    else do+        fileStr <- safeReadFile $+            dir ++ pathSeparator : fileBaseName ++ ".while"+        let fileTokens  = scan fileStr fileBaseName+        suProg <- parseProg fileTokens+        case (suProg, macroStack) of+            ( SuProgram n _ _ _ , _  ) | nameName n /= fileBaseName ->+                throwError $ "Program name (" ++ nameName n+                    ++ ") must match file base name."+            ( _                 , [] ) ->+                desugarProg dir ( fileBaseName : macroStack ) suProg+            ( SuProgram n r b w , _  ) ->+                let namesToInit = S.delete r $ S.insert w $ namesSuBlock b+                    initCode    = map ( \n ->+                            SuAssign ( Info ( "+IMPL+", 0 ) ) n ( Lit ENil ) )+                        (S.toList namesToInit)+                in desugarProg dir ( fileBaseName : macroStack )+                    ( SuProgram n r ( initCode ++ b ) w )++-- Safely read a file in the ExceptT String IO monad.+safeReadFile :: FilePath -> ExceptT String IO String+safeReadFile file = do+    tryFile <- lift $ try $ readFile file+    case tryFile of+        Left  exc          -> throwError $ show (exc :: SomeException)+        Right fileContents -> return fileContents++-- Desugar a program, that is, convert it to pure while syntax+desugarProg :: FilePath -> [FilePath] -> SuProgram ->+    ExceptT String IO InProgram+desugarProg dir macroStack ( SuProgram n r blk w ) = do+    desugaredBlk <- desugarBlock dir macroStack blk+    return $ InProgram n r desugaredBlk w++-- Desugar a block+desugarBlock :: FilePath -> [FilePath] -> SuBlock -> ExceptT String IO InBlock+desugarBlock dir _          []         = return []+desugarBlock dir macroStack ( c : cs ) = do+    desugaredC  <- desugarComm  dir macroStack c+    desugaredCs <- desugarBlock dir macroStack cs+    return $ desugaredC ++ desugaredCs++-- Desugar a command+desugarComm ::+    FilePath   -> -- Path to search for macro files+    [FilePath] -> -- Macro call stack+    SuCommand  -> -- The command to desugar+    ExceptT String IO InBlock+desugarComm dir macroStack suComm = case suComm of+    SuAssign i x exp -> return [ InAssign i x exp ]+    SuWhile i gd blk -> do+        desugaredBlk <- desugarBlock dir macroStack blk+        return [ InWhile i gd desugaredBlk ]+    SuIfElse i gd bt bf -> do+        desugaredBT <- desugarBlock dir macroStack bt+        desugaredBF <- desugarBlock dir macroStack bf+        return [ InIfElse i gd desugaredBT desugaredBF ]+    Macro i x f e -> do+        prog <- loadProg dir f macroStack+        return $+            [ InAssign i ( inReadVar prog ) e ] +++            inBlock prog +++            [ InAssign i x ( Var ( inWriteVar prog ) ) ]+    Switch i e cases def -> do+        desugaredDef   <- desugarBlock dir macroStack def+        desugaredCases <- sequence $ map ( \( matchE , blk ) -> do+                desugaredBlk <- desugarBlock dir macroStack blk+                return ( matchE , desugaredBlk )+            ) cases+        return $ [ InSwitch i e desugaredCases desugaredDef ]
+ src/lib/InterSyntax.hs view
@@ -0,0 +1,53 @@+module InterSyntax where++{- This module defines an intermediate-level version of the syntax for commands,+ - including conditional and switch commands, but no macros. This module is+ - included for interactive execution, and as an intermediate step before+ - translation to pure while syntax.+ -}++import qualified Data.Set as S+import PureSyntax+import SugarSyntax (Info)++data InProgram = InProgram+    { inProgName :: Name+    , inReadVar  :: Name+    , inBlock    :: InBlock+    , inWriteVar :: Name+    } deriving (Eq, Ord)+ +type InBlock = [InCommand]++-- The sugared command syntax - has conditionals, macros and switches in+-- addition to the pure syntax commands.+data InCommand+    = InAssign Info Name Expression+    | InWhile  Info Expression InBlock+    | InIfElse Info Expression InBlock InBlock+    | InSwitch Info Expression [(Expression, InBlock)] InBlock+    deriving (Show, Eq, Ord)++info :: InCommand -> Info+info comm = case comm of+    InAssign i _ _   -> i+    InWhile  i _ _   -> i+    InIfElse i _ _ _ -> i+    InSwitch i _ _ _ -> i++namesInProg :: InProgram -> S.Set Name+namesInProg (InProgram n r b w) = foldr S.insert (namesInBlock b) [n, r, w]++namesInBlock :: InBlock -> S.Set Name+namesInBlock = S.unions . map namesInComm++namesInComm :: InCommand -> S.Set Name+namesInComm comm = case comm of+    InAssign _ n e     -> S.insert n (namesExpr e)+    InWhile  _ e b     -> S.union (namesExpr e) (namesInBlock b)+    InIfElse _ e bt bf -> S.unions [namesExpr e, namesInBlock bt, namesInBlock bf]+    InSwitch _ e eb b  -> S.unions+        [ namesExpr e+        , S.unions (map (\(e, b) -> S.union (namesExpr e) (namesInBlock b)) eb)+        , namesInBlock b+        ]
+ src/lib/Lexer.x view
@@ -0,0 +1,200 @@+{+module Lexer+    ( Token (..)+    , TokenType (..)+    , tkLineNo+    , tkCharNo+    , tkPath+    , tkVarName+    , scan+    , prettyPrintToken+    ) where+}++%wrapper "posn"++$digit = 0-9+$lower = a-z+$upper = A-Z+$alpha = [$lower $upper]+$alnum = [$alpha $digit]+$inmac = [$alpha \_ \$]+$invar = [$inmac $digit]++tokens :-+    $white+               ; -- Ignore whitespace+    \/\/.*\n              ; -- // single line comments+    \(\*(.|\n)*\*\)       ; -- (* Multiline comments *)+    \.                    { \p s fp -> Token ( fp , TkDot           , p ) }+    \(                    { \p s fp -> Token ( fp , TkOpenBrc       , p ) }+    \)                    { \p s fp -> Token ( fp , TkClosBrc       , p ) }+    \{                    { \p s fp -> Token ( fp , TkOpenCur       , p ) }+    \}                    { \p s fp -> Token ( fp , TkClosCur       , p ) }+    \[                    { \p s fp -> Token ( fp , TkOpenSqu       , p ) }+    \]                    { \p s fp -> Token ( fp , TkClosSqu       , p ) }+    \<                    { \p s fp -> Token ( fp , TkOpenAng       , p ) }+    \>                    { \p s fp -> Token ( fp , TkClosAng       , p ) }+    \,                    { \p s fp -> Token ( fp , TkComma         , p ) }+    \:\=                  { \p s fp -> Token ( fp , TkAssign        , p ) }+    \:                    { \p s fp -> Token ( fp , TkColon         , p ) }+    \=                    { \p s fp -> Token ( fp , TkIsEq          , p ) }+    "nil"                 { \p s fp -> Token ( fp , TkNil           , p ) }+    \;                    { \p s fp -> Token ( fp , TkSemiCo        , p ) }+    "cons"                { \p s fp -> Token ( fp , TkCons          , p ) }+    "hd"                  { \p s fp -> Token ( fp , TkHd            , p ) }+    "tl"                  { \p s fp -> Token ( fp , TkTl            , p ) }+    "while"               { \p s fp -> Token ( fp , TkWhile         , p ) }+    "switch"              { \p s fp -> Token ( fp , TkSwitch        , p ) }+    "case"                { \p s fp -> Token ( fp , TkCase          , p ) }+    "default"             { \p s fp -> Token ( fp , TkDefault       , p ) }+    "if"                  { \p s fp -> Token ( fp , TkIf            , p ) }+    "else"                { \p s fp -> Token ( fp , TkElse          , p ) }+    "read"                { \p s fp -> Token ( fp , TkRead          , p ) }+    "write"               { \p s fp -> Token ( fp , TkWrite         , p ) }+    "true"                { \p s fp -> Token ( fp , TkTrue          , p ) }+    "false"               { \p s fp -> Token ( fp , TkFalse         , p ) }+    "@:="                 { \p s fp -> Token ( fp , TkAtomAsgn      , p ) }+    "@asgn"               { \p s fp -> Token ( fp , TkAtomAsgn      , p ) }+    "@doAsgn"             { \p s fp -> Token ( fp , TkAtomDoAsgn    , p ) }+    "@while"              { \p s fp -> Token ( fp , TkAtomWhile     , p ) }+    "@doWhile"            { \p s fp -> Token ( fp , TkAtomDoWhile   , p ) }+    "@if"                 { \p s fp -> Token ( fp , TkAtomIf        , p ) }+    "@doIf"               { \p s fp -> Token ( fp , TkAtomDoIf      , p ) }+    "@var"                { \p s fp -> Token ( fp , TkAtomVar       , p ) }+    "@quote"              { \p s fp -> Token ( fp , TkAtomQuote     , p ) }+    "@hd"                 { \p s fp -> Token ( fp , TkAtomHd        , p ) }+    "@doHd"               { \p s fp -> Token ( fp , TkAtomDoHd      , p ) }+    "@tl"                 { \p s fp -> Token ( fp , TkAtomTl        , p ) }+    "@doTl"               { \p s fp -> Token ( fp , TkAtomDoTl      , p ) }+    "@cons"               { \p s fp -> Token ( fp , TkAtomCons      , p ) }+    "@doCons"             { \p s fp -> Token ( fp , TkAtomDoCons    , p ) }+    $alpha[$invar]*       { \p s fp -> Token ( fp , ITkVar s        , p ) }+    "0"                   { \p s fp -> Token ( fp , ITkInt (read s) , p ) }+    [1-9][$digit]*        { \p s fp -> Token ( fp , ITkInt (read s) , p ) }+    .                     { \p s fp -> Token ( fp , ITkErr s        , p ) }++{++newtype Token = Token (FilePath, TokenType, AlexPosn) deriving Show++data TokenType+    = TkDot+    | TkOpenBrc+    | TkClosBrc+    | TkOpenCur+    | TkClosCur+    | TkOpenSqu+    | TkClosSqu+    | TkOpenAng+    | TkClosAng+    | TkComma+    | TkColon+    | TkIsEq+    | TkAssign+    | TkNil+    | TkSemiCo+    | TkCons+    | TkHd+    | TkTl+    | TkWhile+    | TkSwitch+    | TkCase+    | TkDefault+    | TkIf+    | TkElse+    | TkRead+    | TkWrite+    | TkTrue+    | TkFalse+    | TkAtomAsgn+    | TkAtomDoAsgn+    | TkAtomWhile+    | TkAtomDoWhile+    | TkAtomIf+    | TkAtomDoIf+    | TkAtomVar+    | TkAtomQuote+    | TkAtomHd+    | TkAtomDoHd+    | TkAtomTl+    | TkAtomDoTl+    | TkAtomCons+    | TkAtomDoCons+    | ITkVar String+    | ITkInt Int+    | ITkErr String+    deriving (Show, Eq)++-- Main scanning function. Wraps makeGVars and alexScanTokens.+scan :: String -> FilePath -> [Token]+scan s fp = map (\t -> t fp) (alexScanTokens s)++-- The default implementation is not quite sufficient - it is more useful for+-- tokens to be equal regardless of position+instance Eq Token where+    (==) (Token (_, tyA, _)) (Token (_, tyB, _)) = tyA == tyB++-- Get the number of lines into the file that the text produced this token+-- occurred+tkLineNo :: Token -> Int+tkLineNo tok = case tok of Token (_, _, (AlexPn _ line char)) -> line++-- Get the number of characters into the line that the text that produced this+-- token occurred+tkCharNo :: Token -> Int+tkCharNo tok = case tok of Token (_, _, (AlexPn _ line char)) -> char++-- get the variable name in an ITkVar token. Fails if the token isn't an ITkVar.+tkVarName :: Token -> String+tkVarName (Token (_, ITkVar s, _)) = s+tkVarName _                        = error "Not an ITkVar token"++-- Get the file path that a token came from+tkPath :: Token -> FilePath+tkPath (Token (fp, _, _)) = fp++-- Get a pretty string representation of a token for error message purposes+prettyPrintToken :: Token -> String+prettyPrintToken t = case t of+    Token (_, TkDot         , _) -> "'.'"+    Token (_, TkOpenBrc     , _) -> "'('"+    Token (_, TkClosBrc     , _) -> "')'"+    Token (_, TkOpenCur     , _) -> "'{'"+    Token (_, TkClosCur     , _) -> "'}'"+    Token (_, TkOpenSqu     , _) -> "'['"+    Token (_, TkClosSqu     , _) -> "']'"+    Token (_, TkOpenAng     , _) -> "'<'"+    Token (_, TkClosAng     , _) -> "'>'"+    Token (_, TkComma       , _) -> "','"+    Token (_, TkIsEq        , _) -> "'='"+    Token (_, TkAssign      , _) -> "':='"+    Token (_, TkNil         , _) -> "'nil'"+    Token (_, TkSemiCo      , _) -> "';'"+    Token (_, TkCons        , _) -> "'cons'"+    Token (_, TkHd          , _) -> "'hd'"+    Token (_, TkTl          , _) -> "'tl'"+    Token (_, TkWhile       , _) -> "'while'"+    Token (_, TkIf          , _) -> "'if'"+    Token (_, TkElse        , _) -> "'else'"+    Token (_, TkRead        , _) -> "'read'"+    Token (_, TkWrite       , _) -> "'write'" +    Token (_, TkTrue        , _) -> "'true'" +    Token (_, TkFalse       , _) -> "'false'" +    Token (_, TkAtomAsgn    , _) -> "'@:=' (or '@asgn')"+    Token (_, TkAtomDoAsgn  , _) -> "'@doAsgn'"+    Token (_, TkAtomWhile   , _) -> "'@while'"+    Token (_, TkAtomDoWhile , _) -> "'@doWhile'"+    Token (_, TkAtomIf      , _) -> "'@if'"+    Token (_, TkAtomDoIf    , _) -> "'@doIf'"+    Token (_, TkAtomVar     , _) -> "'@var'"+    Token (_, TkAtomQuote   , _) -> "'@quote'"+    Token (_, TkAtomHd      , _) -> "'@hd'"+    Token (_, TkAtomDoHd    , _) -> "'@doHd'"+    Token (_, TkAtomTl      , _) -> "'@tl'"+    Token (_, TkAtomDoTl    , _) -> "'@doTl'"+    Token (_, TkAtomCons    , _) -> "'@cons'"+    Token (_, TkAtomDoCons  , _) -> "'@doCons'"+    Token (_, ITkVar   s    , _) -> "variable  '" ++ s ++ "'"+    Token (_, ITkInt   i    , _) -> "integer  '" ++ show i ++ "'"+    Token (_, ITkErr   s    , _) -> s+}
+ src/lib/LoggingInterpreter.hs view
@@ -0,0 +1,40 @@+module LoggingInterpreter where++{-+Interpreter that prints a log of each assignment to the command line. Threads a+function used to print PureSyntax.ETrees.+-}++import PureSyntax+import qualified PureInterpreter as I+import qualified Data.Map as M++evalProg :: (ETree -> String) -> ETree -> Program -> IO ETree+evalProg showFunction input (Program _ rd blk wrt) = do+    store <- evalBlock showFunction (M.singleton rd input) blk+    return $ M.findWithDefault ENil wrt store++evalBlock :: (ETree -> String) -> I.Store -> Block -> IO I.Store+evalBlock showFunction store blk = case blk of+    []   -> return store+    c:cs -> do+        store' <- evalComm showFunction store c+        evalBlock showFunction store' cs++evalComm :: (ETree -> String) -> I.Store -> Command -> IO I.Store+evalComm showFunction store comm = case comm of+    Assign v x   -> let evalX = I.evalExpr store x in do+        putStrLn $ displayAssignment showFunction v evalX+        return $ M.insert v evalX store+    While  x b   -> case I.evalExpr store x of+        ENil -> return store+        _    -> do+            store' <- evalBlock showFunction store b+            evalComm showFunction store' (While x b)+    IfElse e a b -> case I.evalExpr store e of+        ENil -> evalBlock showFunction store b+        _    -> evalBlock showFunction store a++displayAssignment :: (ETree -> String) -> Name -> ETree -> String+displayAssignment showFunction (Name (fp, n)) tree =+    concat $ ["(", fp, ") ", n, " := ", showFunction tree]
+ src/lib/PureInterpreter.hs view
@@ -0,0 +1,57 @@+module PureInterpreter where++{--+Interpreter functions for while programs. These functions are essentially+Haskell encodings of the semantic rules for the while language given in Neil+Jones' book on pages 40 & 41.+--}++import PureSyntax+import qualified Data.Map as M++-- While stores are maps from variable names to trees, i.e. the values of+-- variables+type Store = M.Map Name ETree++-- To evaluate a program, we evaluate the program's command with the initial+-- store that contains the read variable with the value of the input, and+-- output (or 'write') the value of the write-variable in the resulting store.+evalProg :: ETree -> Program -> ETree+evalProg input (Program _ rd blk wrt) = M.findWithDefault ENil wrt store+    where store = evalBlock (M.singleton rd input) blk++-- To evaluate an empty block, just return the input store. To evaluate a non-+-- empty block, evaluate the first element with the input store, and then+-- evaluate the rest of the block with the resulting store.+evalBlock :: Store -> Block -> Store+evalBlock store []     = store+evalBlock store (c:cs) = let store' = evalComm store c in evalBlock store' cs++-- Commands update the contents of the store:+--   Assignments update the assignee variable with the assigned value.+--   While loops evaluate a guard expression with an initial store. If the+--     resulting expression is nil, we do nothing. Otherwise, we update the+--     store by executing the while loop's command, and repeat the process with+--     the new store.+--   Conditionals are evaluated by first evaluating the condition. If the+--     condition is false (nil), the 'else-block' is evaluated. Otherwise the+--     'then-block' is evaluated.+evalComm :: Store -> Command -> Store+evalComm store (Assign v x)   = M.insert v (evalExpr store x) store+evalComm store (While  x b)   = case evalExpr store x of+    ENil -> store+    _    -> let store' = evalBlock store b in evalComm store' (While x b)+evalComm store (IfElse e a b) = case evalExpr store e of+    ENil -> evalBlock store b+    _    -> evalBlock store a++-- Expression evaluation is straightforward - see page 40 of Neil Jones' book+-- for more detail. This function performs a single reduction step.+evalExpr :: Store -> Expression -> ETree+evalExpr store expr = let eval = evalExpr store in case expr of+    Var  n   -> M.findWithDefault ENil n store+    Hd   e   -> case eval e of { ENil -> ENil; ECons h _ -> h}+    Tl   e   -> case eval e of { ENil -> ENil; ECons _ t -> t}+    IsEq a b -> if eval a == eval b then ECons ENil ENil else ENil+    Cons h t -> ECons (eval h) (eval t)+    Lit  t   -> t
+ src/lib/PureSyntax.hs view
@@ -0,0 +1,349 @@+module PureSyntax where++import qualified Data.Map as M+import qualified Data.Set as S+import Data.List (intersperse)++-- Syntax definitions for while programs. The data types below match the+-- context-free grammar in Neil Jones' book, page 32. This module also contains+-- functions for printing syntax trees.++newtype Name = Name (FilePath, String) deriving (Eq, Ord)++nameName :: Name -> String+nameName (Name (_, s)) = s++namePath :: Name -> FilePath+namePath (Name (f, _)) = f++data Program = Program+    { progName :: Name+    , readVar  :: Name+    , block    :: Block+    , writeVar :: Name+    } deriving (Eq, Ord)++type Block = [Command]++data Command+    = Assign Name       Expression+    | While  Expression Block+    | IfElse Expression Block Block+    deriving (Eq, Ord)++data Expression+    = Var  Name  +    | Lit  ETree+    | Cons Expression Expression+    | Hd   Expression+    | Tl   Expression+    | IsEq Expression Expression+    deriving (Eq, Ord)++-- ETrees are evaluated expressions - just cons and nil.+data ETree = ECons ETree ETree | ENil deriving (Eq, Ord)++instance Show Name where+    show (Name (fp, x)) = x++instance Show Program where+    show (Program n r b w) = (show n) ++ "read " ++ (show r) ++ " "+                        ++ (showBlock 0 b) ++ "write " ++ (show w)++instance Show Command where+    show c = showC 0 c++showBlock :: Int -> Block -> String+showBlock i [] = "{}"+showBlock i l  = "{\n"+              ++ (concat $ intersperse ";\n" $ map (showC (i + 1)) l)+              ++ "\n"+              ++ (tabs i) ++ "}\n"++showC :: Int -> Command -> String+showC i comm = tabs i ++ case comm of+    While  x b     -> "while " ++ show x ++ showBlock i b+    Assign v x     -> (show v) ++ " := " ++ show x+    IfElse e bt bf -> "if " ++ show e ++ " " ++ showBlock i bt+                   ++ (tabs i) ++ "else " ++ showBlock i bf++tabs :: Int -> String+tabs x | x <  0 = error "negative tabs"+       | x == 0 = ""+       | x >  0 = "    " ++ tabs (x - 1)++instance Show Expression where+    show (Var  s  ) = show s+    show (Lit  t  ) = show t+    show (Cons a b) = "(cons " ++ show a ++ " " ++ show b ++ ")"+    show (Hd   x  ) = "hd " ++ show x+    show (Tl   x  ) = "tl " ++ show x+    show (IsEq a b) = show a ++ " = " ++ show b++instance Show ETree where+    show  ENil       = "nil"+    show (ECons l r) = "<" ++ show l ++ "." ++ show r ++ ">"++data Atom+    = AtomAsgn+    | AtomDoAsgn+    | AtomWhile+    | AtomDoWhile+    | AtomIf+    | AtomDoIf+    | AtomVar+    | AtomQuote+    | AtomHd+    | AtomDoHd+    | AtomTl+    | AtomDoTl+    | AtomCons+    | AtomDoCons+    deriving (Eq, Ord)++instance Show Atom where+    show atom = case atom of+        AtomAsgn    -> "@:="+        AtomDoAsgn  -> "@doAsgn"+        AtomWhile   -> "@while"+        AtomDoWhile -> "@doWhile"+        AtomIf      -> "@if"+        AtomDoIf    -> "@doIf"+        AtomVar     -> "@var"+        AtomQuote   -> "@quote"+        AtomHd      -> "@hd"+        AtomDoHd    -> "@doHd"+        AtomTl      -> "@tl"+        AtomDoTl    -> "@doTl"+        AtomCons    -> "@cons"+        AtomDoCons  -> "@doCons"++--------------------------------------------------------------------------------+-- Name enumeration functions+--------------------------------------------------------------------------------++namesProg :: Program -> S.Set Name+namesProg (Program n r b w) = foldr S.insert (namesBlock b) [n, r, w]++namesBlock :: Block -> S.Set Name+namesBlock = S.unions . map namesComm++namesComm :: Command -> S.Set Name+namesComm comm = case comm of+    Assign n e     -> S.insert n (namesExpr e)+    While  e b     -> S.union (namesExpr e) (namesBlock b)+    IfElse e bt bf -> S.unions [namesExpr e, namesBlock bt, namesBlock bf]++namesExpr :: Expression -> S.Set Name+namesExpr expr = case expr of+    Var  n     -> S.singleton n+    Lit  _     -> S.empty+    Cons e1 e2 -> S.union (namesExpr e1) (namesExpr e2)+    Hd   e     -> namesExpr e+    Tl   e     -> namesExpr e+    IsEq e1 e2 -> S.union (namesExpr e1) (namesExpr e2)++--------------------------------------------------------------------------------+-- Syntax Conversion & Showing Functions+--------------------------------------------------------------------------------++atomToInt :: Atom -> Int+atomToInt atom = case atom of+    AtomAsgn    ->  2+    AtomDoAsgn  ->  3+    AtomWhile   ->  5+    AtomDoWhile ->  7+    AtomIf      -> 11+    AtomDoIf    -> 13+    AtomVar     -> 17+    AtomQuote   -> 19+    AtomHd      -> 23+    AtomDoHd    -> 29+    AtomTl      -> 31+    AtomDoTl    -> 37+    AtomCons    -> 41+    AtomDoCons  -> 43++atomToTree :: Atom -> ETree+atomToTree = intToTree . atomToInt++treeToAtom :: ETree -> Maybe Atom+treeToAtom t = parseInt t >>= intToAtom++intToAtom :: Int -> Maybe Atom+intToAtom int = case int of+    2  -> Just AtomAsgn+    3  -> Just AtomDoAsgn+    5  -> Just AtomWhile+    7  -> Just AtomDoWhile+    11 -> Just AtomIf+    13 -> Just AtomDoIf+    17 -> Just AtomVar+    19 -> Just AtomQuote+    23 -> Just AtomHd+    29 -> Just AtomDoHd+    31 -> Just AtomTl+    37 -> Just AtomDoTl+    41 -> Just AtomCons+    43 -> Just AtomDoCons+    _  -> Nothing++-- Convert a while integer expression into a decimal number string. If the+-- isVerbose argument is True, unparsable expressions will be displayed in full.+-- If it is False, unparsable expressions yield "E".+showIntTree :: Bool -> ETree -> String+showIntTree isVerbose e =+    maybe (if isVerbose then show e else "E") show (parseInt e)++showIntListTree :: Bool -> ETree -> String+showIntListTree isVerbose e =+    showListOf (showIntTree isVerbose) (toHaskellList e)++showNestedIntListTree :: ETree -> String+showNestedIntListTree e = maybe+    (showListOf showNestedIntListTree (toHaskellList e)) show (parseInt e)++showNestedAtomIntListTree :: ETree -> String+showNestedAtomIntListTree = tryAtomThenIntThenList+    where+    tryIntThenList :: ETree -> String+    tryIntThenList t = case parseInt t of+        Just i  -> show i+        Nothing -> case toHaskellList t of+            []   -> "0" -- unreachable as this would parse as an int+            e:es -> showStringsAsList $+                tryAtomThenIntThenList e : (map tryIntThenList es)+    tryAtomThenIntThenList :: ETree -> String+    tryAtomThenIntThenList t = case treeToAtom t of+        Just a  -> show a+        Nothing -> tryIntThenList t++showProgramTree :: ETree -> Maybe String+showProgramTree e = case toHaskellList e of+    [x, blk, y] -> do+        xi     <- parseInt x+        yi     <- parseInt y+        blkStr <- showBlockTree 1 blk+        return $ showStringsAsListFmt 0 [show xi, blkStr, show yi]+    _ -> Nothing++showBlockTree :: Int -> ETree -> Maybe String+showBlockTree t blk = do+    comms <- sequence $ map (showCommandTree (succ t)) $ toHaskellList blk+    return $ showStringsAsListFmt t comms++showCommandTree :: Int -> ETree -> Maybe String+showCommandTree t e = case toHaskellList e of+    [atomT, arg1, arg2] -> do+        atom  <- treeToAtom atomT+        case atom of+            AtomWhile -> do+                exp <- showExpressionTree arg1+                blk <- showBlockTree (succ t) arg2+                return $ showStringsAsListFmt t+                    [((show atom) ++ ", " ++ exp), blk]+            AtomAsgn  -> do+                var <- parseInt           arg1+                exp <- showExpressionTree arg2+                return $ showStringsAsList [show atom, show var, exp]+            _ -> Nothing+    [atomT, arg1, arg2, arg3] -> do+        atom  <- treeToAtom atomT+        case atom of+            AtomIf -> do+                exp <- showExpressionTree arg1+                bt  <- showBlockTree (succ t) arg2+                bf  <- showBlockTree (succ t) arg3+                return $ showStringsAsListFmt t+                    [((show atom) ++ ", " ++ exp), bt, bf]+            _ -> Nothing+    _ -> Nothing++showExpressionTree :: ETree -> Maybe String+showExpressionTree e = case toHaskellList e of+    [atomT, arg1, arg2] -> do+        atom  <- treeToAtom atomT+        case atom of+            AtomCons -> do+                hdE <- showExpressionTree arg1+                tlE <- showExpressionTree arg2+                return $ showStringsAsList [show atom, hdE, tlE]+            _        -> Nothing+    [atomT, ENil] -> do+        atom  <- treeToAtom atomT+        case atom of+            AtomQuote -> return $ showStringsAsList [show atom, show ENil]+            AtomVar   -> return $ showStringsAsList [show atom, show 0   ]+            _         -> Nothing+    [atomT, arg] -> do+        atom  <- treeToAtom atomT+        case atom of+            AtomVar   -> do+                var <- parseInt arg+                return $ showStringsAsList [show atom, show var]+            AtomHd    -> do+                exp <- showExpressionTree arg+                return $ showStringsAsList [show atom, exp]+            AtomTl    -> do+                exp <- showExpressionTree arg+                return $ showStringsAsList [show atom, exp]+            _ -> Nothing+    _ -> Nothing++-- Parse an Int from a while Expression. Not all while expressions encode+-- integers, so return a value in the Maybe monad.+parseInt :: ETree -> Maybe Int+parseInt = parseIntAcc 0+    where+    parseIntAcc :: Int -> ETree -> Maybe Int+    parseIntAcc acc ENil           = Just acc+    parseIntAcc acc (ECons ENil x) = parseIntAcc (acc + 1) x+    parseIntAcc acc _              = Nothing++-- Makes an Expression from an Int, using accumulating parameter style+intToTree :: Int -> ETree+intToTree = intToTreeAcc ENil+    where+    intToTreeAcc acc 0 = acc+    intToTreeAcc acc n = intToTreeAcc (ECons ENil acc) (n - 1)++-- Convert a while expression encoded list into a haskell list+toHaskellList :: ETree -> [ETree]+toHaskellList = reverse . (toHaskellListAcc [])+    where+    toHaskellListAcc :: [ETree] -> ETree -> [ETree]+    toHaskellListAcc acc exp = case exp of+        ENil              -> acc+        (ECons elem rest) -> toHaskellListAcc (elem : acc) rest++-- Given a function to show an ETree and a list of ETrees, show a a list of+-- ETrees where the elements are shown by the given function+showListOf :: (ETree -> String) -> [ETree] -> String+showListOf showFn = showStringsAsList . map showFn++-- Take a list of strings, intersperse ", " within them, concatenate them and+-- add square brackets around that+showStringsAsList :: [String] -> String+showStringsAsList ss = "[" ++ (concat $ intersperse ", " ss) ++ "]"++-- showStringsAsList with one element per line and indentation+showStringsAsListFmt :: Int -> [String] -> String+showStringsAsListFmt t []     = "[]"+showStringsAsListFmt t (s:[]) = "\n"+    ++ (tabs t) ++ "[ " ++ s ++ "\n"+    ++ (tabs t) ++ "]"+showStringsAsListFmt t (s:ss) = "\n"+    ++ (tabs t) ++ "[ " ++ s ++ "\n"+    ++ (tabs t) ++ ", "+        ++ (concat $ intersperse ("\n" ++ (tabs t) ++ ", ") ss) ++ "\n"+    ++ (tabs t) ++ "]"++-- Convert a list of Expressions into a single list expression+expFromHaskellList :: [Expression] -> Expression+expFromHaskellList (h:t) = Cons h (expFromHaskellList t)+expFromHaskellList []    = Lit ENil++-- Convert a list of ETrees into a single list ETree+treeFromHaskellList :: [ETree] -> ETree+treeFromHaskellList (h:t) = ECons h (treeFromHaskellList t)+treeFromHaskellList []    = ENil
+ src/lib/REPL.hs view
@@ -0,0 +1,432 @@+module REPL (REPL, runREPL, emptyREPLState) where++import qualified Lexer        as L+import qualified SourceParser as SP+import qualified DesugarSI    as DS+import PureSyntax+import InterSyntax+import SugarSyntax+import PureInterpreter (evalExpr, Store)++import Prelude hiding (break)+import Text.Read (readMaybe)+import Data.Either (lefts, either)+import Data.List (isPrefixOf, intersperse, intercalate)+import qualified Data.Map as M+import qualified Data.Set as S+import Control.Monad.State.Strict+import Control.Monad.Except+import qualified System.Console.Haskeline as HL+import qualified System.Console.Repline   as RL++--------------------------------------------------------------------------------+-- Types+--------------------------------------------------------------------------------++type REPL a = RL.HaskelineT (StateT REPLState IO) a++type Breakpoint = (FilePath, Int)++data DebugOp = WhileRead Name ETree | WhileWrite Name | Message String+    deriving (Show, Eq, Ord)++namesDebugOp :: DebugOp -> S.Set Name+namesDebugOp dbo = case dbo of+    WhileRead  n _ -> S.singleton n+    WhileWrite n   -> S.singleton n+    _              -> S.empty++type REPLState =+    ( Store                         -- The store for interactive execution+    , [Either InCommand DebugOp]    -- A loaded program that can be executed.+                                    -- This is a list of either a while command+                                    -- to execute, or a debugger-level+                                    -- instruction to carry out.+    , S.Set Breakpoint              -- Breakpoints that we pause at+    , ETree -> String               -- Tree printing function+    , FilePath                      -- Current file search path+    )++emptyREPLState :: REPLState+emptyREPLState = (M.empty, [], S.empty, show, ".")++--------------------------------------------------------------------------------+-- Repline bits and pieces+--------------------------------------------------------------------------------++runREPL :: StateT REPLState IO ()+runREPL = RL.evalRepl "HWhile> " execute options (RL.Word0 completer) initialise++execute :: String -> REPL ()+execute str = do+    printFn <- getPrintFn+    path <- getPath+    expTry <- parseExpr str+    case expTry of+        Left err -> do+            suCommTry <- parseComm str+            case suCommTry of+                Left err   -> replPutStrLn err+                Right suComm -> do+                    commTry <- desugarComm path suComm+                    case commTry of+                        Left err   -> replPutStrLn err+                        Right comm -> do+                            store <- getStore+                            putStore $ evalInBlock store comm+        Right exp -> do+            store <- getStore+            replPutStrLn $ printFn $ evalExpr store exp++initialise :: REPL ()+initialise = replPutStrLn welcomeString++options :: [(String, [String] -> REPL ())]+options =+    [ ("help"     , help     )+    , ("load"     , load     )+    , ("run"      , run      )+    , ("printmode", printmode)+    , ("cd"       , cd       )+    , ("store"    , store    )+    , ("step"     , step     )+    , ("break"    , break    )+    , ("delbreak" , delbreak )+    ]++help :: [String] -> REPL ()+help _ = liftIO $ putStrLn helpString++load :: [String] -> REPL ()+load args =+    if length args <= 1 then+        replPutStrLn $ "Please supply a single while program name, and an " +++            "argument literal (e.g. <nil.nil>)."+    else do+        path    <- getPath+        progTry <- loadProg path (head args)+        argTry  <- parseLVal (intercalate " " (tail args))+        case (progTry, argTry) of+            (Left  err1, Left  err2) -> do replPutStrLn err1 ; replPutStrLn err2+            (_         , Left  err ) -> replPutStrLn err+            (Left  err , _         ) -> replPutStrLn err+            (Right prog, Right arg ) -> do+                clearStore+                replPutStrLn $ "Program '" ++ (head args) ++ "' loaded."+                case prog of+                    InProgram _ rd blk wr ->+                        putProg $ [Right (WhileRead rd arg)] ++ map Left blk +++                            [Right (WhileWrite wr)]++run :: [String] -> REPL ()+run args =+    if length args /= 0 then+        replPutStrLn $ "Error: did not expect '" ++ intercalate " " args ++ "'."+    else do+        store   <- getStore+        bps     <- getBreakpoints+        blk     <- getProg+        printFn <- getPrintFn+        let (store', blk', msg) = runToBreakpoint store bps blk printFn+        putStore store'+        putProg blk'+        replPutStrLn msg++printmode :: [String] -> REPL ()+printmode args =+    if length args /= 1 then+        replPutStrLn "Please supply a single print mode string."+    else case head args of+        "i"   -> putPrintFn $ \tree -> maybe "E" show $ parseInt tree+        "iv"  -> putPrintFn $ \tree -> maybe (show tree) show $ parseInt tree+        "l"   -> putPrintFn $ show . toHaskellList+        "li"  -> putPrintFn $ showIntListTree False+        "liv" -> putPrintFn $ showIntListTree True+        "L"   -> putPrintFn $ showNestedIntListTree+        "La"  -> putPrintFn $ showNestedAtomIntListTree+        _     -> replPutStrLn $ "Error - valid modes are i, iv, l, li, liv, " +++            "L, and La. Quit interactive mode and then run 'hwhile -h' for " +++            "more information."++cd :: [String] -> REPL ()+cd args =+    if length args /= 1 then+         replPutStrLn "Please supply a single directory path."+    else+        putPath (head args)++store :: [String] -> REPL ()+store args =+    if length args /= 0 then+        replPutStrLn $ "Error: did not expect '" ++ intercalate " " args ++ "'."+    else do+        store <- getStore+        printFn <- getPrintFn+        let output = intercalate "\n" $+                map (\(Name (fp, n), tree) ->+                        "(" ++ fp ++ ") " ++ n ++ " := " ++ printFn tree) $+                M.assocs store+        replPutStrLn output++step :: [String] -> REPL ()+step args =+    if length args /= 0 then+        replPutStrLn $ "Error: did not expect '" ++ intercalate " " args ++ "'."+    else do+        store   <- getStore+        blk     <- getProg+        printFn <- getPrintFn+        let (store', blk', msg) = doStep store blk printFn+        putStore store'+        putProg blk'+        replPutStrLn msg++break :: [String] -> REPL ()+break [lineStr] = do fp <- getCurrentFilePath ; doBreak fp (readMaybe lineStr)+break [lineStr, fp] = doBreak fp (readMaybe lineStr)+break _ = replPutStrLn $+    "Please supply a line number and optionally a single filename."++doBreak :: String -> Maybe Int -> REPL()+doBreak fp maybeLine =+    if fp == "<interactive>" then replPutStrLn $+        "Cannot set breakpoint as no program is loaded. Load one with " +++            "':load' and try again."+    else case maybeLine of+        Nothing -> replPutStrLn "Please supply a line number."+        Just n  -> do+            putBreakpoint (fp, n)+            replPutStrLn $ "Breakpoint set in program " ++ fp +++                " at line " ++ show n ++ "."++delbreak :: [String] -> REPL ()+delbreak [lineStr] = do+    fp <- getCurrentFilePath+    doDelBreak fp (readMaybe lineStr)+delbreak [lineStr, fp] =+    doDelBreak fp (readMaybe lineStr)+delbreak _ = replPutStrLn $+    "Please supply a line number and optionally a single filename."++doDelBreak :: String -> Maybe Int -> REPL()+doDelBreak fp maybeLine =+    if fp == "<interactive>" then+        replPutStrLn "Cannot delete breakpoint as no program is loaded."+    else case maybeLine of+        Nothing -> replPutStrLn "Please supply a line number."+        Just n  -> do+            delBreakpoint (fp, n)+            replPutStrLn $ "Breakpoint removed from program " ++ fp +++                " at line " ++ show n ++ "."++completer :: Monad m => RL.WordCompleter m+completer str = do+    let completionWords = [+            "nil"    , "cons"      , "hd"      , "tl"    , "while"   ,+            "switch" , "case"      , "default" , "if"    , "else"    ,+            "true"   , "false"     , "@:="     , "@asgn" , "@doAsgn" ,+            "@while" , "@doWhile"  , "@if"     , "@doIf" , "@var"    ,+            "@quote" , "@hd"       , "@doHd"   , "@tl"   , "@doTl"   ,+            "@cons"  , "@doCons"   ]+            ++ map ((':' :) . fst) options+    return $ filter (str `isPrefixOf`) completionWords++replPutStrLn :: String -> REPL ()+replPutStrLn = lift . lift . putStrLn++--------------------------------------------------------------------------------+-- InProgram/InCommand/Inblock evaluators for interactivity+--------------------------------------------------------------------------------++runToBreakpoint :: Store -> S.Set Breakpoint -> [Either InCommand DebugOp] ->+    (ETree -> String) -> (Store, [Either InCommand DebugOp], String)+runToBreakpoint store bps blk printFn =+    let res@(store', blk', msg) = doStep store blk printFn in+        case blk' of+            []              -> res+            Right _     : _ -> runToBreakpoint store' bps blk' printFn+            Left inComm : _ -> case info inComm of+                Info i@(fp, line) ->+                    if S.member i bps then+                        (store', blk', "Stopping at line " ++ show line +++                            " of program " ++ fp ++ ".")+                    else+                        runToBreakpoint store' bps blk' printFn++doStep :: Store -> [Either InCommand DebugOp] -> (ETree -> String) ->+    (Store, [Either InCommand DebugOp], String)+doStep store []            printFn = (store, [], "No program loaded.")+doStep store (comm : rest) printFn = case comm of+    Left (InAssign _ n e) -> let evalE = evalExpr store e in+        (M.insert n evalE store, rest, show n ++ " := " ++ printFn evalE)+    Left (InWhile  _ gd blk) -> case evalExpr store gd of+        ENil -> (store, rest, "Skipped or exited while-loop.")+        _    -> (store, (map Left blk) ++ (comm : rest),+            "while " ++ show gd ++ " { ...\nEntered or re-entered while-loop.")+    Left (InIfElse _ gd tb fb) -> case evalExpr store gd of+        ENil -> (store, (map Left fb) ++ rest,+            "if " ++ show gd ++ " { ...\nTook if-branch.")+        _    -> (store, (map Left tb) ++ rest,+            "if " ++ show gd ++ " { ...\nTook else-branch or skipped.")+    Left (InSwitch _ gd [] def) ->+        (store, (map Left def) ++ rest,+            "switch " ++ show gd ++ " { ... \nTook default case.")+    Left (InSwitch i gd ((e, blk) : cases) def) ->+        if evalExpr store gd == evalExpr store e then+            (store, (map Left blk) ++ rest,+                "switch " ++ show gd ++ " { ...\n    case " ++ show e +++                ": ...\nTook switch-case.")+        else+            (store, Left (InSwitch i gd cases def) : rest,+                "switch " ++ show gd ++ " { ...\n    case " ++ show e +++                ": ...\nSkipped switch-case.")+    Right (WhileRead n arg) -> (M.insert n arg store, rest, "read " +++        show n ++ " := " ++ printFn arg)+    Right (WhileWrite n) -> (store, rest, "wrote " ++ show n ++ " := " +++        (printFn (M.findWithDefault ENil n store)))+    Right (Message m) -> (store, rest, m)++evalInCommand :: Store -> InCommand -> Store+evalInCommand store comm = case comm of+    InAssign _ n e -> M.insert n (evalExpr store e) store+    InWhile  _ gd blk -> case evalExpr store gd of+        ENil -> store+        _    -> evalInCommand (evalInBlock store blk) comm+    InIfElse _ gd tb fb -> case evalExpr store gd of+        ENil -> evalInBlock store fb+        _    -> evalInBlock store tb+    InSwitch _ gd [] def -> evalInBlock store def+    InSwitch i gd ((e, blk) : cases) def ->+        if evalExpr store gd == evalExpr store e then+            evalInBlock store blk+        else+            evalInCommand store (InSwitch i gd cases def)++evalInBlock :: Store -> InBlock -> Store+evalInBlock = foldl evalInCommand++--------------------------------------------------------------------------------+-- REPLState monadic getters and setters+--------------------------------------------------------------------------------++getStore :: REPL Store+getStore = do (store, _, _, _, _) <- lift get ; return store++putStore :: Store -> REPL ()+putStore st = lift $ modify $+    \(_, p, bps, pf, fp) -> (st, p, bps, pf, fp)++clearStore :: REPL ()+clearStore = putStore M.empty++getFromStore :: Name -> REPL (Maybe ETree)+getFromStore name = do store <- getStore ; return $ M.lookup name store++putInStore :: Name -> ETree -> REPL ()+putInStore n t = do store <- getStore ; putStore $ M.insert n t store++getProg :: REPL [Either InCommand DebugOp]+getProg = do (_, p, _, _, _) <- lift get ; return p++putProg :: [Either InCommand DebugOp] -> REPL ()+putProg blk = lift $ modify $ \(st, _, bps, pf, fp) -> (st, blk, bps, pf, fp)++getCurrentFilePath :: REPL FilePath+getCurrentFilePath = do+    blk <- getProg+    case lefts blk of+        [] -> return "<interactive>"+        cs -> return $ case info (head cs) of Info (fp, line) -> fp++getBreakpoints :: REPL (S.Set Breakpoint)+getBreakpoints = do (_, _, bps, _, _) <- lift get ; return bps++putBreakpoints :: S.Set Breakpoint -> REPL ()+putBreakpoints bps = lift $ modify $+    \(st, mp, _, pf, fp) -> (st, mp, bps, pf, fp)++putBreakpoint :: Breakpoint -> REPL ()+putBreakpoint bp = do bps <- getBreakpoints ; putBreakpoints $ S.insert bp bps++delBreakpoint :: Breakpoint -> REPL ()+delBreakpoint bp = do bps <- getBreakpoints ; putBreakpoints $ S.delete bp bps++isBreakpoint :: Breakpoint -> REPL Bool+isBreakpoint bp = do bps <- getBreakpoints ; return $ S.member bp bps++getPrintFn :: REPL (ETree -> String)+getPrintFn = do (_, _, _, pf, _) <- lift get ; return pf++putPrintFn :: (ETree -> String) -> REPL ()+putPrintFn pf = lift $ modify $+    \(st, mp, bps, _, fp) -> (st, mp, bps, pf, fp)++getPath :: REPL FilePath+getPath = do (_, _, _, _, fp) <- lift get ; return fp++putPath :: String -> REPL ()+putPath fp = lift $ modify $+    \(st, mp, bps, pf, _) -> (st, mp, bps, pf, fp)++--------------------------------------------------------------------------------+-- Parser helpers in the REPL monad+--------------------------------------------------------------------------------++parseExpr :: String -> REPL (Either String Expression)+parseExpr str = do+    namePath <- getCurrentFilePath+    lift . lift . runExceptT $ SP.parseExpr (L.scan str namePath)++parseComm :: String -> REPL (Either String SuCommand)+parseComm str = do+    namePath <- getCurrentFilePath+    lift . lift . runExceptT $ SP.parseComm (L.scan str namePath)++parseLVal :: String -> REPL (Either String ETree)+parseLVal str = do+    namePath <- getCurrentFilePath+    lift . lift . runExceptT $ SP.parseLVal (L.scan str namePath)++desugarComm :: FilePath {- Macro search path -} -> SuCommand ->+    REPL (Either String InBlock)+desugarComm path = lift. lift . runExceptT . DS.desugarComm path []++loadProg ::+    FilePath -> -- Search path+    FilePath -> -- Program name+    REPL (Either String InProgram)+loadProg path progName = lift . lift . runExceptT $ DS.loadProg path progName []++--------------------------------------------------------------------------------+-- Some printable contents+--------------------------------------------------------------------------------++helpString :: String+helpString = concat $ (intersperse "\n") $+    [ "HWhile interactive mode. Possible options:"+    , "    <EXPR>         - Evaluate a while expression."+    , "    <COMM>         - Execute a while command."+    , "    :help          - Print this message."+    , "    :load p <EXPR> - Load a while program 'p' (i.e. from the file "+    , "                     'p.while') for execution with argument <EXPR>. Note"+    , "                     that this clears the current store contents."+    , "    :run           - Run the loaded program up until the next "+    , "                     breakpoint."+    , "    :step          - Step through a single line of the loaded program."+    , "    :store         - Print the current store contents."+    , "    :printmode m   - Set the print mode to mode 'm'. Valid modes are i, "+    , "                     iv, l, li, liv, L, and La. Quit interactive mode"+    , "                     and then run 'hwhile -h' for more info on print "+    , "                     modes."+    , "    :cd dir        - Change the current file search path to 'dir'."+    , "    :break n       - Add a breakpoint to line 'n' of the loaded program."+    , "    :break n p     - Add a breakpoint to line 'n' of program 'p'."+    , "    :delbreak n    - Delete the breakpoint on line 'n' of the loaded"+    , "                     program."+    , "    :delbreak n p  - Delete the breakpoint on line 'n' of program 'p'."+    , "    (Ctrl+D)       - Quit interactive mode."+    ]++welcomeString :: String+welcomeString = "Welcome to HWhile interactive mode. Type ':help' for more " +++    "information."
+ src/lib/SourceParser.y view
@@ -0,0 +1,181 @@+{+module SourceParser where++import Lexer+import PureSyntax+import SugarSyntax++import Control.Monad.Except+}++%name parseProg PROGRAM+%name parseExpr EXPR+%name parseComm COMMAND+%name parseLVal LVAL++%monad { ExceptT String IO }+%tokentype { Token }+%error { parseError }++%right IsEq+%right ConsPre+%right ConsInf+%right Hd Tl+%left SemiCo++%token+    Dot       { Token ( _, TkDot         , _ ) }+    OpenBrc   { Token ( _, TkOpenBrc     , _ ) }+    ClosBrc   { Token ( _, TkClosBrc     , _ ) }+    OpenCur   { Token ( _, TkOpenCur     , _ ) }+    ClosCur   { Token ( _, TkClosCur     , _ ) }+    OpenSqu   { Token ( _, TkOpenSqu     , _ ) }+    ClosSqu   { Token ( _, TkClosSqu     , _ ) }+    OpenAng   { Token ( _, TkOpenAng     , _ ) }+    ClosAng   { Token ( _, TkClosAng     , _ ) }+    Comma     { Token ( _, TkComma       , _ ) }+    IsEq      { Token ( _, TkIsEq        , _ ) }+    Assign    { Token ( _, TkAssign      , _ ) }+    Nil       { Token ( _, TkNil         , _ ) }+    SemiCo    { Token ( _, TkSemiCo      , _ ) }+    Cons      { Token ( _, TkCons        , _ ) }+    Hd        { Token ( _, TkHd          , _ ) }+    Tl        { Token ( _, TkTl          , _ ) }+    While     { Token ( _, TkWhile       , _ ) }+    Switch    { Token ( _, TkSwitch      , _ ) }+    Case      { Token ( _, TkCase        , _ ) }+    Default   { Token ( _, TkDefault     , _ ) }+    Colon     { Token ( _, TkColon       , _ ) }+    If        { Token ( _, TkIf          , _ ) }+    Else      { Token ( _, TkElse        , _ ) }+    Read      { Token ( _, TkRead        , _ ) }+    Write     { Token ( _, TkWrite       , _ ) }+    True      { Token ( _, TkTrue        , _ ) }+    False     { Token ( _, TkFalse       , _ ) }+    AtAsgn    { Token ( _, TkAtomAsgn    , _ ) }+    AtDoAsgn  { Token ( _, TkAtomDoAsgn  , _ ) }+    AtWhile   { Token ( _, TkAtomWhile   , _ ) }+    AtDoWhile { Token ( _, TkAtomDoWhile , _ ) }+    AtIf      { Token ( _, TkAtomIf      , _ ) }+    AtDoIf    { Token ( _, TkAtomDoIf    , _ ) }+    AtVar     { Token ( _, TkAtomVar     , _ ) }+    AtQuote   { Token ( _, TkAtomQuote   , _ ) }+    AtHd      { Token ( _, TkAtomHd      , _ ) }+    AtDoHd    { Token ( _, TkAtomDoHd    , _ ) }+    AtTl      { Token ( _, TkAtomTl      , _ ) }+    AtDoTl    { Token ( _, TkAtomDoTl    , _ ) }+    AtCons    { Token ( _, TkAtomCons    , _ ) }+    AtDoCons  { Token ( _, TkAtomDoCons  , _ ) }+    Var       { Token ( _, ITkVar _      , _ ) }+    Int       { Token ( _, ITkInt $$     , _ ) }++%%++PROGRAM :: { SuProgram }+PROGRAM : VAR Read VAR BLOCK Write VAR { SuProgram $1 $3 $4 $6 }++VAR :: { Name }+VAR : Var { Name (tkPath $1, tkVarName $1) }++EXPR :: { Expression }+EXPR : Cons EXPR EXPR       { Cons $2 $3            }+     | VAR                  { Var $1                }+     | OpenBrc EXPR ClosBrc { $2                    }+     | Hd EXPR              { Hd $2                 }+     | Tl EXPR              { Tl $2                 }+     | EXPR IsEq EXPR       { IsEq $1 $3            }+     | EXPLIST              { expFromHaskellList $1 }+     | VAL                  { Lit $1                }++ATOM :: { ETree }+ATOM : AtAsgn    { intToTree  2 }+     | AtDoAsgn  { intToTree  3 }+     | AtWhile   { intToTree  5 }+     | AtDoWhile { intToTree  7 }+     | AtIf      { intToTree 11 }+     | AtDoIf    { intToTree 13 }+     | AtVar     { intToTree 17 }+     | AtQuote   { intToTree 19 }+     | AtHd      { intToTree 23 }+     | AtDoHd    { intToTree 29 }+     | AtTl      { intToTree 31 }+     | AtDoTl    { intToTree 37 }+     | AtCons    { intToTree 41 }+     | AtDoCons  { intToTree 43 }++EXPLIST :: { [Expression] }+EXPLIST : OpenSqu ClosSqu          { []      }+        | OpenSqu EXPR RESTEXPLIST { $2 : $3 }++RESTEXPLIST :: { [Expression] }+RESTEXPLIST : Comma EXPR RESTEXPLIST { $2 : $3 }+            | ClosSqu                { []      }++COMMAND :: { SuCommand }+COMMAND : VAR Assign EXPR+            { SuAssign (Info (tkPath $2, tkLineNo $2)) $1 $3                }+        | VAR Assign OpenAng VAR ClosAng EXPR+            { Macro    (Info (tkPath $2, tkLineNo $2)) $1 (nameName $4) $6  }+        | While EXPR BLOCK+            { SuWhile  (Info (tkPath $1, tkLineNo $1)) $2 $3                }+        | If EXPR BLOCK Else BLOCK+            { SuIfElse (Info (tkPath $1, tkLineNo $1)) $2 $3 $5             }+        | If EXPR BLOCK+            { SuIfElse (Info (tkPath $1, tkLineNo $1)) $2 $3 []             }+        | Switch EXPR OpenCur SWITCHCONT+            { Switch   (Info (tkPath $1, tkLineNo $1)) $2 (fst $4) (snd $4) }++BLOCK :: { SuBlock }+BLOCK : OpenCur      ClosCur { [] }+      | OpenCur CMDS ClosCur { $2 }++CMDS :: { SuBlock }+CMDS : COMMAND SemiCo CMDS { $1 : $3 }+     | COMMAND             { [$1]    }++SWITCHCONT :: { ([(Expression, SuBlock)], SuBlock) }+SWITCHCONT : Case EXPR Colon CMDS SWITCHCONT { (($2, $4) : fst $5, snd $5) }+           | ClosCur                         { ([]               , []    ) }+           | Default Colon CMDS ClosCur      { ([]               , $3    ) }++VAL :: { ETree }+VAL : Nil                         { ENil         }+    | OpenAng VAL Dot VAL ClosAng { ECons $2 $4  }+    | Int                         { intToTree $1 }+    | True                        { intToTree 1  }+    | False                       { intToTree 0  }+    | ATOM                        { $1           }++-- LVALs are VALs, but also with lists allowed. They are only used for command+-- line input, as adding lists to general VALs that occur within EXPs casues+-- ambiguity.+LVAL :: { ETree }+LVAL : Nil                           { ENil                   }+     | OpenAng LVAL Dot LVAL ClosAng { ECons $2 $4            }+     | Int                           { intToTree $1           }+     | True                          { intToTree 1            }+     | False                         { intToTree 0            }+     | LVALLIST                      { treeFromHaskellList $1 }+     | ATOM                          { $1                     }++LVALLIST :: { [ETree] }+LVALLIST : OpenSqu ClosSqu           { []      }+         | OpenSqu LVAL RESTLVALLIST { $2 : $3 }++RESTLVALLIST :: { [ETree] }+RESTLVALLIST : Comma LVAL RESTLVALLIST { $2 : $3 }+             | ClosSqu                 { []      }+{+parseError :: [Token] -> ExceptT String IO a+parseError [] = throwError "Parse error: reached end of file while parsing"+parseError (tok : rest) = throwError $ concat+    [ "Parse error: "+    , (prettyPrintToken tok)+    , " in program/macro '"+    , tkPath tok+    , "', at line "+    , (show (tkLineNo tok))+    , ", char "+    , (show (tkCharNo tok))+    ]+}
+ src/lib/SugarSyntax.hs view
@@ -0,0 +1,43 @@+module SugarSyntax where++{- This module defines a higher-level version of the syntax for commands,+ - including conditional, macro and switch commands. This module is included for+ - easier parsing and translation to pure syntax.+ -}++import qualified Data.Set as S+import PureSyntax++data SuProgram = SuProgram Name Name SuBlock Name deriving Eq+ +type SuBlock = [SuCommand]++newtype Info = Info (FilePath, Int) deriving (Show, Eq, Ord)++-- The sugared command syntax - has conditionals, macros and switches in+-- addition to the pure syntax commands.+data SuCommand+    = SuAssign Info Name Expression+    | SuWhile  Info Expression SuBlock+    | SuIfElse Info Expression SuBlock SuBlock+    | Macro    Info Name FilePath Expression+    | Switch   Info Expression [(Expression, SuBlock)] SuBlock+    deriving (Show, Eq, Ord)++namesSuProg :: SuProgram -> S.Set Name+namesSuProg (SuProgram n r b w) = foldr S.insert (namesSuBlock b) [n, r, w]++namesSuBlock :: SuBlock -> S.Set Name+namesSuBlock = S.unions . map namesSuComm++namesSuComm :: SuCommand -> S.Set Name+namesSuComm comm = case comm of+    SuAssign _ n e     -> S.insert n (namesExpr e)+    SuWhile  _ e b     -> S.union (namesExpr e) (namesSuBlock b)+    SuIfElse _ e bt bf -> S.unions [namesExpr e, namesSuBlock bt, namesSuBlock bf]+    Macro    _ n _  e  -> S.insert n (namesExpr e)+    Switch   _ e eb b  -> S.unions+        [ namesExpr e+        , S.unions (map (\(e, b) -> S.union (namesExpr e) (namesSuBlock b)) eb)+        , namesSuBlock b+        ]
+ src/lib/Unparser.hs view
@@ -0,0 +1,246 @@+module Unparser+    ( unparse+    ) where++import Data.List (intersperse)+import qualified Data.Map as M+import PureSyntax++unparse :: Program -> ETree+unparse p =+    let (vmNoEq, pNoEq) = removeEquality (varMapProg p) p in+        unparseProg vmNoEq pNoEq++--------------------------------------------------------------------------------+-- VarMap generation functions+--------------------------------------------------------------------------------++-- A VarMap is a Data.Map from variable names to integers for a program, for use+-- in list representations of programs.+type VarMap = M.Map Name Int++-- Create a VarMap for the given Program+varMapProg :: Program -> VarMap+varMapProg (Program _ rd blk wrt) =+    varMapName (varMapBlock (M.singleton rd 0) blk) wrt++-- Extend the given VarMap with variables in the given Block+varMapBlock :: VarMap -> Block -> VarMap+varMapBlock vm []     = vm+varMapBlock vm (c:cs) = varMapBlock (varMapComm vm c) cs++-- Extend the given VarMap with variables in the given Command+varMapComm :: VarMap -> Command -> VarMap+varMapComm vm comm = case comm of+    Assign v x     -> varMapExpr (varMapName vm v) x+    While  x b     -> varMapBlock (varMapExpr vm x) b+    IfElse e bt bf -> varMapExpr (varMapBlock (varMapBlock vm bf) bt) e++-- Extend the given VarMap with variables in the given Expression+varMapExpr :: VarMap -> Expression -> VarMap+varMapExpr vm expr = case expr of+    Var  s   -> varMapName vm s+    Lit  _   -> vm+    Cons a b -> varMapExpr (varMapExpr vm a) b+    Hd   x   -> varMapExpr vm x+    Tl   x   -> varMapExpr vm x+    IsEq a b -> varMapExpr (varMapExpr vm a) b++varMapName :: VarMap -> Name -> VarMap+varMapName vm n | M.member n vm = vm+                | otherwise     = M.insert n ((succ . maximum . M.elems) vm) vm++--------------------------------------------------------------------------------+-- Unparsing functions - require equality to already be removed+--------------------------------------------------------------------------------++unparseProg :: VarMap -> Program -> ETree+unparseProg vm (Program _ x b y) =+    treeFromHaskellList [unparseName vm x, unparseBlock vm b, unparseName vm y]++unparseBlock :: VarMap -> Block -> ETree+unparseBlock vm blk = treeFromHaskellList $ map (unparseComm vm) blk++unparseComm :: VarMap -> Command -> ETree+unparseComm vm comm = treeFromHaskellList $ case comm of+    Assign v x     ->+        [ atomToTree AtomAsgn+        , unparseName vm v+        , unparseExpr vm x+        ]+    While  x b     ->+        [ atomToTree AtomWhile+        , unparseExpr vm x+        , unparseBlock vm b+        ]+    IfElse x bt bf ->+        [ atomToTree AtomIf+        , unparseExpr vm x+        , unparseBlock vm bt+        , unparseBlock vm bf+        ]++unparseExpr :: VarMap -> Expression -> ETree+unparseExpr vm expr = treeFromHaskellList $ case expr of+    Lit (ECons a b) ->+        [ atomToTree AtomCons+        , unparseExpr vm (Lit a)+        , unparseExpr vm (Lit b)+        ]+    Lit  ENil       ->+        [ atomToTree AtomQuote+        , ENil+        ]+    Var  s          ->+        [ atomToTree AtomVar+        , unparseName vm s+        ]+    Cons a b        ->+        [ atomToTree AtomCons+        , unparseExpr vm a+        , unparseExpr vm b+        ]+    Hd   x          ->+        [ atomToTree AtomHd+        , unparseExpr vm x+        ]+    Tl   x          ->+        [ atomToTree AtomTl+        , unparseExpr vm x+        ]+    IsEq a b        -> error "Unparse equality expression"++unparseName :: VarMap -> Name -> ETree+unparseName vm n = maybe (error "Unparse VarMap miss") intToTree (M.lookup n vm)++--------------------------------------------------------------------------------+-- Equality removal functions - require a VarMap for the given program+--------------------------------------------------------------------------------++-- To remove equality from a program, remove it from the block+removeEquality :: VarMap -> Program -> (VarMap, Program)+removeEquality vm (Program n x blk y) =+    let (vmB, rBlk) = removeEqualityBlock vm blk in (vmB, Program n x rBlk y)++-- To remove equality from a block, remove it from each command in the block+removeEqualityBlock :: VarMap -> Block -> (VarMap, Block)+removeEqualityBlock vm []     = (vm, [])+removeEqualityBlock vm (c:cs) =+    let (vmC , cBlk) = removeEqualityComm  vm  c+        (vmCs, rBlk) = removeEqualityBlock vmC cs in+            (vmCs, cBlk ++ rBlk)++-- To remove equality from a command, replace all equality expressions in+-- contained expressions with new variables, and assign to those variables the+-- result of the equalities, prior to the command itself.+removeEqualityComm :: VarMap -> Command -> (VarMap, Block)+removeEqualityComm vm comm = case comm of+    Assign v x     -> case removeEqualityExpr vm x of+        (_  , _ , [] ) -> (vm ,        [ Assign v x  ])+        (vmX, rX, blk) -> (vmX, blk ++ [ Assign v rX ])+    While  x b     -> let (vmB, blkN) = removeEqualityBlock vm b in+        case removeEqualityExpr vmB x of+            (_   , _ , []  ) -> (vmB ,         [ While x  blkN ])+            (vmBX, rX, blkX) -> (vmBX, blkX ++ [ While rX blkN ])+    IfElse x bt bf -> let+        (vmBT  , blkT) = removeEqualityBlock vm   bt+        (vmBTBF, blkF) = removeEqualityBlock vmBT bf in+        case removeEqualityExpr vmBTBF x of+            (_      , _ , []  ) -> (vmBTBF ,         [ IfElse x  blkT blkF ])+            (vmBTBFX, rX, blkX) -> (vmBTBFX, blkX ++ [ IfElse rX blkT blkF ])++-- Insert variables in place of equality expressions, returning the new+-- expression and a list of commands to evaluate equality, leaving the result in+-- the inserted variable.+removeEqualityExpr ::+    VarMap     ->   -- the initial VarMap+    Expression ->   -- the expression to substitute+    ( VarMap        -- the final VarMap+    , Expression    -- the replacement expression (always a Var)+    , Block         -- Commands to evaluate the equality+    )+removeEqualityExpr vm exp = case exp of+    Var  _ -> (vm, exp, [])+    Lit  _ -> (vm, exp, [])+    Hd   x -> let (vmX, rX, blk) = removeEqualityExpr vm x in (vmX, Hd rX, blk)+    Tl   x -> let (vmX, rX, blk) = removeEqualityExpr vm x in (vmX, Tl rX, blk)+    Cons a b -> let+        (vmA , rA, blkA) = removeEqualityExpr vm  a+        (vmAB, rB, blkB) = removeEqualityExpr vmA b in+            (vmAB, Cons rA rB, blkA ++ blkB)+    IsEq a b -> let+        (vmA , rA, blkA) = removeEqualityExpr vm  a+        (vmAB, rB, blkB) = removeEqualityExpr vmA b+        nameNum          = (succ . maximum . M.elems) vm+        name             = iname ("+EQ+" ++ show nameNum ++ "+")+        vmABN            = M.insert name nameNum vmAB+        (vmABNE, eqComm) = equalityTester vmABN name+        in+        (vmABNE, Var name, blkA ++ blkB +++            [ Assign (iname stack) (lst [lst [rA, rB]])+            , eqComm+            ])++-- Generate a command that tests equality using a stack. Requires the stack set+-- up as a singleton list containing a two element list, where the inner list+-- contains either side of the equality expression. Once the command has run,+-- the variable with the given name will be 0 if not equal, or 1 if they are.+equalityTester :: VarMap -> Name -> (VarMap, Command)+equalityTester vm equals = let+    vmNew = foldl (\m n -> varMapName m (iname n)) vm [stack, next, a, b]+    in (vmNew, IfElse (Lit ENil) []+        [ Assign equals (Lit (intToTree 1))+        , whilev stack+            [ asgn next  (Hd (v stack))+            , asgn stack (Tl (v stack))+            , asgn a     (Hd (v next ))+            , asgn b     (Hd (Tl (v next)))+            , ifv a+                [ ifv b+                    [ asgn stack $ Cons (lst [Hd (v a), Hd (v b)]) (v stack)+                    , asgn stack $ Cons (lst [Tl (v a), Tl (v b)]) (v stack)+                    ]+                    [ asgn   stack  (Lit ENil)+                    , Assign equals (Lit ENil)+                    ]+                ]+                [ ifv b+                    [ asgn   stack  (Lit ENil)+                    , Assign equals (Lit ENil)+                    ] []+                ]+            ]+        ])+    where+    -- AST helper functions++    a :: String+    a = "+NEXT+A+"++    b :: String+    b = "+NEXT+B+"++    next :: String+    next = "+NEXT+"++    v :: String -> Expression+    v = Var . iname++    asgn :: String -> Expression -> Command+    asgn n = Assign (iname n)++    ifv :: String -> Block -> Block -> Command+    ifv n = IfElse (Var (iname n))++    whilev :: String -> Block -> Command+    whilev n = While (Var (iname n))++lst :: [Expression] -> Expression+lst []     = Lit ENil+lst (e:es) = Cons e (lst es)++iname :: String -> Name+iname n = Name ("+IMPL+", n)++stack :: String+stack = "+STACK+"
+ src/test/UnitTests.hs view
@@ -0,0 +1,116 @@+module Main where++import qualified Data.Map        as M+import qualified Data.Set        as S+import qualified Lexer           as L+import qualified SourceParser    as SP+import qualified PureSyntax      as PS+import qualified InterSyntax     as IS+import qualified SugarSyntax     as SS+import qualified PureInterpreter as I+import qualified DesugarSI       as SI+import qualified DesugarIP       as IP++import System.Exit+import Control.Monad.Except++addProg, countProg, equalsProg, numberProg, xorProg, macroProg, casesProg+    :: ExceptT String IO IS.InProgram+addProg    = SI.loadProg "examples" "add"    []+countProg  = SI.loadProg "examples" "count"  []+equalsProg = SI.loadProg "examples" "equals" []+numberProg = SI.loadProg "examples" "number" []+xorProg    = SI.loadProg "examples" "xor"    []+macroProg  = SI.loadProg "examples" "macro"  []+casesProg  = SI.loadProg "examples" "cases"  []++-- Run a program obtained through IO with the given input, and compare the+-- output with a given expression+testRun :: String -> ExceptT String IO IS.InProgram -> String -> IO Bool+testRun argumentString eioProg expectedResultString = do+    prog <- errorIfExcepts eioProg+    argumentExpr <- errorIfExcepts $+        SP.parseLVal (L.scan argumentString       "+TEST+")+    expectedRes  <- errorIfExcepts $+        SP.parseLVal (L.scan expectedResultString "+TEST+")+    return (I.evalProg argumentExpr (IP.desugarProg prog) == expectedRes)++test :: String -> IO Bool -> IO (String, Bool)+test desc ioRes = do+    res <- ioRes+    return (desc, res)++errorIfExcepts :: ExceptT String IO a -> IO a+errorIfExcepts excA = do+    eithA <- runExceptT excA+    case eithA of { Left err -> error err ; Right a -> return a }++main :: IO ExitCode+main = do+    tests <- sequence+        -- xor program+        [ test "Test xor program: t, t -> f"+            (testRun "<<nil.nil>.<nil.nil>>" xorProg    "nil"      )+        , test "Test xor program: f, t -> t"+            (testRun "<nil.<nil.nil>>"       xorProg    "<nil.nil>")+        , test "Test xor program: t, f -> t"+            (testRun "<<nil.nil>.nil>"       xorProg    "<nil.nil>")+        , test "Test xor program: f, f -> f"+            (testRun "<nil.nil>"             xorProg    "nil"      )++        -- add program+        , test "Test add program: 3 + 4 -> 7"+            (testRun "<3.4>"                 addProg    "7"        )+        , test "Test add program: 0 + 0 -> 0"+            (testRun "<0.0>"                 addProg    "0"        )++        -- macro program+        , test "Test macro program: 10, 20 -> 40"+            (testRun "<10.20>"               macroProg  "40"       )+        , test "Test macro program: 0, 0 -> 0"+            (testRun "<0.0>"                 macroProg  "0"        )++        -- equals program+        , test "Test equals program: [1, 2], [1, 2] -> true"+            (testRun "<[1, 2].[1, 2]>"       equalsProg "true"     )+        , test "Test equals program: [1, 1], [1, 2] -> false"+            (testRun "<[1, 1].[1, 2]>"       equalsProg "false"    )++        -- cases program+        , test "Test cases program: 0 -> 0"+            (testRun "0"                     casesProg  "0"        )+        , test "Test cases program: 1 -> 1"+            (testRun "1"                     casesProg  "1"        )+        , test "Test cases program: 2 -> 2"+            (testRun "2"                     casesProg  "2"        )+        , test "Test cases program: 3 -> 3"+            (testRun "3"                     casesProg  "3"        )+        , test "Test cases program: 4 -> 3"+            (testRun "4"                     casesProg  "3"        )++        -- number program+        , test "Test number program: 3 -> true"+            (testRun "3"                     numberProg "true"     )+        , test "Test number program: 0 -> true"+            (testRun "0"                     numberProg "true"     )+        , test "Test number program: [1, 1] -> false"+            (testRun "[1, 1]"                numberProg "false"    )++        -- count program+        , test "Test count program: [] -> 0"+            (testRun "[]"                    countProg  "0"        )+        , test "Test count program: [0] -> 0"+            (testRun "[0]"                   countProg  "0"        )+        , test "Test count program: [0, 0] -> 0"+            (testRun "[0, 0]"                countProg  "0"        )+        , test "Test count program: [0, 1] -> 1"+            (testRun "[0, 1]"                countProg  "1"        )+        , test "Test count program: [0, 1, 2, 3, 4, 5] -> 15"+            (testRun "[0, 1, 2, 3, 4, 5]"    countProg  "15"       )+        ]+    if all snd tests then+        exitSuccess+    else do+        putStr $ concat $ map ((\s ->"FAILED: " ++ s ++ "\n"). fst)+            (filter (not . snd) tests)+        exitFailure