pax_global_header00006660000000000000000000000064124547027220014517gustar00rootroot0000000000000052 comment=e32b13123d3ee06f1677f1c93eadbc18efe7caba python-pyocr-0.3.0/000077500000000000000000000000001245470272200141725ustar00rootroot00000000000000python-pyocr-0.3.0/.gitignore000066400000000000000000000000111245470272200161520ustar00rootroot00000000000000*.pyc *~ python-pyocr-0.3.0/COPYING000066400000000000000000001045131245470272200152310ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 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. Copyright (C) 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 . 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: Copyright (C) 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 . 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 . python-pyocr-0.3.0/ChangeLog000066400000000000000000000022201245470272200157400ustar00rootroot000000000000000.2.4 --> 0.3.0: * New API: pyocr..can_detect_orientation() and pyocr..detect_orientation() 0.2.3 --> 0.2.4: * Tesseract : add digit-only support * Tesseract : add support for Tesseract subsets of layout analysis (-psm) 0.2.2 --> 0.2.3: * Strip the alpha channel from images before running the OCR. It's basically useless and can prevent the tool from working correctly. * Make hOCR parsing more resistant (handle extra data around box positions) * Fix: Take into account that new versions of Tesseract uses the file extension .hocr instead of .html 0.2.1 --> 0.2.2: * Fix Python 3 support * Add support for Tesseract on Heroku 0.2.0 --> 0.2.1: * Make it possible to use 'import pyocr' instead of 'from pyocr import pyocr'. 'from pyocr import pyocr' still works but is obsolete. * Fix dependency list: depends on Pillow (it's untested with PIL) * Fix pyocr.VERSION 0.1.2 --> 0.2.0: * Python 3.x support 0.1.1 --> 0.1.2: * Tesseract: Fix version parsing * Tesseract: Fix Tesseract 3.02.01's hOCR format support 0.1 --> 0.1.1: * hOCR: Parse lines as well as words * tesseract.get_available_languages() : Fix fedora support * Fix UTF-8 support python-pyocr-0.3.0/README.markdown000066400000000000000000000056101245470272200166750ustar00rootroot00000000000000# PyOCR Pyocr is an optical character recognition (OCR) tool wrapper for python. That is, it helps using OCR tools from a Python program. It has been tested only on GNU/Linux systems. It should also work on similar systems (*BSD, etc). It doesn't work on Windows, MacOSX, etc. Pyocr can be used as a wrapper for google's [Tesseract-OCR](http://code.google.com/p/tesseract-ocr/) or Cuneiform. It can read all image types supported by [Pillow](https://github.com/python-imaging/Pillow), including jpeg, png, gif, bmp, tiff, and others. It also support bounding box data. ## Usage from PIL import Image import sys import pyocr import pyocr.builders tools = pyocr.get_available_tools() if len(tools) == 0: print("No OCR tool found") sys.exit(1) tool = tools[0] print("Will use tool '%s'" % (tool.get_name())) # Ex: Will use tool 'tesseract' langs = tool.get_available_languages() print("Available languages: %s" % ", ".join(langs)) lang = langs[0] print("Will use lang '%s'" % (lang)) # Ex: Will use lang 'fra' txt = tool.image_to_string(Image.open('test.png'), lang=lang, builder=pyocr.builders.TextBuilder()) word_boxes = tool.image_to_string(Image.open('test.png'), lang=lang, builder=pyocr.builders.WordBoxBuilder()) line_and_word_boxes = tool.image_to_string( Image.open('test.png'), lang=lang, builder=pyocr.builders.LineBoxBuilder()) # Digits - Only Tesseract digits = tool.image_to_string(Image.open('test-digits.png'), lang=lang, builder=pyocr.tesseract.DigitBuilder()) ## Dependencies * Pyocr requires python 2.7 or later. * You will need [Pillow](https://github.com/python-imaging/Pillow) or Python Imaging Library (PIL). Under Debian/Ubuntu, PIL is in the package "python-imaging". * Install an OCR: * tesseract-ocr from http://code.google.com/p/tesseract-ocr/ ('tesseract-ocr' + 'tesseract-ocr-<lang>' in Debian). You must be able to invoke the tesseract command as "tesseract". Python-tesseract is tested with Tesseract >= 3.01 only. * or cuneiform ## Installation $ sudo python ./setup.py install ## Tests $ python ./run_tests.py Tests are made to be run with the latest versions of Tesseract and Cuneiform. the first tests verify that you're using the expected version. To run the tests, you will need the following lang support: - English (tesseract-ocr-eng) - French (tesseract-ocr-fra) - Japanese (tesseract-ocr-jpn) ## Copyright Pyocr is released under the GPL v3+. tesseract.py: * Copyright (c) Samuel Hoffstaetter, 2009 * Copyright (c) Jerome Flesch, 2011-2013 other files: * Copyright (c) Jerome Flesch, 2011-2013 https://github.com/jflesch/pyocr python-pyocr-0.3.0/run_tests.py000077500000000000000000000021111245470272200165700ustar00rootroot00000000000000#!/usr/bin/env python import sys sys.path = [ "src" ] + sys.path import unittest from pyocr import cuneiform from pyocr import pyocr from pyocr import tesseract from tests import tests_cuneiform from tests import tests_tesseract if __name__ == '__main__': for tool in pyocr.TOOLS: print("- OCR: %s" % tool.get_name()) available = tool.is_available() print(" is_available(): %s" % (str(available))) if available: print(" get_version(): %s" % (str(tool.get_version()))) print(" get_available_languages(): ") print(" " + ", ".join(tool.get_available_languages())) print("") print("") print("OCR tool found:") for tool in pyocr.get_available_tools(): print("- %s" % tool.get_name()) if tesseract.is_available(): print("---") print("Tesseract:") unittest.TextTestRunner().run(tests_tesseract.get_all_tests()) if cuneiform.is_available(): print("---") print("Cuneiform:") unittest.TextTestRunner().run(tests_cuneiform.get_all_tests()) python-pyocr-0.3.0/setup.py000077500000000000000000000024331245470272200157110ustar00rootroot00000000000000#!/usr/bin/env python from setuptools import setup setup( name="pyocr", # Don't forget to update src/pyocr/pyocr.py:VERSION as well version="0.3.0", description=("A Python wrapper for OCR engines (Tesseract, Cuneiform," " etc)"), keywords="tesseract cuneiform ocr", url="https://github.com/jflesch/pyocr", download_url="https://github.com/jflesch/pyocr/archive/v0.2.2.zip", classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later" " (GPLv3+)", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Topic :: Multimedia :: Graphics :: Capture :: Scanners", "Topic :: Multimedia :: Graphics :: Graphics Conversion", "Topic :: Scientific/Engineering :: Image Recognition", ], license="GPLv3+", author="Jerome Flesch", author_email="jflesch@gmail.com", packages=['pyocr'], package_dir={'pyocr': 'src/pyocr'}, data_files=[], scripts=[], install_requires=[ "Pillow", ], ) python-pyocr-0.3.0/src/000077500000000000000000000000001245470272200147615ustar00rootroot00000000000000python-pyocr-0.3.0/src/pyocr/000077500000000000000000000000001245470272200161155ustar00rootroot00000000000000python-pyocr-0.3.0/src/pyocr/__init__.py000066400000000000000000000000251245470272200202230ustar00rootroot00000000000000from .pyocr import * python-pyocr-0.3.0/src/pyocr/builders.py000066400000000000000000000407461245470272200203130ustar00rootroot00000000000000""" Builders: Each builder specifies the expected output format raw text : TextBuilder words + boxes : WordBoxBuilder lines + words + boxes : LineBoxBuilder """ try: from HTMLParser import HTMLParser except ImportError: from html.parser import HTMLParser import xml.dom.minidom from .util import to_unicode __all__ = [ 'Box', 'TextBuilder', 'WordBoxBuilder', 'LineBoxBuilder', ] _XHTML_HEADER = to_unicode(""" \t """) class Box(object): """ Boxes are rectangles around each individual element recognized in the image. Elements are either char or word depending of the builder that was used. """ def __init__(self, content, position): """ Arguments: content --- a single string position --- the position of the box on the image. Given as a tuple of tuple: ((width_pt_x, height_pt_x), (width_pt_y, height_pt_y)) """ if hasattr(content, 'decode'): content = to_unicode("%s") % content self.content = content self.position = position def get_unicode_string(self): """ Return the string corresponding to the box, in unicode (utf8). This string can be stored in a file as-is (see write_box_file()) and reread using read_box_file(). """ return to_unicode("%s %d %d %d %d") % ( self.content, self.position[0][0], self.position[0][1], self.position[1][0], self.position[1][1], ) def get_xml_tag(self, parent_doc): span_tag = parent_doc.createElement("span") span_tag.setAttribute("class", "ocrx_word") span_tag.setAttribute("title", ("bbox %d %d %d %d" % ( (self.position[0][0], self.position[0][1], self.position[1][0], self.position[1][1])))) txt = xml.dom.minidom.Text() txt.data = self.content.encode('utf-8') span_tag.appendChild(txt) return span_tag def __str__(self): return self.get_unicode_string().encode('utf-8') def __box_cmp(self, other): """ Comparison function. """ if other is None: return -1 for (x, y) in ((self.position[0][1], other.position[0][1]), (self.position[1][1], other.position[1][1]), (self.position[0][0], other.position[0][0]), (self.position[1][0], other.position[1][0])): if x < y: return -1 elif x > y: return 1 return 0 def __lt__(self, other): return self.__box_cmp(other) < 0 def __gt__(self, other): return self.__box_cmp(other) > 0 def __eq__(self, other): return self.__box_cmp(other) == 0 def __le__(self, other): return self.__box_cmp(other) <= 0 def __ge__(self, other): return self.__box_cmp(other) >= 0 def __ne__(self, other): return self.__box_cmp(other) != 0 def __hash__(self): position_hash = 0 position_hash += ((self.position[0][0] & 0xFF) << 0) position_hash += ((self.position[0][1] & 0xFF) << 8) position_hash += ((self.position[1][0] & 0xFF) << 16) position_hash += ((self.position[1][1] & 0xFF) << 24) return (position_hash ^ hash(self.content) ^ hash(self.content)) class LineBox(object): """ Boxes are rectangles around each individual element recognized in the image. LineBox are boxes around lines. LineBox contains Box. """ def __init__(self, word_boxes, position): """ Arguments: word_boxes --- a single string position --- the position of the box on the image. Given as a tuple of tuple: ((width_pt_x, height_pt_x), (width_pt_y, height_pt_y)) """ self.word_boxes = word_boxes self.position = position def get_unicode_string(self): """ Return the string corresponding to the box, in unicode (utf8). This string can be stored in a file as-is (see write_box_file()) and reread using read_box_file(). """ txt = to_unicode("[\n") for box in self.word_boxes: txt += to_unicode(" %s\n") % box.get_unicode_string() return to_unicode("%s] %d %d %d %d") % ( txt, self.position[0][0], self.position[0][1], self.position[1][0], self.position[1][1], ) def __get_content(self): txt = to_unicode("") for box in self.word_boxes: txt += box.content + to_unicode(" ") txt = txt.strip() return txt content = property(__get_content) def get_xml_tag(self, parent_doc): span_tag = parent_doc.createElement("span") span_tag.setAttribute("class", "ocr_line") span_tag.setAttribute("title", ("bbox %d %d %d %d" % ( (self.position[0][0], self.position[0][1], self.position[1][0], self.position[1][1])))) for box in self.word_boxes: space = xml.dom.minidom.Text() space.data = " " span_tag.appendChild(space) box_xml = box.get_xml_tag(parent_doc) span_tag.appendChild(box_xml) return span_tag def __str__(self): return self.get_unicode_string().encode('utf-8') def __box_cmp(self, other): """ Comparison function. """ if other is None: return -1 for (x, y) in ((self.position[0][1], other.position[0][1]), (self.position[1][1], other.position[1][1]), (self.position[0][0], other.position[0][0]), (self.position[1][0], other.position[1][0])): if (x < y): return -1 elif (x > y): return 1 return 0 def __lt__(self, other): return self.__box_cmp(other) < 0 def __gt__(self, other): return self.__box_cmp(other) > 0 def __eq__(self, other): return self.__box_cmp(other) == 0 def __le__(self, other): return self.__box_cmp(other) <= 0 def __ge__(self, other): return self.__box_cmp(other) >= 0 def __ne__(self, other): return self.__box_cmp(other) != 0 def __hash__(self): content = self.content position_hash = 0 position_hash += ((self.position[0][0] & 0xFF) << 0) position_hash += ((self.position[0][1] & 0xFF) << 8) position_hash += ((self.position[1][0] & 0xFF) << 16) position_hash += ((self.position[1][1] & 0xFF) << 24) return (position_hash ^ hash(content) ^ hash(content)) class TextBuilder(object): """ If passed to image_to_string(), image_to_string() will return a simple string. This string will be the output of the OCR tool, as-is. In other words, the raw text as produced by the tool. Warning: The returned string is encoded in UTF-8 """ file_extensions = ["txt"] tesseract_configs = [] cuneiform_args = ["-f", "text"] def __init__(self, tesseract_layout=3): self.tesseract_configs = ["-psm", str(tesseract_layout)] pass @staticmethod def read_file(file_descriptor): """ Read a file and extract the content as a string """ return file_descriptor.read().strip() @staticmethod def write_file(file_descriptor, text): """ Write a string in a file """ file_descriptor.write(text) @staticmethod def __str__(): return "Raw text" class _WordHTMLParser(HTMLParser): """ Tesseract style: Tesseract provides handy but non-standard hOCR tags: ocrx_word """ def __init__(self): HTMLParser.__init__(self) self.__tag_types = [] self.__current_box_position = None self.__current_box_text = None self.boxes = [] self.__current_line_position = None self.__current_line_content = [] self.lines = [] @staticmethod def __parse_position(title): for piece in title.split("; "): piece = piece.strip() if not piece.startswith("bbox"): continue piece = piece.split(" ") position = ((int(piece[1]), int(piece[2])), (int(piece[3]), int(piece[4]))) return position raise Exception("Invalid hocr position: %s" % title) def handle_starttag(self, tag, attrs): if (tag != "span"): return position = None tag_type = None for attr in attrs: if attr[0] == 'class': tag_type = attr[1] if attr[0] == 'title': position = attr[1] if position is None or tag_type is None: return if tag_type == 'ocr_word' or tag_type == 'ocrx_word': try: position = self.__parse_position(position) self.__current_box_position = position except Exception: # invalid position --> old format --> we ignore this tag self.__tag_types.append("ignore") return self.__current_box_text = to_unicode("") elif tag_type == 'ocr_line': self.__current_line_position = self.__parse_position(position) self.__current_line_content = [] self.__tag_types.append(tag_type) def handle_data(self, data): if self.__current_box_text is None: return data = to_unicode("%s") % data self.__current_box_text += data def handle_endtag(self, tag): if tag != 'span': return tag_type = self.__tag_types.pop() if tag_type == 'ocr_word' or tag_type == 'ocrx_word': if self.__current_box_text is None: return box_position = self.__current_box_position box = Box(self.__current_box_text, box_position) self.boxes.append(box) self.__current_line_content.append(box) self.__current_box_text = None return elif tag_type == 'ocr_line': line = LineBox(self.__current_line_content, self.__current_line_position) self.lines.append(line) self.__current_line_content = [] return @staticmethod def __str__(): return "WordHTMLParser" class _LineHTMLParser(HTMLParser): """ Cuneiform style: Cuneiform provides the OCR line by line, and for each line, the position of all its characters. Spaces have "-1 -1 -1 -1" for position". """ def __init__(self): HTMLParser.__init__(self) self.boxes = [] self.__line_text = None self.__char_positions = None def handle_starttag(self, tag, attrs): TAG_TYPE_CONTENT = 0 TAG_TYPE_POSITIONS = 1 if (tag != "span"): return tag_type = -1 for attr in attrs: if attr[0] == 'class': if attr[1] == 'ocr_line': tag_type = TAG_TYPE_CONTENT elif attr[1] == 'ocr_cinfo': tag_type = TAG_TYPE_POSITIONS if tag_type == TAG_TYPE_CONTENT: self.__line_text = to_unicode("") self.__char_positions = [] return elif tag_type == TAG_TYPE_POSITIONS: for attr in attrs: if attr[0] == 'title': self.__char_positions = attr[1].split(" ") # strip x_bboxes self.__char_positions = self.__char_positions[1:] if self.__char_positions[-1] == "": self.__char_positions[:-1] try: while True: self.__char_positions.remove("-1") except ValueError: pass def handle_data(self, data): if self.__line_text is None: return self.__line_text += data def handle_endtag(self, tag): if self.__line_text is None or self.__char_positions == []: return words = self.__line_text.split(" ") for word in words: if word == "": continue positions = self.__char_positions[0:4 * len(word)] self.__char_positions = self.__char_positions[4 * len(word):] left_pos = min([int(positions[x]) for x in range(0, 4 * len(word), 4)]) top_pos = min([int(positions[x]) for x in range(1, 4 * len(word), 4)]) right_pos = max([int(positions[x]) for x in range(2, 4 * len(word), 4)]) bottom_pos = max([int(positions[x]) for x in range(3, 4 * len(word), 4)]) box_pos = ((left_pos, top_pos), (right_pos, bottom_pos)) box = Box(word, box_pos) self.boxes.append(box) self.__line_text = None @staticmethod def __str__(): return "LineHTMLParser" class WordBoxBuilder(object): """ If passed to image_to_string(), image_to_string() will return an array of Box. Each box contains a word recognized in the image. """ file_extensions = ["html", "hocr"] tesseract_configs = ['hocr'] cuneiform_args = ["-f", "hocr"] def __init__(self): pass def read_file(self, file_descriptor): """ Extract of set of Box from the lines of 'file_descriptor' Return: An array of Box. """ parsers = [_WordHTMLParser(), _LineHTMLParser()] html_str = file_descriptor.read() for p in parsers: p.feed(html_str) if len(p.boxes) > 0: return p.boxes return [] @staticmethod def write_file(file_descriptor, boxes): """ Write boxes in a box file. Output is a *very* *simplified* version of hOCR. Warning: The file_descriptor must support UTF-8 ! (see module 'codecs') """ global _XHTML_HEADER impl = xml.dom.minidom.getDOMImplementation() newdoc = impl.createDocument(None, "root", None) file_descriptor.write(_XHTML_HEADER) file_descriptor.write(to_unicode("\n")) for box in boxes: xml_str = to_unicode("%s") % box.get_xml_tag(newdoc).toxml() file_descriptor.write(xml_str + to_unicode("
\n")) file_descriptor.write(to_unicode("\n")) @staticmethod def __str__(): return "Word boxes" class LineBoxBuilder(object): """ If passed to image_to_string(), image_to_string() will return an array of LineBox. Each box contains a word recognized in the image. """ file_extensions = ["html", "hocr"] tesseract_configs = ['hocr'] cuneiform_args = ["-f", "hocr"] def __init__(self): pass def read_file(self, file_descriptor): """ Extract of set of Box from the lines of 'file_descriptor' Return: An array of LineBox. """ parsers = [ (_WordHTMLParser(), lambda parser: parser.lines), (_LineHTMLParser(), lambda parser: [LineBox([box], box.position) for box in parser.boxes]), ] html_str = file_descriptor.read() for (parser, convertion) in parsers: parser.feed(html_str) if len(parser.boxes) > 0: return convertion(parser) return [] @staticmethod def write_file(file_descriptor, boxes): """ Write boxes in a box file. Output is a *very* *simplified* version of hOCR. Warning: The file_descriptor must support UTF-8 ! (see module 'codecs') """ global _XHTML_HEADER impl = xml.dom.minidom.getDOMImplementation() newdoc = impl.createDocument(None, "root", None) file_descriptor.write(_XHTML_HEADER) file_descriptor.write(to_unicode("\n")) for box in boxes: xml_str = box.get_xml_tag(newdoc).toxml() if hasattr(xml_str, 'decode'): xml_str = xml_str.decode('utf-8') file_descriptor.write(xml_str + to_unicode("
\n")) file_descriptor.write(to_unicode("\n")) @staticmethod def __str__(): return "Line boxes" python-pyocr-0.3.0/src/pyocr/cuneiform.py000066400000000000000000000077311245470272200204660ustar00rootroot00000000000000#!/usr/bin/env python ''' cuneiform.py is a wrapper for Cuneiform USAGE: > from PIL import Image > from cuneiform import image_to_string > print image_to_string(Image.open('test.png')) > print image_to_string(Image.open('test-european.jpg'), lang='fra') COPYRIGHT: Pyocr is released under the GPL v3. Copyright (c) Samuel Hoffstaetter, 2009 Copyright (c) Jerome Flesch, 2011-2012 https://github.com/jflesch/python-tesseract#readme ''' import codecs from io import BytesIO import os import re import subprocess import tempfile from . import builders from . import util # CHANGE THIS IF CUNEIFORM IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY CUNEIFORM_CMD = 'cuneiform' CUNEIFORM_DATA_POSSIBLE_PATHS = [ "/usr/local/share/cuneiform", "/usr/share/cuneiform", ] LANGUAGES_LINE_PREFIX = "Supported languages: " LANGUAGES_SPLIT_RE = re.compile("[^a-z]") VERSION_LINE_RE = re.compile("Cuneiform for \w+ (\d+).(\d+).(\d+)") __all__ = [ 'can_detect_orientation', 'get_available_builders', 'get_available_languages', 'get_name', 'get_version', 'image_to_string', 'is_available', 'CuneiformError', ] def can_detect_orientation(): return False def get_name(): return "Cuneiform" def get_available_builders(): return [ builders.TextBuilder, builders.WordBoxBuilder, ] class CuneiformError(Exception): def __init__(self, status, message): Exception.__init__(self, message) self.status = status self.message = message self.args = (status, message) def temp_file(suffix): ''' Returns a temporary file ''' return tempfile.NamedTemporaryFile(prefix='cuneiform_', suffix=suffix) def cleanup(filename): ''' Tries to remove the given filename. Ignores non-existent files ''' try: os.remove(filename) except OSError: pass def image_to_string(image, lang=None, builder=None): if builder is None: builder = builders.TextBuilder() with temp_file(builder.file_extensions[0]) as output_file: cmd = [CUNEIFORM_CMD] if lang is not None: cmd += ["-l", lang] cmd += builder.cuneiform_args cmd += ["-o", output_file.name] cmd += ["-"] # stdin img_data = BytesIO() image = image.convert("RGB") image.save(img_data, format="png") proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) proc.stdin.write(img_data.getvalue()) proc.stdin.close() output = proc.stdout.read().decode('utf-8') retcode = proc.wait() if retcode: raise CuneiformError(retcode, output) with codecs.open(output_file.name, 'r', encoding='utf-8', errors='replace') as file_desc: results = builder.read_file(file_desc) return results def is_available(): return util.is_on_path(CUNEIFORM_CMD) def get_available_languages(): proc = subprocess.Popen([CUNEIFORM_CMD, "-l"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output = proc.stdout.read().decode('utf-8') proc.wait() languages = [] for line in output.split("\n"): if not line.startswith(LANGUAGES_LINE_PREFIX): continue line = line[len(LANGUAGES_LINE_PREFIX):] for language in LANGUAGES_SPLIT_RE.split(line): if language == "": continue languages.append(language) return languages def get_version(): proc = subprocess.Popen([CUNEIFORM_CMD], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output = proc.stdout.read().decode('utf-8') proc.wait() for line in output.split("\n"): m = VERSION_LINE_RE.match(line) g = m.groups() if m is not None: ver = (int(g[0]), int(g[1]), int(g[2])) return ver return None python-pyocr-0.3.0/src/pyocr/pyocr.py000077500000000000000000000036411245470272200176320ustar00rootroot00000000000000#!/usr/bin/env python """ Wrapper for various OCR tools. USAGE: from PIL import Image import sys from pyocr import pyocr tools = pyocr.get_available_tools()[:] if len(tools) == 0: print("No OCR tool found") sys.exit(1) print("Using '%s'" % (tools[0].get_name())) tools[0].image_to_string(Image.open('test.png'), lang='fra', builder=TextBuilder()) DETAILS: Each module wrapping an OCR tool provides the following functions: - get_name(): Return the name of the tool - is_available(): Returns True if the tool is installed. False else. - get_version(): Return a tuple containing the version of the tool (if installed) - get_available_builders(): Returns a list of builders that can be used with this tool (see image_to_string()) - get_available_languages(): Returns a list of languages supported by this tool. Languages are usually written using ISO 3 letters country codes - image_to_string(): Takes 3 arguments: - an image (see python Imaging "Image" module) (mandatory) - lang= (see get_available_languages()) (optional) - builder= (see get_available_builders() or the classes in the module 'pyocr.builders') (optional: default is pyocr.builders.TextBuilder) Returned value depends of the specified builder. COPYRIGHT: Pyocr is released under the GPL v3. Copyright (c) Jerome Flesch, 2011 Tesseract module: Copyright (c) Samuel Hoffstaetter, 2009 WEBSITE: https://github.com/jflesch/python-tesseract#readme """ from . import cuneiform from . import tesseract __all__ = [ 'get_available_tools', 'TOOLS', 'VERSION', ] TOOLS = [ # in preference order tesseract, cuneiform, ] VERSION = (0, 3, 0) def get_available_tools(): """ Return a list of OCR tools available on the local system. """ available = [] for tool in TOOLS: if tool.is_available(): available.append(tool) return available python-pyocr-0.3.0/src/pyocr/tesseract.py000077500000000000000000000255401245470272200204750ustar00rootroot00000000000000#!/usr/bin/env python ''' tesseract.py is a wrapper for google's Tesseract-OCR ( http://code.google.com/p/tesseract-ocr/ ). USAGE: > from PIL import Image > from tesseract import image_to_string > print(image_to_string(Image.open('test.png'))) > print(image_to_string(Image.open('test-european.jpg'), lang='fra')) COPYRIGHT: Pyocr is released under the GPL v3. Copyright (c) Samuel Hoffstaetter, 2009 Copyright (c) Jerome Flesch, 2011-2012 https://github.com/jflesch/python-tesseract#readme ''' import codecs import os import subprocess import tempfile from . import builders from . import util # CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY TESSERACT_CMD = 'tesseract' TESSDATA_POSSIBLE_PATHS = [ "/usr/local/share/tessdata", "/usr/share/tessdata", "/usr/share/tesseract/tessdata", "/usr/local/share/tesseract-ocr/tessdata", "/usr/share/tesseract-ocr/tessdata", "/app/vendor/tesseract-ocr/tessdata", # Heroku "/opt/local/share/tessdata", # OSX MacPorts ] TESSDATA_EXTENSION = ".traineddata" __all__ = [ 'CharBoxBuilder', 'DigitBuilder', 'can_detect_orientation', 'detect_orientation', 'get_available_builders', 'get_available_languages', 'get_name', 'get_version', 'image_to_string', 'is_available', 'TesseractError', ] class CharBoxBuilder(object): """ If passed to image_to_string(), image_to_string() will return an array of Box. Each box correspond to a character recognized in the image. """ file_extensions = ["box"] tesseract_configs = ['batch.nochop', 'makebox'] def __init__(self): pass @staticmethod def read_file(file_descriptor): """ Extract of set of Box from the lines of 'file_descriptor' Return: An array of Box. """ boxes = [] # note that the order of the boxes may matter to the caller for line in file_descriptor.readlines(): line = line.strip() if line == "": continue elements = line.split(" ") if len(elements) < 6: continue position = ((int(elements[1]), int(elements[2])), (int(elements[3]), int(elements[4]))) box = builders.Box(elements[0], position) boxes.append(box) return boxes @staticmethod def write_file(file_descriptor, boxes): """ Write boxes in a box file. Output is in a the same format than tesseract's one. Warning: The file_descriptor must support UTF-8 ! (see module 'codecs') """ for box in boxes: file_descriptor.write(box.get_unicode_string() + " 0\n") @staticmethod def __str__(): return "Character boxes" class DigitBuilder(builders.TextBuilder): """ If passed to image_to_string(), image_to_string() will return a string with only digits. Characters recognition will consider text as if it will only composed by digits. """ @staticmethod def __str__(): return "Digits only" def __init__(self, tesseract_layout=3): super(DigitBuilder, self).__init__(tesseract_layout) self.tesseract_configs.append("digits") def can_detect_orientation(): version = get_version() return ( version[0] > 3 or (version[0] == 3 and version[1] >= 3) ) def detect_orientation(image, lang=None): """ Arguments: image --- Pillow image to analyze lang --- lang to specify to tesseract Returns: { 'angle': 90, 'confidence': 23.73, } Raises: TesseractError --- if no script detected on the image """ command = [TESSERACT_CMD, 'stdin', 'stdout', "-psm", "0"] if lang is not None: command += ['-l', lang] image = image.convert("RGB") proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) image.save(proc.stdin, format='png') proc.stdin.close() output = proc.stdout.read() proc.wait() try: output = output.decode("utf-8") output = output.strip() output = output.split("\n") output = [line.split(": ") for line in output] output = {x: y for (x, y) in output} angle = int(output['Orientation in degrees']) # Tesseract reports the angle in the opposite direction the one we want angle = (360 - angle) % 360 return { 'angle': angle, 'confidence': float(output['Orientation confidence']), } except: raise TesseractError(-1, "No script found in image") def get_name(): return "Tesseract" def get_available_builders(): return [ builders.TextBuilder, builders.WordBoxBuilder, CharBoxBuilder, ] def run_tesseract(input_filename, output_filename_base, lang=None, configs=None): ''' Runs Tesseract: `TESSERACT_CMD` \ `input_filename` \ `output_filename_base` \ [-l `lang`] \ [`configs`] Arguments: input_filename --- image to read output_filename_base --- file name in which must be stored the result (without the extension) lang --- Tesseract language to use (if None, none will be specified) config --- List of Tesseract configs to use (if None, none will be specified) Returns: Returns (the exit status of Tesseract, Tesseract's output) ''' command = [TESSERACT_CMD, input_filename, output_filename_base] if lang is not None: command += ['-l', lang] if configs is not None: command += configs proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # Beware that in some cases, tesseract may print more on stderr than # allowed by the buffer of subprocess.Popen.stderr. So we must read stderr # asap or Tesseract will remain stuck when trying to write again on stderr. # In the end, we just have to make sure that proc.stderr.read() is called # before proc.wait() errors = proc.stdout.read() return (proc.wait(), errors) def cleanup(filename): ''' Tries to remove the given filename. Ignores non-existent files ''' try: os.remove(filename) except OSError: pass def temp_file(suffix): ''' Returns a temporary file ''' return tempfile.NamedTemporaryFile(prefix='tess_', suffix=suffix) class TesseractError(Exception): """ Exception raised when Tesseract fails. """ def __init__(self, status, message): Exception.__init__(self, message) self.status = status self.message = message self.args = (status, message) def image_to_string(image, lang=None, builder=None): ''' Runs tesseract on the specified image. First, the image is written to disk, and then the tesseract command is run on the image. Tesseract's result is read, and the temporary files are erased. Arguments: image --- image to OCR lang --- tesseract language to use builder --- builder used to configure Tesseract and read its result. The builder is used to specify the type of output expected. Possible builders are TextBuilder or CharBoxBuilder. If builder == None, the builder used will be TextBuilder. Returns: Depends of the specified builder. By default, it will return a simple string. ''' if builder is None: builder = builders.TextBuilder() with temp_file(".bmp") as input_file: with temp_file('') as output_file: output_file_name_base = output_file.name image = image.convert("RGB") image.save(input_file.name) (status, errors) = run_tesseract(input_file.name, output_file_name_base, lang=lang, configs=builder.tesseract_configs) if status: raise TesseractError(status, errors) output_file_name = "ERROR" for file_extension in builder.file_extensions: output_file_name = ('%s.%s' % (output_file_name_base, file_extension)) if not os.access(output_file_name, os.F_OK): continue try: with codecs.open(output_file_name, 'r', encoding='utf-8', errors='replace') as file_desc: results = builder.read_file(file_desc) return results finally: cleanup(output_file_name) break raise TesseractError(-1, "Unable to find output file" " last name tried: %s" % output_file_name) def is_available(): return util.is_on_path(TESSERACT_CMD) def get_available_languages(): """ Returns the list of languages that Tesseract knows how to handle. Returns: An array of strings. Note that most languages name conform to ISO 639 terminology, but not all. Most of the time, truncating the language name name returned by this function to 3 letters should do the trick. """ langs = [] for dirpath in TESSDATA_POSSIBLE_PATHS: if not os.access(dirpath, os.R_OK): continue for filename in os.listdir(dirpath): if filename.lower().endswith(TESSDATA_EXTENSION): lang = filename[:(-1 * len(TESSDATA_EXTENSION))] langs.append(lang) return langs def get_version(): """ Returns Tesseract version. Returns: A tuple corresponding to the version (for instance, (3, 0, 1) for 3.01) Exception: TesseractError --- Unable to run tesseract or to parse the version """ command = [TESSERACT_CMD, "-v"] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ver_string = proc.stdout.read() if hasattr(ver_string, 'decode'): ver_string = ver_string.decode('utf-8') ret = proc.wait() if ret not in (0, 1): raise TesseractError(ret, ver_string) try: els = ver_string.split(" ")[1].split(".") els = [int(x) for x in els] major = els[0] minor = els[1] upd = 0 if len(els) >= 3: upd = els[2] return (major, minor, upd) except IndexError: raise TesseractError( ret, ("Unable to parse Tesseract version (spliting failed): [%s]" % (ver_string))) except ValueError: raise TesseractError( ret, ("Unable to parse Tesseract version (not a number): [%s]" % (ver_string))) python-pyocr-0.3.0/src/pyocr/util.py000066400000000000000000000010441245470272200174430ustar00rootroot00000000000000#!/usr/bin/env python import os def to_unicode(string): if hasattr(string, 'decode'): return string.decode('utf-8') return string def is_on_path(exec_name): """ Indicates if the command 'exec_name' appears to be installed. Returns: True --- if it is installed False --- if it isn't """ for dirpath in os.environ["PATH"].split(os.pathsep): path = os.path.join(dirpath, exec_name) if os.path.exists(path) and os.access(path, os.X_OK): return True return False python-pyocr-0.3.0/tests/000077500000000000000000000000001245470272200153345ustar00rootroot00000000000000python-pyocr-0.3.0/tests/__init__.py000066400000000000000000000000121245470272200174360ustar00rootroot00000000000000# module python-pyocr-0.3.0/tests/cuneiform/000077500000000000000000000000001245470272200173235ustar00rootroot00000000000000python-pyocr-0.3.0/tests/cuneiform/test-european.txt000066400000000000000000000006661245470272200226670ustar00rootroot00000000000000The (qui ck) [brown] { fox ) jumps! Over the $43,456.78 ¹90 dog Ec duck/goose, as 12.5'lo of E-mail from aspammerQawebsite.corn is spam. Der „schnelle" braune Fuchs springt uber den faulen Hund. Le renard brun «rapide» saute par-dessus le chien paresseux. La volpe marrone rapida salta sopra il cane pigro. El zorro marron rapido salta sobre el perro perezoso. A raposa marrom rapida salta sobre o cao preguiqoso. python-pyocr-0.3.0/tests/cuneiform/test-european.words000066400000000000000000000211361245470272200232010ustar00rootroot00000000000000

The (qui ck) [brown] { fox ) jumps!
Over the $43,456.78 <lazy> ¹90 dog
Ec duck/goose, as 12.5'lo of E-mail
from aspammerQawebsite.corn is spam.
Der „schnelle" braune Fuchs springt
uber den faulen Hund. Le renard brun
«rapide» saute par-dessus le chien
paresseux. La volpe marrone rapida
salta sopra il cane pigro. El zorro
marron rapido salta sobre el perro
perezoso. A raposa marrom rapida
salta sobre o cao preguiqoso.

python-pyocr-0.3.0/tests/cuneiform/test-french.txt000066400000000000000000000000651245470272200223070ustar00rootroot00000000000000Phrase en français. avec des accents éphémère python-pyocr-0.3.0/tests/cuneiform/test-french.words000066400000000000000000000026351245470272200226330ustar00rootroot00000000000000

Phrase en français.
avec des accents
éphémère

python-pyocr-0.3.0/tests/cuneiform/test.txt000066400000000000000000000004451245470272200210460ustar00rootroot00000000000000This is a lot of 12 point text to test the ocr code and see if it works on all types of file format. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. python-pyocr-0.3.0/tests/cuneiform/test.words000066400000000000000000000134541245470272200213710ustar00rootroot00000000000000

This is a lot of 12 point text to test the
ocr code and see if it works on all types
of file format.

The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.

python-pyocr-0.3.0/tests/data/000077500000000000000000000000001245470272200162455ustar00rootroot00000000000000python-pyocr-0.3.0/tests/data/test-90.png000066400000000000000000000225051245470272200201640ustar00rootroot00000000000000PNG  IHDRlLzTXtRaw profile type exifxJLRc#.Ss 3K33 044J2, 1 C\pzV hiTXtXML:com.adobe.xmp tbKGD݊ pHYsnu>tIME &:*t\zTXtRaw profile type 8bimxHRs.c #K80d $!:/$0@0F‰PurUIDATx흿:vU(`pAk8`0a?~Xzn~W[aQ ]ЊCTxX}m8p3G%ǣV¯+ ¯+ oK?I}QIͱ(J%ȅE=ۂm6C5>k܁^wjx[W+mO?p'CeCFoWO =6t@x:ΜfwE3hp[O'ppвC oo Ba*죭]+w"3ciGG`̲cd%~ZCV~Z{;[5@ az T?4sߊs$*1mܭ! <`yǕq9p}ak/l|^Zi<Ν}c}[1tLS 0UOR`nV̒$ cFu}V;Ɯ\,yz3NyзdO#kZ\%Fg<oRm.spl6$LrۼnbوϺw`a`Elx $1$ \Ebz0k73 k9;3!a* Bp>~a噩^W]6ipag: ~sMP48nEC}6݂miMÐaavf_B:$RQM IDIt_YU=S^L/$ _ F|NP;qB?auPHA+F=mCAO[4WIc&V!UQOoen30{K~A΁+SM~敷x69)x0Ӯ&}I`wׁp*ä[&`"I:+ =++VChlKZwML;sl8 ff`sPY &n'iܒDnaap=chۅ;YI7N *{60@HBDv[5Z;ޱd);v~ V޻q5eq'" (IVgh@Y= Sa0XO!Z\qkIR[ŕ0'<=I.z~.Ɖ,$I "$ɺq0,ΙYhCUÇd1.WD́[{N,UrNtbm' 5?H´Jnέw̛P+\ ukyϖ;*ۇ| rT#L-`X<΋VU ؈á\a(?='gb.g;]b;5;Mz?Xs8y΃ΝPc#cB;yh C't0,;_vY0.>@ Np>.r ./фޞϦyzۊ' Mir90v = d?:_{nɑr_#?i:̭Ɇ篓;e^m`B;u'5Y 60Yf_Co~f|+*FƱڰ 5GA#xˆ>VDm|K^w ]h(^^8#Sc( "(a+"8scnjSπΒ&x؈-lx @ 0LX7ltd!=5ISC|GpM` xa@Nr-)gӾaP5Y䌩o1:1PƳ䘁O|Qi2`(A tZ,6O^_f`=܇+Ɛ-rW!/(MGX蠿?_mXIy8C}kZ`7y_*i"SN7*9=Zu+;1w!FDaz*8Q*d.7VɃ X?]I?7;݈Ewo7f #%"3HkD 8Bb̿7f%acaqu"BCs`+I {I"imr}s3$UiA/I{XI"84ks [q\)`ezH+ | nHv"/7Pl+^su;wCDҎi&ϖNb\#TSoxe:gs$ޅ{2`2N09@p~:;*>Q*N4a-G`\>Ht5\U5)NaNsWCfi1Y_rC6 3xeᔂ j"g}7y0Zy%p/cf v3Vly?Þ( 5eX ӘZA ,}3u LGa`g! xU! a0]SoÀ=Rx;wKp.dzf˖c7Er nT,Gh^c5 QRV]]_۹DqVǪR0|J)M.$g=MtKo"ݾrA/uKpo5̰SzR{LH޹]ČK eE"ݓ`: 4m0NC&.ݍP䘺D"x]r[İK$4:Dkų 3;s==o>zX:)8/&i0RCȔCc7W|3Yry1{'^a@Z`[g\2i~*dԹo<`vXIܶc6 Թ1EP( sH; wIDh$Q#z}m8VEk*XKZȪD$M(<}-yfڼ96gիW0OoTXg{3GLݨG0rFY; eU+!DW "qGQ8ra,]N|s Jvxe ZrgϦB69$cV2dV9y&ED7dx2PGp6yYZ O.?eN/7VTG2ZOѱ~6u5&LNMIRT{ <8$bul@VP+fLc~χɀ 1L}aYn"͉9pG/ZMkah>+6WaIbR/l {XoՔ*6>wT4L`ÞlW-I0anToFy~Ȇ~˟`]!EU @z% ulأ=gSB܆=U}8r`$#M(3@ YLvJ{+9~M@0PQ`o\3}760GʐPi(?\aCiX o`9.蠚]ˍ7q¸ 0m-E^`,E|p-<)]VJ>p`V PmjYv^gIM%iϷҲ– Adlcミq^AۡAr|B΀ɑ u9XOKgM;$pQF%B{}7A4ٶipҫ}Mnc u,Be]86%qOpvm!h*GVAK JސyL ;W|qkavzamʹʂ}ҽ x[4WGG1(δ>\wQ.),ѿS >~3 +p<&AhtIOzO7-hXAKءIqN$h9vn6|:yx IMlwFtv9&Ɯ~}jUv>­&\ DW{N$"N=r'x;!"lC%; 9JHv-EK; >U1+;|iTYN D(,g 8tSNBY.L $IY &I&9MEgW%4r.`{ZT+ck 8nZ؛VɼbKܦZ&7Z!E\&0Vh D"΀/#2H(h#=y=~. ݩNK@:笓 ?Ix`2έ:{UGel<2۰s (~cP[-ڏ P셺.iG|!qQ-Vj-6Fk|tgZL%FaVGNtW-!˪n\D9|κ[7*cMSɹ+FJ7CQAƒYx'*/G JΝM`]ŝ+7a.?cpF\Q) `U'5QA1 n.2S ETX$ >uN M)3qIx;&Q19`]U9,joaC¿#OkzX(:x2W7w6;)|i.8ra*0'_ۘq/p܎p|Tr;+Gt%ԭCxFwJ;02({F{p NQ}ǑTҴÈ▇v7{\#'bPvPξ 6#.$,N\:D+/]CHNZ65wrjʆػ7 t~JpS b':'N\No*lTPyxZ̰:q9eÍ]'ie]:qNV6\`.a(4JcE'ߝ;RR0{ oNtp; á?L)n2|9O +>Anq h3YE.YZJs\*15WhsE_VQ`1%A/ݛI8ccÓ722a_=ywGr+s{ K_szDibiWa\ok&a[< e0MM >oúg(O<z`=ci_u$\>k&0meݜ Ӭ>Y5S`5<4ƒd˜$.|=xsg' R >2p mb[>egcB/%H&4WiO9Ĺtk{/I!yL”p'z|hX>bϽ$[UF{v8tp?í|Ń]RDŀS/O0p g%_l/\V)Zݩ#M6n%{sƜ8=72̉d帢$ &+Ǖړ`^`'&$˜r3-hr5s\[Gƒ3*Gog ,o -lf}(+#1õÙvEoW9S&Ii zaYU6 OӸ$:A~ A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  #iTXtXML:com.adobe.xmp 1 5 72 1 72 275 1 36 2014-08-04T10:08:35 Pixelmator 3.2 V-TIDATxouDNmݳOxM`1 $H90_#N!Kp{ox5L=%j#E"(k*_:K~z߄~sΝ?zss3j߯_T*ar2߳zhhHgܥanj,--_?vR kka}`mv:@ X{dd(<ܕܳWm` +]V|/%.ڽahh0 Zyt?so/cY=<<^}6_\.ŭpB_;!Ʉ{zzI|soz>|J׏miQ3hCT5oYkiuP*z }`RG'׳07A+ ӧßɟ?Z[7C>OᏍ-R)? +7޶z@_g S]WxJQSjMUtU mQxD cA:*J"әa>5- `@yqC4CJx67CO O*5h +a_D[ѝv'4DުUr]1yx;s|mhJ_+R. KJadTAާRa$Q3\ XOO{bގ33S M+ IqN|20 7x{i MW@NS(uekb̈́?&+dpt@ @J0˥l5º|>qp>\&zrFCK̙sA]']6;g홙Saph<\Oδ Vbjj2| G߯+уl&Nƙ3gM6`/ti.ExgL{&]r/-+}`HG.mwjo}爷{'+#(hHܾ工 kԣy5L{&@^bֱaX 5 6Ya &pgs*iF&;_AO<5(Nƒ#H/-̐lnnRW$c LgzEay3`%~ey C1'a~{ZؔjidU!d "KB{K}muݼE;4K;-kj8 &Z!,/jagh9%1::.|F-'*Zõ&M<܇s=_P$Hed\Xײ謁eS$Ci72ԅ;XH*A-(YIocrjBJk喂=QK+BXʢ)J)~TImfol<#k!\;f%…; Yj[o֕C| aX>pg]UNyVjS>?F/Y"FI6Maac|xvZxxMwC#}~VH 3 y+'V&tX)KJ+VfC 3!} WLIGJWO'1>3(+[y&kfVŋ)%(&#߀'U,`X k|+rjC_'=ċx΍w.Qfjad7-{vxI? 7}ݏUu' $bmUCL0ʔBOxG>\qۍ鞆>q12L 10mJ+ yrhId'$IryO8ǧ7B}K/Ǭ7iP7<<(7q"#7>-_xgק]$ˮ$<$M$j>y_XPش& a &JDLwG)vLPL@F#^^^]~?P&Թp=v81믿;BY/[I;^y ,?w8<alx$KKW=3edx~FJ&+b'5J1>Oشi-< <&M> B޵wo~IJ:=3S_uḞ ;su4Da.h,*˗ t3 C&^-h_\\2:BTl&l*aMМgd 21YcȤ 5Zx'pw,|ΖO&a9'R,nS(h܄tZx Zy8/ Ά`lMP> W&i;,3sV6R3DŽ8߱2%F\p,%QcRi)!JJx&Lz[n uB`\[5*-&C83q7W C?X( Q)`ijzjp)_a0V.ΝB]ӟcY5[d҆"Xj$̖;sz:L3pue{%guP"NGzՍdFGsVw]'iq7D n8 ݯ~V V31lPfC&o(̉zI_C7нDFQ^j}PsBhCC1=~rdFJA`ʤAC`0Q.XTPȓڔ8}WJ~_ nm xf_ .yjg\>cu9%!'BYe7C3I+lK6(ֿ Cc^3o&#&'znce1 /^H` r!֪NkF|;߱s,ڂ&Bcw޷䤬V&Ki 8L:L' F49M.Eq7:0;s=Y1j΁?A9YbSfϨgf }}aX9dwPCPq|Zx0ɄW|%k#/Rx&฽.*j[EG` ri4IݻڬH$iNOCHs2Jr2~eΙ!ccSubݷ8o$#q㦿'AчٳeI,ꄇ~N7|:וCyd*>>M~y)y /CΨ;?arHGqZ!)$t<ƈ۹ +i۱2 >;{QrýR.[H2 j&'x?I3D74<ʐ°6 Vxx&x =xXX<!ds9%Ruц1Lrn_,k<j_b,&cLBe.<ˏ26~lmb12"a石z#`ބYn τ F._lnҰXtAg!n6ڸ7ahs7m] kˣx4٩ˍEv!Yc&yʄ<9q9G~c=j U,>AJ2:1:%IIiE@(^iQ# jd֤U~"@N$V,Z-hv٫߰nEP`x9^WRLtBn5D緘8 #Rc!!oҫ}(MiR`ժݰ8[YAYa>F=V$/BH'4UNH<[-%fB4mWLHCɟpMbPi @I]L+ Y`Cӵ |8g@8EMNJ I1ha<'ìdC'WW֛xy^ST(,` %bI^MyzFsh]G \ȹ@+ս{LP/LDx2L\m25d3_YeqA,np[sr!V=mRn/8={Gx VV"\g nʥn_187N?pA²`lqFJ)v +: <66COYTJmpP!m22o211=* 7.MX{ qg_NQ\%XBKN)(IC:.1$)vG.<j.vlHiXccfnRn{\9gΰ.ř<trJgwwa<{nQNR o|Cox<ŬBʖ :oX OH-[F<Y P2LCAC\j\8P=?N\hgk_JxDó"@C/ZȜG5@Ɋ<"3;2g9=|>hDo{qs l/D2%`ӄ"e IEO |8"΋w+h#ڱHgEg@0utIE%Ӟl7ِ[0dqhT!qYޡ1Ǩ<.x1|s CH@X, (\M. S!:,58G<[}8x*Rp'ɚS pHTKor-dcx +hss jUH+&>˼E6ƹ'x Lbn6 ;1!q N4Ľ9>ݫeAM2N% *{˂,oɊd.L,*'Q'q.KHvYP3Q->V#)=dACd*)y% UI) ވ\NkIT{CVC'0pj:oux'&Lv!;+4,pc':?༳yFZ䬇(avvN}0>+5koyov}@]ikG,I=MkB`+ӒuxYqÇl(5̃gV) xb[5L4,Yom܊V;9`Gi0T>p0!9 0τ ˖`<Y"׆ޝ ,ڼ:qRJa m"2ꮶ{Wo%̀IkP +S,n&€O^)Zѓ. 75T,K]r˖1w`%yk)DESi? {.3q+  7lW\4$5d bXk)z&CB^}i;p]fJ+vixB':!a<#8k^q-"< hOHFYdϱ?Xwygyky/.f힤w0.\0e¸)0LV;7eFNHBOKSy,DĆA\q|Nvm_a$vy^tP RP<^.6xHbUGl\cDR}(+d}6ZkٻN?J&|ɚ\EGsVwaA4:8AgÃQbo=&weAX8M^ K =L!#\ G48ĉ4#M!D(^_ Ms[ M"/lL՞`rJՙCC/!7ErYzx& /YvM4( ]WL#k0DnUjNG`ve]xRbYlb67~F4^ DAL%={BL0j@p"M<: Ԭ0p.5TT^% nRPQgÒcFa֭[%ds9^ /buKC?xbQL2nL|L4L \;9o| ]xJu cE߯Y %Ϥc4 9|gq<ĸF_ds E-6< RppOif3aA Ǫ`?_;V;}j&w_ r9˕lWV[ : W}"JzǿR",˗eܣF .$ S ?:kPmABUy܏"Yhxx&^!:KzS Ȕa#xqzR|2Px(&^[b 90!2^rgopfՆ_ԕ k;r!Xej&"ZSA^˜ҘV8gYv<ॠ{hSQyCd)Y-ܘOѪ# ^`e\y@ڌ ˁ;:&$MAarRlڈ6+vnszk60N π~\Do3U&ʞ6ckI\!#4LתANA6#ccyK DL 5 iPj\sݡ7J'<.;oMo ,g j92ݍLVX 2+&…}5V2m1?ȗuy.Hj@V XW&5&)@q&1X'RjUq1Lh…Kk<,Ip.a)H 9Ls)l('$ml/ɦJdu( R<-1A3\K~F y&Y @>#z&0EF3A6L6n( &nG͒2+Bze酚@n B<"mnq흯XINaS$(040iszGaE0$5jg!؝uY <в,B1gϝkOt -)FC ~4t!CY%Sg\G5m7/A|LL54%P΢ жc5gs$5Vr4Czi%~k"<M7S3uQ$GϜo!sa00D*RS<,ygnNorXR"Q2Z(;;.'i} ׾$L42W-)ٿu˥XK.9L )i[6 Cνڠ9%cZ/G fWpC5; CGgjh/.-[ia0"bI fB}#\-R9tgnzl6 @KL i<i Bp:9+*èPx')7<rqn6I 4ݎGxx kB 1€W^@\ԕ 7xLjW@ IBq_,Lt$5<u,{eLpHj5U0"z*.($;l70c?pfEdgTh Kw~acA+'wX_}@qE[L5,3Jֱ'i s#Ws|fr qS ? Q4РIC7o5&|Vvwr9cA\ׇS <Yy"`>J7v5)JvUy&Peex.r jTR҃6EVgIql\OKxNGgn8Q*_S[y:H,F)ƱQKt P#H^t^k[)kbdxRd';#V )afs wVeE"F# @?Tz;WiLk3s{<U$Lb,{HRA!Uo?cIpG:Nè$Ǟb)k[+sus5*:+W]'ikcqc}m եM MxF22R  `oËߙ[jz~E{3_YIӺ+ԑ<)'5?e,3; .qa^HP0rk z_~`G5[fYs6PD[2D+HP)`񼀒MXg0v\!mլ|H`H<JVٿa̙Gw[K0ʌ8de? ?bmaK{HQ! #O⶞65xoeqaA@T9 /$lʃk=MtX ̢!n\BOB )) )PA'# q,&5PY܉DRy "aS:n7gVM>nb2v{o,Լv670Z\ijA<2Taʺe  K5Wc~] Co#!$ ^U?nA .omnafxdÕuaAAjR,V[]{iOx=]yG"tޡj[әff9L/=\F% ! 7 sgv)[Ikuv_$R)W^T9RG ?mtM|$WRE%<[좎9]zKJRϮ-ԚBi}S7R?n>9PݨۋO=rzUg9˫,ebgBtE^}hWz.X[k;" 0#n*Jnm-{y}pˠ&i%Fх+NHƟ)JU]hk1wz%5̼Gvi"BB ăL>9g5a(Y *'uv6)]f3srr<Զ3&:ap"'`UPI[}کHwyt?n<166 GŸ+?<sy:R)JRf kWiWv{h,1ƾƲdvLd$Q2OҔ)JR)JR)JR)JR)Xῖ+o'0L#g#[N4}l.}7/D;0, Е=v-#w3hN~ͦ/rtb,Ao~g{BZxE xeJs}5k{5?ՂRT&\al`}Z, My,AiYXpB3%?j Sɇo*3WJCqDhC}=3w~"yqxϴY^秋_?5uFk=YeilvK9kh0NcRxEc1x]xy9qomͥǎ z%3^9GZ'p>>C8j-wZcjAf.1w%vy6ee)BypA^ninN\֐4 3ڽɷ>NC0\|u~8J^wSzpaAci Au.ԗ.ҔZ]_OC^I]Bf$$|]k4),n8]yRAGT3զ=~Wp\dot[MsaT sqr9z.D/`" S$g.#z{M\͑Ob#Y^(GW.IgO5jlCW^mⷋ K=n@ѤΠy JtnnΒG{ƭVa}-pw8G]OVPJnYfJ6ylfLuØ(DNra<ۿa%n##y!R;;[߼&Ue-堆߼1YZ7(&Nm'i\M5)q^b>?a]/J-H[1pJQOu )ʅj]Auy!6Q 'wrGu"8n@siJXk]eAu]s7(A(d"JЀqTxzݍo:ZdKpPDaT>yfsvW㭱{Lˀ2,ҡ`ʒG>  I6uc4agԱOtֽmP]JZPLߒBgWU:+u6 mIQ]߷>U u? =RnNͼMKt[[OrGY4QNL?P+:^3VeUr0,U 2 >) ۯW} AK+{^' R w^ng^=BhUi?lLUIB'U*bRֿۭ_׺+EGD*WVS $pNSWM7,6Xnc;,0X9_V X[kOÅf(&!eP[Pzv Vi ͥWW&K3E F^x%WI&1%{\&?k;{huId rȤxԂB,OjՆiD6Q\L %5DFfxO`0 VM^}n g 66a31?rXkZR)JR)JR)JR)JR+ͯP jvp-%amuv(;0i / 4,}ۭCuV3P_i잝s:VR*J<x kTI$=kmvvRK|}Զ]@hS~D^QE%Kio!~ŔHsVgݮWӞ29\5ݕ)8':!8Ek-)+M^erOebp9yrNWK mDZBil2P%{t*"!2NoL~W8Ym﮼'tVI; ݘO(BtFң?VՉょ8 a?@:^5Yw ~@F"Gq$#so^v.Kc4p;x8 ϥk̦i[~:NF$13+]F#e'x*`Q|LC3{73a5qb<=( 'cz7_k:kGo0@D2FUU|o[_݋W  g-ʽ23}my]K(+*Ro&D!G:qXr>AqW1_zq,Vߤw0 e9"Fy)&@awkco}cs եK4 xFR D!??IXڴ791zsɦ.&Lxh-`_|;|"_RmxHi7SѾ%A(G_9߈ 75bg]ַv~2Dn +/!3{p]\emYdF r#H|}\×\`-&mŌ6٫NFDESmOE?\#Ri-߱ 5? 3&:lGDFvq p+^6w1v|wW1e ]q-wWp{bHXkY`H81V}t^.xZR)JR)JR)JR)JR)JRK[hn.bhgh*0ᑔ2H kOJq3Os~]c={tQێ?nOsJW ō7V1434ap~H$~5HONϓN~k%ig.*Y%-]tVy 6 ߘST3SVjmOo/ A=o7d U|qkϯYvw0IJB@>JW;gwQOpibQ%g?Wi ]J=I*YWzJѸ6TmI!qBc_cd~5 MŸv:IO\d࿘7ʲ"X PP~>Em,) h㺽,>UP_'fuw/蠯LJWeWi ;9|#$e|4??a[B`E>LwF6xy|Q*w^x 6vWe{FYxEE2 /*P56;hGvQ\1KՖ^Kp2XWHRyLⵖl>[ ©d|Hոe$AqZ9nΌ^\exCYIwi@(CwԿ%H`YзiփnaaB-mf#kD :_[QY;;R ,,fXcقfb\e, EM#Nnmiyh`e\7g#FFKY)%/>XAa(܎ ~%v}#K+rvڏ5c%0l$TYȮ{Gˢ;w?]`4g,fĶشJ]8e%dR}KKܞ8llKm+A(Xi>HSJ.5%v:lq{mkk2q$H"C$(Aa^L~W8Ym﮼'tVI; ݘO<_ >o_s'Vޞ߷^^kZ)JR)JR)JR)JR)JR)JR)U6{ӆg3 .|ŝY@' 0X  c7(*/,I<(IiJR)\777Z\чTa#)e A 1X;xlXb=Q@$ܓ_m)J:ub)n,m1BOFRy=ys€|1~Goe\OB$~gn9ck)JR)JRk/tVNE!j"gU'> a r6gҖkMÏSn7ͮ,;#x[Èׅ4*͍;c՜ORWȠG"{uyٹ/ sWaY^WO,|;3;1")JRs;4m3?{"$%XeRbPۛ7c -k2۹~U "rYc9t!|Sexۋ_I"f>C7fp[m]j4"l eX^f^6jKLY~R/EXQ Hi/#km-meMpp܏nT}jRyu?5VkOa㥖+hrAH At6/ѓ[Kne!#<2x *?4FԷ}'q"$ H^YnI.4Y]+Kn.c,$ҖT#`>[ո\[ mmxpStಂAx?&|VlURiSKm^SG r>E}fج.lo'eu(0Q؀9beY\9L&N'a?o՜4Rub +)JR)JR)JR)JR)JR)JRgO-4gJa18.^e(1c9bI}5Ҕ)JR)JR)JR)JR)JRUakw{8Z/19S4纞̨]u$:n͚|v/cIdL% Ɍ'+7fkvtM9;]f ![F] aD$O *~Dc F:Ye+O1brAH ZZo>k{haOpq4舼G :6I"\m X&S6 :CO%Y[Kh'@ʌ9WV A_X__\kimMc|k\.>K1;V7w<_ 뙮t4سbI$Mo{[9Z5_KijցYT#8Ib] TAU6jO^4ޏMy_X- {0Q<2\lV]Sa{xe ӱ7 0ưg=u7f^8!gq(I%,I>U/qFZ`Cj]Qsln}h_4WȝaБ0^71&VKa}h8D/1œ$}6i[wJ_dflRs(dF*Ĥ@@!|w3 }Sk2k+Hᕙc-#S<{>V qۍ.!1Ptxe^,G.4N_LZ`;fv^]8||(WsJuw h]:Kl֗";G,zx2b%'R鉯S5}pc,ѠNFT/!x |ƸX=_YjˑȽIQdiC+'#'w^.=7c읷d`,'<+O 5m2[ϓDyEh$mɐٸsiz>{N;ۨV+Ő?P۲מ ^t)UWz6-4UƯ|ZGimgiLB'xՒ78*$AQ{-񍑰kEjXA!Lʐ:M {x]^NIXQ cx!@pYkR)JZJ峗x,^k褸~^B@w4)Jt.ͫKj}ZY~GwOq-SC*+HSɏb [6 cV% $q#E*GpGP 7,$-,[͔챖u^Nf ;;,@nce[3W,I)-yY}u`O#X/:M6^YOJ 5P䘻y3ZuÆe*I! cų:M6^YOJ 5)Ji}ҧQ껩i|$04O7Gu@apXaQ-y&Y_ F`cwK29ḶiJR)JR)JR)JR)JWncj,Wh\IİFeo+@$zqPoPWv[& E/$.T,5? K[L֐!q13܀~HFjh8q᙮%N߳yQA? p-u/|uM.WDP*[Dex_ FY/&]kCRye|70?X V~F{ugUZCN`Ş*^bVt*G^ܲ>~@Q8}!m6MoS\Kn}k P{R iCClվI 7ӽrG#Z۱ ?eor8K c 8Pz+Z&A2}-dmw "_dx׀,j}&WYmSotCE⸷}.>>U Aכ^673K#o#+)> ,eT>}Db:-uȥr#Yc nTugܻڞq"9 1#ByeY"W^0qY8}PԚIC;.ZYs:3KՙY- ՎՃk 깚""f+෍cd,=u)%p2n 5w|]c"K(LȾ9"d'db>ER$ [;5n6d=~.IhbtHEL!??IYOԂFZXGcm]t2DY܈ą*RJ`5%㹘mS]1[YZE7 nE?`œzm Li=ׂA}4oEXF̀K 1No w.ˠo'9ķҾ Sg.u]X-<]y|̌Z錟Xo&eytڏO V $ JI[RP1n+FmNh-ͱiL3ݬ^I~*ER;|59*ݯS[yHF(Z]C$t*H#A,_M5ګY{sZX[ 8E%Νݣ=W7_K>y'{+KNY"` _֓x37Y/gN $dqszL1еj,Y%x=бv^U;s ?T\m,WRbawY]eA!Y8}~면A1Rܛg $l@6 Od䏷Na;i?=s=̫xc0UI#ottK{dsm|l%ng v纩q,ҕjKiCr0v1yn.%?JbH@%H7n:.A"+j;etF./-Gq  ":~vKw{*uxc"-,\^7d`.fn/2BMaI}IE=Ӽn?k+*;ple7-#0 <1pT*n/ӳ_d5?#PNjdwu@Jܴ"G~lVͶպ\Mgk|w9W\uq)wksma[]?o G fӸG[p~xe?b+]Xuis9Q*ᔂ#\ԥ` cɂvϯR}q4~@ pGF~Vصw/`g2O5R~򙝺n-UYq;Uv pȅ) R98M6%ė6 l[J\^_AwIeuj %QrKuc "s윧eԶӭg2-,G{r#Vf'Trܒ>MQt{&m`InocIh۫'!?uP%IGNͶ;o3QX™Gp ]@UK#_j ֺx6m-pbWrcA ؎P&}m֙<Im-үunby&RG}<"MJIuMFvH~:s@'Zզ6+Ye!Ė+rKVxeIR!T~ eolRl^t\%4尟(۔\J{%Okrër~Y\  d[̋MnѤ* 9|9*Φd'Wi49N!nu6>HB&'Hhe %ԙˋͿZw#-I$qs}䂁JP缾Z9st.nJǹk'䷚$.ddЕ@Ld3;BTNs֫ݣȐBLVi Vڝ[b&ҙgXU-#ULײv k}ro#4 Wm$x.Vĺʓ9 C >H'~rFkdb'i1y̻+Y.~D))JYd  U+?TߵZ+܎&1v#t݂ONfb y\Xw<b%EE,y̴۟;s1scjGSWRK =5%2nrҕ}inX~htg]6;XWxK&f+R4P{ _d|Km46F^dI?jkMM2-wR˒"(ὴS/xY _璠~v4xH +[u[p{V~09PŒmWOQ֠$7" m@:C$rس ̥z= ͙־if2b8Dʄf,W:(?O}/b? sYs,,HC-QБҺH?"+z:TRŒ^acɓ^O"%̱*\px0w==,G<25 ~3u2J]v+//FfT@ !ɛCS,Ez,׆!V`v%dm1[ai,?Y*G Qsn[G^TKBe?%H=$_(|lg^Nݝ%,~Iw4QJr]K >[)-¼8 pitlUdl`IU|rX (9YK="mYmG}ձo!(0~Y$$$I$gJ.k:&lvF d"`+H9#o eUmU% Z髩[? ek?y+YYoNZ_o _'uY+w#Fyc ygI8c#HI^x@zqkMg߹ƽ,O߷Yg;עuy,=ieI .tDi1Gͦ6;um㹻 K8@J}L VԯXht&[w!dhd>I…< ٝ5vt{}gL`6G-r],NJ`$V%&>; =My\Xw<b%EE,yޢ]=Iۏ5̫Ģ272v^xkI͙ҸGi j[_#o 8n *) ܨ~}M>]fGO:sqj<Խ"auDfrWۀZJ}庛IIdm`hEurr7pTJr}B^&ޣ2bdIg0E(C ѩfIe6+jm[%gVom+?#!`!sZ2*zpۭ{֘T#bĺCm;Ѳ*ى$C73^KLV7PdrTW<I!G%f<5Ů rrZ.ie!X^9*dgQ Jl]yM,W1]â N~7,9`Pk_LqmFy?_qe|d>kdWBT'RcXnoßVWy#E  O2wnvm4Wy jdeGԂYLJJ~-MUlu{6[ (m{#\?vU%:ٿP1洞t?%ͽsu2M$ W$%:gWKfd^K'#D) ;}+O's^Kܢ<}PO$:@uޖ,5v{3Zk%thFs"[yG>Vu3r~Z'Hg3 EReڑ'rO,Ix,-䞭g 53w%]C#H]wOwnP>YUw[#+y <֚z/qheH hˉ #P)^sI;LM'>(E|K>z#%{񷙿Mz+!"}7ћ~[} n5Vuݪ_knh2#UL Hw[ ^ <x$p{|sSzyטQ Kq1oROoYxϢ~gT8mr^>+K<3$q'^z?!X?1; }~r }G#%TsFMڌڋv|vKoor:9C1wUaB(mh\^E<,HLq*#NH,KI )JR)JR)JR)JR)JR)JR)JR)JRFBRB#cbuk|Z0SnGW㼌YA Ԛ)JR)JR)JRikcqc}m եM MxF22R  ucI]/?Ft zˬbn;qٸi'tX\'?.מ(f㟷'k/f-ž_e{ *O9$C*"tޞiӘ/dn'Id~T)x<\:JiA3x[+%ɺrI?,ĒKKI$k*M{ Oo{i1(4R>G۲72>CeX/wwrEń o}R4U"u>jx]~Pg-|g'Z B|a2Kgкoq֗^9PYbnW^O x'[UvNˇw{t7$s;*ꠐxNsH5ŨXṉ%,jOFݘWݏ_۽Dx™cGUs2Py#fDfvOƎZGW͝e YO '!A)-PUUZR)JR)JR)JR*vXcdOL wrb /@+́;7JG.eN@I&pYDRٍK)JR;n#u "9,ZYeSAy8.SO湴N9r敡2ƬttpC) )JWM՚We5.-yEآt3v`Tp$>k+_~m߱vۧos5Ҕ)JR)JR)JR)JR)JR)Pn?N?MB׻gn>n<÷3)JR)JR)JRS>}=Ḷϕ-7(&I,;qN _w1{ea.]nj#gh x _ӾڟSc:fXnK;n)JR)JR)JR)JT3}.r[1psrG&bP)WWn~?F/poufSڼwȅ4>MK]Mk=:X -5m_[ExO48vUHNdp{2M{9fm#]jPpxGgJWśbx2[Ggb VMk0;oy2)q⸂fea;Xs\ɿ/܆g魫LҔP-c!]DfIvs2ĺDOf_@o5ח^0QI[c)ė}!`?rI>ҕ}{w^_\^)0r4䇎(׷<55)JR)JR)JR)Q7ZSEd+H=˳UBJcボ+>r7Hi\f; an#乷xiK~U  WgJK 7c7(Գ <(' mR,viVK6hE#?K2X+*?_>w_a=I}8Y3~9 2lk!Moc DcF!1Hz-i=Z}2١=`z*; {!e(5TۉvkwYGq1N%uoՙ$+ʕD xVR*][Q IIos*w _B {"͠{9-{rW1ZMмr@YDd(!XrP 3JnnhM;W>_iDo'Hq>sgQOW?i4J=7Ƨ[k#qn4^~VrTE$RDHIIX)` *xR)JR:_ gvir-?$T^Gi^؎G2j >+mQp|F;{IYdƯӞ;sB$$H,.omnafxdÕuaAAjR)JR)JR)JR)JRG9q[}z+UO5F0@QI`Db2+KǴ^0b쯑BmqnĪܧU&h}:^6=i?^lVnovJ`ޮ{\MU[kGS`#BV+V_B7mi[vbq84!dE<̬# J & K1}:&Z~}Fg3˵kn:` h̑U /w=9XXq]H&( #N,ݣTiJRnzԗ;4V7d-i2+rۖUvzvGta[q8똡y,$L0+*w;J6h=c'y yL$4x =?JRKt觯L ڭ#ݜf-bVYM%dy`y2$>0? N:΢Ǐ[8ۼ3c<~@G<%s&>0zYr1ˋMErz/'~>K7W'CRoZ[k5T$2΄KXz2!i PxUٴV8;C("3xXf{K;|H"1$dҶ -;e[aZ/5ccD)'1ջ|םfQ9r1$qF9=̓?% G}o?'۝u7Xnb-ma2uzF.K;`u5zFڋ9g{/NOkخaK7>ʒ7 P*n)J&mvSlC0\v2,#`eE-߇Cש;n7G)6n;'Y1hʳ#|9sV8-.6>t,yfQ+ {o _Ұ xA\3pգ ~ZGGn+iK5YAic6?"! *Jzحu 71.RXèxwGPGȬ3wE}s9LNÕO̐\ ]R>2[l'ަS ="_$H|OCgҼ~/0ɇki^bέ/lf$`PPփȀ^{7Zg_-VeʐG#A5|Y+)c, 庼a>vv X9?rtM9̤8&9;xlM,TĞx`MI=Zp1Tj_ʼvJfBDD"~|_ s`v<GkkvoQT^XxP$5o![+Rh9bN2Sc' ٱ? :Ҕ)JR)JR)JR)JRkWLYn.,m|M't8! ݘO<ѕݭ}5640 E/%Ȉ i@WG77r0ӯ |24g/FI~y~OD/so9fv6,[f#Uo%T_p^:B5e~K[ e rB9{R}k~-,u^Kio_xQd״je^;翋o?~nnkCzkWq{qZ502Q-'8U ` xj KҺ("Kq}mnKFc yO.~:y|^ן_Z6 pD]O4*ãw({Åa,c5I,{kO˼x< ϋ_7=~;<ף77Z\чTa#)e A ן?ewOM\6Kyed^4F䢺p9 {8+< I;'pY 2R=V"%1p{D@~joV&jC3 LA H +6zJ]+վZ$mwučP k@hoI[e~+S[d55..ἼeC3F=X7)JVSw}TxZLGH'G̮8"8c `\YՔۗwԴcWX  viPY$G]h?wX=7;o4xyeY͵[ydD :G C3~t#ckELYׇa9pWCR3}y#w)*V3]31u2"NXy|h:$Wspm-lCⷷ}(>~Y$$$I$gJxVs6/7OkyX0<0r>ޫ}7h۽ֺ.M_]An-..]kP(f,qjo6?Y%ݢ cfb8];bi[K崽eKbxXu`e wft5:iv,im9+v #"yݭ׹#m:+{ ,ʬ=eGg ؋3җvrv]-QͿpDX)tVVc!YRC7Zg{Q5FS:qOO#n=yY6kUQEBq/+3UG<;?Zka,Oeuo ̍eyv/bvM󹹼[Io,ř_B$vbK;,ağxMI~o>\7gH!/S-h?w3G}o?? :Ҕ)JR)JR)JR)JR>R4J-̯-Ő[e'yJB*Rm aRNfbm' R4KHGf*< Tgt}KiMA6[^[!d6O^*3U~8iM5[V8-ɂ OVbHMJVm9=Sk--g mvS+^Z&Xԃ°n=ƊWXêbT T ݃׳?-,~erx<u^]߇n~p:z_U %;R9)nS`f+O,rg~\-[]ۧ 녉ƞ[i=yVFPXzX%y)z~Z7KkkUO탉CG/yP0Ƥy\%67 tKb#+> D(IeW8_Fu~: a /2Ώ aCOY<@8$}Co펅{s-tP}RH42;K+p;;p>~(@#n/ :'IeLedEPFʩ ~)ۇW@[oOT\]K$Q\H!'/^&~tFh;w S3Xh #Z<#(%u l& y7q5'1 ,i}+T*ʡڼzZ x$ٝg=[倱b$p*_w[kxs(dKu:X)ʧgn]&4L%KB6/L$YRIoéY7퍓ucObXx[*x&UI 8ki!DFEddPH U.ǖ6Z=ҷYryK}q nDaP{*;JCBTpzkұzU!ը8ADFI(;voPi-5kke1awi- L#hJ,.H;&iۜơ0˪ DTerD Aԕ@9ޫ9MnE!%cg%Suxe3'db[ՒݏPi#dC|ҜV pAE/ \aGeMk駴]>9Q(=`ן:HÓ)sz۵R"7; #d0H}˽ɮ_.^I\̊@đ*dBzBcަuMպg e9EmS+ ei>H  MGY])-uDI”vbLL{vזiJEr+is)\LsHP _*o]g]q7:/53E&Ll@:~VtT oOEZ;/}Mn@D<$Yd*dW'WV5SՅ?Hf0i/ws+r|1I H OvY8.BR_ 7ApM%8[@?'zB$('fmM[tV`cpL/g2^&f=_BCqR M#8ˍON\% $#vA\@b&zO7kt'Q4v[o`I*J00G?'^1[a;d\R*BA&JBEᄃGM;uͬ5l`Ai4"ϕS[*;Z~#H//nZTD"EXr,ynfV@S}߳} }{cc $vv))UʒJ>CjkeZBh<66,ےy%1XRz7cԽqG=;p‚xwWlzbW>N#F(M} Wu]Mqod^"Lr̡{a;?}ua/)Vvڎ%pϊ%nz, LAS7k׺;Dac5f `%nMKyOB$dsY搏Amv(K }s9x睅ݭ {n.wfxdUՇ)G8*߹ yJ3?6ջ5UNêm8Ux(GI^??ª͘߻ ܼzj U<0Yۺ"#/gV2J^ԏ]XFlݥ DWgBt*X׀8= n=Ԝ-3M-Xř9aːg;g_(w/ R)JR)_{_"_{i=Oێ~x珚~b/緖I^V?$|F,(W}LI&gJRom-oaXo-eeIcpX*]f Kb:G( K 8Wsl&'Ëc,vZf,z,I<&Rom-oaXo-eeIcpX*e&f>uyidGge$*MQI4^KG4f8)=6$ gRBxrOYg M+oRLN+Yc, ⵳a>XEXxrMt#qm,Vrm$RDHxX)yRA*8XZZXCkim8G T]fzWT{m5n<]׺^x?šcI]/?Ft zˬbn;qٸiQ=}7vz/*+D,%Y% pT| 1<*L['^KHۯ":$ XO5`m~iӱat&U"\]SsxW4˹{W%PsAn%s$cPJf<\;HVFBY7s]zj-I_\E?dn ~O~ I^[tV+q4&GGf/m2/,n*IGRs?3 ??zO k'NX4ly22D(?WgJwgcyAeiI mG+e+?oqWZuO'=<\\:u^e6{41x D\ /؅X {;/^ܰVH#Fo̥W]qzJuqmI`1Hn'(@H$r6Ҧgm7Uwb`Ҩ o-$L:r PGŸ.jЙeKrK34(zDU8P⥻Rni+{٦y!y#8NYyfŲY?ַ33ieB/iXYI8F)nĨ_KZ)7mHIw46O"fGPea*!*-AXr0P?HPLq/i_m]#xmo{`n_-1o)A`9(mɼ[yQw4Ŵ2.6;kk0ዪUz,Y$tg-fXiq,W|Cll " T§b졹r>zsmm\ZJ{EX1I4$^iGoeI,yh֌}9b4ִ2yl^),"e-2 iJR)JR)JR)JR)JW ݭ644#r~@~o-_7qfx,2PHʣQے?Ƥ)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)J^uE!u{i2X9a[-όx#"v3zKӺgv~!u-:G>_"-BK/=k*R)JR)JR)JR)JR*;vSWe=v!{ي,{ /_%cKKzI, rvd=Ab97{cy/{e`|/(# #4dñ,W:smSlÑE巸.>~U  WgJRWѻ7iqv{֚2KqѐIԞz켎xW>nvtΣӖy;[KktBꑹ #ċyҔ|wH2SǓ',koa#.*~$ )afs wVeE"F# @?_m)JR)JR)JKW.akbIH X#cO(}sR)JR)JR)JR)JR)JR+c6퇼YK㸃FכZAC殼~o~=/嗷:'/-0_~ۿ;/u.\v>>+zԹ=3dNybaHc" !RX2Hg`. -.k c$6Le!X2{%Wϫj4OeYۻ2B8vY$FJ<(_vG_n~j_cq,V)-Q(MWk)rTRب$;y]Z0=io-Cc)F;ÂA*oݼf4Vr-okVw(H%UFBC&TS7oYHvl=>kkYd忼sx$%fN$VUO׾ {29Ymnq%yRGoT^H9O f ^mas9=LDXYVtGKN4^ ^J7w]+v1V`u  7 95ҡ߭ma)Zyb짧ӷ3iz)s=Ş& Sx.&2nDzPK5~q~9cld#Y""Tp/f/m$Ԑ0[^=ccy^K.yzi%52|\'"X-9vnG#=cbONҗ;WOWc׉q1^;Gf2IC-vn֮1]O9'/==QY]7m:!fI7 W$nt/ܪsGwe3 &o$[Zu߫-UgqCE\q3<^Z(C^9>x[uEc5vyBhHXx$9 齝-/r/2㬭+F@7VO+dثeڃ[_ #\'@Y!e_>Hpp~~:W?:vP9]^[{AXARR EgtLiC9k&^(- 1?'>z:tlә+Zsi;|c (@q]։8-i-56 8ea*/PqOɳw iqDHY~^v}6s[`3>,9 so*/eO.x}>x8ԥΗG61Y\dce6HX: %i7psS av BH )\ټ+)c, 庼a>vv X9?rFt~ƯKӚ [aj!e^bFʝy>D A<ҕj}Yt&Ը\'1׎{e珷#kM{9fm#]jPpxGg]6WVi\NrԸ[ Okcs}wb6`فQ<@攥)JRn2q1a^!oh\Hꪾg1nǮ)JR)JR)JR)JR)JR)JRԳI?[Le wh1 D-j3+O|*=8=y2v7±am,`dh/swZ>#QG wy["5ymn]I 9$MLY-^[Ix. $3 P>ʫ=T70bro4u3C7Rh}- ewUmy(="ru,J,3n[X.m6}8ͺ{ FNFkX9CeRB%f ڵ.c%oJD0$b$$,?;l&V"m0 9v[n~^f3c1MItay]YOG >vOViksRqm g5fH] ؚ 뻧ז/s3ZC-@d&4w/3>HE*MڟefBMVymVX8/fE Nܪ7 Y?Y7'09q m1WvW5@J K' A_<x飬k_AZga 柇C3?ՙy#w)C^--MC=my]K(+L# 7$\f'ک=C䡳Y_=*\k,gy ,i3[-ڟQj,YXYܛ9/RdҬ }gx^-?Kqݮ]/p.(?P"*Gib[_wW Jii4VXGPtI#1RAbķ'y5L[]mSivi)fd-Kiv㍣-ñKf-|^wHiضCc)"k{'> -/nI@ +/skktv[j셌?:!s* 7aՀ:]U1(oT}_cV ?|}m,^8xX!o?T5:[ ©d|Hոe$AϤ;Ov۪PH$_W˰UfOO]?w6J-9}$ ǫ(cp*^ruFn58O$5q{$K81IR|p2+1 !X7ҺӎcL}߹=~߯hN{Þ^Ƃ{w ?XOrRE%(>?ލkR^ryMt !rVy]7n9A_+YݝSic!!Zx)$,$v*Ðlα٭/5 ֹKnզ*J ,D99f_j5[q6>{hvVGX;)t<|+)..i܆}h@2G4Y_ kT"Yx;_[qo_M I>h?n(T= [O{kԞXmSOvY/^J4&٤ֹM[gl$"C39v~_( z3QDl}qf]](8DeE)O%>ʟO9\/;{70=[;'VnX}~vu&2TV+s)%۩R eQ߳ }E3'׻yZ#@jtq3ۤBCQݘW+ؑ9sONsl߾mq Oy]K۷ Iܾu]3٣nW#{es5`Rmso.VHdlml. 2|Q$0U(֙RJXWДM269N^(1vnkya[.Xy$,Qr{Ƚ!{r~gߛ||/qZs!4,g\vU<}6ǔnjkm͝c/u,fi7v*yVBAVARt+hi@Ċ9gf? I? zToM_Gj,N' [q3¾Y܈0*~: lLw߼n^0FeNvY-Rv^ysnxknmƯ[i,&(ṖU+,|};'G?=XM;yvd^a29{N;ۨV+Ő?P۲מ tޱqش19i#|fohGU2'7ОAkഎQ6wג!nTD1T(,Ȭ26XrXujQ"` #UcΥщ,;W6o_-ܹe"?Y 5Qİ;xy' <27. )afs wVeE"F# @?_m)JR)JR)JR)_{_"_{i=Oێ~x珚襾?3̿4~i^_/=x8 _?=_{hG۞x㟚tu\!r=fY`( 4N;s _?=_{hG۞x㟚=Vl{lœeʢ ۥuYm=v@H^[F5L W/NcL7f 3Y~;0}&0=(l=20es[%m!b J_vtS̅O!A1[#qwJ99kDPt$ nx?sNZbõbV[Ϲ)"I$-/D(>z;“_Thc y$+Y;yAg v,qf~vou7vmsZ[JCiFb$ۺJU`@SےUtfVi|FÍcEHD)cǃ$ҳϮmӋ hAvqq + RTi'{O/j/s{kcg䭢yIe Y4q(iGPy z@._L䉬n1yI~|OV/lc O,oXn2Bjc|0axX4p \sPokjsCW\\.:{yC %_fPgf\̙ K2ȐJTF>7bV y '>{)k=oqqcki<4qB0 x5so^ﮐlyG%o/VuXy#7]3k=M͒寯AK;!HUG-ǖy 'ޮ;N%$ȥs\Ɲa]P) WY^ik5K8ۜ==Wi]H> PI7k/8CdPwLG@?ϯTڒVoaٮc ynJcFRrѱ`,5M8sY+\ݾf #(ī{b8?}_l<`o1pcn /,̾B@_^9$&籚k&;HaFym4XVvfwUA<k W^;i%_4кD^ q田.-lף$H+#rxOrzXf=Iktxc՛/pʼ07^~ǎG Z78,hߝcT[i9~᾿nXda,' bA/t RW;/4 6|qv^GDL $ pB^P*x_eYq#gV_{nF~wtPlη< ˩Iohc@W1HTo~ejP50qQ\yCQ9SF $O,sa,2ZїTQюyxױySgVAh$2 V5|v$eˉ¸i"8,E%iX>H2^tgC k5[ ,Va8 u|aTH豃9ДVRl6752^81Y<ܧbx ƼxKMӽ]g51х"8"7o!iz"FQ);2ǥO|9,Qe-n-`6tO/tY i.u7zȼݑXB_OD9T76kp9ɼbٚ$2 #PW\^l֨4wv%DaBi#@yⶳ-3clJ;.-WSGu;# Bx,W:.kCjU!o}\ii1\Nd?ge2;uC 5oھgRPI4 ~XJ7cT6[V/4VYJķRF:H +߭һk)qW\NFc$o')ITT`G'@k-o/=n?-lǰ+|O?0׿xc{}IYԚm2<^`nb9%LNU=~|]Af!fEUTgῖf4;hzPWU槧_ X-1qo" (XD?I=;puV>ӷuȭ]Ŧ7# 8f$  տ[yߔ^4;G vF?2 ky!X{kہ!!= @L8Eq'܁Szd?8(0퇷r8'/x#l]cT>U AF y 25׉++#PC >x#VeDm/I]]OD x5WŴ:7u$-'i/"7_$/rG:gW77Z\чTa#)e A KgvM^&a$J@ 8UETI3:;OH&RilKmp~!YX%pzTsU\X}N1R%h#U_~H.~iT=qqwx-K `@!H@5~1Se& V ZʟH紋$anH&٭[Q 1Iqs*w,B*腻wzb16"X/2JR?ٔ@ я7 ; .JU3XieDuVNy Py /Quļb [2h 0Ċ8TU  ;OK{.&!qkkI/GpV@Xlj29.9e  i-nE*ʐG*H°nz:>R}%ĵ[H^ H̢@u_7U-j3u6^-kgm1"H;; U*u"AO|v  }-kV+ZUd+;Uaz۟q4Vn<>kG홹yfK fP=9#kg{Wmmo7;.QqUgS=ܝot^OOc9&d##‘^|ʠ6;v6Z\_fΜ)oo,N5s Zჱ૷!HK|N?MKtg~iڼ_'OmzqOWn觵LII"?41w~-d2im{ywwIc<"Pvy%2sΕ+eЙͿe,~/egxbPIؗAr>p쏨xc+NѢo$OO>xZՖ3=.MmIW1JGMG@9FSZCǡ.6RbV$iwmeH-d xߖNLgA U[ko+[[r%cp=f*~{K֖66]]`+EQIIY鹻 ,۫pldyyqY2$@Ď}@&W/~Ssmܡ}+u Ɍ)`AkG6+ ^$B|ʳyA(^ цj̾ɽ/l,'R VY V,#)8o:}I1C{wo'exg}RI? \#6ߌ,^"rY{[[1ikq̪ rH?}[^[G?vK?l%Arh^:IzeѿXj uہ.5t`>;t߈8v JR)JR)JR)JR)JR)JR-kkFK1J"m,~2ƒ!~~qY͝GZ[ޥ*(Osqq,~2ƒ!~~FReike Cgm M,2EE/#w bOɮjROJa?Ξ/w?{w4)JR)JR)JRUZfo힞CMK{lۓqe s'x$0N ?Rgg!.^LSL-%&f,KT&i!8C䩑z65RI4kN[ÞZ 7HU_@ ڱkz_soИX-f\i3{b@unWgҶkL'eۼgYzyF~b*G箌)Jv{s.FP}1ƀ42z;;p~>!A#6'h0Ҧ$_ F{)bC+[ K]i[aֿU6;#x GFՔH$r ùMΐAAKąN~[͋նqK*Me O$GV<Oh [{n.bY*0]X|2A|k~"돚e\KK[mom 2iy8´&¨^3qOoºTYc&ۇᕻp(?NQ~ys;c'juŭ7P[[#T ɉ݉RArfobY; mo YGTm& JnILLvy^/$,Ȍı}R#9Pk{p^1]+swqu45qslR۬PJ= JWl. eqd/DCᦝB>F'<vf[wGM-?`1CJFb,b g*O Kh'@ʌ9WV A&iyfID)=[A!9 Ǐu{lv9Kqm2Oeu.Vdn~ I3-M3+2CH# sbrLN~+9hOWRAWJRowks560-@ W~ttn EsR+~ [źnJ2P"7 {v/+á57$>q۬Q?~T/q>?fz]iv;U!bqm8A}E;|tdJ_5 e{,7AVxcf ,Op+)J=S z=8;|S^dgsGS*D*á|2y:Qno nk5`pt"=IRxUYLepB#zf)JR)JͻQU"JhLu\$@LB9T)JR)JR)JR)JR)JR d;ca<&Nii$Kr"a@c6 SZΙ x,> i&]V@`G,􏣲;Ws$Kwu%ay:7s7S۩"jQI5ݽ8n<]׽U珿+O<%Ҹ9c$Zba R pX7j--oko-uNjeIcNi]U^Ҕ*u&م^%%$Texyu$)Nzz=;qshrTEM/4[''D zƤ"mmBUyq)xy!.?**yR }c՛7>?od(i/ wc>{$Wkj2{q<6؀q-$sBFUA*1i?ls]fi=a5gіlag'IUTzrK^OA???c_/~Ҕ`w߆[nw,VًI7oq*e7" X1BVe9uflkno& %lʩ* 㞲b.ƾăCڛK[RDՁ<x?o/j-ްl( DE'CݤQU_՛k]2rf1X{,{Tݴ1B̾~:ݿ`Yc}:iٶ+UjYO^BOѕv`BRN{ӨoSqsXdf\D'MbAG `z sG{頻!CGp2*``A ~ޘu>޵J:K[5=] K#q'O6GzσI&+;.Xng~#$UO ={mmC6\Ć!D"Rʯԡad{DwtWLcsY<>:on,.9A -D\X&Nk,[Ilnʈ1!A_ZJg ۫/b.-qwo?/(*F$9&lE;y/>Ka Mz " kkh.W].O#{vdQ:rL[8~Af־l]vOL~O{R-k۽ 9{ۋ +JIR!3(G?R Һ/} wl_%=ws%ͪ#3<\`T__b=J]zZEySwA,%]ת=jl^6#guorY{@J|`!ϩssnBk=r$ Ds;E6,TG";yNPԘA X\8)<4W۱qpNLd5V>߽B4@VD`[o*[VګՆןi wZ' q9w_8BLpw%\yXniݣ'YDyS)IznZ5em\Y'TYUӕX%(G߁QË-38/6{c_q['nq̥C~ള63 okxx2K0^Hhۑv670Z\ijA<2Taʺe  ך~7a% ,-eq,E"Β^Đ\֬ ^K^MUH#{EӼ¨J8\_`./綎K/:e/bW _ɮ5N3{Li6x2wnxsW}/ 1KrTY*o~+vm`Zs\1F ۢGvyҕ榤tS9352r /J93hvR$}3Α}Dc`q-I5,2T8g0߉i2yeʬ!s o8 U’ zc6Mn|\1$g`aXa1p{{ ~GkkvoQē€9$AAZZVO̩,a@7,+ۄ'yLW$9,FGTxEc3B."&0v A,1~*M^[䦷$]V<'嗋/4n&H[nQOu(*Þ(qʖl=9xAkiy,H7]mu}u2)c.:+a) ~PpyR ?<]?a'O7quf" n~yMMK~uƒL F_q^$V%RI'pI>}<設q6Ƭ.~Uf~(; ՍJR)JR)JR)JR)JW ō7V1434ap~H$~4%!$q"G¨JRo-on,o ÆFSA Af6} ery>ll V )ȑ + vUUͤEŹ?6y帰{I!Z5VE u<砎Ԛ{lRQH$q 3~5 حQ\nDj-ۘQ*?SscTgp Z㵎>&J,|r%;|WŷYwm챓OIspyO,(nxRK[hn.bhgh*0ᑔ2H j%g M+oR=I4^KG4f8)=6$ gRBxrO@h/i#YZclww% *l g/yM/2]]K%;p9bOvgmry7X˓ugeRd%Ni> sm_]h32! әB4T %Wz;ӯv9YR3##ІF#  :WbYem%,2[LGHPx=y,--l,mlmac HEQ=f3SF̗WRgvIdb,XX'K`^:fbl{+ӻ噏?g\J-Y!.r/uq ^!+]IıHai>.;Hw1wv?٘O: u&-y ؍F\23ȣ.B*qQvQAsiNbS%`?OY]CŸ CV)JU3'ޛl[.~Zyh #!=TI1zInbYvAr|*O M?p+Lbݾ䳷$P>#y5V;.l5a˳<SגxI9^git3j\\X{u'!9* rO?]6M7Kk14莁%іFʞg cx<[,s5;"Kq/SWF0ꁕ_e/n?RYk,{k[2>y1<,*;C)fEI}"DnbP"1SK9<_F2; ,暿;{'쪮W̓c&!s8]k0֐K(+{D*ʬ#([ Ngs I4k2/UfV1r @#/짦M۝jMYmrQ3\ٗ_4]ZA8` Ѻ{mU2XM+bkx ^%[fg꽊?PmwxGE/1+ʼ1NUpV'ޏHۋ8s[f;qA%N#xyS?,x Z2mw(3ۋq߯#qXh,wb5ZK6kkTܨxeo7db>Ğ*rĬ7[6}Գ'v>k(nLfÒUx!6Gw屰~moe/_mt;xD]OQ`O>ycΧٳXKl4> o0,W²/?Oy械ӷ"{+<2ZAt"E#8P޲GcoCnbbW2HcRYc0<%'hBvBk=-Mia~\Xxv ݜ(嗂Gߞ*\>],;mnn5YrKy@F0#K#rݜxk-6=ػ; bT@ Ny\}Z_zCp5H/}JU# ՗xRA`Yj^&lvl9.̯ $JGDKnJkAߢۏcoϣ?G;yi \-(o0I?WHEѮ.7Ikݱ ,RynJKrJ3> n=JkξyEӟ'q=;HH:ʲH0v<2  gmm;ljMHLpã8*ĀS`v3~MH4q;)bO97ɫ؍k4GPȏnmw pB05ݭ644#r~@~kTn46Kob"㭼F{xgR$~DNۯ.O^~=,)~=߉//cWzq-oRI7wSdvڦ+إKeo:B1$ɫXlYo!\cgOo8[w@ʯ^P]y ųW{maӒȗ ,Ne nGKT߉̶,c2Y%<^>:>8?>џB+{O4>vikqPI9vSŽ+OJq3Os~]c={tQێ?nOן:^a o0<Y--i0 3$rܞ;/TYj/D&Re5ͽXq87^$kE" K[ {hmm-X`G(QT|*|+)JR)JR)JR)JTgt+n&GXn,1/,vh+y%HP̣sOc39e,n:0)9C!GH̱Bzn۽ح;G9>OVS3m܁)XE $R 򕡷!??IX.i Ʀ %0$iZ܅PHQ«,p|/KUqrױM#)eWܲ;i*s>h EIm,b`Gs%fXW,A6tra//qcpC27?Hn#G59K-:Wf!cUK"}goxPH E2}aʸm@c* xʗTLg8Qiid^\B#TU%O*AgJU'QVS0yզ&N,+].9akb Я |p+ZmI{(M]x3+#Q8e 9&wlǕbb2$LF㲎r95MCV)}5R{Brn~ airW!50bndEEEYQR\ۍ.Y9dU^@ӗQ߯^Oȩ)T-LJHmd,l׹uns?uN8Ap'5 ?͠^沿cmoXM/ϛ<졸_=tazLjfnDVcbg7pRmDIyQkM&yXn2v~UHp Ҕ)\7t7 c40]L h e,JRG#^|Q{6RCԬvS0DG3yWC)JRo =g¥ʐzI%ѳ|C:QNMgLh0Eؚ):U֩KvHO-JR)JR)JRwsޑz%0s'c/m-NDveqӃ!vJusGi"CH x$sMvtzAm53QN)sN6D}{Fnܑ]nvtΣӖy;[KktBꑹ #ċyҔ)JR)JR)JR)JR o܆[M%d_ja~3TKԄ1⸷'g|B=09-Ax+1}תןy餬[G`5N ZY:;% O#̄MN@u2j~mƛzOg4>m9,Q$0ePQe@UUG1.Mie; {noqtѶy潕3V8ISB{nnѻ9~IJE^GOp â5nO_Eymt,dRG4H_plj 4HKs%1H1O UH~Dne֘ٲQbKkqu$11V,< GűGoɆK;#X'xbk~ҢD{7=X *Ro;_mk̠+|W2s{qs|_y '>^b|F WO_?^}LF/Gc/rv涸'NZR0A0b݇H5Voi%\K p&TDZٖU.x~4?_&_kF]=|cE-{:#f{#k/oHaO!F *ɻ#s/MY!AP a$KhTI$gߏP <>kVnfSko70I(E2xEB'G<>7vїXv`@]X4m( 5KړVm:WR1x-[#pGwt@YJX2zť/Y QO'FT3dTsEks&I$EoP:Gho2yLՋڢ`rF#T9I+='WEEK&ڍtlP_aYxsrWYdFRfs߬}ko ij\Xp;(xXp*E dQ&Y6ӷPabb\J~`,ĐK+0d=f4iep{y8UDUn?_;5Gv4칍-s0ki|WvWJslO=K*x#7utسb2,U^;VeTYr=A?'h#jos|?{N<]9xߟxiw*Uƙm&H^ x*3b:oMٻ܆az4d"Y`GR,ʋ[SbVZHff)~ &y*9JAv'!GS:V`H--_g7m ]è#)`Ȉ@pcB@%/ :7῟7usmao q:'fTUI mw#Dn=ÕQʈH)"?<7%Oo-fvX:n'Xb O܁UdbK ʲOݺMy~~|Glpy}㱅mc_!ne!5ƙkgidꥏTV$i-M3+2CH# ԂKh'@ʌ9WV AZ }]V%[I/{F~G^UHXx[_u XCcG=a=O뛈,*[awkco}cs եK4 xFR sR)JR)JR)JTgv1wͬոL\!Y uE rHX#Sg,ٛhZ$M,BN\,_Le!HfV8 \>YfBȌGxb;uMeg?ZO^da)[ y p!Be)$v Fߥ+)$^#ެ3I[k\+?BpL9{?G;͡\ffo$M#>tX9=}'_ #Xe,z0U$Pdĕ[_݋W  u&Q,Qڠz4ۖb v!i=ga}xr7V𮷿^C,s({$w+ʸъR7;2A5vڪR&B{V8Fس= 2CO)e, JAeIzZUMh \#nUVRt}lJ<(7 Z]&oeO Sȍ.'.ŔH?qZCh͗ZCpu%%\,'#7VXxe#Wg[oltG,0G=hF^$`x<͟Սlnށ.m1}aB,SȒYB9 *P߇3?6տJ 756clg]+?a4͆y%vBSbI$Mg;I]/ 3Os+/_m׷Es_;l~nnjO^v?x/IiP/g0̐MsOË!dkjމ;y%Kpz# l.o.r±,myG{|Kشgg?^Rc?ĿjKشgoX9K?cw4ZtV)W}Qsk)G{sZiZ\-_I^$9_K{7^Y¬s MgCwVޥ63CW$rYZ^TkgkNc/![_C{bFGn9$_9֛͐[Ee_SM}-KbUf:2Ho /o&ReO4 . ~ŔHsZ.'yPe.Wm쮥Z[o%ݺr9N<5 mnܯ\濗{iKwT=|z/.yN߹O4^xYgv{n_7GD[?YU r9fn + tރu^)%%WTexuF؟܆[MLYa I^CQl׹uns?uN8Ap'53}ѸH8{crW2;DlQ<@Y?ṩ !t[ =ͽŗffh!}O!o˽~ߧn|~^}<\ֆ&x&X,ugPYZcdt+<@`z͑]+y즙k}l--o{v,4׆x34矞n~On<֌+9ǦkCwVKkUIu ݣ xQ?k?M,&`>+iRO%PD$qܰpx#>sn`ncMRKsB J{\pٴ^ҐN2;ئkI$]cvQ*KUYjIW{,oml,&-/s;Q$~!1͎n3 mkk62 e[e ?cV[}iҺU[vO YIo!DJI1nU9+ }ilq: NmG,9wXZqre~{sO4RCl样{.f&nGZ>{ly}? Jnޭ36Yorr[z;}lYG,5]_}嗝4іKuʷZ4 ln.aɳ_x`,k[^Yyf ҹ \w=q5U%SyC!(ܣ}<+ԽYi\^6Zk,!t腖%1y?cgR&,۔:"L$J;1 &=pC_4ytZ\Yi^6JNeTpbA=*|%5 F7/<Džs诋|LjMh<ks W(J‚B@cj+Myᾖ-?6nFD !fUƎ@8=UӦn0d(38Fݕe;q7WM\zK~NatP}=/q$G -Y `xs4,a$0`#?^]xxf]7-.̶*yyOÖ<*TϧUӶSTfx{icn\[0HTqK'uרK.nn^k7>}gۯI_3W H3d۬9:/AlAn+؆㞭o2Ya_=Z||Rq(rA-LNa^NkIvv X9?rhďSeqCKikIVެ{q3iA28G9nr:~[g\|2'$d7 H+?~Տrc?]ݭ!n6$Zg@nX%-1wy;+{VΫ-ώݤu+Cz9]_:%wBM4UU@,@_Mޯa5C;-G$Vd%o)H޷5֛כηz^bd@cN:3p@;}ro#4/~gnmיoUp~&7v}R+H m9_V1iYῖmc䖕 27je)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)J-ڧIarIlm}͚5D{})/ӂAVHgMX0֒Jfx,-6r.UU+*3M}3BI@Wۦ4gMap篸+/^z裷~ܟ L{}qy6eV1ǒP? >+im;e:v./CA$I$$$I&;[u֗LÓ y`!<-erfǞ ;kpy&~P{\^OqY/!+ _]A*ʋ6BhS )W_`ASкoq֗^9PYbnW^O ՚3fٮ&#e2:1A; ܕ*Xs\ckl^VgHPrO H77kt&~_k/ӿ^y~xY6;jMC6YHh{7b9ÞcVmP'ary=87=ݕF @0IuNH ׀82>V5ߕ>'{>B&>4czG^^ݩ۽/ZTi)k4/wvIұ'#^B^~*YJv{.SQȄ,Ҁzpz~~AI0_{뇱ܹiXQ,*&PU>|^hݥů־95- XRH;q/*v.T5}ڶKHp]bD?>Ov:|;W pJ\x-1ՙ<7=\u=sՓ}@zFVjYV9Kq{ə6d(K1oTۏZ欼 \+s3BǤAQ:>*A鬲AK轓arݰ?~HdepI7N9ֿXlhx:37VG!jR)JR)JR)JR)JRλ7BY]l\k?p<F#̂Kh'@ʌ9WV A毋7`se3y;,e|W1Gق'@7psS av BH )])JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR-XvV'uYn|kOR ɦW-O2vV--}wI؎rO_mC,7_lIZL\lnezN%n_u莡~Wrm=տrdnYnԞ8 5bڏ9ZI('Kx$ g X΀ד%X۹%hͽ̅SP2 G|'umsj#5:K[v%"{2KB?~Eq6>k߷׎y㚓UMSo6]`3nVrgVTEvqo;f`v<GkkvoQT^XxP$5SܚG[앎j-?[Q @0 OH؂ C3?զiJR)JR*'[-qL֐)C<HC0yw,sa,2ZїT})JR)JRVz|sj9)wvGh-Q,8%yU}J;H'Z'zVc𶟔{Oot2o/n?mhM+;/wDO*=nEӸC]B:;'+^)JR)JR)JR)JR)JR*3MΐAAKą9}}MnJx RX-!I cffX3%9-B6rZrxzē9YCJ0~!(=`H=ņBK["Jʒ9-6K@khK[ K(CTu.`J Iی尵2nQQv ʢ4A2%?@[gy6'pwjg2u ͊M8iDWgGm;k.630r0*-SJTG*H#'nR֚wWk{:B^XU($Oט7Vn4Fkwm[rDuV5XYWG  JamZ9%(BD'&Uzs!P{pMws򻅶I9[wѼZ w,/#"0[{6rC1~ oq^oĒq!#w?NJ;x飬']jM+mwHZ_=e긒@;$$ xv,L}c>};]MsYq7N{x0 ^Uq~3?̓MmPoYn;KGiX\V2KQdY3b%'GQč9NM_k=z,u)ɉ;+2#㈏ b~w_\`&lt;\-nx㷋Ԝ|U}PYn_h.뜴HӭJG[8BLOp ;!Mŭ cc Vxݢǧ$sȬwZO.gDֲu(]k'Eb7YTz}I>'l3x_=~9̄$}J5One8}G2s,-13si(HNcndfn+t6q{oq;6d{I_%tkTi$9K} ;Ajؙd +ʬcQE?ٛnVo6Z2Fì3S,}{;IUY2}[Ov7{hqTP:F"F 2^{:tWTXc-^C?4@.¨$r񬿡w}w>vLi,](.Y/ygs"HYUoύ 7W2J^GQ^i=]cs^&d8nQxI>\u$H^:ov!1ZRVU?\WJH #ankHr Ѻ~HIoTfʼ=U<9hH+xhl OejJVwrҩ \|)UnM ټGe>QyXGޯQ_r'sb~[XqYPxeHfA P+s߃R/Liژ^ܥ0$iXA!G ij‘H9r{7{oa{+s \۬76?V  ;ci ]Q}ŔL -JA R D{KcI3ėVQ]"N÷ 㞧* wm׬lV{M[||ؼeQ!q!~db}=T4ᴶ:#;cSf$X$Y7?~A/wc߳}vSt0nu[_=hT^$_ Urޮ6Wܤnf(21y+0/m&^[:bdtS+xyƽ{7ߙArֲK凬xT˩>YvNŘ73iej7$qآ(ꠂH9 Ma?io8Q&'fbz'ⴕ)Y }=-w1"#]}± ^~¹/܆g魫Ffج.lo'eu(0Q؀9bL~yo,O/~>zt~*% ܏ g1p0;,WVsIՊ,V[]{iOx=]yG"tޡj[әff9L/=\F% ! 7 vt)JR)JR)JR)JR* ;gݍ>O5 E͕_-mpʲ^S x*0>-I&˺_i 8UrQz$"jM|km&CG"O*'0N]$>ݙ)+;0Kt觯L dORz}=og `)-0; aaC'dr[Ai=S߾::|w[[ѹ vQil썬C]dU+#>-9C0Iq,7YR%@cܱE9=z]vWnv,ڛXA2Dw0 fkAb 5vLtvi}7o&YXpen b\@fb "q +՘K]KrrIe;@RT(I9[1{ Uikۛ n[#1f>:®>YOA)7_N-U ã"''XXp1;p4VZ][kVKp#(U@G&Gԃ=Pc1z3JF:;xѢbH%^|UMk/D݋Hz~%܆iq~3?̓MmT;-Ml͉h?w8 w+FYdsogG)Ud_o[r[HXuRї4B {ep|q\1'1(ݵ{W?Ftɽ{g{I,ҰQ@ULΕLZU3eoWf.p]'n|%7?W k}<'i;]SXos ֙}- ٹ[532 (qeVۏLq{w&fTk@Axxi)ݏz/?~5Gi+v;됚[h\Be;#a&vy? 3\k~GCN]xUj=#Uj=9nR O(Nೂ̿*x{svRk-ӾP"o w 3۫JӰn{pxjo\V>5,-s[h\DПn}x?ڻ׾0)mb"]E]]8*”ױ [7C%u]Zn}:+GO'f TAL"l~Sg2K{;%{{~CH ߲?e^ת}\w}&G{]z4s2v]lרm__ہ{+n$G0U>德y/geċkYpZxneuQ'LُIN^}FT;} Nm,l5"RE(_@0̐MsOË!dkj?=_ԛL+y6([+h2KqWdaPH38@5hK:L&/)g` `H Fo@h, Y`rx]>%rP ܺ:*HyX@-$,y뤩Uv)ZOR(*0>¨oIKg6篦#p2;BҼBřwnJ`s:Bxn "`512'R][B]%llEkv(ܼPF ANN!u /3gD̈uTBbAy_g{Oŏyo;v+ ɽKq"p*!^|/H;+̮bI^ߢ~저$~?W{ bԚvO[xaIx31WW!3hHGii^$p~ OR /"i 6X#ec)N9f.;3!q}3<:Ug̛k!G! UL *QsP~}& <(ŝbD8J;.xiJ}K μIC&R(^9d)㔠cdx3f ]zo!l|4e OGIjYY)u6#9indc4=B/2gn}ORXe=d^4N(d_)=cHiM6 ݽ+qS&fwTc xy‘IJ(;# VvfxX?Qkܽ/ ~V?3+ۇ A2mڌN{<]JH dṟ'/ | ArS>%l ng"juyidGge$+z{^N`kI%3<o9**~g_benb'T=n/)x㿗 y$IAzһ?VlF9Wť 9D1cKج~:Zob˳*ry/`~:_xyge7lד!鐎rGD(x$:KԚ38亂m^6JY~3GY=Hs"L&8X[ȅ~G.9n 5o{~,-^k,Y&ܴo J̢0K/YttLc?PÚg&;uɎeVH,Ne۬~Ӗx˫vNnc_U S^K}5Ig-8iY,ZOk{}e#ǵ?~{U%NͻD HKp#ȼ؂no_a0wVsW6F,u\ YH_T1xqK Q#lOF"6-y~xs ܝMOL2 g7PeoF(E2!W$wBu9OԖⶃW_d%.u*Vn 3}QʼsՇGfgBd2mglZoq}khJGeĎ8sJ߈C 48rI3~ +C.kk;h}*R9AuG'#U-+vlFXcs;[ب8rpH#N;2sHZnZ[u=]yG}PO"9'9zFm@ufs,S^ʶ['r9z襾?3̿4~i^_/=x8-)JR)JR)JR)JR@z8,NBÖx-;yV/U&'gj R{?e7]eNAuaߏ8ݖ666[D1$Q¢UW5Gވzjk"0md$A+ʩ\zWk t1{>})J5V t8r8WGʰ  i/1%[ [[^f屾o)n L}Eʷ%K$X 6ӷ{P\[>pA*C  k j)FMW6o"HYzBroIn3&"16IYVt9@9 *RsowrŖY.;?|+z/VXFWG<b7siuؼey$R: z '^G<)on/=ߚoW~^:8i\M5)q^b>?aΔ)JR)JR)JR)JR)JR)JR)JR)JR)JRuO`5-X<33id.#W\a߂ƾ-74^{94H/=6y dPJxrT)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRm>i}$p2.n]nm|eUCy)6צoZN .:(&KiHO#<~#*HPR)JR3wVg,o-sl}۬ ҧ>Nzq#`lҶ+7y~9<853)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRW66kOjXts613FV䪙1Ò~QA=7mdtד`v. L C;Vn̽.]~9I_x3VP4Ȝ]nX'PB CזSftvjIYXn"^ bAVb e 䌙[/V3K=ܿؕR(4!U Id7KWj=U4nnoi-:D _ȇ)9v5|Y d4>K{s(8?~u %,취ξm#(d/Rс9$L=Ubm=gk5N` WuFQјMq+;Gm rSĊ'2'T:y4 ѝ#;r_.S+${u8ΞcVRcPkֿj bl}єH,p g/Ry׷OWcb8liwF(R AX}ݍM#!4\^#xmKkxdi&,ẖJ Q܏OҔc?ĿkLOCA-㿦uwkacq}}s M4 HEP$e-]5cb{ֽ\G»j oػP?VNަq[tޜ˶Ig[Qp07*ׯJVy՞Mjj.WYNۘrT+ʞ9\[1 o{oaEYW+{f UAS.ݝUs43PZXeBI\EpNw;]iZT^{(>@[H=by?X{J|?o]?W?smSlÑE巸.>~U  VsH--_g7m ]è#)`Ȉ@pcB@%Ϣ_Ť[=sרݴl/uZ\,IxĊ)^e168VIn5<,g=%2)o?V9S{M7t0re4S~yk*-װY6o-fvX:n'Xb O܁To^l?5?ckҹ6ӶZOdaD~b?* A+pX__\kimM]&ŸŻYd*K)$\:J'|u'͛awkco}cs եK4 xFR |ZP4Պ_j<3 i$-g [c߀º˽6x޸6'+snxܷՈx?[蹯V0?%*)f(LiWCsb?~+zl^Ng1H0iq,2>5͛bx2[Ggb WǦ5fgRs~ۯ+nzǯ=[~onlY.aydpT,5f5 }1뼔.)."V r8^O,?WgJR)JRfoWO\iܦdoYtQ]t&_@3Jɾ3{?$O{3c}ߏ3}NHQy-3&ً۝M\絆C$/2g?S? >Ҕ)JR)JR)JR)JRLZT3f'ڨo]=J>#]$6{t H9ar;r@/;g|w3 }Sk2k+Hᕙc-#SFhwKm%{; ^*̗äi dTuSS&8}߹ yJ߆_Vo܆[M%c?CwOָ_r^ C \QcՂvr>y/2 FLwCef[wrʄM7G)=@<9x4=gE_MaJ$ sh$Y^輯 Iy./z4 uPflVL)"HTn%!`FϻYXJ-q eE䰉z]yn'a5K]ԗQլ({r-ĿB ~ F}?X-_aQ݇oA{yيDe>C ۯSf~# 7$\3d=/fmF-vd-\*E/AcȏגO^9Uvm^j R%g8ӖY~G ODKa ~;l/~gnmךz:Pc,~b[ˊýGEyQ‘8#m'#`qٳrK(lǹv]=?lҔc?ĿkLOCA-㿦uj%ҹm9}$elf H*bpǎAY7@꽭KƜˍAګ9*g$ 5ćf~}KF[c&C&㡶6ٹ- ~cTGK۫z]Is7HE6>b!Uh#Uf1IK۩g<&i90]M rV~4QxPO<YWp=Z!-q&UgX}Љ[ײ?nkVz ϧ}M{L>"Kr[Š-^"RxO̠k6+z;q9?\GO?c~$vn@$tKyø_U2 $|T/b?ď5~XAe~ NĆ%yʡ wu.c.1_"oAxӓcToM oz{{YBG P@PH<,njMIkl mEmon^Ifq<(!U@zw/j:_5/bP^9{{FlP "Cвn|qR\;K9.uki,e|;fUljտ{`4m>5di9f?rjh{Scܔ]cjTt!C/zZXjne/˖d)2`z؊ڗjs["Hc$%RS<;vlokpҶw¶^^_oxˡ~dhӀy[.bߤ{϶|Qs_frM *Z.]׳E nBb@E,P I6lC"Y-$#(zIF$~A_rǸVzOܫ \`vXɏʰi<#H|(߅ bX+2y(_sUV({u=yF&~3v jaR +?Ab2fgY:SjlDM%.2Ffg0,qJ>R" \\zXq6E9Q/ȀB/#9p?ћx =UݭL\ݣ^9E4(y~Ttg>fwKikP 1ύ/nG1@:mTF+fF_F&cWUHHPdQ>Gy۶[cӚS~ym%G~R5i_n_D{{szki,&'&D\_+j*b@&m{R}j9+9A$3:Dcn˻@5Eg4ޟY9le(H,2bH5r `I?VQэYfJ6ylfLuØ(DNrya{m:P]f.eX`We*-_ 1p|=kVz_mSc/W6=]YKؕp{G(@_繑YjwlJ;x{N X~## uԱ*MdU[ikOMb3qjeDEu.T?aJu]&uwsc ό < ~Z"I*OR+,Mo6da{k紻%vW5JQ`>TU޽1oһ_YKYY{hd_)'y! 1_^ϫKmMqm41]j Hʬ! ?בʰQV>5rbMk,isMpC+H;3pOxfo͖׶][z-HFE !o9tnR\Nh20$T` aΔ)JR)JR)JR)JU3kj_YkJ3Qj-xXญ!0V.@Bճ}ַЕ`gCq"1Ƌh"z<} l; r[/ҷE# ! r=A,i?V=]at&_2ÚX##<;\񳩔{ӵ[ڹ + qc'b!Pռ|Ko9i}$Hd%(eePO@v -Am{l~fSi+^\/,r[#Xs~C{V_ZX[CuisC<F9Q ᔂA^yjrwbĿnK\\HX2t`Kth-]koD89%mŘx:xnUGeV<,gS{X]?#(%̒b1 9$$hws|{%ܥ"\Re9:=K*Re䳳vPٞ3z #ԶX5lo%ou JLRO!X0fkRTNԚ2kT i0Ha+,rI9n9_NGnkIMQmWN\[GS&"VY%K u"%^Asu>6=0mIRq7W dgBHn%@ 5}\i \6%F(]{?BHXw 8cH>4fjױqJ{o2QdUfs,NT(?#~84gMVAw;C^˻Y^yürN8$Ԙ8=#{:)eCO^Aq|)Y#UFhCODԱlwn^M}[e,㐆d ʋS*|C:K5w_C7cn/?NWe?wnR?~ۄrԝ~ўOnJW~*Zn]ZWZ3Bx ?((JvӻioOjec`?a՚T?Rb G'LK~If~n?'ʖwovsxERV8ً=T7} RX=jknM+Iw< ,K<[BC!o-]ҺUک& ymaʣyvZ>X uՂk]{e![xe`>I%S(G5)Q9;c ^I 7^53{ˎ,O_q%IFncdXW矮746Yos+,RC oՂ0#^! Ym/vK-&kL\׆pQ"hq27]}jxz- q/m\n.V*])GcբC ]Qk-2]6RR'H$h笆gX~x}hP4Cpsu+p?e:7S"oġ\i(\lmas/P+vQ䪇RawHLz{Te䤝׵2cوRL$倬h U4մN)Kq\;RR3+mZk8XC7IISY|-yo[m^WJjĉ{n6#E_&Oy.mYzjlV}8 -p?_*X&Ey)a3xņC7/)!dn9R5'J26%o}6k,c蝸{P,0cM[72dļ('D^~ÞOU7U-]&-݌y+˃,/5"A ӦLq⹷avE"I$U{XoE$&2Ī8rIW-Һ6xE\JTy @!yd PWZ~;lcnU:n-]fltnbC ¤R~bËߙ[j7scqo r"\B #YK9 Φ k(mv'|<ݥ$r4(Xq4ʺ۬qY8* 1TqWiumY -+Aq5U0!t':>9Vpk<_z[6?kmxg L >@ ;Fē[[c*) 1N}K~Z7sj)kekBܫSGkWP9܅K u{o<@uV:ZKa 柇C3?՛}q]\԰\4VYnHYaCk@e{c&d?)=E丟Ɯp W>VսKq4ʱ^u #YAW%E\*ݟtv%^/`ôEb2 "2)+LvK[oMjk{ha[ɮ8´.@G7DE>UYۅ:ozu(M%3 KW"Yex uO[r1XxpKDYEa,A^$D'!GS:R)JR)JR)JR)T79Ecɞ&@euKcj9gM[wMo,d,nҲr9FWN[EhR)JR)JR)_1X;xlXb=Q@$ܓ_m)\/ij_=-w O Sʗ@pcB@%_otb\e>L;)?THY؟Msii!rDay1H% "WSې?»K[hn.bhgh*0ᑔ2H j{wU>hldF̒?yc&VQԢQC?D,Hϻ>I:yۯ={}U`RΟ7OƮi+,kyxnw` IZSM,MSI\eRrx"W=].,Yi9[{~t1O< _6666[D1$Q¢UTqgmw9oX[XY/ȣ~Y$$$I$gJ5fR\h23YN$T 1RAc ѮX_[Xskwm*ۤ:UՄ|+ߏLx:]glGͽCQrSpUhy%~{~o9f-Z@cn%>Wp>F=ͻ+e[R/C^@ȬOi"6,\5Vgo=܆~ǂ.6ÃǏ9r>~́@3H+_Q8n-Xcfv0Nꥥ [ 'ӝlۏ{e-V$|wI*Fl͎nLl;,$pxyě|tFgq4Sy(Zy߫UX TER[W[RmuV\?}ş\y\?vT^3g?ow#l0f/G>,'ewXA?P[o&:ksYRȋ@aVIPI327\\Ki-=v1xJ$bI%%$I5kkڃQhfe(#@GUTrI rI<`n6٭2:OdqMRN KGYْubK?Uv~gsv9QjL-ޚ,,,n%d (DVIS}J^9NR=i岋?~-@+@Vs)yq-Su-F5%r#g2Epy\Xw<b%EE,y*crMm7b{+k:3Z!*Gea7<}8l ݜNy46R.ʾI@Y{v^_Pl%ҹm9}$elf H*bpǎA^y}/{7׺{AvIe4'+$`n8e`W-|{ٶַzW G3)vu1*qntUN,X5.5&.gW`? ] /,;7$NnY;ubJ^Y^CUbw VW;qiki<gD;# p㚶޹THq$cohG2O$NLsxp@v@I'vlۍh;eP+#Q+ۅ8>w{}kk'W3xpGzssgU=t{5s|4|vF4)JR)JR)JR)JR)JR)JR)JR)JR)JR)JU t.ֹ=]5lFPn-R4 x?eQUG$$66+k+X-Ew;NΔ)JR)JR)JR)JRj]j/s~z߃NzΤ1h=q77NU>;#ՊR+XT07i]U\N+9Yd'嵼fNvF9p })JR)JR)JR)JR)JV ޡi]QXfԉbE(;x^4s,z*9.9yT~Zi{m{m.3èMBb:}zۅfMH)JR)JR)JRg!4zȠ^ݿ-N/v$"!'u`ʪe,0x;Roa^8R($'*6Q^7Gcm3BÓ,O9uX%HK}Lx,R)JR)JR)JK4?.Uۿ}_oWsJR)JR)JR)JR)JR)JR)JR)JR)JRTަgt7+iO$xWV@啇"wOXC\joW8)3'7-etuHTuPR_nz!rj4?([%;(|THsRb,3{fdiR$~H$QT/rC|iwv;,(EQI?@"<$2V@$$WZԲ#EB$2D&@ x_AbcVMҹk9i j+o191,)~K~^ml6ORa6mie}]k*$q5D*^c ?D1{{,k/g:As؆+H$|Zz};,V׼?ĝW2wHyoTNo<޺9v^,6qǷ{d/kgp3g ן*8mӶ7LYuՂ*_I,;2ѯrtI;75Ԯme&yPG!vRܖ :Iu.;+c 0EIP:Hm/w7Ҽj b'3(YGNHfl_7to+{uqI~."4<UEjwhu~r<& [K7`ŕÜ0?<2[5|:W5ܑ 62@pXsa:GEm5ns/oux+,xsۧny~:V$ݭ7V1,O r>H >5Q; k{WWw20AfbHMK)JW ݭ04n94.Q\#-Ѹ?<2b򼝕{Km:8'#<WTg<[{>w|ݺv}ztW>*)JR)J MO{^,o-IQ^U*xa>vMkճݮlSfxFت v ]_dpz;͡Oۃ 0dn廎DeGk-ɎBC?BFƩ%P Ps^-)Xe2Ԛ8`Bcy۠p_w67MQk,ꘈ YAKĠ =8=Cf1sAw 1q*I|-;}ō7V1434ap~H$~56^mnj).a5j(V,.V4bjXUOvm4:{F1KcoqرҐH3d`H,A"oX3uym?[c4K1[#ʝe:b7HW5L={u4F$׭kzl#Xdۉ&bL ~Ib}f3ie۷+><8~;wn}={Jῴ&x&2ic-R+sPaD"$cZNҵϥM󹹼[Io,ř_B$vbK;,ağxYHaT5Xb$ijL+pIqgA`=[n%drru-+ρ+087i{,|GnG}1d31X W){g\j&N#W?tx@<^z`zҶW{4ȓm?l_DzRk͘kQ{qy)18>YHui[ǐoBynXtզ=~Wp\dot[MsaTݣjzm;iwcu4qZN8&`'<#5LnŽ1HZ+'r:Y %~xГjO, wP^u2!%p#쌀 (x#Tf}MlƠ㴕ec[)1d xJM?n֜Pcy+{^&O"}i!,xa5^ⶹ_g$o-*T'SÁޢRg=.(܁C6xK]5q:rIXeA$G<9yq+~0 8]SY]]M4B)_"2(=UѺmy6m4-:K, 8!шF룯+~%𿪖igf Ѥ)#x5QiX7Z.w,\f\EEvdK+uG?uc^]Xuis9Q*ᔂ#^|Z1Wk[HUydIY>~B~r?YYmEmOL\wf AW2y䔫v ~+{K[Z7Z\#C<F9Q<22R  o-UOt]wAwCmsDNU~ űZ 1yṗ),W-VUTHaB)𝙘#$ןy餬gq~?sSm[6Y=]ec(>9f;*HI0jT~.Y2p|K+"s 1 ) %*=z3aikacoccm K CHE**Py>MSOeu Ñ\4W$ Ua 88}i{\͞s wzz 0Wy&$ +9ss$&ƥ)JR)JR)JR)JR)JR+=+Zgrk olb]:HYz,8#I5~Dh-DڎHilK$͑ \e ۳vnO<ǟ/tFK4,̹qxR/U8T/R%3wB Ċ3!yf<}'j33ituldwbX{rBQiL ?aōPm-{KgaaqFzQ&J,q4QIu=F ]a AE͉׿ڭ.bhmb5 O Ơݱw=ڒ+KV+tDy>&,;ʞzكDfϦN T&Q _W(TFʬ';/:7iqwvzV ֚2Kqќz9ՁJػ  Xd-/)*A#A UYkֆ՘K]KrrIe;@RT(I9mgymiJv{.SQȄ,Ҁzpz~~AI0XzKwܹYT8QJf`G 1V~էB齹_K{{(>$r[H?wҎG;g[ie.ײpY!0ά_KAkG7Y:+}5ʦ6] B*tN8Km>Ij BKyd0:1"ǎy&Iy]}2z)We{[{[\{8WtFk'rsS=M\ߧIeyMfVny <)8}7zzٽU˦3icmp)ser9FH=שnajdJ,>On-$~JYy5}{tԺJ FD=IJ"s2C0 HZ}/eine vVvv|P o܆[M%yh}ƽ{ D(?E~$}(Ft 8 qحmqr)C ,݊A #~m>>?'On;u>k~2y|Nۧ㏊W(V1aclZ#u |Fc/?3v@~-ٸ'oz%BCbf ѫRWFՆaZ=lعbYu"E. `As[3F͏zP2e..$?bHF <8.׺'9C!Y$hB"(~ʢI$I'w3sq7<Զ0FpTRP}ިZ{qzFqq{I$v'FvF!;}\l5ݮhv&3خ/ӷ-aG_e/X7Wj4cPeY\"*2B9"Y AJޮMye\8ս%~x(\NlΕj;HlRxO1pPQHfCo?zQԙ]#2: /uEŊ-*!*ŏ ~ooS~m~oNv^|[u-6`sZ{: V,#J 6~ّX RetdbPM1ږo$F-(ɞJ~+3gl1C48Dn_:¬m'_#;oKs`U5f/ܭ!e-Y%-)F*Z[pjЕgw{ޜ@.{ ;kF,X$8?R9!к %ܬ<[Q;{H8hӀg~vZ3bLF%dH%p#RLq~1^+-us7+2ᮭݼ, LuS[ ^~WV|;[c%Gq1H*~s ]i>h{m""$idʃf߇bu>9 [=-;y r@^ArkYo~6Phd-UYu.DNz=ϏgG% 6/ r5, cfE,A^[w^5{:gI희{8+7KgKy$HSYI%xjܻqtV;3 E٥ ꣼<3g?$ĒOH)JR)JR)JR)JR)JR)JR)JR[ilzgSXMOqoxuu2#\M[9V&X'Chˬ嘒,F([)JR)JR)JR)J=Q._i;i#_DORVU ~$b 2ސ6yu9i-WRM,*?$EEE rXr˳)J}"DnbP"1SK9܁ m+Zi nJygf)1$O&&'Ëc,vZf,z,I<&=Ok ݽ61\xqۯu=y|XM8<9L&8;xPC,}ꠎTx?bEI-}\WQI%*8TP;vk6nͣ2i .yy[)吳בjgJR)JR)JR)JR)JR)JR)Un+h:l6#vWُЇA`G kڽ[u]]EKa?\$rdn;#;#+p9IJR+hi@Ċ9gf? I? hJ{aۘݼs'ߔ~<8{*9)JTNr4Dm/꫘);F腺SԼ)QI^KGHJy 8W`J9rWuawkco}cs եK4 xFR sR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRUv8ry+W&+P2ev`QIGeW rx<kW{ ]my푱V% f #F$ n`h,d5Mf?k<(X[s/rB9NM7sZK'´ %Hp( fG?<֬Ot}Kh-Ҙ2zSjL=nEN~nnkih뙮t4 ;1f$I$Лi.c]n0_^_Yᣰ>h٘vqI#Īүn ZoO]`XOsn}{{tcמѕT^חW 5K-6:Ϯp bݯf5Exx}6;jMC6YHh{7b9ÞKTwm 2#GD6ܪ~vkj~uNe)n^I$%$,Nߡ{ mX.c- tH٤DÂ%G+[y{SS5,ZAg Um&p+ lWXlOCA-㿦K3QtY6s-Q_JyeFg T0=.햤ݫZn6j,Mꢺa 9DR#Æ ٶk_j4ko6BuU7h;1G'*gJ=Tn%O=5q,vX*<%1zt4[}]/^ G-NzA°OYѿI6_qAׯۿ|sTnn?ivci(OmIYe 儣 ^DA%6YK{go:'%ՍIo[pf_BU*$xew΄h||mwybWہێs珰9my]K(+{.&K4FXY2Px%C)#,lrz\-%5LxxLTc4V2Zg!mvbUT(ꠄ K@${Bk)Hn,HdRWku +3fύO+;[ [R묞[];V@7hUp.-)U7M2\6wFG@<;{eZh%RLyc ru $1`G%4jμ7u &R)H)9Q`8)=-e1|\ډ%7HB} U ~h/ޘ0OH('wVnr^Uii\T-C0qwym"?K`AHH AnjܮFb?8Aˆo4$? =uȹ_zopm[Ν5HF%\ FuBz ͡6+Yi VM%\NGoԐ[` ᔏYw=]n׹-=x"h$ͬ\ JLR"* )qvR sm_M} C䅿'k bXdUKUoQӆ٭;cyy-Jaa%'_+X"u.s^qQ2O]K^Gt;w b>x VnƂTՄ_UVhp0nTNi\7v70[DO<$Q;1UIVF>3wL_e^G4qLh1Rx[=;z{F̖R݉ N˯㞣,}mv-]K*27je)YRz+AoS:o X*!Ws-1 GKn" c'+ق? lu֛m!k4︲7e)Wב!*A?~yM]ĆKEV4f*e*7bmRʨYBcv 31Q=UZ2Kh'@ʌ9WV A5'=j-O)E>JIiQbUhR:?SS7=މx[+oܤ)!r9$I(M;Ƿ_V7=͵/5 !~"il6iJ>.\|60-#3Bi#-Ѹ?<2k)!ݥ2:zݶ]"-Vʦ!Qc$g7P5ݼ2[5v/De{Nʅ' PTD3Ֆ Bj֟ÑK,Es 9 VDOK A>]Xuis9Q*ᔂ#^c~mL/3@~ξ/:]㏞xO&7v}R+H m9_V1vF@ \#-Ѹ?<2B4-L^Y^\˙Z8 TYYxzPv#JטláZ̓)N)[OU ztۛ̅nmoo\:Fgd!߹ yJ3?6 uw/蠯LJ}mv-]K*27j6k ֱȧeb凚RB*Wۂ';PCwSPprolvnc@IE+ߐN0X + &.oambƴgm/uI`o,}H^wi&BI R +{t3wYŁilVY SxۤG+Yy_+烞 9o~vwPEѾiVF i[)|b!I !f^HBku˹Vxc^d,㽅`NcA2ո<A-M[?.mә iKݾVxAG_9<_R!^O^rHࣁtU Iz:E:\-\#Ḓ1o,LzX]?X%qmW 876۴GQau+4LDG-̳MutcʽXP BA>`uICYxxwy g^瞤vnkG wKm5kUI{lXIg)[?$:Y%U!H<"fW.fbL#N$N:K(oU8jz7Xh}On"5.[$d#"7oo*OQ6_P͡3c"G pXHTgt EM3l}&Ͽ;;}NKY O=zl\squ Y+f$,X&A8ë}.l ؈Q$-oCjA pH,A2.HR͆ em8[ a۪xmߞp{sUg.lOPvsUs;j}Ct7I"X{v/—:`8' ۍ6Gb,室K7iYUKs#1Q<|ō7V1434ap~H$~55-e"esZ~s\Y/^"2}hG=ݤ I ggvC^/io{&^efHpp X=mstUƔk2M,s$:0!gV vBx竰5Ymץm19[56S,)5kxoH~~W >2՞6Rꬶ^ΐ[r 9$M]Mh!f[%2^\4Ҳ P*Ί:'eWYmwQXU~W 2=]lު^M yud29#pG$\V]-a{yxU, : (?²fz_S[s^㥹т7̣.n`"Ռ[ҶҺm^mm[yup겻(hCw!g=fYlJVs+#wyp*R::G`E/Zԛ}_Sj+^<2]db{HpzT(T xNP.Nlu$[2lB*z zd/PǨC{㰸Xfn]%Ȱe+ /`@~ `vL\m]ټqFQybI@OJfިܝiXo26yxoMM*匄g!{(o[OїWn6+ɶ^ŠhbD)Ѣkۆe2)2s۳!҆MC#^?^Mf(ĥiEFbi,y< ^ג`z|-.--7PoI#B(dg PTn6 樂B4Gwn@r|/|5&4aKy%"OV19G @n~^f3c1MItay]YOG 9 ]Eo8{-oX&N KӬ AY}g. ҖY*Ipr۞SWϢȵGAe5E څAWy$TFUBMJ[hY汶^-a% b粢%ݢ2q<}7zGp簷3y!T$ܩETWklwpw~?KIۉ#/H}LD~Y ۟c==`elO2\aBeQI,x 3l:Wǐ0e2ZKao!>s(C,E=yyk_AZ~7o.};eGP=%/kM][ʑH:vW??W.7+X#D ɐ|zޠ,&Ԗ˒:)%hpۧo,, R k@Gߛ{nۈ==WVv670Z\ijA<2Taʺe  lGroH?2O5H=w{I௡41@eiQCD~T-Fy|V[{b`-($=V((2Z׎RVz84i^{@["@z/:g{1>S^O^z'~滚R)JR)JR)JR)JR)JR)JR)JRm/΃^9'ߨta*UnUy*xVr8nQ9niĽlIfUV&$0<) u)JR)JR)JR)JRo-on,o ÆFSA A &'Ëc,vZf,z,I<&5&j[xzWT{m5n<]׺^x?£KhvI/;qT hD$"*8P4支1fYsm I?5ym֐h-:}&\v:"#b31 8~^mGz,,'#(#C27>)^jG2z/D1~*߬|{#&Afת> $2Szbn*};zn{K\I3v"0>÷$瞧 JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JUYk絺+z/KVUQNx?Ԛ)JR)JR)JR)JR)JR)Jn>WX,d1p\2ng0ׯ#yWYwj=a9b zY[w Fp|q-ѺM,y-IHV`r9;[ mm-iiG(坘* $*֚p21XDm7P=f]Xuis9Q*ᔂ#]f՚WKmK{x׻v^xr?Ƹ&.mڿOw)>J%JxRȮ~!ۚTg7Zg_-VeʐG#Aݭ7V1,O r>H >5JR>fo83#wK%änQ OJR)JVsA{Krm(9vr1=W;?Dۣu\ךOJs丅%fn?,ُ/W)JR)JR)JR)JR)JR)JRT+o6^Brr]QKqqesCf$b <@r @Mk}m2I%V`۲2̜JV5VvŦ+W$Y;$1r^#Ao-q[@n[]9uQ׻Q ȫԚ)F<%k~OqXK<FtIL2vͲ[<E<طu>0kꌝS%9 ,k'.]U},83.vAcjkƢhk[ī(݁II0w 5qXL wCS$׺Ux%2,ËXKKZĘ%2pЃظ^),mK ܼԚ ULqYۻ0TV0\OJ.X'pSX桋$ˆt)#gkvau S!|+"Լq$;$I&oi;g$-/2\I rq<;E&>g_MVoDo/%f)x6VYz/1&@èC΀[FwG h#1\*R@1†U7-EokƫИ˛pdxUy-S$;I7n8e}'Кo.r,ݜk|"#]VӪPpǦߍ-깚/: H"{:ROn}FkQx֚Ͻ[YKwd-:-'#]ʨ$/_eas-[Ȗs ;( Jv,u)JY-=V76ԈQaQo%K"<]Qo.DGQW),+壆e"V0#  Q37n)J~~4v^Clmq,t2-ݩ7vfNBuV *O;TɢYaHbêX$ȍU/,JVGEkK.w]HYaߪ/ B> Vx=U %ga]PLk`=d.Jc|dߌVb沚KKn⛳2-b X0 oy6wHCr?Guod YXq'tA ŀδ6c_ FL4B/4rф쪯'Ĭ]z WeKZkQG wy\E"5yaW`BǎI<Y%\k}}'z8[db@!ndb[cc;+ܿttݖ#1&Ic( #@W+O/.55)U7l/%1("bM!(#nHW1j\}exC#:uA+"`XJm /M{wib%[kQƉY/p uO\xǛ۫+=QneO60ܷIヮl.omnafxdÕuaAAxPiBY4KiĒ*aW JK}ZX\nzCp5y8/#[9R@RYtfI/kqXj ݢe eF0~U ש#.dm<]3f)yQ92bS y*)o^-j7e.bI׼2(hxے>>j w'hEmfylⱌKiոB=]O_,sa,2ZїTQ䘻y3ZuÆe*I! cfAn2MF/52/Iܨ~* (X KiCr0v1yn.%?JbH@%HS`Q_Qdqgfص^ ӘW"g<'yG=IөĠryX㶲_" [{n.bY*0]X|2A|j W(7m{&B;FU} ,@;=i]/w{KuǗ; vup~AfWM7'IIJ["[p+ff /j8}Q @yƙOcۧ۷~O^9jMJR)JR)JR)JR)JRO}ylR|љF-7FuCUdpܟ dH]k;LeUaBT ^ ^}7Ijjk-"[ hSI 'hS/#9;}[^mgrD [LQY`ER|:@ct[omX|fH'*љ9:Uغ&mLn^Aإ-w WKۄrpcp %?? :Ϳ;䶙!g;r[n@?$#q5szjݭ6L-s5 61\b_k9Gn ]|c_*#v<֎+{;ŰlkV4|?IvSkeg$+?RZW^C_YgBQ6\O.d|I$|?V,d~-2ث̥.'eqXVȽ 8b>(y`U{]=^<~{|t⩟G[䃭͝_XVVxoxsjmtΛԶ]<7M+YW 7p*Qt^}s5m,&4m1uT~͜ݮӺ#br!4_tPWU]G$ ey^Mqϑי%W?9 rePޯc4b{>&)eBxC̱aܱdv@k={%e3E6m1y Y:i#Xn)Kf'ګĹhuon_RIvv^$gqMFbdznژ7Z^ ݝr>Ğy5=C3o 7E-%!sgpuV ~㲩~*g]>l^fO4P '~FB/?a[m0,tkkqso5*/,XH>$y豯>p8ռZ݋[)mnbxс*9޿WkM;sZ[6]pܥݥ4$O ]Av_Dӱh0,"kMr;2%Xjx/ʿ#~S>˯u?O^:>+#!&vw7Xeh cnM͵=g9Qu x8fOO'>s)[5ckV N'.pT30,Q&?*֫&.!I+_Z v$/@*|m)*/sajU[x飬4F W(48s ąDWG^a'w2(ER* C|uUIyKMX[,fRZX4X"BK/B8f~cV'!;FOzB-dhSVbW]<^ә MJrB {+HsˢbQby(ϫѻ_N`_~wm[}9ٙ0%n?5cwwW;iۤXP@e{c&+b3;&Rqa.HRrA+}w7VE}?I?Ʒfz]{u6z2DHJxFvXײz T$`õҘ+ܾʂѕ轢52W0!v Ȉ eQU@XO6{0ٯf[C\4~74bX;-s/nHvUQA!T$٘m]7CgSԶKk9r*) YԆR8b~f CI_C>Xۿ%B̊9"RC|xY:Mΐ^AI#@, O}}.njƚ){1fmQ#U(g^w(}$-o1O!ou+XbXqsD !x31 Q~кoq֗^9PYbnW^O <ߢ]}RhL) ҿ9 ^8ss՛X ҳ13_ʓF$W@eF,TQ䚯Czhw5zص;D Fvd%K}]z[ؽ=8Ż[ӶmET1#*<1rDVmL:1f9A}溺`BF%grX[wzV霽'>oq[aGuuBW5BU[Qr4z?puL89Uiy Ӳp(fy$v]eZC V3HqDfYǀ' ͹/{uy/̖cPį|i-ݍܻ}IO28V( wu{S fbxr*&]!׺+'uLA%0D*WUa r@;WWda6%Q$MjdLѲXVP ~t濆4%k,㸐}HL@1ơZ5OC翠o?mj7g}k}/[oMEm N\qy0׀0-R7ݺ2{p/$ /b.AR[5%ސ\u7?-5X 8چ7SqlpGErX[yW%s9",kI$^#'غש7YƧѰãRs5ZW>G#3 z+ՔyMn-Kou\ۛ~:3X7mVً]7׿oKoe7 7iU(pe#U=g|۩ᶷh0s; vROF? TynO.O+ę)I)!iG";+QKhF Δҙ~k#y q,Մs0gbvZo~?!3Yjqα*-Y>RO ڽ_jmyhmomIv4.@o+$`9?K"³?Mq_{{K;_qn{usxRYK 7Xd-/)27 iYgZn=i[&~|WLTi^=ǐH߇vv:R ﲿ;,%C -ۏR9K%u65׸,^a5^iu~75e6[f@,J vrt R7^lN)}]M﬿'vזq)xD#5 XybYͅݭ7V1,O r>H >5썁*K~ϕ2)$‘Ãi~[3pE-̗3K CyV׾-{\>o2QdUfs,NT(?#~80_qpͥo6%sI}-6W%"O+2>+I]zH >47_g)s ]è$XȈrpcp %?JWoUaTwfV_H&yX}ԤC"CQ(+p{b^vK68?5F+єJab8 #„'B$n8$wkSS_XuisO ܫR S?uk綅1"#hH,BBA9<:/+jૻ)RX1ѻګOlrWZ+skhw+>cĹpBr F2|䶅nC,0$tKx !oU29֟)JR)JR)JR)JR)Y}}.njƚ){1fmQ#U(g^w(}$-o1O!ou+XbXqsD !x31 Qft)JR)JR)JR)JR)^pzm[pv+y#q49*N9*r1:G]YXCs)]Z/;xDӡʰ EJ{Qi ?sYcr2a{ĥ{v^q|Y|N+1n-,+߈YTw}Q"W`~ a6@0L/⺳A R9RA&m+Zi nJygf)1$O&:9tO(4Oqua(=.h`etڟI]QI7{lbv^zy [{q>l=]{lT~;TvFrx}i?mWۛM}3BI@WgMX0֒Jfx,-6r.UU*/LSuzꌆ2Ks>A^|ASɋ]^k?W:~]OvC?߷?T*iM7 nVj, ahۖ,[ʼnnI&/\؟{ͪb0x; &.oa.8P$I'jiڛJ{Oqq}") Qª>]mn_?B_~cxZ< f^+y%֝~xYͼe^OCedkeC+|dn"deʝ !nAxM-.aʠH*yVu!fkUbuoVwP@ ^Ts)="mYmG}ձo!(0KD ҷ%f fS>ԖVdՖ%HBZ鵇MUY ^xKY,9{p_FY>ԱalPܮi o?NO-l]@/Gf~%f#z/1x3(V"Af囼[Jy%,9&fmi[Oܞ-R)JR7ex 6? F.w^ĬK(u1(Ĺ,dX씓j;7xܽŒ]L2u`dwbY}UQ&)JR)JRRzz?#qU&r2HOW#~XwWn9®{;T"d>$NQyud^vue^XS:R)JR)JRnAk{њc!5"/3\@QT7`SUcR)JR)JR)JR)JR)JR)JR)JR)J^߼v U{Q{+<-ȒĀ0FПn:XzҎ vWSM4"_KSP #iչ] V1m[~]T~JFd`8PKC#l}Ci^yZt_;tmITU{3-k%#AȊ#*Cmk式V38} u}'uo,u1 !GT0%)Ó 厥 Eň!L%y Tg /hoVAuÎZ 1 }1!_ry٥tk/Oxn7{VrmqkspBb*x㬊mzQॶ_xeFUPYdbOTd ׻6m6q_HZxg Lo=nÇ~yt&Ys|vQ4PCrv#\"v$^N9(XP-߬vk2s#RY B+Vf !\ybT,[8I G,A,H=I*Qe=H_묢h=y'QEUVPGU Cx<0Oa 泞md alח{;_vc(-1'CP{ҧZqZy.#A{ *T, k6m/FߤW62[H77.vvU%(RFSc+6Gg1BT|LV2AO$U Pto}#i6vioqB`A=YPJZڇtF=5Ւ#^^h%+c cUgóL.W;t6 fS}[JD{Fp@sJUH6o6~qYoe|T^Ag |*5Sk456~].l$8BqZgb_Mސ\ccdpJA?n  V*OT7nZ~-Z h. YPHi0gBPx*ን bZo~}G)d2[L+ b1ʫ$iR'i.5,‚O °S=7=Mt6fFxWW!qE IIRKЦL1k[ mm-iiG(坘* $+,_[G|-IdIn.6 @Gu[j9ͳ[Ӡ^SLd&#o{$T?uf u,XԥS;cjtRwe}Ֆ*зR[GX,G!鵇Hj+sO",{ '(N9r敡2ƬttpC)nV_ZX=M2#40%BܬHT@-%[z >vj#(3W~crfVy'C>[JڧNj=#oq\} *@*Aq}Im.dsD3֯,HBy=UZhDZyrY"QI#%$U`U$YU6oԎacC׳YOuC#| x<Ws޽bn>u[̄v]~AjOfRp緷+/^;u÷>܏+Vi\;Ը[Mu}m}tPEbHc 7^{9f8JTbB9rGԂmл ݜk@籙G,MzAy!G -V% "^TI5ԚEzOL_䡷v*ß }oP5-i33i.#WS߂?ƻ:nX_\Xn 6$NFR *YJZJ峗x,^k褸~^B@w5wkacq}}s M4 HEP$,.omnafxdÕuaAAjR)JR)JR)JR)JR)JR)JRgbte.tc a~Q㬱:]*xߠ,Ԃ:{w\A}xskE{٥ٕ r n /ӷs0O9&c(nY21,~O9B[ϩN7BtTxzLRF$<^VBSԈះ3?6ճ7!??IYgM imgkf^9Dy#O7ū[W?ǵ)o_fͿyyMD~Dq~mQ\MqYľ]4 P+ufr_X]Gt/El-ƅQbsMkƸպul}'~uqqiJ+pn[緿i7pu GYJ-zaUj ^r2?/omFw!#ݕW!כ._ÃHawsyu<]cnxp8&M<41xC,;xR^9P@%r0 :2jM/vne敹bO$}<?w!dkpzW={$UDG+X.?x ?ii tݛgkynXI#a߹ yJ.myai6~f&x)_9_Vs{~^9ca?FWkKCy3'ee,knGxXPJTWU8gRz9[{ۓ'ŽĊ3cےƵ)^pze}Fdn#bXY[ _ynpIui; ŕe2짤 ?W a?3{o093(-sn }=%n8<ZTrwZkn..X`LlBΡ G<x"omWUkSi3K^iapI1nOK7'o=뷛9e/c!VXGVy^&Be~V^TY_I`,C^|`d1#$ X87KUWԼ'bS<-A4~qI6C.$ cO19Nc\\os6X G!(Ups"vF?JJ X㡲l",p\4ӣHG3מ8ǖbMan- NVew ԯK#l\1f=4qp%`٭yGª۪sl.qqY\{*׋7v.heYWNwoGEt.5]^,3ۤGGR{Ԉ.KomuvWʯOD! "1ĐM7x/ d`2,NWK{WfR_tܛ3ZM ^;-G%$`d!s=`԰jIzqҺcmkuV_$$lP*Udv)!\2jMX{b5PQ^M~&ni{`~85%WΞ\/KG滶 V6vX{(L*+0f`e<鷋o}qicz[3ZxS%~?P?݀5CZhQ[yE/AُO"?^I=xS:R)JR)JR)JR)JR)JR)JRk7&Ktvᑲq$*m!I"D&I2P;P1kloo_Oc%;[' "m4SR` UmoGh.s1csCLe1 9$ NX/5ClU΅Ӛ{OL޾j ~I$XB.O#=ߍ,xldv첗^C,w 73xՓSۧp'^prY{ۜf/Es*G㳖 VI;($ m7l7%5ҹxeKY q:x.uq#r>.m+~v%𿭖de ݣ ؞'8:pu·N]2ehmAs >Pd[׆jp})c6N-Ϟ_#*+4̦Qf2| eu>c6kx-N2#[ɔ$qF FΡVOqb7FnO ۼՖ3l^lsS N)B0;fMw;Ѵs9!7qx X=(|&7UoǪ,Atnm{y}P?\5%~Ml6ɨ񒋼S;$eHKrDX[ZDnEŽԶW>E єx߄nV@˻}],MTnvdw]&ř} bcHYRα,Cizк^li{/{G E*2ļ}n<pN̖:w5ucH3/m8nv%XèzN]Q7f]ט(lqג͘zO#2ȰfXtf*YKM^~uŮجѸ\R`6 2#ʢI >,2#{-xu=T壞$y=c3sǷ95ػ  Xd-/)*A#A R{{rQYA ]ѵ0dP 4oVB~jorn^O{˘-Xy$gyT^A!J3ʔ'j6:mMwEY)v6w$%B:,`1-d~'O0&ͤ(UH&cݗ2/j8(o/=m5lV 5:2+G##sJ5fR\h23YN$T 1RAc 6p5wM[I(k14r+/e,>\8j5WMY:c{CKՊwx (vuf!"'*(+zb<4 ѓ 59XPz*[S;iuF\̤~(Ո Q'`q4(R+/E9 o-0TMs+'W@` q !vFBgR,65n QvePX+ ~PIemx]?0,2ʦNЪ#'*?=r5v$ru~<C!JVG}o?3WCL8}]m9V[T)bFrUA<:^浽ń/؛+y愖Rab{,J0`&QjH.Sg6/s ͨ#( Hprd@HןoË!dkjL%W_[ ņ^ N·oxCI ^IE3&;#̳,8gb~RͧHi=]ZcBh?:[]-#2DHo)~2e?o, PCxlmk~?[П6hY/tS\&i-Oi͓Ev{3pAd'gV;O,oBj|f4QGC{ đ>#U LI,o[_݋W  Nօ7V;A<2Tl*ᔂ#^W;?KKom4Z y8,(a(]_M{+muхߤ)dyU2uT_z{c?t9,yfcO*޿OZ/vuUy=AkwmbH‘W!sۙͲ;9}ӷajeܣDheBK~6ō7V1434ap~H$~5]7Iw N[\؋cIC)U7IcųbZ+urF>#,ÒxL"^+l^̛de[e ,H#UaۉA Xz%a,[G?k,On>~;* mw[OA==&7[s )$rۂ!$u;qt^謞 3c1'IGSy]U G9kHzB֘]E ԚGD{Y |X{xzr>؁i臶kqIsY$VK٠'F=R7wKE_MxuM:+ir%y]U#1*^ß>47'Zw8IgX*֪3쥔GR OT=qqwx-K `@!H@5?].M7K e%Z6/D[?pC2Kjb\oIX\H$C/e( M{ Oo{i1(4R>G۲72>CeɺwdShK`W05?/vᾒeBn#\Ɓ'8 ;c}}/rqDHQG- L~Rc8H+zi7>Eq3Dw0&S<xE'6vКas!ywjb-n+;[XxBē€9$HPVoY]\( Vܰdua *,effє)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRf:%d[KU!Ϟe)ʜmrv!G]#l@7(v5T^Q\R]`}TocfOdǡ?CPђ ? 3џ7( &ǐ\oY9Jn+f^ꏺL˪V{"5k}K@4 ΙlEMG-)+Aĭ-/uȵ\6*-r53dV^vNeE8uN8j<c\ÖȎ>޿TY#.ԢT$!,i>G߱tf2){SW&s}5,)]I}.9֓/.PeL?nqȔN4X[IM4jIZF,ܛ9{QD-QO1:FܔȻw<9geI{Y8Qԫ6 ߇?q|bl7ljiё1)j8dvfdK[3?$ ȈD^3rIwbGɜ3"׫ /wW?o/LvW"|vI,ƛ١=LDG_]XN5~/ ?=z^zZ|;92jV8줱%$mhQo[߅3"sUC2`]>B֓22#>ǽy sD-CdkSkmeJd1QkS4 ink^CHV31y2UdxŹGTd oԴľlbds";10pSBS"޴_~? Z E\K)MŅ<[3?y"m LWGYL|GYj--ٗ_ 3a M6RE/*{O2EW9n8ԷM3?fք ??_\V[ErBI#Y6Ge1f1*i4EyźI$$F[/7c46=}\]v ݳivRj#ZoðZ%5):Z_ZM(Y$i$dqڢn.([jmdD}T)'#^B?SThMLwe!˷T%FIl^ 3+.[/c624ujG]/dg~CWA9s$m!9]}6љ{іMbƒszKJi4b/"7?*c]tuJsl#ލD#"=x6]}w_dTrCu)jKfeؽ=kx73`,+ɘc2L!'܅GAXelDrgC 0sBx["uݚS_-[?JPj=B8+= 8 dNbO3aQF֐K[j-+A_=n|*V2[ +~Ch#Rg>i/2951tmƨmD"YEAxI)ٟE󚜆>}ؽ^:Yrؐ n'gຖØnqlH~NZmI=q 'e&kfKQ҂)hs+(vLw~I]?ZIkɐ etD U-6Hm1 hDi5feF{"O9űs.8*qL׻!IUzK$I~2b5ږr8'Y%Bi&DkQi{"ތ!e#I5ʈFdz7 JiFgyy.-TIiFJѴԓfj-t-րe2>=umQ/,6X1%uBRT=mV[DZr+:LZ>c2e6jBȵ; ڲ_O>RzBvs?=*/KȔ۾}D -~A[:f9~!6!u5Zbm"#52dD)Iљ'{i4̌Ȍ I>2 V}E͊mty0/t!I?w\Ւ`܁3'q5[ZU|rkҷMLRk%FF4Ѵmh=K_~Y1m IB ߞ|uq~IU(R>t#i֢%)> ;){ Y`1+ORpɗ#Eu%= P"Se(5CI%}%{lU1S#7C~ LٴH~[IZrTj#f ^I- 5"6a HmD[WR3"^ȌkF>x1eQO]|`3g4]eqAsgXUN5 9O->g$#R} J{? 6=?1Wc\ũeމu>GbN|#a(=+oy+y ,*Ylz=yrˌrag5c?Z5/df]z;TNjh㼺qFbey2kؐOςFe@<֙#|UxTkĻaU:fiꎻ9Ͷ\o}Bg*D~Y;[w"I?>gancw.=wbu 72 72 pouces Skitch Version d'exif 2.1 FlashPix Version 1.0 Non calibré 1653 930 C     C       <|@jz5eZ>4y(NjeK~ VTbˈDJ\@ Q%()Tb(7*PtP0t&Eu*УjR*(sͬMcj/!e!RߛٽӐ›(e(&h|I(Y56D[*(u (=I1G0 XCT :r)Y_汵@%-f)Y_E:5E-* k0>B$e(2Rp!yFQ~W/4C F d@ZYRߑ)V|ҋ*ZRQXRTFY򒓁%T6P< k>CO$z=M|ǃ%"P+h̓Z16AHI/5Yq b*:HWReOcY{9XEE=KK@ T_ZTPp%E7`1VU/?!PVK,Q)0`1$*]E T:~7RߖTXRG<yBnFEF! sKR OG:*[ hiK^ )RQѧQhDPZ:HT$7EE&E>˪OǚѺ!Fh5НM|$`5e T}d]*PZ:2YJthވA @)Y65:hV9>S_@k2TZ:<*dB< 5Sj穨9Z:HnNj_:~d VEGJMTeK~,PTP% SILx@0+8|0 @N΢)Y)U9[sIHH+L)N쮇Q Qβ+RQ9Ie4R:0E.?ͳj/)Y)=L{\ t_Zs/| !SЙ`nP9yn!3 yγt|ƨ]zTl)h2hEe*)Q@@GC̩\ ~TR+Q]KJJ*Yʛ XRP JhE U)e/ ,sʪUS )04 )@ |$RB7G, ل%9OEtSR:.ya@@AMuz%\[3y9XRT T]CJ9yp/!@yѓ*VWe.Q2))Q8|Ǖu*ZKD~sǙ1_ Sؿ$9iE4/Q"FTme*!YoBϬމF(ѓ\:Z>:nTU"`K@ >UR{/!R,YyFEe*yn$PF[ |M<YPc4(L=|G*iLy(xZ( l<|@Jb>n^@@+QZΊPɨZ+Q0QkyL?%"Yu( y^˨ |E7TRP Sԝ@U&@(5P_UR/Q!,)y`( R<6P ʀ |IT\B0E%I VFVRUK.*-!B0-7@ JTp'(˾TSi^XO#CD f'0_UR/u.y~Re'ћT J˨@*-QJ(0{_$҉҈|y8| )oMQ:.yD#B4+UIXlތQ5 _B`+5B*(ңj6 @J@+5B*(ңj) P#-Qn*<}i.)Ee'P!BŖ|J@CGCԢttE \R))'T0_!p2ɀҐJPtځ@"ҢiDkFu$G1Gle'-9JsE RDW\(to@d>LH !`.U,!B0-3R/-(4B͂)~*Bt躠'f΄)YQ@P(PT T++*h)m`Pe"$%$p+Tu|JJAGML+MKME#ȵUz"[!DJPtځ@ (ʑR(TeJc~JT !J>*˪EDHKdHW7R˨ h4>Ȣ4Y'Z+y`|f^E%:l]@|4& @J@EE:Tm@ @WKYuHɨDH&(CZ!P5flHH?/)55o*UHHJUH|ʒe&Pfk*%EFL_7Rߓ0># Rk.IYM,y:?3e< IE@GQAE :H VJe' Cf<sϬzTO"%S@aL Qf5>}`˜d QX?"{2| @iFe@54}`TUSU.D JZR2$ xX@1D*BP҈< |4S KE 6h$(j؛9\RE1F@T VL$#򅖨@:lT !o"U2UU& Ky%pR:^ VmE1.Β2E>RbEFHZS4EEU/0:J hn5 HflX‘\ (<. )YD^Z*LQMKtXPBj(ǑTE2+7CGGtaITG̀ sTQϢߓJPM|@Z)).-N@/9kFd jA&@ )hGzSO7u,+T JU(BE.y/Xp%2Z*ft "R @/!!hh$CGJWp#SY:9XRU0^ZS4"<@9j^p)-QIE|* ` y/Y)GM@>P@M P$!S`$Ry8)T @5?&B*gn4h#R5'e#=H薍iE0@މQk!_4-Q4Ze4o@ l֍|LSeaMϐm@b#4|6kFofT k&}f( SD$*@=@!'yD }e6)ф:*Q]McVtJmFt llj/%sKEE 6IE*[KLj+)Т+mDIUHԾ'RKtPS@YP("|,J"DTR _h>)G*_C_(eACe)=hTN*)YҐ@/NFgE|AP Q?H+y($ )SEe-њ+]KPP j#%rzYS@i< ϔ!lO"/%*)@@/QRP6HR':@[p(8,!m@*Z )cȔ͗L M9eM讥%/9ufTHhY)6CFX̀4m@4O$by7O%_" Ԓ~c@y1:Y0AfK <Bn}f("_6F>Բ@BZ,:D 1E6P*)hڀr-f++=h VWPb`P/9`yTJRכe%RJX T-X.?U9 K@K++` 5S*uIP_U_)Y_]@i@y` T.%P3@ VWU/.Njҍy9V ONj.?JJP_`9c*uIP< VWU/]@%R )-RuIP^RE6++(QaK5S VuIP_UGtd5g[Rπ T/*Ƞ^uIP_UͳeIl$1Gt@sT@5f OeD^RZ*]Rj_9 yh+я,|6i'7j2\@hje@ f=@1@*2e@ •|TDҊd o@dIE/y]IDc* }dj)QqM! HEKJHVRnH։D4RR{1$Ygk)#R5hފ`y}%1@ϐh: f(n6mmE"p6SgA yAKcڊa QSV.'YԚ*X ʔ@ < UR>Q"V$4}!]K@EDcJԧ'bYF@~JJ@EE=H`<HX@#O'*ѕ46cʒ#HȔ 0J k%2*y!U҃#RU#S_&De@0IF<( -e>CΝq@-PLPLcG~gјQcv~ 2̺,ނRI]KG2DxzlpR]_|6)4J\\I{Y Et(w`L$TQ{/.iҾ{M]Kj4踌=]%?XҬ(HzAԻ&:#lלnvU*$+NcUFcFˊ&g 'wa\0`ȽR,:D@J5F\E . F|׉Ž*MHDIZJ}Xr6 yFO͑[lw4 Q(ĉRg*Uw]\gnXAUw]X,afZYi&~zn8q1>i]{B;$PLuvҫ*%" F5zA%xjv+mrr34+J+ ,~P*8.֊Z>Ƿ }j j yCYc%W{ɊhV.J@Ez:X¡2JɨHMjxtAcj(*%GLeXy1ZX|S"5,e}1U-VuSG1Ew[jX_0ʎeX_Oʄ 85k[ٯa1>)Ceo%k~ af?R!0tơ4ư,փ NDBp8\*(߅Mַx8zDH8HtBo'9>a(b2F V`E]$#~ 'vjg7#T˹⟋L7t3x7x=䟂GO!{)!`ZR߮hOucu{Oҕn-{:J_9H{йPrD>B? yYcU$qV"YPHnY++2"r $x}*[f|}[ $4DwO/A rADi'h6ulF۠ێ:HDYUKEag%z3\*me7ag=ceчQ-".M2Dž_|QId^2;jCh5 >X@O /TtVmj5%c!URjy9]ѕ͈ P7 _Ad@GPQ%n$]Q.iNJB)C?GG2})_Vw:)+[ȭqp?í I]KNp^WUI-KϾP4ãG7:)+NQ_([~Z WMWwMq6CKt \r?|\h'?/ՠF|\5UtA'W1̵]̷J$ut"SɮW$RIqRk#VįMG6PL7n$)_V;%t-0c q2e]&4DFU:1IdhGSǾ$Ŭw$DEJX>$ bS'uSvL2DwEjM DS)ZhWEmD&M04vWΩ^yĶWdS'w5W }ejI/GS 4KuՉ)OU_iQ{/݆G2 .s Uu1uj/ aԄ/)/-w5ۑBTZ!I>_ϐߛHMCMZ?p&,~]4AA?~[9dy1C2ET'm aJeY ?#Wx[٨̜N4V6m^$-Rb~߮k"㣾 e\Ad G.r9w W+ %m% F]̚vtSr\11o$f/ȃng-aVZsr 4K.VO9ʛ;tU $J_*:;=9 35Q0b4/CBUe{G̅B TJ]W궊Ɋ+A4=&UWY.{W"Kr1C2D̈|(ȏ7vWΩfWeӇrn/^EL}oH]9#<5h5¯9$pRWM2f2lo$+U]Veuxo[^[ղ#aN):0"krcxnUJ$^[;]ú:. (>-{ nbJբ P]:ZȟCMx#JIhO1+l&UٗL8(J*/}pa7wp7 y+wh@U5 h"b?FhcpP /+ꄞ%!kDguvիe1k.V毎+~%'~]W@1ƭ|*F >>![ت*U-UCUtw˰`|i(>o?CE/^B _]ⴡ ųFYI^HHn J$*.~'W \#B:= bGA;!^UN||S:7]$A+YK뫑y)R;_K^.(<>@%fx3<*W uvA Wc LS是f@X}CZ'S1äRfh WQZy"IBSXT]$!Wɡbz]jTc-2U^ )[+D)o|xʏk_y M$aQHE]H5(5L d$r#aK4U ų3A"QkvؽܧxN?aJDC /"vWjLʐ”:Q ']yCYc Aݥ5^/Vb)u.z!f+-3B}/Tov7o;way݆ vʔ"ouwye-~G2'k4$?w ۦQXDe3FFS~YFFZ?\(31cliФu]]CxB%}e.:[A3A8l!0j j yCYcWW"xT&xT&M PP3 vIJNJ% bl<<&fI!<<,{^j j I1X9y,w7/ŋy<;KLmލ6U]V7Z j7MxTJ+16 %c d/Wz'iS95ZH)k 35I]V=cȟ$"rbUspMx BJK .dG:DD'r"1ڠ@\4Ī[i1/BF{JiB.(v;d 2Z 0xL7SǿG^CZUnj!1:l@^:[FFRD'ۦQQ5(ܸ&_[M0usa/]oKtd$Lz jU]V x4SsE{:e~RN5\|˵Z?@Tm veSڹ :e Bi", K&]^*"77ȴl^aSySxx*ԯ@\tgd)$D^A栙栙dMX0#PLPLh ˫b&H<&ֈ w[ƅPLPLBE$IOr='9PPaWas¡3¡1*h: UKEҮ뿅#`VG7Dȡ< Б YtѪLZ~ 7*? (Auh#9_̕d ,ê \el&o$BTpcmPO 1^Pd&iG2'Z>JNZ>{˫M]ylFs+CчMd%݆$7oHJ>B'zWծiq&)SxA_27]?c0ܧIdS. $^DqsըlX$7,haw"h*6HfͰD+U>_.9}"~ţtıL$#?iXvXЙ , t,G2'O`GMK+L"~M#m]F2ІF3ьtc5I_+WǤ%;jF.f?V^y~w_V ~,*~ fW}"+'r",)gGۭUt&UٗI%0.CZGG:DD|,05CȧB#+7)_ifs=?]^i_iet`TC"~-Dȟ},^268UtA. ]5^ I_Aj}sV0MX?~jI/HؖbSz,!?c6hFhujXZ*^UAV|QklK)X|S;L>^B⎒WEv&-fA ¿4H1>B>]G%|X5"jaՌ?^(j2r^&f6y3˿Rū^=jd%Z0Jc˿W$o|/*8}-{+\AJJ6CM[25I]K(31-ɸSnu ?4W5@r"5| /OƘuTA^mklIyxۑV _l`WPLn"%t]+)_i)l+栘 ۆ>T.{d~X.L=Ԥ)J/ .i8~FyXwdE ųv'*.K1A~ \-d~C.,+ewhCs@\Fג< j]B Rz+(1n% 4!ţo;]e}^$KG2f)5;<} rO'%yoEWnꤘd ƴMT{ f2Rc+CU^BkǺ0soFL5o%rtIV0 Vju][<*o%uHuke/pPW 밲6̶`sz)u`9H{*[~F#r $d.b2| NOIvȼ (=Zsu ܈>&Y?#2 BL<*<* iڴA&k!5BCU]HŦ3W!+eU:q>}^k^DcXWŚA纵 LA2ƕu%˫`na:Iv HP}t>IqrET?'4Gҩk$A/P\{Y&å+;jn5@S ءխ@XJ* 0$]T]%iB=_D $A.wxZ Ɓ/`Z_M$CP%*oJ,D^B٭jlvr:6$PQ|B5@RxUQK*@ Sxʑ#)AF3bb B.VWD1GWG"~ĢShZ$5y`GB d*BF*k-+S$XgrbS)L*J .Z nxCGJt=*bIRt&\+/*IYn|qXJ{45=J~?CN_k’|;ݐ|}sCG~&=JO[g]T'u#nbԳ)Z0>< RrQZ^aţ?ijۘz V`D&Z>c@?)JM?it*{LLv|%d=%j F JEGr77*uhF%F)M ˭-:o4nM$i48U]H5̑uRT .(9]5[O чYdI0M]" X^,hWuQ'B4ԥ]5j,1(x-D/ZϾ,ZTw皍{<),Z>Ґ: tVf_dpQMT3kGk55枞yPW(tZd?p-[}PNխ/\ZnJ#[JC'!(uNEQOaŋ^+샧N"br|/k&EbFb1(stZ&㶩>k+;گݮ5!GFDɒ}H1S" ųA&I LcH1OŅG~"P"e㥍 ؿ Ƚz:&T$BGAƿ{H&rGP LLL\Džep3 ףoW$*FQtȆբ PM|l ңt診>9TD Rjv "1̢.X8_nQh#i-j(a1M V |R[D]9yUh:f06ِRuCmW9kIqC ;I_ PI]KK 1t5M]:9 ՚Ӵhp"][a2)i(4$^dd"[5 f2JXh)YA76Mt!4k`E%\\UUtATD}ڧCթ_VZtJ/HEwxT@ZCv&-l  ]pӹ희7p=K#H7J":D| y#4 ׉eUغMuF hI%lŋlOiXU:) dv "1ɀ+LQX`|]>AD$ $*Īa!xƐb0`[<'Q"=jV1CuhR?1T5VrK^.29 +Y.T ȃRIztB-7((6<;-  P. F.h1A!UtA. ;&w`L݁3gv ;&w`L݁3gvĕtbҎk2U]̈&HS@Ø8JNqDĦB '{*DZa]Ԋu< g3fx3< g3fx3< W{Z>Fef"LQO\m.!~:4vCQVJw(*9mR|ԝ$WP9YE:7!qFΩ"\gPG!!1p"AQ?&DX<|4~;+|kq Nh+ٍ'b1[m mE"@ "NpfL{G,t"Q!K Ӊ;t]U呐uU;)ލI}iXT]@Y|2.кzWj]/kg)9ODG8϶ȩHa5*[3Ԥ˽[R6o6p I3 N=`a:ĦY %k2[i%#vQ/2T,e!rFឌf%PˎO!ڕCiHjOϲzKפ+8\m$Μ,f[ V; l\3.2ojjLg>xmvzOWrZ[m-F@ ע:U&qodMoѬϧ*E[ u$ۙ{w˸CMRV"Ho%wK_!^2Jz/@j :N)2ᲞyvSqRo ZGMų=CRB@PSTHکp/_u>xmvzOWrgL.=ViRG1X=CG8[C-j>.ﯺ\MUJTux;>*;ɫBC1j}yr2U6խנU0H*|D-_1NFýjtSNSW0 ړhxcS/-<8#.[JE nrإa:.K6HTCB]ZӏP)M(BvٷcЛ6\f-$vteWd;@mi;?~\B|tl2ٖV)f*a3ʫeJ`4y]oQwXK^*pϬSdkohіtJv[-N8R2N:]N¯7 e%I?3/BbҒVPeBŶWj:}jae5)j3$ҕ)X`{@wK_ںO w yً4gqt:RD$qwci\#m?6L5J:'FiU7Vz$  ñ03;prUvO"Uߕـn88JZ;C1)(hI,$%c܈8AU*J洜p2+qũjRfIe&AqP)ˏf`cV3:gnGl +RMj88%VSDRrdbqFy1}iLD4iZ9CXO 1=V=]ZQ\2om?GI5V(#淇ѣF1׼T;J{f~ uÓO:\6Ve%!`Ϲy[km"7fyZ(]%PJ#EĽ-K9z.4T;l?!y/le'T@pV9OfmŽۈl4*H;RwW#Y0P/u)[)*$${m^АEÅ_S+.3iIIA%_BPוQRŶU$5֩,2;)iHq qT 7Yo]fuyfX ֦:HnrKŵg#SVF˰q#D IO~n'VO }/E4WO\lBeHݎ\яDᵊ# xwRU…;eۈ4  ֑ jnr u˸ާEN-KTf<%OW~\l@Of#K{B?D֩*euOR7-O6e2PV}wdH`ID.!F.**)ę! )g]EڔN'ԢE wU ܺaRj(Zeg.E8O8+K۳ kWLWyzg9`v*ڃ\D^vN4:R]J0p^/ZDmYkޕ=TSd INZ+֩+,>4,O(&uXz(QhxhGؤ)4Z2Shy).',gW[54l&}#D  )PUpvVĔ7>c|6d,ZPSrz8Sڡ͂ /kZ5($8Z|\F]9s>.tT:|B&YZpVR+"@q2?HF;B!;-{R -i/(y-Q,9`|!eۈ4  Z1H64"|Rٿw(ZJCf)ɨk ꜲDS)t$մB&)*LYp=ą/.W'bSm4#e!KI*dͮ}׳SM/(c׫]L!+)-+W5$)XHЛ1V8a#xhzfqj.1ѩ N"#-؆Pzs^q3mI/!MtTR}@Z l<@N_3O+#M6='+@J;3ۈ~gO2#p9-GG[%A^IqPPH1#+鏋l$;+).&.*")R[&pLIJC*6jITDJmObIn-ǛmAdg"6.Cη Z9ndà˛ ]\)t|Iۡ0l>mss m&i2=ZZȎhӬP'pf3y?NSuCAnm2~FǽkZmI TLYU:]ELmz S2IH(\1ܥ}"w_3O]MJ0Ec %k\iC]],"tG ;L#bMO>p8 x B\{ 1mJ}zTðZ i$qafaMo<9L*-ZIVrV ,<$i2#h>EW3HنT0ѝ`?-aGfT*Z5sGiy^*oɇmʻV%!܋S8) bT7d);ZODx>-C3 52=Yn9u@JZI;nVɨ LZ֚RqS[>eIBR%K tJ=zsy>8hF95`$Pe(hCan^ߍV"|iqim 7OC0Ίa]'ҫbvu(z!Ry /.ww|Y)ջZlҩ|Y66 IZL;K*B)|lJeKFU.h2n6 NǒxXF)K^Ԏ@17mءjag3=z]%Poŧ>4舍4 ǀrDlIVyM L2V?t) הS[淇ѣ>h4"S)#^)-)M- V[%@2N_3O\xϾ4)WIsƫ.LvZaMB4J1 yP.o?GvzOWq vsZ%_݉e/uJiʞ]Sc T'ߎRye^ĎDFĚ}ejpZ B3QDŽ^U ) M4R{g:[%i2RT$AZVynv-t©$ߑ>Nm%)J$dr8x::ꝞnzK Ub1)'#mdKE՝ܟKM^(?5?oVze42hL 0o8JIR>4^`X@hJf=֕e3I ȏ^)ZpaNٲS5\ڭ&XAZNVz%V.-Rq+W3tW/8՗(IJ >2m4"P䧱&(D6g9+kmx9H"&m׼e =?m伒CTk+LFhV.BD4=wZCCixv(Zt y15W>xq-m)iJ&IhhӬHprԕN]||HAInd˥?*n)R1ИFstQNZSiLk.%{J۷b1-ԸG]]+40ʜ&,ee?DmI(L!9ad+ku)4 ˳M]qLͤ?F{)o9xrJ z-T9mJBO]MTwjtL[l4xz[wLIJC*6jI췁d p짢I#KqnvKZZ&9Ujie [ Om *y'gfaM 9 8_9O`{=[iC`8 #ZSW@('Do$}cݱs2/|TS!YvS[Ψ! NVDSگqY7OkͯCv&QnDI58i.F*U<srM heBg9 ]Psy٥-s鬃FyH&7;Y @Ֆϳդ$&! .{+õ#Eۅ%Eo7rX*1ʧXK(Wgxh9#mUDq>/}*-y$166 IZL;a'n6w*F7_I6 Lcf2+=1S7ipšA* 9W{7U0VEjg醻`_r)*%|".ze:%;Z\W$#ABW״QWT!"^pJYA,Xh.m9l"`d͜82)R:F =VbbM,)^MI)ᎈ[%.^-T4Rp'd\:~^NI}iZzir!ŧôq}[Y藕[,JS'aa5~?(RdH+#2qjqŚw&=a%0m8 z.OM!)eB!IUΥ3mpy(2ߍ%n dg#v) };.= hy֙D`mV9*T&`ٲE%"@lhxU#A= 73)硜m JH 0ɁlBFJτDE:ŨR') ҕ i㍟^YUc>PqnC!*!;ĽxOEX5sL2_ RF;:KmTDdT4:b>a)Q7TPS=?,K YJXm *y'gkDi5%*Yb"X2XN"D) [ْs;wv99m1BB44 f`ы>S >İhbOh+ EH9e!'AKڗkJ="G6v-1ѥhVHVɨ=X9SR̷ctܚDa#@7݊q mT wY,2CjQ::zEjJ,ԲHS=zF-Ĩi`LawSPcq;$D-'Gm4#%6q<)O) Ϩ=x݅,FTys^Vቱv%!ϚOn xE !ێGf˲c N%T\RJ%dGbہha\A1Sy)*FHmZ(qJd ˑ+IGɼom[ie▎^gvn>%q,2CjQq{ R{pKp]ԡׄlZIs9n& ^P%I9wgeۈ4  n:&̥TOfnS˜ >m)iR$Ab$KЮI[+(2݅KD<5 ҟt҄'mF.NHN\0.OMQ`Пp iK0̹-{,i?_s>=T/Hn]VXn2mϚ)`MATu 2YHF;B!;-ʛ]i[ Rs'f9aF i\C$rټ[CsV/>G9;y% 4Z<9]kSn ԕȃ@3 mzĜ5Oxu;$>D? Z B3QDŽU̓R2x+g [yCڄ;8RD^8۷q73 ! RGf[n%"`CCRx`wՎ!Ж@(Huz^W O(!e5)j3$D2hNfO ae*~-g7 f+ U*Pc-FzZ rW#q)zc!e/G4f$6o }*XKcJrgrn8qX  Pe dz]3ո%N:ɓA x}U ۺb*Zfc/6O8A'۷ +RPf:FRՠF÷\lqWDR^h qX)9c1ӳP–X@BxܰK-UJqYmaWs)=8ȃ1&.e'Yh%Jla$E=gt$[I~JЭqw[ƳZpyy' VSK#i}i`U\d=b,T["Ϩn-)B: F6jХNϐ4J$aeǓAr}sV 0ʎpB^J/%M=S9hk_'U9ERIʞaL[qRV'_,6ˎ. 4C*Tv5wJ[CWPhI8,P7DV|2Vxg;WS[f.\qqRk'6ҦRѭK;Lo &\]2OLs,\#o6-@'~l6Tb``gCU!GgLI-,6kv K_LjP lffYER ;j!䳱Pje{CyԱyGChq ┌%'v޳K7֗o/o Z_>3x}ixf6mKE^qe/Vi<䍽{;mvzOVB\mqm%HP"~S6}ݪIrX xYKQ'}ezM:c5>CБl8 *R6noGoG㳑phpC9_3OA*q ]E%`uux}"?ux}"?/H%3K* A;ߢ-ȘS)ɷίGίGe 4R]3V(+Cqqmkp4 9hvhv!zCJ~A)ql]A5b?}kx}?kx}?FC|YV tD[E"uA9(|4~;|4~;Er6կH)"whT rh6)xRee W[% WY7jaRMk/W3 p55_)TOo~'_o~fba Qp) ?v fJ~!0Rq>PّqjqŚw1SwRQ|7 )BDyngf:Ž kp4*Q3;R7hn.-W[Rڑm)iJ&I e(5W>yp1 J Re}괦"5jPx{8Xj$rxuXau&SZ1<1j.Կ N+^=yzy͵$P5RSIkQ,*-(8U=FUyjDkl[z)*(ef[𷁯o^U_> x}U g|>vzOVt\fϸ4~h3Wxq'} id ˑ+IG> x}U ""[&Rc7uG8IZaA򷁯o^U_f%!OISJeIJ/0Z)n! FA}yVCyU gRNs59^L<duC\$<U<ĈNao aPW ա86'Gk0ׄg(e+Мqd8ۈ5%i2 [/DөlL|^Д!PK?xFcq$?6[4JRXB&TG9y\7nOE<,.tGFTJqF|s5zUrfS?1Xvr65V8Y(&uXz(Q`P>3g\pjѪCP`lV[v! D/$]Ek'΃[KIeۈ4  q_*@%'1!* J)E@Zt;y]lQw[% W[% WhBR[%P}t7蹼͟pi&^f}6='+M鿂73giާElM6='+LD|QPa3H;+uX:(HhșiaW]g3 K]7/=x5FϤwhf"rcqQ2w!*ZZI2+T8Z3򾳓hҪ9th)j2oG؛pODcjYCc1$mk|q_ Ѩ7^t~הK*\q ~*%N֬)H8*#{>ipw66 IZL;5ʣ@D6{ٻG3jRqw!prsJ'N;͚iO:iBܚy9ƨ>?-v)>۱KLDpod%{rP}t@D)U 3:&A55,AQi p 4 mJ yVkvkv~KhyTNh3Wt]ks ik}Ҵ~S6}t]n8JZu_=g.WCUte;CC Ya 9BVe\s3ڛxO xFrR`N q:<'_ͷxF)5%"{g95c[ӶSFru+RJ*.6m)iJ&IݡS[bcbBYeȇmԣo^U_m)iR$Ab$TS`V*X-khB%+ h>?z-Qiݴs1nmN'9;-YKQ'}o55M#Vd鋎r+J30bA6Բi$Bg2GMۅA"Nw=nj#jF_ CԥQ1 Jk@Z N)//U 8 @w"uL Ir)+qMՂ:\3+-|p!2qZdjᜥՖ2&6!ȗlZv% K˿fm{6IQSbx"!T8 έڕ-Y\D2V!-Lq8Z!PA)dq=[4|2CNp|E |E .=!^aVf<@/^h`CoRDOɷή_ή_|J[ʢњqEyh~b1o3*HIN +kx}?kx}?/d^蒰@ıf!Tc41Mkx}?kx}?FC|YV tD[E"uA9(|4~;|4~;1w1%$'OD/]SMINr))hvhv!O$l'vG!CҊPL$*5>5>ї2\C/QHtIX h% RPRBi C]m>>߆Ə^Ho^HfbqyI"THݣW#[W#Y7y6 IZ]@ wKm%)R&h3X^ai%cD\,|:bT$hF 3-ò4I#9wJ\[,PhMXoFhƒo8BQ6z-\AtR%JF Yn9nK%V6N˾,Ln8faM 9 g2:].n9hmO-KKiDLL51 rIHOW|)ť 䎦j2Ĥ=z/wd9me*8 !RSՁZ#cC2'Qz jL35zAJ9Ĥ*,=5s%..R\:sȂYGip9 p=~Mk4j<$LxCnV)Ο(dGh% rxD<h6J@霧0 *n0FgEn'?_3O]z7 7+E?'vzOV_3O='+D L^QF3 J}FKF ~"g SH>sy>6K0הd;)JGdK75<'>3x}i)2!tu)'v͟p|W+E|>U۪Syt>|E D8R\a4 \#Э D<9'}uw"}^Wl>>_anG<үVZMJ;!ЧY(H'u [*JiTtuHiߴsCnW*yn]_茼bHDMRJU Fn6 NǒxZ">(H zyŖSw\JpRjc|$vTC !?Kf}V[j&Jgf[pCˋh1<5~fg.(8Z,x!|>vzOVt\fϸ4~h3WT5KXh+*%*{fJ^U)HvCM鿂73{6,lk$p<0Oe42hL 0ۈKR(L,íS-cf|K-0RTnxۡWRs_[[dy=]"S:÷l쫒R[@պX!gk"[)+dR{f1hR\`.Z 5'So/]^n*qRն3wiFñyB>m(mB烳:.ܽ`[q%HTBv|m᛿HzVUI=;mjѥOD;)8HWF =,s',2ya&r8 B]%Ws'=7Z}7蹼͟pww' \xϾ- ig|W+E|>*2]W^%o Y[UURe;;GPjM{Hoe{xo_鄍Sn #1&%MP);:΅߰hqo r<:}-A7[ē@ 5fkp'X8[D*k]mjϣf>'&6!ȗlVCmN8JP2NȳU)RA洜p>:r6r65V8Z.i8pU2.)/vɝ %DsNt^DTF$9=Z`BM'󼣗!fࠛbIyGLK s)՗^f}fmN; (|']qjJdAc)EJPS\"c iQ^f}9\rԆJBS2H{6![d__AǸ=7Z}7蹼͟pww' \xϾ,|4~;;Ƞ.JB'Jv%) % `VK!b\]kvr{-,!`!ʩ$h(S/\8#;EW3HoA_KRof6DS^tHz 9iqmRjTgnSi825T|-kZ;urXS&rsJzbӎ=UZFk np.XL5<ݼo?90 O= N!O >4[a%K `P*IJR4]N8sw b{m1IPwjR)0"-Ce?nf( 3w|%q @B9Jj8B݌&)#"*;޲9jWFHQA8Uϑp7 m%)R&e=/.m6HS}uM)}9dlBq!BD_#hY.qt9'?Xt10N;)G,t"ط  2Ve[--R xf>6K7ʺ.4{ta\"J o ZGpNQC/%f[]1*Tѥm9Jmެ@U߁hz32*5(BA9\=5kJyH.ɆmŴ @)$t;7ع S`VaݿR"T9 Ȑe:땗!j ]|KyTZBJq\l Ӥ:$ rn(8H[@(9a❇$,Oc[QeÜGȲfzЖّY"FaK'lGq.mz *B;^yUqTۧ;' Ey|kTl!R2,?Hox]j*) D$$*jeO1 q]bg\"Pe%k2[i%#vmpS[ZeA=ɵ|*9lKp&S:V5U,G _KPE]rbcTC[juµlo?GI_!ʑ=kMJ%E1M DZ)h$WK*aWn Yy;K?b,%>7;h[J!inrڔh6pY+h11 2۾-OI=c1зZ[m-F@ oF&Sqs]ܖB5tiN"G=v%+rSS 峷1t`Ҥxf"%#TU*Akff4m x* eWHd 4Cm%wE+BJUxR%Ӓ'H) OjYB5t 8٨HF;B!;4B^0ʮ1otdߛQ@ B| zT;:|\MBSe{Am圦x*ʎq[yM)?s1dKXvK&9~Rܩq{\K0H[ݍ3wi-~,T e}rE۬Hk ķ*Y6)DdJG4)?AXK)'^)lKUeОK+RnmKODC8QfyNhf_ph{9Y8 S?m4O1s? BT\2v6KrJ6e)Y?ܮCD'u!{[֑!&-)2gh6[u7 %G`fVC2:MP&yɾ\DD3C0vKrL;9R^8~۳?:1m3-!*=Q`jS )zG!eo=g&ytwK29l;<[}m(PchKiť\Ըi) d!.^I]+ vHqRyNED/tԣyR!e[z%P(.-R  T#(rvVT-Oڿ1nqN');!4Ba-$?啮^r!k*qT@n.! }d?%vY`'V<*ZS%Tr&ߕ2ҀR!d vJBB4! >v %)G ۓCsN/>G5-,PꟄM@$z=3S0B۞ʧ1͟i鿂5oR>2& 6lCwrEA%n/]ʀTt/D9CXO C}iYۮ" J5uae-C0CEZLaq/3# *r2{hKJ_DNDv.9JXl*ωqU?F⵨m %,6RSMGjhM^c9jGl*r>epѿعg))ʷ?jK9 90/P0% ϞC ᡫ fOiݐï8λVR\'ic zDIJV-ns2W#PˎT1;-ɨTtԭS )ۇ &%ObT}q櫛`{U&e1S[vlπkWLWyzg9`v*zZ5E'hgUpE8E ~^Mƫ\eE)]B+Tރh$h9ˇ70!O۳Zo9;з2;W/[ߕ`Cs?d64 $ccz,b,|:_fYLf*5,9%ͬ]P5Α1?m"2%#֚ ,pNQNQmw=J ִ5.Cd}r$#IbJ|[Ru302m\h RQ)m..kAQ] j3흢a).0QNSV`%Pql(Us%W9*,$m u }YU3 T"Hk5m-Ȥ6`)ٽs.3@qʤ8Yǡ-à\XaցR\aaa0fqҋ_oX!#ϱ(&uXz(Qjӟ*Z$G8z rC/& "%o^Ho^HhFʋlD8JQvK͸ꔴQ4md p짢I#MM+Lfxmsy>_F”xȓ^ZH- Xm%)R&e=vp짤6XV{w¥2,&:kx}?f"<(Ww۝I)DDCS=vC.6RV0F,0Sq *'0;L8ۖA jKT?-zaWGq]o{gZ2pBm?JoWZ\mqn+I"e42hL 0$ʢ-Mqhr-8J[!Ȥ8*sCy|1ZJԺ2{0WKN8):+HRe )Rz6J JO-u Kq $˛)f WI{@o(cS%a WJBf8ah_WyV3 #V{yD5$- UIb%m%U.ź!-jd)@$'=-{:ۈBeGfU)鐥Xbr6-6H[\y+nHNyX q$su0])U5 qvC;B^|X-,c"7c I곧LFB4! %N3FTfVYngfIQQye,q qT 7Z1g5ͼ4RAZqũҔhn8JZxSB^_0J\$RiyHֻ4Pqim 7n88JZ;3)PBg9!cT?1a 3#lggy=Ç:%4rY=;fȇwC8&Hki$DF:BOd`a/GnX惆}`ͭRÇ>=f\x#d!p"/ Jrm㷩G~^qw5ۉmw]W4=oJ;˸|pٸBPAPl#x5f0g"VhZPC!sShH }U.SRLgQz 0n.o Nl&6(qlpܢ"&JLYc>Lgg##\:RF]mb,TOMZ)(,i&:7%(_ RuLA7[ē@ CC Ya 9kYsXGEI(˅[< ↔ugÇ'9pI@3نv:_jSN"Ù˰pL[JKC4 jdee5hL2pn)RqʗjH4h&Sk2g ihF;':J܃sZM3VRTzVj(SoL#)-XX"~Q8Us k iJ'|RK AbW5SW~Vu<]O{I gh{ӨTT3DRQ 3 \#4"bV;J؛1s=`OV=VCm-JP ~Hajqb%>k]|HT ˭! 2NSbGmn!.C.:am%3O;*ó AK4sN09v4b%n LosBYpTA%VkP2&C f0So K|12l 8svA7 p־k_@" ?۪ e 3x;5\>\,|:ߐU'w_GSz]StXHP#uۈSn Ҥ(H!Į)j}AP RmJqqYdbKpwaEMäȯ1*:*rY,džx bޅTŽR S{m?6 ~#[{D&USc/9Ss{K-2n)h\d2OM:) +Z"R?uIP]  @Sg"qŶZ!$L oN@thD*D(QJC<3P2K$jI-]$zJ9΅3q ۩'* TzqUboggCLP3YF )\CNrٸw؆=TJYևC-\M3d3mX0xHbAIBM*a{{z)hT%2vίGίGS12; 8@'7fTTq !WI=G1**-)g1wϷ,A>Uff_59Y輑Vm,O|2ͺ.%?kVs[n!.6J0F,7 -g5JRSv-N^O'c֧< ?EhKmR$HDIau$vsd6h n݃rjJU$f6 /&ےnM?2a%W'$0Rn#6qU %-v O= DSQkZ!,-2ή_LMOxi;f>r6^qZکeaN2] +$:όGg0̦Y@m ܩeX)ֳ.vv}Iu 1BldnKqPc,ghSϬ;E xaC̮Fpcn4QDU%J#,=FʇB楺+^*bZu<'ɷ&E2Or-,D] rL8gi1 }j),4)BT =Ӑ!<Ӆ vܮe)CGTYީlᷫ=11nDqN%hɟhhFʋl6U#WRR:HyܢJurg~m m R7w%Q{.HQt p*VCTPըzr)+evQ^Z9Y^P %Y}h)j2oqI&i&v.7{B ߗ>KEij 4=7֑n#9+dcd yA(OKXqRS9ضT]@X S`VaOD;)8HnqŚR wg6e -Z#%^J}jY/C6|la(8mҥu1w+4*[JtV0G;!i QT=e8Y|2.кza\"J ehtўUvK7ʺ.4{t#FCW׺WT᛿H7֑n#o ZGzWEƕROn\|,+TAm?6_#t.wpRWRVi~ID[;}[-ôl[Kq=%7]t5ɮ^VrlKz-% ;wG/Y :zN#,x1>PwkC݉JiTF7'9Tp# 8n*Va:{ r9 >sᝡaLxkn%]y\ S>jxYhE@a/Ym m R7Y9"zP&YmiF$)RP}O?=a"1BC,%  6Ϭh[n!.6J0F5Ϊ*sJz-;XAIVj IbeK~SkƘ_B- O3S$h+)}n fTev* )ҔT,3Oh))aTj;>' y̵2kL9`"#0ϬvΙ>69YPE╚\YwaQsGR}6.!v1PX"l/?GItHO~r'VO0=$եSITt^6T[s,b^ k}һ!c!hmS< S)ȸȅv?u2".j _ ^~SkƘ_(9E3Aʞ6(xzu X"Z)z1tTrBrᅯ?GeNr9[% WX)AQQ[i$nn^2TG>`gJ{' PC;k%z##?ݚ"M E`LkUoOM0Zsjq3r3pCx0;SmgN4K)5!hϣ#ۢ>kF'˳<"#B w9,⤝\;lK 5.Re),o}n¯$>$l[wDzTK-&CU .9J?+8_ Yϧo Z_ިM8 !mu/ú*BӷL],"tG ;L~.%ʍ)kQ84*yi94~V\[h$bF}[upzL[%\O=نa&?$o6~2<@BPٞ9vNr\e!Ao;rY&mq.+);5_tTn3v PӈZI_`WG BiSq<ԟ"׼1Wymm"FmSkJLgHzޮ6T[s,bBqf"do?GL/']IJзZ[m-F@ \\ -*G${rd1nK")ʯ:$\=O윴^~SkƘ'S=R@ήe'^h% (z"mcXU)JlSO.!:`U?GzPS)=7/ٽbdE4ULޒ&-&Uqmm>l;]sLk8e;:vfoĸ 5 yݬC)B=9d<]V[fNԍrUOab$|,STPY-wr7aʵ#NRu|*RZiJ5/e@,B[m"@ ֈOV+lsi2efbYU2)ȌE ]HVr"v[n!.6J0F:$Fb`a98 K'p{lac8ogarŸCoJ:;%6$&!{F(õCC.Ĵm9yBiA gm\t#1IH&e3Gge-kqI2sk fa=Nc>ӦmJkȭYam9*n*tHiz T,DʹzAC!m)&\ݸHa7/%_pCyuXeh[wüD:Iu*==xv!I )g l]܆QU29cu4O-EڡuC,Twt^f}kHpօ0 bRVT#Pr(KX:8#C/*YAqj&ёjCvΚk-㠼KQ%$6JieKֵ$PUHZ%p8#K# DU9mDjaKLg]TFQ]:P^VsdݴRf} 8g]^-y?Mop8 V&%@sBOqtr}]TݵN|t^%jm\O1@TeەMW70cܭ:e K=X  Pe B]T q\W#/PzE[!6 4L (T29vL!#!׾JIA(!U⺕jہ rj:(Tvai=?gv¡yQX"d6= Bs#ᙼgX{,`؇BJq=,""jQIR+F?"@p?E6^ո%Z}tFFQ'*S,ԥ̓܎ :(oFoFg,B(ަ73ER%Ws(u8:+PdA0&]+FV8vYBmUimuO:jZնqCKJ3y7zCE\aĺ [[bj8Hnee_18DeCw' _-X҂'hj2 lt,ow6*QpHZvY"&m׼e =?mF-÷Yevj%gvC.Ts|:ƇKjL{ |۶& .Y|BDcedsTzz=鞭!v}6('QJCնw:jeRϽvo7 MJZpHXJKm=HlSq 5(~%Б?)nLi:/Rӎg.uD5hlii%Y i\?|\",terTT;'%F-÷YevqM`^n.;C;őofětXb+79P<8S.zm wjK^Q̞3:+rRK緷#(bSP)g0wYȸGqmyI"SbF:T,A3SФ <7>jU 2]VmQG-33նan[i4vhS1,ʺM{,q?4~'d/-i:궱m='.a2%> )BD)[e]&MI=qPo@R36Ï{8>2bٟpȑܷg,%Hm821Zn )˸v-hV:wbԡBVq>xo_VDt뢓m3-òm&6OdvZsI&a q2O So^Hb2OH.8V1v[% W[% W[% W[% WY˙Hn|&&dl\#~R*E_3jJy-.$^k) Q؉R2g|mk'd/8,yj[z9rܯFɟ{],Sy9*DǫʺJiZ?{l^2sn'g>sU VDr$l2=z }0B׫ ./oHa#ʋq}xo{l{"[UL[--R -YKQ'^HBYz>VCRҕ.I@'jIB}5{XǢ[C6rI#FO~cw'miq7+qũjRfIߢ+#7|L 2ՃionC|E |E |E |E |E |E 9RT@A7CIēY4vzOWu iע+o3{=.(/,wJ 1vKiy3{:`%*YqK tj=za|>]B}5{[s:-n.DˋZ=`c׿{ >ftݞU+ iעtDWG>ft_t%LщnJFS ):`sg1^xq*mҕn#-@KQ}pNQC/%f[x_3OgwPf}z"^>V7æ -u+B[DV,54rn{J >;u/ú*Bӷ{ >f~E66 IZL; +ZJ^uu(OOB}='+4jϙ7g[DN,9,$[Jb!JЭO1Q,U=OtĄ+ iעtBSm,ԯCDWG>ftݞU"] ю[ëv7dMݐRg39ë^xqQ0 XD5T|-k[Q𷁮o]UGz탇y=a)P}҄i(P^~1jRW,+LV7æz+a༰" +a=s|p='ޫV -ԩUIK*VB9qLwzSG˸~:!Ib {:Kʭ\Z){ĔiT)x|o{M>ZVۈKR(L?w:{5\~\y3{:nI4J$am)+Bh0QC<ZʌpWoѕ WZ"ƞq sSx@<0Ye87>jT]VpɇsX  pOtDʆqԄHvYiL]H2 K蒸l$#W)B^RS!NeHi$Tl-rT➨=wB II *Nf}v ː6f4XE@~ll!=gi]+x s1f0<ܥJIH[w?;êIpʪ#Bpp(n|ԩ+$[STVg~nx hTYI\ !2C2Ï[h +;Θpy d$TS1?d ˏ9v\ഁDMɸd@W{ ճ+12;9h4 ǀr\LSռR'23jWd leqy?M)*-yJDZ_-xJ^tD^k= uÉ*U)@k#P%.je+_Ja ?L:\3KAjRYF([ 5 iqF <pTNr#١硜Z[Z2 4KԴ+K iKd%je)iDt~Thp(juA9 n)I{:y'Ȁ7K-!IZb\ ++|pVkKمG`0xJpgQ1@]^f8Rn5K|㜤RL-w[h)iҧGkk(H#2e<,"錉H._gֳ9|7Ogd8ޗX+LKd p짢I#DD|}w :Ot ;wm̅즒K ߶S⛏oa1$LjS@)p=xqv{Лr]oJB跜Z*eo!#:%c 5A]ɉ%p6^ f.PA+&pKsDSהd*A:Tœz!b\I\PӏbaO>ͳʃ X$"~H8 orHsR,\[bR֭n/4 (AP$OFw4%a7eZݦT-u6ۈi*B4 ?WLHOymn6O"HMR*3\N2m _xTd}VrBo Ȋ<|'R~j|qDU'8*i0j .]rYy<|DT>rysJx=O<9x2J>z($ ٙz!IJjA#(HfXfBd! J sY˙Hn|&&dt?VvcfYR(d/132r.iM^Xes'ЪT}.FM䦥InI8qAݬIOVTuZG](sUrXS㝛cRjBM(Tiᳬ9TI̶uu!ɘ&>v`]QG5@V̥Pqliu*G|YKD[*4ʪ?٨GR;-;lTȫ6">m B:uԄ+,Ķe7tB54_1*WәLThKmR$HDpuÔ*sMC[ڤ+V+RdFo]HgqƾR$,.\| #0r%9PьpVH+k.FS5ul߶-BSN &yGDbYn!tu5$Y&IRMBV*ߔAu5jqɡya6rxCS @g_4;p̏ɝ xT* Xb6jތH 6P~XCAC [pBaPaѾGoS EDf{zw*b٩,*LC.z-3ۖ.!(O()U39G(mbuR?~rn%`{nUSP}zfJ*&S3">(0șLzD3CӬBIrۖHbV'f2[- , ŔMzMR;; _tR+m UӮDkw6|m᛿H7֑n#o ZG3wixf>6|m᛿H7֑n#o ZGkKTݚKzR^-"J?U 5Ejuf{}_~z9l:RUAՕ',vn÷^:S@͹!j@xY#b\C2.646S}<<]-CAt27>2!))dNyJ' ]Ukk.IL,T)(RP Rd;ITzU[=7/=7/=7/=7/=7/=7/=7/=7/(0Ȑ̝vzOVm}6dd<%zuUv~538tj1 MH<ᄥ'my9Io"ׅ?(*6D&hi{z \- ۩SiuGSpQlũ◩U@Nb?lVRmyU$xSOlf=Q̿UI Y)#fgiDMݮ{5JJ.Ez&梚uy5 kL0p6?܆8S4p?UYM();9t<7Vj0)tvή_הO(ea4 s;rhcŗ6~Ŕ!g[!GG5孏i.wm3fZg%,C/!1AQa q0@`Pp?!PRiʬd_bXMwNQfbz\,P\v`TO#%*xiʬd_iX?d&He׏״e3g$`Ʌ?<:n\*ڽ4'BQ0 )۞Bh0I%C@ulB[ԧ;z\Qypm1C щS9IrSrByTI24[QrY? !7g8@M/1KP ed q@N~PS[uIAɮuS:eAPilv_Tge8)eMAb;ÃK eτW>F-t6Q|pf֣8N6SPv [ۺAuĄ*,j.\X@ It- _0NJh.H|xE r!p}-ϳ~|7ҿ$Qu^IkP-NVYh@ e(A:ST+qAI #R90)?Fw7NiwQ`]ٟo1U,.9=A/'4]Lcaw[`fQ$5gďjjXQ=_G/xsѱ\ACJaBM*:̪ Z)4R*Ml &%BeG b|TTWT:Eg@Mk CUK5K{ 2eZfH7!x .f 3هln2eĈDN{8RjD6 %c)R& $N rY9.D b &A.brϷB=$$0hT1HbG;FirN*H ~ylv4`5̑gŹC*;c`c$vsॗWHNcl4UCU &^zߜXء\d0FJF`&H3M,vб̾bܡbL yFL|N?6Rne)=ynt(';՟Pa2珘"bu]n*Q1ʥnpܵFdI~(40k/G=fXU;Dar`g,OP B4K6,Xs#bHJ ߦSFB:rzEI\EaCц ;JJDA}<Fj?^ї7ݎ6,% %b#$ ⪙)Lȍ`·3P3En/c q 4*ǢQw /vyP,W:hǵfq.vF LFO6_!?c@_ؔG˃&N1#}WHpQn9E21߾Y~WG p3z>=uaV?\2f,`RڕڒeXx`* oG 0Ҭ9/>(T5P|DFzswȬ &-=:u⃄hh'I4/':R'bGϮ C PJp-^t Sd@NB0C*ӽ/'n}6(R B Uy23œZhL(QK=,vs}RȨf@&!bd&$EXpu*X;RidaOՌi+ &-+TVARVHbC/H2 Jc Lҕ\{vyE, Ãyt ` 0VsEhR0olZxuw4+@urdBe<"v` 9U\ј JD_6Tr3q(Ph&ݶEQdx4|Zт>.aI0⺲`Rڱڒa1U, 3z%1e0IS3_DL;sMtyTK0=~*:G}6;M-sCvyP\Wp&kƊNbXMyG>cX/ 23)^O1E @A . 51WzǓaz_:Sy" egX81E @P&7ϽX%#h4hW^Dž9j D1U 뛗^dqY.@ujϠ%|D?s b\O1j 1E U.& C(SiS,a2?\6!,jCPiR5#|bS'糅.$Ab;paAc&e|htNVgpcM]7ʇ0@ZP:)O*K b5,D,xo_ !\ q=qdi"6<5C M%ve=[bH/9Gp:Z`vKb1,Pa݊ɥ5}RȨ'FQNdsg\֝ج84Ζ[jE;D`rbc=I.~8 2SCY\EjP1o{&+'L(b7a@2j!^ 0Ҭ9Z*| X@l3C*2JL/2JFrB~Ty Z,z=htl#PQ̷j# '2y< 6 VqxKDь$'m[Z4W.^DLP´bT fpZ#١\82e_ aJB2nXԔRG\ ; ]ս9ۣAr-B UҢ z@@1CVo+6A5y\ڥFdU14jC^"?\2ffv|ρ)X07lQBvDvVHӇdpHRx !!:UL3ZQ(Bh*dP`+j#zv^n@C+p3( Ct X)v{8Xu `&H`مdSSwT+`c.8j+[-cn)i\&I\&,棷iv?u6gTd o@JZK^Ja Q niA2|?{~BeoCh:rR @& :0.ps4nUO@h+@c20Fu_ wsο!!Ur42a2ځ#FLX b{W̞ Oe~awT~*֘qh*tgA.'炖}z+A`KGd)\ f; q?<@۔x'$?b&D;hTϥ YUoM8 Yd)l2갞@5'_ժU_ 02sQ5]L Fmk]7?޷^$}FTv))R CQ^P@T(S2yFTv)LP,@dXZ׳S;2R Ic1c`Ō M%!h]ĴWxnhѝxS쳫+"D$H"`n( %KbuUy0g$9|TTWbtg u&u,,9QnPF,_BˋD ,ԛZ"˿c앆9TLxMbF$Q vvfxL9\FK)){'iK)떛Ć5)4iȡf[e,&HUNq-!Yb:,]p( 1U 똢%Z $C0c33?•t(I*6:Y,9X*X*w|ڽʮY_1E U.p{Wd]^d:7)S2sYLW$6 4~2:fUy(~6\_|Etqbbם$X,XJ6NqP&/& s-@T<Ŋ)RU.?- vY)8w6Iۈ8PqbT)O { xG;JGү+$eGb"NQfh{1E,E똺9ՙqXT@V:SK 8iF W%H [P".c˯$eb2L ~ώn5n 2JFr'/qϲ['f{\tƜ]$ 7%kFFc@rCvK ߓn a=шY򃖋e(n= ȦT.`el#tmY ab 8$WmZL[LDaN Jglb-Y`+ڟYU˾Ywˀ%]7e\E;Da0NbDO-* ?^02+_{Ч17gZP9 C◴'s1/N7PXAz*ڽr #CḾWTC;zyK{kxUJ4@|{8RjD!=3e\X*f-сG[8h@WkD.0ʜ>ъ3c J8 ;[/`RWkO|;N 9`v4_;NHg(@".MZz8RB^d:RaS0 ̄ґ\;)b(v'\7cAmoH&,AX:/;\;ZUb dHv1c>S]$WLYX\Yj"@5G 4V X\/ ӎ +0(pG(b8a0OѾ ,*?<baDiJЮ 8$WMYX\Yr{߿)c?fk 5y3:T6)6OxNH7=)vW*3+hf5O>z= ~)s!h0 Xي( \3qtXyd?5ٿi@=H/ 'S8տ'Cտ"H,DBiHЮ\t,҈Uuͪ%vYk;{ >w$ )9*0Vs8bXM2JF21҈eoҢuH >G5.3\^q4"i^9>kH7#+[Haņ v`S(bwRHs1ž# f<>b]4Z^p/;{pPϯ`%i~\QC֘TI m1¬~vo}~BCF"dA<%AiP tY](,dSM$ ڵW* HzaGnG8 3oGAK.88NJGJ1lr )\0˔}R8B11U83 3 3>\$'\u">+p2~$ak#\pYnW[C8v0B3Gq|40xzʇ4Ʉ43'6p _MW7"(ffqz\.* Xl^psLRتz sHY1&hb3s:\L(@E3KznTQNgD Ft^[l 0ÐhMR~|r VGJ9 #RpuPs~ny.* @Q{_*ˀ?#01sKZ,#LcTڽW.=qrK9qο!!Ur5J&CQ|ĽqdQˠC] ]{0ŎUSfiNR 7%`Kb1 [R1L糅.$ACkpROf"&YlMc6 :#ɢȯ9ic&e%64||) mZmw͇"-=dB+P|81vtDE7Y;=8sc">(l-@A(? ۟Nq,ZF]B_*> o֝ج<v`T:.Ύdz` ++؄lza0x}81aԾ15ȲAmp<1:OBVl^#Q`6C͖=* J+JUW('nHPn((zaBK`8l`VRC3ላK*Lh| MT %#hCr= =Bxwdfۡ [V(؝rO",*(~xA0d/^1^^*2RԖ0-tSq1E,P&]7\ c TK>r$K%[{%K bw̄ґ\;rT;O(fxK`0Ci"p`j́D"(L ʬ1f00Qr=1 Pmfw`{ߒn}d:)Qplm !ɞPar']%]T`{%CD E' 0 W`&H-46|CPŹoǍ(*U\ҲU,fG%:pKh Y<aduGTw RvgL&0.eR O*P!2y A:ј P6sQ4ML`r YtH JڵW*0G{"ba8IƮ8Pq1ueep#09Vb~x k0!H/|hgg7.WEZXQOX $s8+Tja;z+)QC:%ʎ F{e.eq tHCqK\9zb>ɔV:5fp ۠`"&^z--,Pq_k=t+&AbX1U 5-ܴT!Ь[NX{,)R'r` ?mHTzG.eI;.ΎϷpEYp|ZU 91VY@3'V=mݪrTv)oؿc^lđPNbqSOqr){eLj 80AsHeϬp 2`.Jym$ن;4h0MubdRȻN W MS3^ʗauq2 9\,&5;-% z f: q?ybn(qL)e)abWI_" iR(PhNҖBfG$,#ܠ U;Dhr(c^,s5Q)>b] #;ܟQFvi3?_Esf$f>>H0#0qM< aAE) rehi:hIL|ÃK e 9U 'iKa 'S%5 80DxÃK eD%YOȧh LÃK eЉ*M< aAE) p2|9sܖde*4#sΪ,1X"~H"à 0ONJh&x,F!Di$ZEέpRlNAQ @\qL+,(YT9N#Y.x_)! 0%]=@Ps, ;JJDA}<$(l)Cqq6 zD%$X}~y A?<ݟ܃tއf de٬?Ʉ{:?;^J]#>g?K Yuy$?jUWgHɅjBW^+m;c&p!"d_<!sߞ=DcUK5K{lPt5I<0ֵޢV 11O^b` #< &G?>㣗U`pe_{t\5X41ʼYF[\ba:A05/Af皨&|5­_co> 1Rxcc5s% >LERơY NJ ^9,3(7ȡjd]dh =+6VAe#j0e% {&?t}>z<|*` $d* Ҿ c *sHH`I]ei1o! A eE.Duw@lq@h/ɥWWUT.驲4U贤!7I8]Ub_9I06&;~`t|b(Ha&'R vN]#>g1U,WWQCK;IյSnd3jve0ԕ_{|paf'甼,ߜ)j;sp r (vxॗWVc .2;_ f xi[ 6 $ӛQ 1 Cj\?!L22D^O"4'3Ϻ&C0 5.P1E @뇩XGp&H @b<|;:t#Brx<]rKh@A;c cFpȉژ0؀i0PCL:c3e\@ g +f6#\[xZ8+ g~APzV9y}R!N&Iz>#Fp\r|GF\ph Be:PHl o.ܬbO1>IL ̄ґ :A .7,dsX=tuUC*A??y09ec@f-lU70cҴ^ vo4En8{8Rj@U ?(&}~}}[W9Xĺd!ȟ(w$ )98;vhNA>UMЙ[ #cLoeZsVOC cCm2XChr7贤!7I8[QjaQK ;iIߛ|1T`:REap#cNg?䲹\(m&i:k:ᢎcH9TeVux^%?bbr ,,@ GWlFmM9Mp  g5ᷡe'v2"ۆ*!H$2l~xM(~U|voU6f>_: {w_rFYUK5K{N`a4 {Xl3T|y^0I0+ڟ1ƕqC34'w)5.GKʬ@bbqbfDmvC~ChXv 2)1YzCBKx MpVZ{`)d %-Ӌ6 j08A7[}hBV8~J.db+FqKVx c)2fiwjxWuV2tTc}RȈF@^XNSk]0 FCi7s3\QZkepR1T;.t& dl)]M *%Y3/ıUyowڰpIgC[aJ(}ء)RU.+(PQ2)ŋ[2O1*Xlul@aPh@aXr2C/f}c>j}/ 0P|觫ک$?b&DTSUg= ΓxZ*|Rh.8QF*Ů#K.? (hؑUUUT F}u #W~z2\WMLl ߷pt*: 퉲T6Qp~$ƚq@ћ?xbHra#('vqHdIQNDZ:1` n$Xmb]1U,.a =D?s ~/7Ǘ+YO#ۃQK ;_1U,.X^.Hxbŋ$̢Ss—e{S7˿z;duroVv0_CG|z1v R-.A3"SCw /J#QŶT}zL2Ta҉PR8NwWD?ŒDȂqf{S[|=~BCFD՞bM#;AV~r ooCw /HD~!\ƦGM'\-KM.so0ux>sq&r9aXF ޏ ^wj&p^D$Ty#SzFrCvJaG$|W.ɢTw:df~ҕ9;%d Y!L_Ab _IrL*yR!/^ HaoW+(؝pk= t{$LK\!%0!mbj3'4JucbDizYW-V QAAFeQ- a2"})tWh=)tW?b'{~kH\{ᆔ*Ʉ?醺L )NS&,A oT@ys 0cfkH\{B= t)rnUC1Cz}_kp$zS8rhQà J0Z^ƸJ}5ST CWh m-٫SG-'4-U­X"FKa50 1Ο2@U)#AqS??`bXM\;5i77vfNϗsF-"q"\`0¬C 80D@rxr\cC& fsz|ΣUDZlk#2j9y , rJK$ K zFo Cj:OXL}(s 6bdH0 Vwu"0*rL(Ht~8jOQҮu\sQt쬹1P37F2C 7y?_ߟ~?Ǿc.e`NX <8gn( F&Ng> dBmx# vl2۟BiHЦL=p*ń̤)p׌.UBvN +Zzr$N× hDG(ꦓ fsz|f1+૞e2D_Z-ԨnS?e!dO}Tī~#hݸh<-D~{!zJiFtPAcNaqOHte}ѐF% =#Y|rs@xn@'4u9!A 4R* +LM#ʇ([ȑ6H牤C镺,)HFM䌘1PgaqÀkP#t$3,1^ "".e!5k[‵.ĝFR .YZYGgzVjD5@OgUV(1;xvJYοRk9 E+H溥Q*{YjG< ƃY.rf*  -`>)9rH* KhRC?$kEY83?Q|%*p{^UjdEp9I8^1Cs?iEsՙh-0O}N%-$9:ywMhd}=mȆX JFg:ʠp4+@xyb2ބJG2C3y?_ۇD}:Mr3lk\CàP8_`iu"0tl\yvI>.3{9iY|(I{n+'Lpc-v}_k+HifuHU̢5SydP,uHA*VzF ?NaϮaT =KC6* k WEC߶#) g*sF7G|w `.\dY!mdٓ7:I + rlo#\4G"#C늊X냴6hT'dc#זNQ(xӂv뵀qFw/bͨb;82JF2$[u nReW[MB&W㙉;6 0%Z2Y)I.횄@ ⁴H 80Apr|$yX:H{sƲƨB(Uf_#avarhdg>mjn/dj8DMv (]-iR`꽭Ϲsr}d\#b n+~j}/ :8HgiQʿ<@)  -*ÐÃKX0e_(S7Ϸٞ \lqUkR;ڵW*-@4JNιA`ʿaJЈrJF2a됱,V@w("3Bs "R*֘qh*B]C˥{Pg1D:7G;F`rNbc5i7BidTa:DȂsٝϮz0ֵa>f@aX2#QK ;sf$f>8y)b6'|ÃK e(0 9|1T("D$H"D$G(bwE: V}ӵv]%qYnh5H3Ϻ'j ;Wx0逐A;9^ue8 \ya%@vgiQ'D*Xluq.CKgc[!e?g:mb䤷Y)R0Tyѱ.0Agɕ,F^,YXMQ!vzZ0 *ΒZ1ss728Dq;BiHЦL=s!^uh>CpBy1AS&kin]@ZB;=-xk@+R՚eAT#C<@`d<M=H>K֚JqF#TvlgO3nQ ],7$cv$ .EB$V2ˣ†3$PPsBCn9J `|EVi$D!QmO\ l:X:GvLu#B<}l:h<4?F 0JlApAECeYVHҔ෯Ȑ[O7L r5d"XdBa+qU֡)IB}l=_Rd\᪄0UP[éaK(ɨ RWh:Q HzD0#6'"ы2M*A48*0!Hkr DA3ڨ=|0(vv-"/jč G] R/:t4TF?/k$* Z1%$dl1K:.)RJr Q>VX"M94*=8?՚bU@ڹ U$> Hw/r DA3#B:mx%g"|]JwT rjԠ0X.@)X@qJF҃Cݒv4Jаo6 3Q%ZFDbʬ4ce22G`){XO;d1Hш$v@{+75G! 6TF5JW;Xs'4FYHh+m)H:a!G"h$ !悞Zcd.;LxilA9 FZ%WP*C”.^=^آT ^!'b?VkR{ҙ)-ѤP90(}$5T?VkREV0UT<%vG>Tn؆}jϢ]_I15!L| $J  UJ,cYVTJ U W1fYPU*."@+# R qGT[*s26^ *]0& @".U4KMe( 4ԒSAZFlʨ`xX!"E4hzΞQ(vQJ7at(`qUF;ARA  DGN` {Jo@ZB;;b:-cqˈPHH2Z k=jZSBSǔ̦DV JIWbJџQ$D84-%)UUX(R yup[?P,u W; e3 ift/']QlAji)lZ P,uJUNȊuhCγ؞k/W/¥|b쑵E6 mͭ`aUUPDWl#;8l)=kA5YF3fX@E"9'-,0(CΕH!ABvD|~!Aܪ~@e/E @)/L`"'@dM>Ae̮WMZ@NlaxzhS{ m4DDDD Qy}a0T4H ;]PNjm佋TS_ߗX%@|%H%B2céaBAbw:A5j )=1s#kcAS82U3> e*jodH p̡xE:XIO6;$%AB 4a+hp146ƣT‚%vTЁ"A&~ z]YE9ߨ UqTV}69ȦQa-,HoP&DaIQ OGU0D=)@* S{@TFۄ  ]qϲN9_YNYɑ$B<}o ]a(`Me1HĈ&acg4"=,\PU*DŽhD(zXG+C܈eke )浇A,CeGj 8N`B-xQ QeaZ08Mb Ή'9 (@Cd5ʀU@> @-Ϗh1Ut13(tqҰtAT6gccUx z]X@E"?^k 6Oa@Y*,qD5ȀDD #ea] (6&" p<:E ][XkUF `@>mA)0$b)= ,`?Vk&;)peQe>}U"v8*,?VkP"#AWuYc"qE`rXT$L-䝏UUa-A:; Ϟ7m)՚`T L40@f y@  Q8.4Ъ YV&qU"0 v~rdI:L i#{ڂ*[FyT3 dc,FE6mE6 mnWSg4FKp#:4e.= ,~l QPhy4q+=,zaw:YhwuwBlǘDŽNhD{XgωDXU|Zt0YDpP2f*5|s%LKRW QPoh˃ A@S,E ;J&]Ws'6~u))+%q`hyT 1oEJU)QR+  vg1>OgmӼ97H?ݞG3C1P*CNhE{Xf}],ī b8P+lB1<r>;3\IT1< g=]h @F'ϻ(Py5a* iO{5a*QmO_.Ȼ $70 EE6 i*CҰf-"'{Ntp 9:X[՜GQKwU ];ѕDwB xyP%-p@A +*Vm\ *!/H\6xw{LJE(ωDUQ0֏ A"¡URB6*v:hA@|M8~+D4yW10:2DB#ș衞W4 $<ŀ4*W)+( veGX ;ZB>.Սl ИR>׿w@FH$!NǪƁJDzrCYE#^g||i 1@  Y"A=/Q[`@JB= !B0`4';& 6 Rh5bLJPKdoګPC?VkP"#X}<%b] D~ DG /iCM@Z 4U@B$ni/Ds(B;5a*hO TA%@k-CXNBjshPb !RRE14UUT(U/Fia'lDh b+ w]ur DA1;ƀ6ڋ41j ; FC@FRP}DY++D@*a#CQG݉y@ nPgwJO"fXd-fYPU*+Ӏ:h;2(*mF? 8$'wɠՊNH5YE\3>?:T>D-P /iCN9X?p&j@ xawbLN+PIH,oNUc@UXx+$_fԃؼzX#R#"uD4m70݁ ;Qрu݀T/PsMs#j&&:t5V1آ~GST%rDAGp p5" m(T=0 K!М0TV<4 ʟNѫrz FUiy:+р:i4}Mekh:;"E噕FQ݅`0:UF"'DZy',-_T8[bD-#@5PJka 0.@$w,RԔX & =DԺ Q9SQ,"@`]UUAU_K.g#kK=ƌ %5V9c.ڰ0}$r>5U+lBX&R"뉝=,k4|X(e@׊}`qztM 2 \Oɑ$B3ȇ88~hm:^( T{ iF&? Qe`'+Ū-@NB{#͡(rz|Ro8pÇ@+-mK֚Ȃ(DQ ݀K2PE"r?VkR T#FR% 王kcA?ѹ uѦA5Z RM :}!};?0SHAG&#D=]4BQCkhQ^e@i <>VTN 41{WA4lzmӡRQ"oDl ChߏK$Z&/:t i-G(\{TVJӧ-t- S]O:zX!"Ui8BEhO%w)7ػKh(YSzt3Sr} 쌩6)v3bW3'X\0SBR\*U\F #E3\, J3]gA쵱CjSA쵱CjP5ʀU@>G, -$ґ4Il5hJ‹n S@!?#5jqH`a@C_ܩ0T4H  ^!'FZDŽNhLzJg8pv[ !<@3TE}'}jϢr DA3'0!PH0DQ\Y2Ŏy%؊$5[ыp;!$M(JX+P( mW3jH '$)~+Dr% XߕjYe #ThCUBQU YXGlGY{t(Աхyf^O=3t#(Y@r?@Qo8u,=exMt{]Gfgr:J9CŶŶ۲@!j]@B4B!UT(fe3/']Q`'lQBW&tM՚`T {Q bQ)*U59TΈ$NJ,<[”.C*(B eh@[YV&f 0nԦ'ƥ˩:h ")ʼ1*߅QQ؍P@ OHS:&t f=<QХ%#A~ W@8cBR3dn+5 ʂ)GpDsե(IBQ9PA`DŽhD(zXG HD|tҔ ]Dե(UiPdO. uL{0& pP8Y؊hPY`% #jOa *w\*U\!CHYDB"W4Qeh+1ኑTBL(6{X!"E4hzΆKh" [y>ldH FypTrC%aMH9TzVTڹR+s/h@ kE#OcW*r}> pZtt ;SV#AhPL+#dYH ajCI&6m Qa"]JCFL--$K.g'KalpdPZB ZW2^TA?$ɳTLYXGmommE Ւ(yI@J6'xDP0SHz~)"V7o}NK"j[ EЪhQ!n]J=ɏF tƽF0! }!Jt9Մ2)&pDQml30X^\‚*D?۲doSkqKAGL+DH|gns31K-t/[.Ŕ8s9-`_pyC*~R!XRj HoREG}{j*W=~ldZxĪZ4.uU" tv2)TXCLim&o.WeAG@5ʂUUv{ >Z[TAIP kUPMBZd3Y|#fYE8=Av9&Ee)IhWONڨaV0 ԬeU`}&MOa4K.g'kcP1*7šLu(v8V *z]XD|ZVGJ:|t.e{ IoVk69i&~59t`tP|T4 eb c ^l=8( (Fss\FH,!\,T 6 `yz?Dm7hCUBPP,4-їUh)Xj%W*cU@ct;<"b)Q[4՚a@gPz'cEhl\z P c10(==5DQU/xC*~]i94*}hM){JGA6A$_!3`x( pxD|B UtHFSB9ۊ,%S*Yu#>;[w%'zvv £&d f*҆‚XyvUUJUaG}v>)F,6¢a;#4 l DR3?VkPIeJ*ϰڲJe2; c2rZ),vnApÇw ӨbЌ YDB"i1`2֧~CUL(E{PFX!C͊8GmU@>gժO gV31b@@݉3T"GR:!DYD=+*Vm_0zd2*hQ7GqbP`ZƏ*"W~Gp ryAhB"r|b䑵~ DG>.ՌJdҔ]ҧ>@XfΘNhMzJg#fXU 0jՂҎNIQ 94(=#iFL#l`"vjՂҎ?57)uʚjnRow?y#JX/kؑ AX.??vj&M HDZN:>AIT1c *ب3>H`4p"h~ ֙ 4٤1 \,@E"9٨ VGJ:?,7 Px!ǹV2ˣ?`j6tKi8YVD "&uU"0+4.S ̢Ԫ ;A 2(hAD b8P&T/J >t&ly]%w)uʚ:Y(WD АWi'=k64 .$((W;BB:PSdO y֠SH090*=9ߨ UfNKP $#"pMS80843ڱsr#>6 m8vJEF3Ep!& _.F L!>6vE56`"@H {4r Q>>,֪ĉ5J3B ZBd jLUt@ !-?Ps Vy FSR@uR%8h,]՚aVOfġu t J>:t#'Rn6ZTv* ~l. JfY(O1P &:JP#F#fXU gIQ,MO:";;i"]H @R DUhD"7@`]L:`$ pbz>-,G9'QaUUPDWJ7!*TH+2+VF}:E|OOJ TeW.g#kC؝Ƭ!Z['! *j#m HP5,BXVH9b}>0A#m _S( k|y3[,v'{V$hR=*R[BEbnGy5aj  -;F3_B@*‚ Cx=}j (#`ER=^O&=&j ; {PVJOۄQVP#_XՁ& u$PC&j0lvTW5AC HkJL)B[x Y6@|>{Ӱ4pXqh|UR!X#BR*(Q}:d=>FS QX-yEEс*CҰff%VXPU*'THW[TAIP)i)U@*Fmt' AL]K-UDm#: kGmBU@|t<ۓmgLP_ ޗU&1ٟ~b_rIJ)"br@ %*^bʈَ"h#sT*gM o !MbYT)Eln>U+r,/jč G] R)2  4  0.ª@* 3,̒[0#jx#R ̬ 7T)QA1R8 P*"D0j.aP "t#SQ!` ͉AG&L$ ?9j hҌugTHASzd^BHჶXSCeT4 ebbJaCmhDTQD<԰B9ϼ@aD0(622 D9X?p&t@՚`T 漈Mb4;Y 57)5ں آT!ɡܐ4JܛU@Y  8R\䔊>.@JBSq`hyT 2a(AgOl'bf l>|Dɀ'cmZ" Kʊ/`2ڲͤNkȦQa $*FǠN&\M0H46Jy1Ocb'΄e3$0 0éa *w)$;*fY(TzRT%8װJ 9k-R?@3Q/nOoX ՚`y"/+Te߈ %1#jy^PxQ kLsrf6o ?W֠XNȚ NmPj6 ,C[D+ր77PCzhFBrG>Tntǝ:gO8Lѐc܇?VkP0P \?&btT:iO:#I$H*՚d@@"yG3 9:0Ԋ{ڙnkx1 z]Y(TzVTھv2DJ<ϘfUG#%,-<γ-!!=_ER@&sUZSM;CG! 6Kj9ۊ$%Sq* +@+;5ajGOf=p,L@D:'d!t J UH` ͉ 8!Hz; "ԀPld.bY P M*[ B0q LS}҅ )j"{]t >e5-S0 $^EBe|5@ 8> V.qU"+6c682@zJy @ &)x@%%-S-h" J|YDSV0jHH@q/ "$ >tgPTzc0]UUJU~G [f ùE%՚dA"(祴o hhGz]YPU*՚`T 渷%j] ٴ{1m`՚`T ?VkRUH`JͫצBU ' bQ'1Rj8Ub$: wD(Ec@(v-P 1-SMPlY(]VL &CmheoG;& lhlYAtri@6r2PY-zP(VfR\Ը֠J*?hf*9GC;ܝQU"9pUiz0ڪUVm$D )dMV4P^QV<$2#Ҭ*cU@MBess3o(axwRDKdP]s0DT\ v@AUH(@] 8R_ H"u!bhyEsM3p $-٨ VCBxg#j "gr^TA? ɣUMFy"DeDe)P@mE@tDRG X oGId֛ 6àX'rl73t7Lio ր77Q:2\3 a5G}= ˹9`=Z %VqY?.wlū b8T!}H PaUUPDW5[@Vn?eZP;>4K֚TI-0Xt,&w@@ 2%yc9[^4aI}a=nJ[Ƙi>?,RR=i$4՚`a.Up*i5 /1p6nMt۽KBQۚB5fs<)=a|P|%Ag H í=3$(G& U &Kj*WL`" d1((ߘYDB"#fX@E"9}$@`5NNX ʨj! ̴~ +Q3V |{_܉ГX]&L%XM!霫4+^t)5 t J!BF*쵳#CjEMMrvQz' ]QI KCwIV*u9" ׎M@JC?'y]SC>Yh 6q*!]G 1)+CHgXoREF/eB:ts$ & ^$FT|ZPF 00*C"!>!>OɜÁm]C"!>!0՚dA"(zsJ@Hw,~ 1#~@Y~-ϥ].q`t#oN1R{ Ҡb6;D 9E6Ȫ(Ƴ`6q {0O=%^^ i`ac]`?Vka ǾMۂc94(}uztAl`b]՚`T b@]x.A!5&Py#g0O 9b}9ߨ TLQt݉6 jP/kɨ RWh:VkU{Z1}e1 fL-X!(P&u8p], IAɨ RWh:0ߨ TLQt,lP>.Ռ;g0=%G?%zľM0`t ce:|pÇP&tw` (zJO~.ՌQEmFE݉6 jP\DO~FE6mͷ ?As&*HRڱ@ׂx``9Dxa$A @#@a [/01$lo($滒 tLhLzJfsBU@+p5ʀU@xQdl˜0݈6@Ync$Ofġ%?[PkUNȊudqHUB2@@ 4j3VA 5ʀU@5R+ 'HbP~Um)DyI '#"uE62^TQ)Q8.4@҈j- !<<GUuB]qHZ$Y [0$ X ;ZB J:ac$B Ka}].%͉8BdqHUKbHH + 4ԒSAZF5`!<<¿՚`T~\@9}j$TPlQ[anW_9!)RGXI0 +48*0!Hk ^FIDv 67s\m) f"b#t0՚`b5$BzJ S65y"+ v悛I0;I+\,"E(址2ܚAB oCÉ J 9!*R»f ^DH+Aa4.E.0f*ac.ʗ5W N[%t'hYVH pCpϷ}AOjjhBBȨĪʁ f0i@i3偼pw*#@\!HE( " E2Ad ŠLs/* Вe֒aȲ9CaUv~?3?@Ӹ9QBP_ՔVm$6@F"dΣKMhJ ؉tY)4UUT(U-BFRt4b(]?L$H%Paz)3J&(H64Gck z5ʂUUz$D*",^څ2[żi@M')iO g2ZdK-a v}v> $Ъeg3HޒCF7`~O [y3;"= \ < t`["t.%;OK.PzWҢBi% Ԩa GlbJ 98UU("P 6eG"QAPD IA%w)7ػƆrG! Y"!9A *C°f>-Gp qk24ihn BFC@B5$U6 3@PCM 6AUv J~UiD; Mn8t@70: 5h"aBUH` b'΄e1R+ ڇ4l&f#؋iԇHT8J`?v#Rz$o$.6 ol6JXk+[<.йsO~4|[,I" }BҎpV6Y1ًy/k y&t+S NT@p^ XWyg 8! `e I*!NH~B+uh"E Kh(YS՚d@@"xLS}R@)Gr@sM[d0*]M>S՟Xק%?M!x-֚N*q)15Djc94(} NazQV@,ЅL?n4DPW8 b5=;h-U14"7N @! AIJ0":hEY5wv?7yC/?@sKl {T:d<~+* UWΎ $4*)Tʰd\20AGK0mt0eT5fZ:8'^D 5e#@hQ-^% )Nq9X?q&HTxJhrSQXl4XNzڠ fH7 Nb2rs+ kR+(4b^ Gӭr=ߝ:wPCHkc5X!HpeTzRT%9ʼ4/\/@qM0^Lp ť@e$ih?ވ4NB]Rُ彞[Uɠ0.ª@*- ,ПT6cB]gэzH>*JFj6ZEhoҔ ]AQ2E!w~=:t=~hmHz%#WQ5ix {TFXjBڎ$EQJ{ڠ if&  s(=jvyӧΆ Gf&;WP{-lڑùk5A(hQ-N% E)彞[UfL%J! P&UB4('F(1T 0՚`x )=3yogeޕ43j6Xv~Ɣ,_(kcAeb:IwtjaZ<bFciGP&Y [0OB*5s j:k|apm/W3333CBbq*DjJ"""~'i!5ս~{GpZ*D>ȿ-mTIg9Y]'9)h:NHc{1W@W Kʊ/`?\*\GrUU݇*څxckZxO=xo@+>M16 "0\DO?VkRAaƁIKϧN:t[Bbs*DjJlVž6[65C_)J<h @ʽ1 6zv@)<~8Q\*\{'4&=%O|x( `MUuU/ʼ5".h !O`?Vk" f!U5@w@`MAD\0OjXXR~6i2h X' o[@(l.zK=yDbQ@ j+I|pÇ~D%TB;eK U$QKS-ЁDmceIQ5FqU"0#6&(! R3aTie&QTxR74b@yTZ՚dA"(0ZQBxmK.g#kK"(% {4% sdSWJt3d(CCBdl5 / b@ΦR٠~2Dv2PY5bGpD|굢B=A6r<ȏJcDl{6P&>@"`0 jD85<+J cg4"=,l. ȅ RB|Չx*>;Q`+FE6i94(=ɨ RWh:?Vk#g0O$ isR˄GcShS2\Ԅ@l(9~&L-J]띚0`t8#mB@FÌ%; GtQ !%4uOԀf-"_FI]7fA .9-UQW# P, w=glv&l u; r@@"f ^$FTsC1WΒ?@<G5ȄGYpIC2$r"C;$R*R6?`DD@JBSg1x5~M% -MO50\R9q% jUQ(m}βj&~@_P-DfG$hdFPX)u?ߙٮ^6!xפ5LvҀW@d]@T, E/OH\di "-jͨAi0FH-h@eBEp(BZY )1i4ThQjDb̕ |/q.$¨ YBrG$JPGTYb4('F4~] sIbe$@a,?֏_)?ñ%) TAu1"pSG\`zdy])kr1-q*@frlK'V (q:"+2\XpJ4EDD)(/AfP.@U4\n,,?Vk t07P}Y i B+UR!X#B~/ȦQ! 20hI"9jHcaNĄZQ$P XXs "PjUE6\Cn ") Y=X'P-իم1(5 WM0NqL()VH$)G5`J)3[,4Oʅ>@"`0 jJdI^t#[xv~Ɣ,_6T-rDQOB*5{(@y5a* iL D!=qܨqר?Ĝ9L^,Qe!?3h0.ª@*~L. jASP&DLa WCҔB.)=`d͜ÁiO,̯tX6Zv~kv#mB@GX:B9`}Cd4ۜP lt̏CFpGQmF=ґa)095ajP _A\DL#g0O\DL @+sP&tGr@Ç8pÇ8pr Q1a%Eh xMv+u pe!SMMv.*!AUT2ˣz ;vUN H ;X,hSԿ־ HMZ^;?33333333@mBp@i6lgLOB!PLɇd1pj5Ba @1LazTXtRaw profile type 8bimx] 0 D{Oq#?R8@@`&WrnQ+{"ePwOs'NͲQu ?Pv5z`ze:-!F׳r˞]ﵭu:?Q7V3Un*=cx6zˈng‚n7tGM8CfxCs[h>ԷiKt##NeuVgVjU.f6ʃ[h#}\ CBNݜ܆5%{6r^3})M.oA\ wG9rBͱP_J^)֬\f7aMGaC2hsȘyk[wRM)a`ݧ3Qxl+4׺2/ç+ڈ栍^ٲoS"U37.|O+Q*c͝J(\d-",5tܭ9 mmG!#ث+ˇfmh ?d!FvT0CWB8>f4TkwR^Z e &o~,+n@F0C AD!sCr?L]afHK{ Z?^w)RH!m<m߶r˚mbt[r ˻DϨui\ѯvL^u/4Ͷ}YVHckfdBI<+o2[PGR6y|sh4OXv\GplNj*M9h u`I낻DQj ;C#/:]MJ2l0ef7Enٍ-v\`9I}YSa&,#~ l'=N6TJz(8*\)v3n=6Oؚ0dSŏy3IM% xhgZgTufeFg_0\T;3J]dAkOo9+k"'sw&pi֔3qU.T2pbh;5.@a[ FC?o:5O ,VԽ,?0'J=73ٜ5خ61aͭP͇I @h!O3F0]ņnCXwl Rn"!K -oѹ`ee)67;=ث%Ps2&nҟ*H4I_M}$oΰxfa MqjS;x.FG٫xgh ~!̙3a5g _je!lQwmeb3< n4w6jŝRHVmƻjJ-G=7v4nG4FbyHK%>V W4;OA{Oك@X!hHSжK5?[? O;t}\us`Y|sysfCЇwKS#IԔ<$*\ 1pF͝s}{τk-mgXWY},tٟϧ~w|-a}eK *)n]g{6)٘C̗kr<ɩ]uB' 75'<[g*o*g1{XfH{/l} wrly F-MwŸン ^N-vQ0ܼdZs][ޜyy+a~T$D[jK0OMZˊm(Cw?0,Tat>o")> H@  $`H@  $`,1uv/Ĺ"(+(+`2lS$kt32EX̳0C !F2hϟwa/t:#]Kw%Gӎr-l 6iK.v꺸!VuҔd7FU>m_fO-*8Be90^ Y }y].C%?"HSV3T3w}uol!nzyclw+w0TC*KTlqПdiFC9,EG 9Ds_w"C}V6{ÐuVOn+4A~y}>5,PӲrmb;UambCw8]qhN M_oǴ's8 Uɳ욀7 U*d G[Q 7GcCTU |grnb>pYTI= 8Qv vTqpI{.8$u"hTP!\b{1-"|jDϨ/߮N74$[a{!;ԣk.x.dDT xI½*?~v< òO3+ -«y| ]$nT_ߝJI.d M3L,ߒ/2]cγ]-^g9]LkZ[])45:i*U6Iat"عh;˦LoW)Kn-b'ENQ+؞WY)9z'GlG377~ 6e?KP\[6ە z>P_ߋb ͲxK.^<@{AXR0<7Xl?@Ibx5y K0!/_q S3yɊ9 @H@ ꧠ7WGV)갽#'$z3d╲WvyQ 8XӮ`"%fQX 喝  ؎Cyh)w }]+/n~𩆛erg;Jk׬SR}l-v~b4d7/ʰX)*%Jw4 MGT}{3y&>lFu 4NHWRߊ~z=a ,$DRmw2RC E) -Y Ake $V.`F&TpOG7T-bP# !=8JtO\j/|ikrwz:9> n[y,_N}4t/ﭡ)\xڢ^w[DSBmME5pw5Y]x=,e ݆FKXD+`9E]([RE~>ް;B(L.O ^nYЬm)W{WA/FjW+pvDHf'5! Ø!O'{["Էey᏶0U97,D_w ,PeGo)]3xm=;4='+RI%џ 53Ru«T/sw+'ݎ341\#XJThcJB&V~[׈N :ٿ~d%{#C^wB+q,?|XJU#(8pgZ8]&>f }ydn]U}*{T{.{cM1)C#T>KUysD>?o`@55zL*X 2́O8[w5k({:}hR=;5eT~2䪍tGzXvL:_<5̍7ZkiNœ-:\NЋW;hM 0GKR`t.ӲӓsLLK+5*glNs)a^LJ3vs諰>Sxfh6{uҲsM4EXN1 9T+CS m]64 ([SQ.eHA,s3VYW(-Z :3Um '=?c@giSLjsx[V9ZMD>]9Y/+w[fʝߡynl@xweY[GumHkB(ReJ5dfbdh[rUV0ll*CЋ{j xK;zW\Tk&MCtgxJ^i\Dxeޕ&S0 ]F5;K_8/3hf@3Zt=r?-R3{F-B^|.:ͰZהs|&x| [.5#<4+ 8֠a6[ʵ0dߍI/[4ԐJ;\Ru Wp*9eWʉ3 O& 3U^qov9Veˤ aRj+ǟ6aw<-F6+aCլ&.v迆u5+zB[׬S>/.WY@毅lc-գ]CgXE#GٰC6oe(Vq-n4Wfa3_s6iCe z~)i{YY?Qe^SlMKUau+PVfp:MKݛs7e5O8?S%s-l٤;ʷpȔE: W}O= ×25؂e U4LY˝_0ö~fgmS引 :ehf_wm."CJ0r!c`[Rvt=ռrjSҔ:yA. C *):O4gJ 9+<-s,h#|n¥GfvofoVZ^Dj`הP'Eٟcf5Da~%mi.bKi*%Ըl8t 5/_ްR v$ז]bd=%ge5}B#=B xF^4k |grnb +B[x!g'l6g=+4|h;gm΂+ԐZtShÍN$=:f;Yg1s! f4pRe(-Js;tEXttiff:rows-per-strip102IENDB`python-pyocr-0.3.0/tests/tesseract/000077500000000000000000000000001245470272200173315ustar00rootroot00000000000000python-pyocr-0.3.0/tests/tesseract/test-digits.txt000066400000000000000000000000121245470272200223230ustar00rootroot000000000000003355456544python-pyocr-0.3.0/tests/tesseract/test-european.box000066400000000000000000000155341245470272200226460ustar00rootroot00000000000000T 105 705 130 734 0 h 136 704 155 734 0 e 161 703 178 725 0 ( 205 696 216 732 0 q 222 694 241 725 0 u 247 702 266 723 0 i 273 703 281 733 0 c 288 701 305 724 0 k 310 702 329 732 0 ) 335 695 347 730 0 [ 376 693 386 731 0 b 391 700 411 731 0 r 416 701 431 722 0 o 434 699 454 722 0 w 459 699 487 721 0 n 493 699 513 721 0 ] 518 691 528 729 0 { 559 691 572 728 0 f 580 698 598 729 0 o 597 697 617 720 0 x 622 698 642 718 0 } 650 690 663 727 0 j 687 688 700 727 0 u 706 695 727 717 0 m 732 696 764 718 0 p 768 687 789 717 0 s 794 694 809 717 0 ! 817 694 823 726 0 O 104 654 133 685 0 v 137 654 157 675 0 e 162 653 179 675 0 r 185 654 199 675 0 t 224 652 235 679 0 h 241 653 261 683 0 e 266 652 283 674 0 $ 310 649 328 683 0 4 334 652 353 681 0 3 360 651 376 681 0 , 385 645 392 655 0 4 399 651 418 680 0 5 425 650 442 680 0 6 449 650 468 679 0 . 476 649 481 654 0 7 490 650 508 679 0 8 515 649 533 679 0 < 561 653 583 674 0 l 589 648 598 679 0 a 604 647 622 670 0 z 627 647 645 668 0 y 649 638 668 668 0 > 673 652 696 673 0 # 722 646 742 677 0 9 748 646 766 676 0 0 772 646 791 675 0 d 818 644 838 675 0 o 843 644 862 666 0 g 867 635 887 666 0 & 103 604 134 635 0 d 160 603 180 634 0 u 186 603 205 624 0 c 210 602 227 625 0 k 232 603 252 633 0 / 257 602 269 633 0 g 273 594 293 624 0 o 298 601 318 624 0 o 322 601 342 623 0 s 347 601 361 623 0 e 366 600 383 623 0 , 389 595 396 605 0 a 424 599 442 622 0 s 448 599 463 622 0 1 493 599 504 629 0 2 514 599 532 629 0 . 540 598 545 603 0 5 554 599 572 628 0 % 578 597 614 629 0 o 638 596 658 619 0 f 662 597 680 628 0 E 700 596 725 626 0 - 731 604 744 610 0 m 749 595 781 618 0 a 785 594 803 617 0 i 809 595 819 626 0 l 825 595 835 626 0 f 103 555 120 585 0 r 121 555 135 576 0 o 138 553 158 576 0 m 164 554 194 575 0 a 220 552 238 575 0 s 244 552 259 574 0 p 263 544 284 574 0 a 288 551 306 574 0 m 312 552 344 573 0 m 349 551 381 573 0 e 385 550 403 572 0 r 408 551 423 572 0 @ 427 540 464 581 0 w 469 549 498 570 0 e 502 548 520 571 0 b 524 548 544 579 0 s 549 548 564 570 0 i 569 548 579 579 0 t 585 547 596 574 0 e 600 547 618 570 0 . 625 547 630 552 0 c 637 546 655 569 0 o 659 546 679 569 0 m 684 546 716 568 0 i 742 546 752 577 0 s 758 545 773 567 0 s 799 544 814 567 0 p 818 536 839 567 0 a 843 543 862 566 0 m 867 544 899 566 0 . 905 543 911 548 0 D 102 505 130 534 0 e 136 503 153 526 0 r 159 504 173 525 0 , 198 498 205 508 0 , 207 498 214 508 0 s 221 502 235 525 0 c 240 502 257 524 0 h 263 502 283 533 0 n 289 502 309 524 0 e 314 501 331 523 0 l 337 502 346 532 0 l 353 501 362 532 0 e 368 500 385 523 0 ” 390 521 406 531 0 b 433 499 453 531 0 r 459 500 473 521 0 a 477 499 495 521 0 u 500 498 520 520 0 n 526 499 546 521 0 e 551 498 568 520 0 F 594 498 617 528 0 u 621 497 641 518 0 c 646 496 663 519 0 h 669 497 689 527 0 s 694 496 709 518 0 s 735 495 750 518 0 p 754 487 775 517 0 r 780 495 795 517 0 i 799 495 809 526 0 n 815 495 836 517 0 g 840 486 861 516 0 t 866 493 877 520 0 fi 102 454 121 482 0 b 126 454 145 485 0 e 150 453 167 476 0 r 173 454 187 475 0 d 212 452 232 483 0 e 237 452 254 474 0 n 260 453 280 474 0 f 306 452 323 482 0 a 323 451 341 473 0 u 346 451 366 472 0 l 372 451 381 481 0 e 387 450 404 472 0 n 410 450 430 472 0 H 456 450 485 480 0 u 489 449 509 470 0 n 515 449 536 471 0 d 540 448 560 479 0 . 567 448 572 453 0 L 601 448 625 478 0 e 630 446 648 469 0 r 674 447 689 469 0 e 692 446 710 468 0 n 715 446 736 468 0 a 740 445 759 468 0 r 764 446 779 467 0 d 782 444 803 476 0 b 827 444 848 475 0 r 853 444 868 466 0 u 871 443 892 465 0 n 897 444 918 466 0 < 101 406 110 425 0 < 110 406 119 425 0 r 127 404 141 426 0 a 144 403 162 426 0 p 167 395 188 425 0 i 194 403 202 434 0 d 208 402 228 433 0 e 233 402 251 424 0 ) 256 404 265 423 0 ) 265 404 274 423 0 s 302 401 317 424 0 a 321 401 339 423 0 u 345 400 364 422 0 t 370 400 380 427 0 e 385 400 403 422 0 p 428 391 449 422 0 a 453 399 471 422 0 r 477 400 492 421 0 - 496 407 509 413 0 d 513 398 534 429 0 e 538 398 556 420 0 s 561 397 576 420 0 s 581 397 596 420 0 u 600 397 621 419 0 s 626 396 641 419 0 l 667 397 677 428 0 e 682 396 700 419 0 c 725 395 743 418 0 h 748 396 769 426 0 i 774 395 784 426 0 e 789 394 807 417 0 n 812 395 833 417 0 p 100 346 120 376 0 a 125 354 143 376 0 r 149 354 163 375 0 e 167 353 184 375 0 s 190 353 204 375 0 s 210 352 224 375 0 e 229 352 246 374 0 u 251 352 271 373 0 x 276 352 296 373 0 . 303 351 308 356 0 L 337 351 361 381 0 a 366 350 384 373 0 v 409 350 429 371 0 o 434 349 453 372 0 l 459 350 468 380 0 p 473 341 494 371 0 e 499 348 516 371 0 m 543 348 574 370 0 a 579 347 597 370 0 r 602 348 617 369 0 r 621 347 636 369 0 o 639 346 659 369 0 n 664 347 685 369 0 e 690 345 707 368 0 r 733 346 748 368 0 a 751 345 770 368 0 p 774 336 795 367 0 i 800 345 810 376 0 d 815 344 837 375 0 a 840 343 859 366 0 s 100 304 114 326 0 a 119 304 137 326 0 l 143 304 152 334 0 t 159 303 169 330 0 a 174 303 192 325 0 s 219 302 233 325 0 o 238 302 257 324 0 p 262 293 282 324 0 r 288 302 302 323 0 a 306 301 324 323 0 i 351 301 360 332 0 ] 367 301 376 332 0 c 403 300 420 322 0 a 425 299 443 322 0 n 449 300 469 322 0 e 474 299 491 321 0 p 517 290 538 321 0 i 543 299 553 329 0 g 558 289 579 320 0 r 584 298 599 320 0 o 602 297 622 320 0 . 628 297 633 302 0 E 662 297 687 327 0 l 693 296 703 327 0 z 729 296 748 317 0 o 752 295 772 318 0 r 776 295 792 317 0 r 795 295 811 317 0 o 814 294 834 317 0 m 99 254 130 276 0 a 135 253 153 276 0 r 159 254 174 275 0 r 178 254 193 275 0 é 196 252 216 284 0 n 221 253 242 274 0 r 268 252 283 274 0 é 286 251 304 283 0 p 309 243 330 273 0 i 335 251 345 282 0 d 350 250 371 281 0 o 375 250 395 273 0 s 421 249 436 272 0 a 440 249 459 272 0 l 464 250 474 280 0 t 479 249 490 276 0 a 495 248 513 271 0 s 540 248 555 270 0 o 559 247 579 270 0 b 582 247 603 279 0 r 608 248 623 269 0 e 626 246 644 269 0 e 669 246 687 269 0 l 692 246 702 277 0 p 728 237 749 268 0 e 753 245 771 267 0 r 776 245 791 267 0 r 795 245 810 267 0 o 813 244 833 267 0 p 98 196 118 226 0 e 123 203 140 226 0 r 146 204 160 225 0 e 164 203 181 225 0 z 186 203 204 224 0 o 209 202 228 225 0 s 233 202 248 224 0 o 253 202 272 224 0 . 279 202 284 207 0 A 313 202 342 232 0 r 369 201 383 222 0 a 387 200 405 222 0 p 409 191 430 222 0 o 435 199 454 222 0 s 459 199 474 221 0 a 478 198 497 221 0 m 523 199 555 221 0 a 560 197 578 220 0 r 583 198 598 220 0 r 602 198 617 219 0 o 621 196 640 219 0 m 645 197 677 219 0 r 703 196 718 218 0 é 721 195 740 227 0 p 744 187 765 218 0 i 770 195 780 226 0 d 785 194 806 226 0 a 810 194 829 217 0 s 98 154 112 176 0 a 117 154 135 176 0 l 141 154 150 184 0 t 157 153 167 180 0 a 172 153 190 175 0 s 217 152 231 175 0 o 236 152 255 174 0 b 259 152 279 183 0 r 285 152 299 174 0 e 303 151 320 173 0 0 346 150 366 173 0 C 391 150 408 172 0 5 413 149 431 179 0 0 436 149 456 172 0 p 481 140 502 171 0 r 507 149 522 171 0 e 525 148 543 171 0 g 547 139 568 170 0 u 572 147 593 169 0 i 598 148 608 179 0 e 613 140 631 169 0 o 635 146 655 169 0 s 660 146 675 169 0 o 679 146 699 169 0 . 705 146 710 151 0 python-pyocr-0.3.0/tests/tesseract/test-european.lines000066400000000000000000000225611245470272200231660ustar00rootroot00000000000000

The (quick) [brown] {fox} jumps! Over the $43,456.78 <lazy> #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam. Der ,,schnelle” braune Fuchs springt fiber den faulen Hund. Le renard brun «rapide» saute par-dessus le chien paresseux. La volpe marrone rapida salta sopra i] cane pigro. El zorro marrén répido salta sobre el perro perezoso. A raposa marrom répida salta sobre 0 C50 preguieoso.

python-pyocr-0.3.0/tests/tesseract/test-european.txt000066400000000000000000000006501245470272200226660ustar00rootroot00000000000000The (quick) [brown] {fox} jumps! Over the $43,456.78 #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam. Der ,,schnelle” braune Fuchs springt fiber den faulen Hund. Le renard brun «rapide» saute par-dessus le chien paresseux. La volpe marrone rapida salta sopra i] cane pigro. El zorro marrén répido salta sobre el perro perezoso. A raposa marrom répida salta sobre 0 C50 preguieoso. python-pyocr-0.3.0/tests/tesseract/test-european.words000066400000000000000000000225611245470272200232120ustar00rootroot00000000000000

The (quick) [brown] {fox} jumps! Over the $43,456.78 <lazy> #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam. Der ,,schnelle” braune Fuchs springt fiber den faulen Hund. Le renard brun «rapide» saute par-dessus le chien paresseux. La volpe marrone rapida salta sopra i] cane pigro. El zorro marrén répido salta sobre el perro perezoso. A raposa marrom répida salta sobre 0 C50 preguieoso.

python-pyocr-0.3.0/tests/tesseract/test-french.box000066400000000000000000000013241245470272200222650ustar00rootroot00000000000000P 23 150 32 163 0 h 34 150 43 164 0 r 45 150 52 160 0 a 52 150 61 160 0 æ 62 149 81 160 0 e 87 149 98 159 0 n 99 149 108 159 0 f 115 149 122 163 0 r 122 149 129 159 0 a 129 148 138 159 0 n 140 148 149 158 0 æ 150 145 168 158 0 i 170 148 173 162 0 s 174 148 182 158 0 . 183 147 186 150 0 A 21 122 33 142 0 v 33 129 43 139 0 e 44 129 54 139 0 c 55 129 63 139 0 d 70 128 79 143 0 e 81 128 91 138 0 s 92 128 99 138 0 a 106 128 114 138 0 c 116 128 124 138 0 c 125 127 133 138 0 e 134 127 144 137 0 n 146 127 154 137 0 t 156 127 162 140 0 s 163 127 170 137 0 . 172 127 174 129 0 E 23 108 31 122 0 p 34 104 43 118 0 h 45 108 53 122 0 é 55 108 65 122 0 m 67 107 81 118 0 è 83 107 93 121 0 r 95 107 101 117 0 e 102 107 112 117 0 python-pyocr-0.3.0/tests/tesseract/test-french.lines000066400000000000000000000036701245470272200226150ustar00rootroot00000000000000

PhraSe en français. Avec des accents. Ephémère

python-pyocr-0.3.0/tests/tesseract/test-french.txt000066400000000000000000000000631245470272200223130ustar00rootroot00000000000000PhraSe en français. Avec des accents. Ephémère python-pyocr-0.3.0/tests/tesseract/test-french.words000066400000000000000000000036701245470272200226410ustar00rootroot00000000000000

PhraSe en français. Avec des accents. Ephémère

python-pyocr-0.3.0/tests/tesseract/test-japanese.box000066400000000000000000000030511245470272200226050ustar00rootroot00000000000000ナ 34 668 83 755 0 こ 68 670 119 725 0 し 137 673 179 746 0 ` 187 683 220 741 0 な 231 667 320 755 0 カ 331 668 391 754 0 ` 392 695 423 740 0 り 446 667 507 755 0 つ 533 673 617 741 0 お 666 669 754 755 0 れ 763 667 856 754 0 の 866 669 952 748 0 よ 970 667 1047 755 0 め 1066 669 1151 754 0 田 34 515 118 601 0 井 130 514 222 606 0 中 234 514 318 607 0 律 328 514 423 607 0 俺 461 514 557 607 0 の 566 519 652 598 0 嫁 662 514 757 607 0 a 27 415 61 453 0 b 68 414 107 467 0 C 111 414 147 454 0 A 172 415 222 467 0 B 227 415 267 467 0 C 274 414 319 468 0 ぁ 348 413 402 469 0 し 414 416 441 463 0 ` 446 423 467 461 0 う 480 413 526 469 0 ぇ 539 413 595 469 0 お 603 414 660 469 0 ヵ 666 414 705 469 0 ` 705 431 725 460 0 き 735 413 783 469 0 く 803 412 840 469 0 籐 863 415 880 467 0 ナ 879 412 914 468 0 こ 928 416 973 465 0 0 26 318 67 372 0 0 72 318 120 372 0 ー 133 319 152 371 0 ー 173 319 182 371 0 2 190 319 229 372 0 ー 238 319 247 371 0 3 254 318 293 372 0 B 302 319 342 371 0 4 346 319 389 371 0 5 395 318 433 371 0 S 439 318 479 372 0 6 485 318 524 372 0 7 532 319 570 371 0 8 576 318 616 372 0 9 622 319 661 372 0 F 263 166 348 262 0 U 451 166 533 265 0 N 639 165 723 265 0 ぁ 316 86 351 123 0 っ 361 86 392 112 0 ナ 403 87 427 123 0 こ 418 87 440 111 0 〝 451 98 464 123 0 丿 457 87 479 123 0 ま 491 87 523 123 0 ぇ 534 86 570 123 0 じ 581 87 611 123 0 ゃ 621 84 654 115 0 ん 663 87 701 123 0 ! 713 87 723 122 0 r 616 29 634 51 0 i 638 29 644 62 0 t 648 29 669 59 0 $ 672 29 696 51 0 u 700 29 723 51 0 ~ 478 38 610 43 0 python-pyocr-0.3.0/tests/tesseract/test-japanese.lines000066400000000000000000000105011245470272200231250ustar00rootroot00000000000000

たいなかりつ おれのよめ 田井中律 俺の嫁

abC ABC ぁいうぇおかき けこ 00ー ー2ー3B45S6789

F U N

ぁったりまぇじゃん!

rit$u

python-pyocr-0.3.0/tests/tesseract/test-japanese.txt000066400000000000000000000002531245470272200226350ustar00rootroot00000000000000たいなかりつ おれのよめ 田井中律 俺の嫁 abC ABC ぁいうぇおかき く けこ 00ー ー2ー3B45S6789 F U N ぁったりまぇじゃん! rit$u python-pyocr-0.3.0/tests/tesseract/test-japanese.words000066400000000000000000000105011245470272200231510ustar00rootroot00000000000000

たいなかりつ おれのよめ 田井中律 俺の嫁

abC ABC ぁいうぇおかき けこ 00ー ー2ー3B45S6789

F U N

ぁったりまぇじゃん!

rit$u

python-pyocr-0.3.0/tests/tesseract/test.box000066400000000000000000000105261245470272200210260ustar00rootroot00000000000000T 36 364 55 388 0 h 57 364 71 388 0 i 76 364 79 388 0 s 82 364 96 382 0 i 109 364 112 388 0 s 115 364 129 382 0 a 141 364 156 382 0 l 169 364 172 388 0 o 175 364 191 382 0 t 193 364 201 387 0 o 212 364 228 382 0 f 229 364 240 388 0 1 251 364 260 388 0 2 267 364 282 388 0 p 296 358 311 382 0 o 313 364 329 382 0 i 332 364 335 388 0 n 339 364 353 382 0 t 356 364 364 387 0 t 374 364 383 387 0 e 384 364 400 382 0 x 402 364 417 382 0 t 418 364 427 387 0 t 437 364 445 387 0 o 447 364 463 382 0 t 474 364 482 387 0 e 484 364 500 382 0 s 502 364 516 382 0 t 518 364 526 387 0 t 536 364 545 387 0 h 547 364 561 388 0 e 564 364 580 382 0 o 36 330 52 348 0 c 54 330 69 348 0 r 72 330 81 348 0 c 91 330 106 348 0 o 108 330 124 348 0 d 126 330 141 354 0 e 144 330 160 348 0 a 172 330 187 348 0 n 191 330 205 348 0 d 208 330 223 354 0 s 236 330 250 348 0 e 252 330 268 348 0 e 270 330 286 348 0 i 299 330 302 354 0 f 304 330 314 354 0 i 325 330 328 354 0 t 330 330 339 353 0 w 348 330 372 348 0 o 373 330 389 348 0 r 392 330 402 348 0 k 403 330 417 354 0 s 419 330 433 348 0 o 445 330 461 348 0 n 464 330 478 348 0 a 500 330 515 348 0 l 519 330 522 354 0 l 526 330 529 354 0 t 541 330 549 353 0 y 550 323 565 348 0 p 568 324 584 348 0 e 586 330 602 348 0 s 604 330 618 348 0 o 36 296 52 314 0 f 53 296 64 320 0 f 72 296 82 320 0 i 83 296 86 320 0 l 90 296 94 320 0 e 97 296 113 314 0 f 123 296 133 320 0 o 133 296 149 314 0 r 153 296 162 314 0 m 164 296 187 314 0 a 190 296 206 314 0 t 208 296 216 319 0 . 219 296 223 299 0 T 36 262 55 286 0 h 57 262 71 286 0 e 75 262 91 280 0 q 102 256 117 280 0 u 121 262 135 280 0 i 140 262 143 286 0 c 146 262 161 280 0 k 163 262 177 286 0 b 189 262 204 286 0 r 207 262 217 280 0 o 217 262 233 280 0 w 235 262 258 280 0 n 260 262 274 280 0 d 287 262 302 286 0 o 305 262 321 280 0 g 323 255 339 280 0 j 348 255 355 286 0 u 359 262 373 280 0 m 377 262 401 280 0 p 405 256 420 280 0 e 422 262 438 280 0 d 440 262 456 286 0 o 468 262 484 280 0 v 486 262 501 280 0 e 503 262 519 280 0 r 522 262 531 280 0 t 540 262 549 285 0 h 551 262 565 286 0 e 569 262 585 280 0 l 37 228 40 252 0 a 43 228 59 246 0 z 62 228 77 246 0 y 78 221 92 246 0 f 103 228 113 252 0 o 113 228 129 246 0 x 131 228 146 246 0 . 150 228 153 231 0 T 165 228 184 252 0 h 187 228 201 252 0 e 204 228 220 246 0 q 232 222 247 246 0 u 251 228 265 246 0 i 269 228 273 252 0 c 276 228 291 246 0 k 293 228 307 252 0 b 319 228 334 252 0 r 337 228 346 246 0 o 347 228 363 246 0 w 364 228 388 246 0 n 390 228 404 246 0 d 417 228 432 252 0 o 435 228 451 246 0 g 453 221 468 246 0 j 478 221 485 252 0 u 489 228 503 246 0 m 507 228 531 246 0 p 535 222 550 246 0 e 552 228 568 246 0 d 570 228 585 252 0 o 36 194 52 212 0 v 54 194 69 212 0 e 71 194 87 212 0 r 90 194 99 212 0 t 109 194 117 217 0 h 120 194 134 218 0 e 137 194 153 212 0 l 165 194 169 218 0 a 172 194 187 212 0 z 190 194 205 212 0 y 206 187 221 212 0 f 231 194 241 218 0 o 241 194 257 212 0 x 259 194 274 212 0 . 278 194 281 197 0 T 294 194 313 218 0 h 315 194 329 218 0 e 333 194 349 212 0 q 360 188 375 212 0 u 379 194 393 212 0 i 398 194 401 218 0 c 404 194 419 212 0 k 421 194 435 218 0 b 447 194 462 218 0 r 465 194 475 212 0 o 475 194 491 212 0 w 493 194 516 212 0 n 518 194 532 212 0 d 545 194 560 218 0 o 563 194 579 212 0 g 581 187 597 212 0 j 43 153 50 184 0 u 54 160 68 178 0 m 72 160 96 178 0 p 99 154 115 178 0 e 117 160 133 178 0 d 135 160 150 184 0 o 162 160 178 178 0 v 180 160 195 178 0 e 197 160 213 178 0 r 216 160 226 178 0 t 235 160 243 183 0 h 246 160 260 184 0 e 263 160 279 178 0 l 292 160 295 184 0 a 298 160 313 178 0 z 316 160 331 178 0 y 332 153 347 178 0 f 357 160 368 184 0 o 368 160 384 178 0 x 385 160 401 178 0 . 404 160 407 163 0 T 420 160 439 184 0 h 442 160 456 184 0 e 459 160 475 178 0 q 486 154 501 178 0 u 506 160 520 178 0 i 524 160 527 184 0 c 530 160 545 178 0 k 548 160 561 184 0 b 37 126 52 150 0 r 55 126 65 144 0 o 65 126 81 144 0 w 83 126 106 144 0 n 108 126 122 144 0 d 135 126 150 150 0 o 153 126 169 144 0 g 171 119 187 144 0 j 196 119 203 150 0 u 207 126 221 144 0 m 225 126 249 144 0 p 253 120 268 144 0 e 270 126 286 144 0 d 288 126 304 150 0 o 316 126 332 144 0 v 334 126 349 144 0 e 351 126 367 144 0 r 370 126 379 144 0 t 388 126 397 149 0 h 399 126 413 150 0 e 417 126 433 144 0 l 445 126 448 150 0 a 451 126 467 144 0 z 470 126 485 144 0 y 486 119 500 144 0 f 511 126 521 150 0 o 521 126 537 144 0 x 539 126 554 144 0 . 558 126 561 129 0 python-pyocr-0.3.0/tests/tesseract/test.lines000066400000000000000000000202561245470272200213510ustar00rootroot00000000000000

This is a lot of 12 point text to test the ocr code and see if it works on all types of file format.

The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox.

python-pyocr-0.3.0/tests/tesseract/test.txt000066400000000000000000000004371245470272200210550ustar00rootroot00000000000000This is a lot of 12 point text to test the ocr code and see if it works on all types of file format. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. python-pyocr-0.3.0/tests/tesseract/test.words000066400000000000000000000202561245470272200213750ustar00rootroot00000000000000

This is a lot of 12 point text to test the ocr code and see if it works on all types of file format.

The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox.

python-pyocr-0.3.0/tests/tests_cuneiform.py000066400000000000000000000131721245470272200211230ustar00rootroot00000000000000import codecs from PIL import Image import os import sys sys.path = [ "src" ] + sys.path import tempfile import unittest from pyocr import builders from pyocr import cuneiform class TestContext(unittest.TestCase): """ These tests make sure the requirements for the tests are met. """ def setUp(self): pass def test_available(self): self.assertTrue(cuneiform.is_available(), "cuneiform not found. Is it installed ?") def test_version(self): self.assertEqual(cuneiform.get_version(), (1, 1, 0), ("cuneiform does not have the expected version" " (1.1.0) ! Tests will fail !")) def test_langs(self): langs = cuneiform.get_available_languages() self.assertTrue("eng" in langs, ("English training does not appear to be installed." " (required for the tests)")) self.assertTrue("fra" in langs, ("French training does not appear to be installed." " (required for the tests)")) def tearDown(self): pass class TestTxt(unittest.TestCase): """ These tests make sure the "usual" OCR works fine. (the one generating a .txt file) """ def setUp(self): pass def __test_txt(self, image_file, expected_output_file, lang='eng'): image_file = "tests/data/" + image_file expected_output_file = "tests/cuneiform/" + expected_output_file expected_output = "" with codecs.open(expected_output_file, 'r', encoding='utf-8') \ as file_descriptor: for line in file_descriptor: expected_output += line expected_output = expected_output.strip() output = cuneiform.image_to_string(Image.open(image_file), lang=lang) self.assertEqual(output, expected_output) def test_basic(self): self.__test_txt('test.png', 'test.txt') def test_european(self): self.__test_txt('test-european.jpg', 'test-european.txt') def test_french(self): self.__test_txt('test-french.jpg', 'test-french.txt', 'fra') def tearDown(self): pass class TestWordBox(unittest.TestCase): """ These tests make sure that cuneiform box handling works fine. """ def setUp(self): self.builder = builders.WordBoxBuilder() def __test_txt(self, image_file, expected_box_file, lang='eng'): image_file = "tests/data/" + image_file expected_box_file = "tests/cuneiform/" + expected_box_file with codecs.open(expected_box_file, 'r', encoding='utf-8') \ as file_descriptor: expected_boxes = self.builder.read_file(file_descriptor) expected_boxes.sort() boxes = cuneiform.image_to_string(Image.open(image_file), lang=lang, builder=self.builder) boxes.sort() self.assertEqual(len(boxes), len(expected_boxes)) for i in range(0, min(len(boxes), len(expected_boxes))): try: # Python 2.7 self.assertEqual(type(expected_boxes[i].content), unicode) self.assertEqual(type(boxes[i].content), unicode) except NameError: # Python 3.x self.assertEqual(type(expected_boxes[i].content), str) self.assertEqual(type(boxes[i].content), str) self.assertEqual(boxes[i], expected_boxes[i]) def test_basic(self): self.__test_txt('test.png', 'test.words') def test_european(self): self.__test_txt('test-european.jpg', 'test-european.words') def test_french(self): self.__test_txt('test-french.jpg', 'test-french.words', 'fra') def test_write_read(self): original_boxes = cuneiform.image_to_string( Image.open("tests/data/test.png"), builder=self.builder) self.assertTrue(len(original_boxes) > 0) (file_descriptor, tmp_path) = tempfile.mkstemp() try: # we must open the file with codecs.open() for utf-8 support os.close(file_descriptor) with codecs.open(tmp_path, 'w', encoding='utf-8') as file_descriptor: self.builder.write_file(file_descriptor, original_boxes) with codecs.open(tmp_path, 'r', encoding='utf-8') as file_descriptor: new_boxes = self.builder.read_file(file_descriptor) self.assertEqual(len(new_boxes), len(original_boxes)) for i in range(0, len(original_boxes)): self.assertEqual(new_boxes[i], original_boxes[i]) finally: os.remove(tmp_path) def tearDown(self): pass class TestOrientation(unittest.TestCase): def test_can_detect_orientation(self): self.assertFalse(cuneiform.can_detect_orientation()) def get_all_tests(): all_tests = unittest.TestSuite() test_names = [ 'test_available', 'test_version', 'test_langs', ] tests = unittest.TestSuite(map(TestContext, test_names)) all_tests.addTest(tests) test_names = [ 'test_basic', 'test_european', 'test_french', ] tests = unittest.TestSuite(map(TestTxt, test_names)) all_tests.addTest(tests) test_names = [ 'test_basic', 'test_european', 'test_french', 'test_write_read', ] tests = unittest.TestSuite(map(TestWordBox, test_names)) all_tests.addTest(tests) test_names = [ 'test_can_detect_orientation', ] tests = unittest.TestSuite(map(TestOrientation, test_names)) all_tests.addTest(tests) return all_tests python-pyocr-0.3.0/tests/tests_tesseract.py000066400000000000000000000321601245470272200211270ustar00rootroot00000000000000import codecs from PIL import Image import os import sys sys.path = ["src"] + sys.path import tempfile import unittest from pyocr import builders from pyocr import tesseract class TestContext(unittest.TestCase): """ These tests make sure the requirements for the tests are met. """ def setUp(self): pass def test_available(self): self.assertTrue(tesseract.is_available(), "Tesseract not found. Is it installed ?") def test_version(self): self.assertTrue(tesseract.get_version() in ( (3, 2, 1), (3, 2, 2), (3, 3, 0), ), ("Tesseract does not have the expected version" " (3.3.0) ! Some tests will be skipped !")) def test_langs(self): langs = tesseract.get_available_languages() self.assertTrue("eng" in langs, ("English training does not appear to be installed." " (required for the tests)")) self.assertTrue("fra" in langs, ("French training does not appear to be installed." " (required for the tests)")) self.assertTrue("jpn" in langs, ("Japanese training does not appear to be installed." " (required for the tests)")) def tearDown(self): pass class TestTxt(unittest.TestCase): """ These tests make sure the "usual" OCR works fine. (the one generating a .txt file) """ def setUp(self): pass def __test_txt(self, image_file, expected_output_file, lang='eng'): image_file = "tests/data/" + image_file expected_output_file = "tests/tesseract/" + expected_output_file expected_output = "" with codecs.open(expected_output_file, 'r', encoding='utf-8') \ as file_descriptor: for line in file_descriptor: expected_output += line expected_output = expected_output.strip() output = tesseract.image_to_string(Image.open(image_file), lang=lang) self.assertEqual(output, expected_output) def test_basic(self): self.__test_txt('test.png', 'test.txt') @unittest.skipIf(tesseract.get_version() not in ( (3, 2, 1), (3, 2, 2), (3, 3, 0), ), "This test only works with Tesseract 3.02.1") def test_european(self): self.__test_txt('test-european.jpg', 'test-european.txt') @unittest.skipIf(tesseract.get_version() not in ( (3, 2, 1), (3, 2, 2), (3, 3, 0), ), "This test only works with Tesseract 3.02.1") def test_french(self): self.__test_txt('test-french.jpg', 'test-french.txt', 'fra') def test_japanese(self): self.__test_txt('test-japanese.jpg', 'test-japanese.txt', 'jpn') def tearDown(self): pass class TestCharBox(unittest.TestCase): """ These tests make sure that Tesseract box handling works fine. """ def setUp(self): self.builder = tesseract.CharBoxBuilder() def __test_txt(self, image_file, expected_box_file, lang='eng'): image_file = "tests/data/" + image_file expected_box_file = "tests/tesseract/" + expected_box_file with codecs.open(expected_box_file, 'r', encoding='utf-8') \ as file_descriptor: expected_boxes = self.builder.read_file(file_descriptor) expected_boxes.sort() boxes = tesseract.image_to_string(Image.open(image_file), lang=lang, builder=self.builder) boxes.sort() self.assertEqual(len(boxes), len(expected_boxes)) for i in range(0, min(len(boxes), len(expected_boxes))): self.assertEqual(boxes[i], expected_boxes[i]) def test_basic(self): self.__test_txt('test.png', 'test.box') def test_european(self): self.__test_txt('test-european.jpg', 'test-european.box') def test_french(self): self.__test_txt('test-french.jpg', 'test-french.box', 'fra') @unittest.skipIf(tesseract.get_version() not in ( (3, 2, 1), (3, 2, 2), (3, 3, 0), ), "This test requires Tesseract 3.02.1") def test_japanese(self): self.__test_txt('test-japanese.jpg', 'test-japanese.box', 'jpn') def test_write_read(self): original_boxes = tesseract.image_to_string( Image.open("tests/data/test.png"), builder=self.builder) self.assertTrue(len(original_boxes) > 0) (file_descriptor, tmp_path) = tempfile.mkstemp() try: # we must open the file with codecs.open() for utf-8 support os.close(file_descriptor) with codecs.open(tmp_path, 'w', encoding='utf-8') as fdescriptor: self.builder.write_file(fdescriptor, original_boxes) with codecs.open(tmp_path, 'r', encoding='utf-8') as fdescriptor: new_boxes = self.builder.read_file(fdescriptor) self.assertEqual(len(new_boxes), len(original_boxes)) for i in range(0, len(original_boxes)): self.assertEqual(new_boxes[i], original_boxes[i]) finally: os.remove(tmp_path) def tearDown(self): pass class TestDigits(unittest.TestCase): """ These tests make sure that Tesseract digits handling works fine. """ def setUp(self): self.builder = tesseract.DigitBuilder() def __test_text(self, image_file, expected_output_file, lang='eng'): image_file = "tests/data/" + image_file expected_output_file = "tests/tesseract/" + expected_output_file expected_output = "" with codecs.open(expected_output_file, 'r', encoding='utf-8') \ as file_descriptor: for line in file_descriptor: expected_output += line expected_output = expected_output.strip() output = tesseract.image_to_string(Image.open(image_file), lang=lang, builder=self.builder) self.assertEqual(output, expected_output) def test_digits(self): self.__test_text('test-digits.png', 'test-digits.txt') class TestWordBox(unittest.TestCase): """ These tests make sure that Tesseract box handling works fine. """ def setUp(self): self.builder = builders.WordBoxBuilder() def __test_txt(self, image_file, expected_box_file, lang='eng'): image_file = "tests/data/" + image_file expected_box_file = "tests/tesseract/" + expected_box_file with codecs.open(expected_box_file, 'r', encoding='utf-8') \ as file_descriptor: expected_boxes = self.builder.read_file(file_descriptor) expected_boxes.sort() boxes = tesseract.image_to_string(Image.open(image_file), lang=lang, builder=self.builder) boxes.sort() self.assertTrue(len(boxes) > 0) self.assertEqual(len(boxes), len(expected_boxes)) for i in range(0, min(len(boxes), len(expected_boxes))): try: # python 2.7 self.assertEqual(type(expected_boxes[i].content), unicode) self.assertEqual(type(boxes[i].content), unicode) except NameError: # python 3 self.assertEqual(type(expected_boxes[i].content), str) self.assertEqual(type(boxes[i].content), str) self.assertEqual(boxes[i], expected_boxes[i]) def test_basic(self): self.__test_txt('test.png', 'test.words') def test_european(self): self.__test_txt('test-european.jpg', 'test-european.words') def test_french(self): self.__test_txt('test-french.jpg', 'test-french.words', 'fra') @unittest.skipIf(tesseract.get_version() not in ( (3, 2, 1), (3, 2, 2), (3, 3, 0), ), "This test requires Tesseract 3.02.1") def test_japanese(self): self.__test_txt('test-japanese.jpg', 'test-japanese.words', 'jpn') def test_write_read(self): original_boxes = tesseract.image_to_string( Image.open("tests/data/test.png"), builder=self.builder) self.assertTrue(len(original_boxes) > 0) (file_descriptor, tmp_path) = tempfile.mkstemp() try: # we must open the file with codecs.open() for utf-8 support os.close(file_descriptor) with codecs.open(tmp_path, 'w', encoding='utf-8') as fdescriptor: self.builder.write_file(fdescriptor, original_boxes) with codecs.open(tmp_path, 'r', encoding='utf-8') as fdescriptor: new_boxes = self.builder.read_file(fdescriptor) self.assertEqual(len(new_boxes), len(original_boxes)) for i in range(0, len(original_boxes)): self.assertEqual(new_boxes[i], original_boxes[i]) finally: os.remove(tmp_path) def tearDown(self): pass class TestLineBox(unittest.TestCase): """ These tests make sure that Tesseract box handling works fine. """ def setUp(self): self.builder = builders.LineBoxBuilder() def __test_txt(self, image_file, expected_box_file, lang='eng'): image_file = "tests/data/" + image_file expected_box_file = "tests/tesseract/" + expected_box_file boxes = tesseract.image_to_string(Image.open(image_file), lang=lang, builder=self.builder) boxes.sort() with codecs.open(expected_box_file, 'r', encoding='utf-8') \ as file_descriptor: expected_boxes = self.builder.read_file(file_descriptor) expected_boxes.sort() self.assertEqual(len(boxes), len(expected_boxes)) for i in range(0, min(len(boxes), len(expected_boxes))): for j in range(0, len(boxes[i].word_boxes)): self.assertEqual(type(boxes[i].word_boxes[j]), type(expected_boxes[i].word_boxes[j])) self.assertEqual(boxes[i], expected_boxes[i]) def test_basic(self): self.__test_txt('test.png', 'test.lines') def test_european(self): self.__test_txt('test-european.jpg', 'test-european.lines') def test_french(self): self.__test_txt('test-french.jpg', 'test-french.lines', 'fra') @unittest.skipIf(tesseract.get_version() not in ( (3, 2, 1), (3, 2, 2), (3, 3, 0), ), "This test requires Tesseract 3.02.1") def test_japanese(self): self.__test_txt('test-japanese.jpg', 'test-japanese.lines', 'jpn') def test_write_read(self): original_boxes = tesseract.image_to_string( Image.open("tests/data/test.png"), builder=self.builder) self.assertTrue(len(original_boxes) > 0) (file_descriptor, tmp_path) = tempfile.mkstemp() try: # we must open the file with codecs.open() for utf-8 support os.close(file_descriptor) with codecs.open(tmp_path, 'w', encoding='utf-8') as fdescriptor: self.builder.write_file(fdescriptor, original_boxes) with codecs.open(tmp_path, 'r', encoding='utf-8') as fdescriptor: new_boxes = self.builder.read_file(fdescriptor) self.assertEqual(len(new_boxes), len(original_boxes)) for i in range(0, len(original_boxes)): self.assertEqual(new_boxes[i], original_boxes[i]) finally: os.remove(tmp_path) def tearDown(self): pass class TestOrientation(unittest.TestCase): def test_can_detect_orientation(self): self.assertTrue(tesseract.can_detect_orientation()) def test_orientation_0(self): img = Image.open('tests/data/test.png') result = tesseract.detect_orientation(img, lang='eng') self.assertEqual(result['angle'], 0) def test_orientation_90(self): img = Image.open('tests/data/test-90.png') result = tesseract.detect_orientation(img, lang='eng') self.assertEqual(result['angle'], 90) def get_all_tests(): all_tests = unittest.TestSuite() test_names = [ 'test_available', 'test_version', 'test_langs', ] tests = unittest.TestSuite(map(TestContext, test_names)) all_tests.addTest(tests) test_names = [ 'test_basic', 'test_european', 'test_french', ] tests = unittest.TestSuite(map(TestTxt, test_names)) all_tests.addTest(tests) test_names = [ 'test_basic', 'test_european', 'test_french', 'test_japanese', 'test_write_read', ] tests = unittest.TestSuite(map(TestCharBox, test_names)) all_tests.addTest(tests) tests = unittest.TestSuite(map(TestWordBox, test_names)) all_tests.addTest(tests) tests = unittest.TestSuite(map(TestLineBox, test_names)) all_tests.addTest(tests) test_names = [ 'test_digits' ] tests = unittest.TestSuite(map(TestDigits, test_names)) all_tests.addTest(tests) test_names = [ 'test_can_detect_orientation', 'test_orientation_0', 'test_orientation_90', ] tests = unittest.TestSuite(map(TestOrientation, test_names)) all_tests.addTest(tests) return all_tests python-pyocr-0.3.0/update_tesseract_test_data.sh000077500000000000000000000030421245470272200221170ustar00rootroot00000000000000#!/bin/sh run_tess() { img="$1" shift out="$1" shift lang="$1" shift echo "${img} --> ${out} (${lang} / $@)" lang_arg="" if [ -n "${lang}" ]; then lang_arg=-l fi if ! tesseract ${img} ${out} ${lang_arg} ${lang} $@ > /dev/null 2>&1 then echo "FAILED !" fi } cd tests run_tess data/test.png tesseract/test eng run_tess data/test.png tesseract/test eng batch.nochop makebox run_tess data/test.png tesseract/test eng hocr mv tesseract/test.hocr tesseract/test.words cp tesseract/test.words tesseract/test.lines run_tess data/test-digits.png tesseract/test-digits eng digits run_tess data/test-european.jpg tesseract/test-european eng run_tess data/test-european.jpg tesseract/test-european eng batch.nochop makebox run_tess data/test-european.jpg tesseract/test-european eng hocr mv tesseract/test-european.hocr tesseract/test-european.words cp tesseract/test-european.words tesseract/test-european.lines run_tess data/test-french.jpg tesseract/test-french fra run_tess data/test-french.jpg tesseract/test-french fra batch.nochop makebox run_tess data/test-french.jpg tesseract/test-french fra hocr mv tesseract/test-french.hocr tesseract/test-french.words cp tesseract/test-french.words tesseract/test-french.lines run_tess data/test-japanese.jpg tesseract/test-japanese jpn run_tess data/test-japanese.jpg tesseract/test-japanese jpn batch.nochop makebox run_tess data/test-japanese.jpg tesseract/test-japanese jpn hocr mv tesseract/test-japanese.hocr tesseract/test-japanese.words cp tesseract/test-japanese.words tesseract/test-japanese.lines