pax_global_header00006660000000000000000000000064122111716360014512gustar00rootroot0000000000000052 comment=f82c6f95d16963a7aae3682dc90e10cd57a6cef4 patool-1.4/000077500000000000000000000000001221117163600126545ustar00rootroot00000000000000patool-1.4/COPYING000066400000000000000000001043741221117163600137200ustar00rootroot00000000000000 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 . patool-1.4/MANIFEST.in000066400000000000000000000002601221117163600144100ustar00rootroot00000000000000include MANIFEST.in include COPYING doc/*.1 doc/*.txt doc/*.tmpl doc/icon/* include Makefile *.bash-completion include scripts/*.bat scripts/*.iss recursive-include tests *.py patool-1.4/Makefile000066400000000000000000000110331221117163600143120ustar00rootroot00000000000000# This Makefile is only used by developers. PYTHON:=python VERSION:=$(shell $(PYTHON) setup.py --version) MAINTAINER:=$(shell $(PYTHON) setup.py --maintainer) AUTHOR:=$(shell $(PYTHON) setup.py --author) APPNAME:=$(shell $(PYTHON) setup.py --name) LAPPNAME:=$(shell echo $(APPNAME)|tr "[A-Z]" "[a-z]") ARCHIVE_SOURCE:=$(LAPPNAME)-$(VERSION).tar.gz ARCHIVE_WIN32:=$(LAPPNAME)-$(VERSION).exe GITUSER:=wummel GITREPO:=$(LAPPNAME) WEBPAGE:=$(HOME)/public_html/patool-webpage.git WEBMETA:=doc/web/app.yaml DEBUILDDIR:=$(HOME)/projects/debian/official DEBORIGFILE:=$(DEBUILDDIR)/$(LAPPNAME)_$(VERSION).orig.tar.gz DEBPACKAGEDIR:=$(DEBUILDDIR)/$(LAPPNAME)-$(VERSION) # Pytest options: # --resultlog: write test results in file # -s: do not capture stdout/stderr (some tests fail otherwise) PYTESTOPTS?=--resultlog=testresults.txt -s # which test modules to run TESTS ?= tests/ # set test options TESTOPTS= all: dist: [ -d dist ] || mkdir dist git archive --format=tar --prefix=$(LAPPNAME)-$(VERSION)/ HEAD | gzip -9 > dist/$(ARCHIVE_SOURCE) [ ! -f ../$(ARCHIVE_WIN32) ] || cp ../$(ARCHIVE_WIN32) dist sign: [ -f dist/$(ARCHIVE_SOURCE).asc ] || gpg --detach-sign --armor dist/$(ARCHIVE_SOURCE) [ -f dist/$(ARCHIVE_WIN32).asc ] || gpg --detach-sign --armor dist/$(ARCHIVE_WIN32) upload: cp dist/$(ARCHIVE_SOURCE) dist/$(ARCHIVE_WIN32) \ dist/$(ARCHIVE_SOURCE).asc dist/$(ARCHIVE_WIN32).asc \ $(WEBPAGE)/dist homepage: # update metadata @echo "version: \"$(VERSION)\"" > $(WEBMETA) @echo "name: \"$(APPNAME)\"" >> $(WEBMETA) @echo "lname: \"$(LAPPNAME)\"" >> $(WEBMETA) @echo "maintainer: \"$(MAINTAINER)\"" >> $(WEBMETA) @echo "author: \"$(AUTHOR)\"" >> $(WEBMETA) git add $(WEBMETA) git cm "Updated web meta data." # relase website $(MAKE) -C doc/web release tag: # add and push the version tag git tag upstream/$(VERSION) git push --tags origin upstream/$(VERSION) # Make a new release by calling all the distinct steps in the correct order. # Each step is a separate target so that it's easy to do this manually if # anything screwed up. release: clean releasecheck $(MAKE) dist sign upload homepage tag register changelog deb register: @echo "Register at Python Package Index..." $(PYTHON) setup.py register @echo "Submitting to freecode.org..." freecode-submit < $(LAPPNAME).freecode releasecheck: test check @if egrep -i "xx\.|xxxx|\.xx" doc/changelog.txt > /dev/null; then \ echo "Could not release: edit doc/changelog.txt release date"; false; \ fi @if [ ! -f ../$(ARCHIVE_WIN32) ]; then \ echo "Missing WIN32 distribution archive at ../$(ARCHIVE_WIN32)"; \ false; \ fi @if ! grep "Version: $(VERSION)" $(LAPPNAME).freecode > /dev/null; then \ echo "Could not release: edit $(LAPPNAME).freecode version"; false; \ fi check: # The check programs used here are mostly local scripts on my private system. # So for other developers there is no need to execute this target. check-copyright check-pofiles -v py-tabdaddy py-unittest2-compat tests/ $(MAKE) doccheck doccheck: py-check-docstrings --force \ patoolib \ patool \ *.py pyflakes: pyflakes setup.py patool patoolib tests count: # print some code statistics @sloccount patool patoolib clean: find . -name \*.pyc -delete find . -name \*.pyo -delete rm -rf build dist localbuild: $(PYTHON) setup.py build test: localbuild $(PYTHON) -m pytest $(PYTESTOPTS) $(TESTOPTS) $(TESTS) doc/$(LAPPNAME).txt: doc/$(LAPPNAME).1 # make text file from man page for Windows builds cols=`stty size | cut -d" " -f2`; stty cols 72; man -l $< | sed -e 's/.\cH//g' > $@; stty cols $$cols deb: # build a debian package [ -f $(DEBORIGFILE) ] || cp dist/$(ARCHIVE_SOURCE) $(DEBORIGFILE) sed -i -e 's/VERSION_$(LAPPNAME):=.*/VERSION_$(LAPPNAME):=$(VERSION)/' $(DEBUILDDIR)/$(LAPPNAME).mak [ -d $(DEBPACKAGEDIR) ] || (cd $(DEBUILDDIR); \ patool extract $(DEBORIGFILE); \ cd $(CURDIR); \ git checkout debian; \ cp -r debian $(DEBPACKAGEDIR); \ rm -f $(DEBPACKAGEDIR)/debian/.gitignore; \ git checkout master) $(MAKE) -C $(DEBUILDDIR) $(LAPPNAME)_clean $(LAPPNAME) update-copyright: # update-copyright is a local tool which updates the copyright year for each # modified file. update-copyright --holder="$(MAINTAINER)" changelog: # github-changelog is a local tool which parses the changelog and automatically # closes issues mentioned in the changelog entries. github-changelog $(DRYRUN) $(GITUSER) $(GITREPO) doc/changelog.txt .PHONY: changelog update-copyright deb test clean count pyflakes check .PHONY: releasecheck release upload sign dist all tag register homepage .PHONY: localbuild doccheck patool-1.4/README.md000077700000000000000000000000001221117163600163712doc/README.txtustar00rootroot00000000000000patool-1.4/doc/000077500000000000000000000000001221117163600134215ustar00rootroot00000000000000patool-1.4/doc/README.txt000066400000000000000000000044571221117163600151310ustar00rootroot00000000000000Patool ======= Patool is an archive file manager. Various archive formats can be created, extracted, tested, listed, searched, repacked and compared with patool. The advantage of patool is its simplicity in handling archive files without having to remember a myriad of programs and options. The archive format is determined by the file(1) program and as a fallback by the archive file extension. patool supports 7z (.7z), ACE (.ace), ADF (.adf), ALZIP (.alz), APE (.ape), AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2), CAB (.cab), COMPRESS (.Z), CPIO (.cpio), DEB (.deb), DMS (.dms), FLAC (.flac), GZIP (.gz), ISO (.iso), LRZIP (.lrz), LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm), RAR (.rar), RZIP (.rz), SHN (.shn), TAR (.tar), XZ (.xz), ZIP (.zip, .jar) and ZOO (.zoo) formats. It relies on helper applications to handle those archive formats (for example bzip2 for BZIP2 archives). The archive formats TAR, ZIP, BZIP2 and GZIP are supported natively and do not require helper applications to be installed. Examples --------- ``` patool extract archive.zip otherarchive.rar patool test --verbose dist.tar.gz patool list package.deb patool create --verbose /path/to/myfiles.zip file1.txt dir/ patool diff release1.0.tar.gz release2.0.zip patool search "def urlopen" python-3.3.tar.gz patool repack linux-2.6.33.tar.gz linux-2.6.33.tar.bz2 ``` Website -------- See http://wummel.github.io/patool/ for more info and downloads. API ---- You can use patool functions from other Python applications. Log output will be on sys.stdout and sys.stderr. On errors, `PatoolError` will be raised. ``` import patoolib patoolib.extract_archive("archive.zip", outdir="/tmp") patoolib.test_archive("dist.tar.gz", verbosity=1) patoolib.list_archive("package.deb") patoolib.create_archive("/path/to/myfiles.zip", ("file1.txt", "dir/")) patoolib.diff_archives("release1.0.tar.gz", "release2.0.zip") patoolib.search_archive("def urlopen", "python3.3.tar.gz") patoolib.repack_archive("linux-2.6.33.tar.gz", "linux-2.6.33.tar.bz2") ``` Test suite status ------------------ Patool has extensive unit tests to ensure the code quality. [Travis CI](https://travis-ci.org/) is used for continuous build and test integration. [![Build Status](https://travis-ci.org/wummel/patool.png)](https://travis-ci.org/wummel/patool) patool-1.4/doc/changelog.txt000066400000000000000000000151151221117163600161140ustar00rootroot000000000000001.4 (released 2.9.2013) * Add missing GZIP creation support for 7z modules. Closes: GH bug #6 1.3 (released 19.7.2013) * Add patoolib.__version__ (see PEP 396). Closes: GH bug #3 * Improved detection of LZMA and LRZIP files with file(1). * Add missing patoolib.programs to Windows installer. Closes: GH bug #5 1.2 (released 27.6.2013) * Fix detection of *.gz with newer libmagic versions. Closes: GH bug #2 1.1 "Clerks" (released 7.4.2013) * Add support for zopfli, Googles new zlib compressor. * Fix an error repacking compressed tar archives with 7z. 1.0 "Robot and Frank" (released 1.3.2013) * Add support for searching in archive contents. * Add support for ISO image handling. * Allow multiple --verbose options to increase program output. * Add patool.exe to the PATH in the windows installer. * Fixed Python lzma archive handling. * Fixed lzop, lrzip and rzip archive handling. * Fixed Python 3.x support. 0.19 "The Kids Are All Right" (released 21.2.2013) * Support the lzma module in Python >= 3.3 * Optimize repacking of archives with the same format. Closes: GH bug #1 0.18 "Skyfall" (released 15.12.2012) * Fixed unadf archive listing. * Added support for Python 3.x. * Use importlib to find program modules and depend on Python >= 2.7. * Added support for archmage and chmlib handling CHM (.chm) archives. 0.17 "I am Bruce Lee" (released 4.8.2012) * Added support for Monkey's Audio Compressor handling APE (.ape) archives. * Added support for shorten handling SHN (.shn) archives. * Added support for flac handling FLAC (.flac) archives. * Added support for the BSD cpio and tar programs. * Added support for lhasa handling LZH (.lzh, .lha) archives. * Added support for lcap handling CAB (.cab) archives. * Added support for shar handling SHAR (.shar) shell archives. * Added support for unadf handling ADF (.adf) amiga disk archives. * Removed support for orange handling self-extracting installers. * Generate standalone Windows .exe and Linux .rpm installer. * Initialize the internal MIME database correct on all platforms. * Improved option compatibility for the ar, cpio and tar programs. * Rename the temporary output directory if it contains multiple files. The name is the archive name without extension, which is more readable than a random filename "UnpackXyz". * Require and use Python >=2.5 0.16 "Game of thrones" (released 12.5.2012) * Document the --outdir option for the extract command. Closes: SF bug #3363964 * Added convenience library function to handle archives. Documentation for those functions can be found in doc/development.txt. Closes: SF bug #3351936 * Fix generating an RPM installer. Closes: SF bug #2977749 * Added support for the lbzip2 program handling BZIP2 archives. * Added support for the plzip program handling LZIP archives. * Prevent overwriting files with repack. * Support extraction of BZIP2 (.bz2) files with the Python bz2 module. * Support extraction of GZIP (.gz) files with the Python gzip module. * Support extraction of ZIP (.zip) files with the Python zipfile module. * Support extraction of TAR (.tar) files with the Python tarfile module. 0.15 "Contraband" (released 8.4.2012) * Print help when unknown options are given. * Print error when archive files do not exist. * Added installation instructions in doc/install.txt * Added support for the pigz program handling GZIP archives. 0.14 "Book of Dragons" (released 30.1.2012) * Handle CRX (.crx) files as ZIP archives. They have garbage at the beginning of the file, but some unzip programs can cope with that. * The xz program supports listing of XZ archives. Adjust the configuration accordingly. 0.13 "Megamind" (released 25.1.2011) * Fix command argument order when extracting cpio archives. * Added correct cpio MIME type on Debian systems. * Added support for the clzip and pdlzip programs who are both capable of handling LZIP (.lz) archives. * Added support for the orange program which is capable of extracting CAB (.cab) archives. * Added support for DMS (.dms) files with the xdms program. * Support ZIP (.zip) file creation with the 7z and 7za programs. * Improved MIME type detection for compressed TAR archives. * Fix needed archive programs for several test cases, including test_repack and test_mime. 0.12 "Galaxy Quest" (released 20.11.2010) * Show commands that are run. * Fix rar extraction unpack directory. * Fix ZIP mimedb detection on Windows systems. 0.11 "Primer" (released 4.10.2010) * Added support for the standalone 7za program. 0.10 "Matchpoint" (released 10.4.2010) * Correct shell quoting of commandline arguments. Now files with spaces or other special characters are handled correctly. * Use correct error routine on rmtree() errors. The previous one did not have the correct number of arguments. 0.9 "Cargo" (released 26.3.2010) * Do not use the diff -B option when comparing archives. * Improved documentation: explain commands in more detail. * Added support for RZIP (.rz) archives. * Added support for ZOO (.zoo) archives. 0.8 "Storage" (released 11.3.2010) * Fix path error by using absolute pathname for archive when changing the current working directory to the unpack directory. * Fix parsing of the "-v" short option. * Added new command "patool diff" to show differences between two archives. * Added new command "patool repack" to repackage archives in another format. 0.7 "3000 Miles to Graceland" (released 8.3.2010) * Added support for ALZIP (.alz) archives. * Added support for LRZIP (.lrz) archives. * Added support for ARC (.arc) archives. 0.6 "Waking Ned" (released 6.3.2010) * Remove the --force option. Local files are now never overwritten. * Added option alias -v for --verbose. * Added --verbose option to create command. * Added support for extracting, listing and testing multiple archives. * Fix permissions of extracted files: make them readable by the current user. * Added support for ACE (.ace) archives. * Added support for AR (.a) archives. * Added support for LZH (.lha, .lzh) archives. 0.5 "Vanishing Point" (released 4.3.2010) * Ported to Python 2.4. * Added support for LZIP (.lz) archives. * Removed support for setting options via config file. 0.4 "Nikita" (released 3.3.2010) * Added support for Windows systems. * Added support for creating ZIP files. * Improved listing of available archive formats. * Improved recognition of MIME types. 0.3 "Management" (released 23.2.2010) * Better test if encodings of archive commands are supported (for example .tar.Z needs a decompress program). 0.2 "Birdy" (released 22.2.2010) * Add support for LZMA and XZ archives. 0.1 "Hard Boiled" (released 21.2.2010) * Initial release. patool-1.4/doc/development.txt000066400000000000000000000051741221117163600165130ustar00rootroot00000000000000Development with the patoolib library ====================================== The patool functionality can also be used in other Python programs. To do this, install the patool program, import the library and use one or more of the convenience functions. import patoolib try: patoolib.extract("myarchive.zip", verbose=True) print("Success.") except patoolib.util.PatoolError as msg: print("Error:", msg) General rules for all convenience functions: * All convenience functions raise PatoolError on errors. * Error messages are printed on stderr, informative messages are printed on stdout. * All file arguments are filenames. File objects are not accepted as input. * Filenames can be relative or absolute. * If verbosity is increased, additional output of the archive program is shown. * Usually the program to be executed is automatically determined but it can be set manually with the program parameter. The convenience functions are: * ``def extract_archive(archive, verbosity=0, outdir=None, program=None)`` Extracts the given archive filename to the current working directory or if specified to the given directory name in outdir. Checks that the archive exists and is readable before extracting it. * ``def list_archive(archive, verbosity=1, program=None)`` Lists the contents of the given archive filename on stdout. Checks that the archive exists and is readable before listing it. * ``def test_archive(archive, verbosity=0, program=None)`` Tests the given archive filename. Checks that the archive exists and is readable before testing it. * ``def create_archive(archive, filenames, verbosity=0, program=None)`` Creates a new archive. The type of archive is determined by the archive filename extension. Checks that the archive is not already existing to avoid overwriting it. Also checks that the filename list is not empty and that all files exist and are readable. * ``diff_archives(archive1, archive2, verbosity=0)`` This function lists differences in the content of the two archives. Both archives are extracted and the contents are compared recursively with the diff(1) program. Checks that both archives exist and are readable. * ``def search_archive(pattern, archive, verbosity=0)`` This function searches the given pattern in the archive file contents with grep(1). Checks that archive exists and is readable. * ``repack_archive (archive, archive_new, verbosity=0)`` This function extracts the contents of the archive and packs them into archive_new. Checks that archive exists and is readable. Also checks that archive_new does not exist to avoid overwriting it. patool-1.4/doc/icon/000077500000000000000000000000001221117163600143515ustar00rootroot00000000000000patool-1.4/doc/icon/Makefile000066400000000000000000000003341221117163600160110ustar00rootroot00000000000000OXYGEN := ${HOME}/src/oxygen-gitsvn ICOICONS := logo16x16.png logo32x32.png all: favicon.ico logo%.png: $(OXYGEN)/%/apps/utilities-file-archiver.png cp $< $@ favicon.ico: $(ICOICONS) png2ico favicon.ico $(ICOICONS) patool-1.4/doc/icon/favicon.ico000066400000000000000000000070661221117163600165030ustar00rootroot00000000000000h& ( @W0L\qLk}uJwbi}~k^Cp}QuP~pSz]_uYdpFsSqNwMzglowVP{\rReRvQ]^Mk}l&&&&&?B&&&&&/*11*/5555::555547777<<77774J ED0))))% !%))))08>HA9 (283I$#+= @,3C F G6'."C;;;;;;;;;;;;;---( @N*_xpKsg5n[Cyza@hnYr}ueWw.fLze?r=mHXqhb]gtm^P[|ui=v1jmNyI{d9r~UibS[mZv,c3hY}KfBwE}cbhvqk\5kRKvu_xdie|]{rumg;q;ul_?t@y_0h3lfV?x{qobfba[\8n>wJuLcnn^hdLPgo-e=sB{{X|xsoSjn0j:s?wBy~D{G|zux`iVXka_idh.c=uEIJtmVcc+`+b2k6o=u@wAzD|wzF~zGtrMpOmQgeZc7o9r=w?v?x|}ByBzyD||D|D}({>ص]♣\؅(ZĽ ?! (ZjHl ?U'u jHŠ:F &>;S夲gNF؁Ch|%Igz*݂FV](2MHEO݂F؆ۖϫ](Z"YE݂҄>Fن؆Z^ogEfZ݂>Fن夲M[ȑ.fjZ݂>نA夲P.f HjZ>نjH0amHjZ(>نH)Je4mgHjZ(>نgk#rsXgjZ(>ن1gȑ_cnT~9EgjZ(]>ȑˌ+@85 5EǠjZ(]>FE/e}}xbEǠjZ(].q,mt$meLǠӲZ(]` mt$\Z` Hu"aM/]bduF kGQ=慔U/cq5% ;m t.IglT/PV@W5-|VW@ NI B@A c@k3lLCRZWDZrm`nfnAyID ƒ:n4Q0.@Zew$O.'ԕNM.`?H 3V|<r-%`vDNɠFMc\\\8s hٙ#ɭul%bh,_Ji|_ѤJА!L5G$/@#|ŎWɇHC]ɮ Bl|]ץ=Ϫ }N bJRmXj^\?-ϾP(U {->,[Ex ÔRT(\t,;tO]тi0 j ~7~l`t(v\Wo:xm㝧zWv_Յ'\:1V1k윲jB f{AS$BwIENDB`patool-1.4/doc/install.txt000066400000000000000000000017431221117163600156350ustar00rootroot00000000000000Installation ============ First, install the required software. 1. Python >= 2.7 from http://www.python.org/ Now install the application. 1. Installation with pip If you have pip installed: ``pip install patool`` 2. Installation from source a) Installation as root Run ``sudo python setup.py install`` to install patool. b) Installation as a normal user Run ``python setup.py install --home $HOME``. Note that you have to adjust your PATH and PYTHONPATH environment variables, eg. by adding the commands ``export PYTHONPATH=$HOME/lib/python`` and ``export PATH=$PATH:$HOME/bin`` to your shell configuration file. For more information look at the `Modifying Python's search path`_ documentation. .. _Modifying Python's search path: http://docs.python.org/inst/search-path.html#SECTION000410000000000000000 After installation ------------------ Patool is now installed. Have fun! patool-1.4/doc/patool.1000066400000000000000000000127771221117163600150170ustar00rootroot00000000000000.\" -*- nroff -*- .\" Copyright (C) 2010-2013 Bastian Kleineidam .\" .\" 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. .\" .TH PATOOL "1" "July 2013" "patool" .SH NAME patool - portable archive file manager .SH SYNOPSIS \fBpatool\fP [\fIglobal-options\fP] (\fBlist\fP|\fBtest\fP|\fBextract\fP|\fBcreate\fP|\fBdiff\fP|\fBsearch\fP|\fBrepack\fP|\fBformats\fP) [\fIcommand-options\fP] <\fIcommand-arguments\fP>... .SH DESCRIPTION Various archive formats can be created, extracted, tested, listed, searched, repacked and compared by \fBpatool\fP. The advantage of patool is its simplicity in handling archive files without having to remember a myriad of programs and options. .PP The archive format is determined by the file(1) program and as a fallback by the archive file extension. .PP \fBpatool\fP supports 7z (.7z), ACE (.ace), ADF (.adf), ALZIP (.alz), APE (.ape), AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2), CAB (.cab), COMPRESS (.Z), CPIO (.cpio), DEB (.deb), DMS (.dms), FLAC (.flac), GZIP (.gz), ISO (.iso), LRZIP (.lrz), LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm), RAR (.rar), RZIP (.rz), SHN (.shn), TAR (.tar), XZ (.xz), ZIP (.zip, .jar) and ZOO (.zoo) formats. It relies on helper applications to handle those archive formats (for example bzip2 for BZIP2 archives). .PP The archive formats TAR, ZIP, BZIP2 and GZIP are supported natively and do not require helper applications to be installed. .SH EXAMPLES \fBpatool extract archive.zip otherarchive.rar\fP \fBpatool --verbose test dist.tar.gz\fP \fBpatool list package.deb\fP \fPpatool --verbose create myfiles.zip file1.txt dir/\fP \fBpatool diff release1.0.tar.xz release2.0.zip\fP \fBpatool search "def urlopen" python-3.3.tar.gz\fP \fBpatool repack linux-2.6.33.tar.gz linux-2.6.33.tar.bz2\fP .SH GLOBAL OPTIONS .TP \fB\-v\fP, \fB\-\-verbose\fP Display more info about what patool does, and display the output of helper applications. Can be given multiple times to increase the output even more. .SH COMMANDS The following rules apply to all commands: .IP "\(bu" 4 Existing files are never overwritten. .IP "\(bu" 4 The original archive will never be removed. .IP "\(bu" 4 Files outside the output directory will never be created. This relies on archive program options to prevent unpacking of files with an absolute path name (eg. \fB\-\-no\-absolute\-filenames\fP for \fBcpio(1)\fP). .PP The following commands are available. .SS extract \fBpatool\fP \fBextract\fP [\fB\-\-outdir\fP \fIdirectory\fP] <\fIarchive\fP>... .PP Extract files from given archives. The original archives will never be removed and are left as is. .TP \fB\-\-outdir\fP \fIdirectory\fP Extract to the given output directory. Default is to extract to the current working directory. .PP If the archive contains exactly one file or directory, the archive contents are extracted directly to the output directory. Else the files are extracted in a newly created subdirectory of the output directory. The new directory is named after the archive filename without the extension. .br This prevents cluttering the output directory with a lot of files from the extracted archive. .PP All extracted files are ensured that they are readable by the current user. .SS list \fBpatool\fP \fBlist\fP <\fIarchive\fP>... .PP List files in archives. .SS create \fBpatool\fP \fBcreate\fP <\fIarchive\fP> <\fIfile-or-directory\fP>... .PP Create an archive from given files. All of the given files to add to the archive must be readable by the current user. The format of the archive to create is determined by the archive file extension. .SS test \fBpatool\fP \fBtest\fP <\fIarchive\fP>... .PP Test the given archives. If the helper application does not support testing, the archive contents are listed instead. .SS diff \fBpatool\fP \fBdiff\fP <\fIarchive1\fP> <\fIarchive2\fP> .PP Show differences between two archives with the \fBdiff(1)\fP program. The diff options used are \fB\-urN\fP. .SS search \fBpatool\fP \fBsearch\fP <\fIpattern\fP> <\fIarchive\fP> .PP Search in archive contents for given pattern using the \fBgrep(1)\fP program. The grep options used are \fB\-r\fP; additional options can be supplied with the \fBGREP_OPTIONS\fP environment variable. .SS repack \fBpatool\fP \fBrepack\fP <\fIarchive\fP> <\fIarchive_new\fP> .PP Repackage archive to a different format. The target archive format is determined by the file extension of \fIarchive_new\fP. .SS formats \fBpatool\fP \fBformats\fP .PP Show all supported archive formats (ie. which helper applications are available). .SH HELP OPTION Specifying the help option displays help for patool itself, or a command. .br For example: \fBpatool \-\-help\fP - display help for patool \fBpatool extract \-\-help\fP - display help for the extract command .SH SHELL ALIASES When running under a Unix shell the following aliases can be defined to save some typing: \fBalias pl='patool list'\fP \fBalias px='patool extract'\fP \fBalias pc='patool create'\fP \fBalias pd='patool diff'\fP .SH AUTHOR Bastian Kleineidam .SH COPYRIGHT Copyright \(co 2010-2013 Bastian Kleineidam patool-1.4/doc/patool.txt000066400000000000000000000124571221117163600154710ustar00rootroot00000000000000PATOOL(1) PATOOL(1) NAME patool - portable archive file manager SYNOPSIS patool [global-options] (list|test|extract|cre‐ ate|diff|search|repack|formats) [command-options] ... DESCRIPTION Various archive formats can be created, extracted, tested, listed, searched, repacked and compared by patool. The advan‐ tage of patool is its simplicity in handling archive files without having to remember a myriad of programs and options. The archive format is determined by the file(1) program and as a fallback by the archive file extension. patool supports 7z (.7z), ACE (.ace), ADF (.adf), ALZIP (.alz), APE (.ape), AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2), CAB (.cab), COMPRESS (.Z), CPIO (.cpio), DEB (.deb), DMS (.dms), FLAC (.flac), GZIP (.gz), ISO (.iso), LRZIP (.lrz), LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm), RAR (.rar), RZIP (.rz), SHN (.shn), TAR (.tar), XZ (.xz), ZIP (.zip, .jar) and ZOO (.zoo) formats. It relies on helper applications to handle those archive formats (for example bzip2 for BZIP2 archives). The archive formats TAR, ZIP, BZIP2 and GZIP are supported natively and do not require helper applications to be installed. EXAMPLES patool extract archive.zip otherarchive.rar patool --verbose test dist.tar.gz patool list package.deb patool --verbose create myfiles.zip file1.txt dir/ patool diff release1.0.tar.xz release2.0.zip patool search "def urlopen" python-3.3.tar.gz patool repack linux-2.6.33.tar.gz linux-2.6.33.tar.bz2 GLOBAL OPTIONS -v, --verbose Display more info about what patool does, and display the output of helper applications. Can be given multiple times to increase the output even more. COMMANDS The following rules apply to all commands: · Existing files are never overwritten. · The original archive will never be removed. · Files outside the output directory will never be created. This relies on archive program options to prevent unpacking of files with an absolute path name (eg. --no-abso‐ lute-filenames for cpio(1)). The following commands are available. extract patool extract [--outdir directory] ... Extract files from given archives. The original archives will never be removed and are left as is. --outdir directory Extract to the given output directory. Default is to extract to the current working directory. If the archive contains exactly one file or directory, the ar‐ chive contents are extracted directly to the output directory. Else the files are extracted in a newly created subdirectory of the output directory. The new directory is named after the ar‐ chive filename without the extension. This prevents cluttering the output directory with a lot of files from the extracted archive. All extracted files are ensured that they are readable by the current user. list patool list ... List files in archives. create patool create ... Create an archive from given files. All of the given files to add to the archive must be readable by the current user. The format of the archive to create is determined by the archive file extension. test patool test ... Test the given archives. If the helper application does not support testing, the archive contents are listed instead. diff patool diff Show differences between two archives with the diff(1) program. The diff options used are -urN. search patool search Search in archive contents for given pattern using the grep(1) program. The grep options used are -r; additional options can be supplied with the GREP_OPTIONS environment variable. repack patool repack Repackage archive to a different format. The target archive format is determined by the file extension of archive_new. formats patool formats Show all supported archive formats (ie. which helper applica‐ tions are available). HELP OPTION Specifying the help option displays help for patool itself, or a command. For example: patool --help - display help for patool patool extract --help - display help for the extract command SHELL ALIASES When running under a Unix shell the following aliases can be defined to save some typing: alias pl='patool list' alias px='patool extract' alias pc='patool create' alias pd='patool diff' AUTHOR Bastian Kleineidam COPYRIGHT Copyright © 2010-2013 Bastian Kleineidam patool July 2013 PATOOL(1) patool-1.4/install-rpm.sh000066400000000000000000000021361221117163600154540ustar00rootroot00000000000000python setup.py install --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES # 'brp-compress' compresses the manpages without distutils knowing. # The sed scripts append ".gz", ".bz2" or ".xz" suffixes to the affected # manpage filenames. RPM_MANDIR=usr/share/man RPM_LOCALMANDIR=usr/local/share/man if [ -n "$( ls $RPM_BUILD_ROOT/$RPM_MANDIR/man*/*.bz2 2>/dev/null )" \ -o -n "$( ls $RPM_BUILD_ROOT/$RPM_LOCALMANDIR/man*/*.bz2 2>/dev/null )" ]; then # add .bz2 suffix sed -i -e 's@man/man\([[:digit:]]\)/\(.\+\.[[:digit:]]\)$@man/man\1/\2.bz2@g' INSTALLED_FILES elif [ -n "$( ls $RPM_BUILD_ROOT/$RPM_MANDIR/man*/*.xz 2>/dev/null )" \ -o -n "$( ls $RPM_BUILD_ROOT/$RPM_LOCALMANDIR/man*/*.xz 2>/dev/null )" ]; then # add .xz suffix sed -i -e 's@man/man\([[:digit:]]\)/\(.\+\.[[:digit:]]\)$@man/man\1/\2.xz@g' INSTALLED_FILES elif [ -n "$( ls $RPM_BUILD_ROOT/$RPM_MANDIR/man*/*.gz 2>/dev/null )" \ -o -n "$( ls $RPM_BUILD_ROOT/$RPM_LOCALMANDIR/man*/*.gz 2>/dev/null )" ]; then # add .gz suffix sed -i -e 's@man/man\([[:digit:]]\)/\(.\+\.[[:digit:]]\)$@man/man\1/\2.gz@g' INSTALLED_FILES fi patool-1.4/patool000077500000000000000000000161351221117163600141060ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """ patool [global-options] {extract|list|create|diff|search|formats} [sub-command-options] """ from __future__ import print_function import sys import argparse import pydoc import patoolib from patoolib.util import log_error, log_internal_error, PatoolError from patoolib.configuration import App def run_extract(args): """Extract files from archive(s).""" res = 0 for archive in args.archive: try: patoolib.extract_archive(archive, verbosity=args.verbosity, outdir=args.outdir) except PatoolError as msg: log_error("error extracting %s: %s" % (archive, msg)) res += 1 return res def run_list(args): """List files in archive(s).""" res = 0 for archive in args.archive: try: # increase default verbosity since the listing output should be visible patoolib.list_archive(archive, verbosity=args.verbosity + 1) except PatoolError as msg: log_error("error listing %s: %s" % (archive, msg)) res += 1 return res def run_test(args): """Test files in archive(s).""" res = 0 for archive in args.archive: try: patoolib.test_archive(archive, verbosity=args.verbosity) except PatoolError as msg: log_error("error testing %s: %s" % (archive, msg)) res += 1 return res def run_create(args): """Create an archive from given files.""" res = 0 try: patoolib.create_archive(args.archive, args.filename, verbosity=args.verbosity) except PatoolError as msg: log_error("error creating %s: %s" % (args.archive, msg)) res = 1 return res def run_diff(args): """Show differences between two archives.""" try: res = patoolib.diff_archives(args.archive1, args.archive2, verbosity=args.verbosity) except PatoolError as msg: log_error("error showing differences between %s and %s: %s" % (args.archive1, args.archive2, msg)) res = 2 return res def run_search(args): """Search for pattern in given archive.""" try: res = patoolib.search_archive(args.pattern, args.archive, verbosity=args.verbosity) except PatoolError as msg: log_error("error searching %s: %s" % (args.archive, msg)) res = 2 return res def run_repack(args): """Repackage one archive in another format.""" res = 0 try: patoolib.repack_archive(args.archive_src, args.archive_dst, verbosity=args.verbosity) except PatoolError as msg: log_error("error repacking %s: %s" % (args.archive_src, msg)) res = 1 return res def run_formats (args): """List supported and available archive formats.""" patoolib.list_formats() return 0 class ArgumentParser(argparse.ArgumentParser): """Custom argument parser.""" def print_help(self, file=None): """Paginate help message on TTYs.""" msg = self.format_help() if file is None: file = sys.stdout if hasattr(file, "isatty") and file.isatty(): pydoc.pager(msg) else: print(msg, file=file) Examples = """\ EXAMPLES patool extract archive.zip otherarchive.rar patool --verbose test dist.tar.gz patool list package.deb patool --verbose create myfiles.zip file1.txt dir/ patool diff release1.0.tar.xz release2.0.zip patool search "def urlopen" python-3.3.tar.gz patool repack linux-2.6.33.tar.gz linux-2.6.33.tar.bz2 """ Version = """\ VERSION %s """ % App def create_argparser(): """Construct and return an argument parser.""" epilog = Examples + "\n" + Version parser = ArgumentParser(description="An archive file manager.", epilog=epilog, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('--verbose', '-v', action='count', default=0, dest='verbosity', help="verbose operation; can be given multiple times") subparsers = parser.add_subparsers(help='the archive command; type "patool COMMAND -h" for command-specific help', dest='command') # extract parser_extract = subparsers.add_parser('extract', help='extract one or more archives') parser_extract.add_argument('--outdir', help="output directory to extract to") parser_extract.add_argument('archive', nargs='+', help="an archive file") # list parser_list = subparsers.add_parser('list', help='list members or one or more archives') parser_list.add_argument('archive', nargs='+', help="an archive file") # create parser_create = subparsers.add_parser('create', help='create an archive') parser_create.add_argument('archive', help="the archive file; the file extension determines the archive program") parser_create.add_argument('filename', nargs='+', help="a file or directory to add to the archive; note that some archive programs do not support directories") # test parser_test = subparsers.add_parser('test', help='test an archive') parser_test.add_argument('archive', nargs='+', help='an archive file') # repack parser_repack = subparsers.add_parser('repack', help='repack an archive to a different format') parser_repack.add_argument('archive_src', help='source archive file') parser_repack.add_argument('archive_dst', help='target archive file') # diff parser_diff = subparsers.add_parser('diff', help='show differences between two archives') parser_diff.add_argument('archive1', help='the first archive file') parser_diff.add_argument('archive2', help='the second archive file') # search parser_search = subparsers.add_parser('search', help="search contents of archive members") parser_search.add_argument('pattern', help='the grep(1) compatible search pattern') parser_search.add_argument('archive', help='the archive file') # formats subparsers.add_parser('formats', help="show supported archive formats") # optional bash completion try: import argcomplete argcomplete.autocomplete(parser) except ImportError: pass return parser def main(): """Parse options and execute commands.""" try: argparser = create_argparser() args = argparser.parse_args() # run subcommand function return globals()["run_%s" % args.command](args) except KeyboardInterrupt: log_error("aborted") res = 1 except Exception: log_internal_error() res = 2 return res if __name__ == '__main__': sys.exit(main()) patool-1.4/patool.bash-completion000066400000000000000000000004711221117163600171620ustar00rootroot00000000000000# patool completion have patool && _patool() { local cur prev COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} if type _argcomplete &> /dev/null; then _argcomplete "$@" else _filedir fi return 0 } complete -F _patool $filenames patool patool-1.4/patool.freecode000066400000000000000000000006511221117163600156520ustar00rootroot00000000000000Project: patool Version: 1.4 Hide: N Website-URL: http://wummel.github.io/patool/ Changelog-URL: https://github.com/wummel/patool/blob/master/doc/changelog.txt Tar/GZ-URL: http://wummel.github.io/patool/dist/patool-${version}.tar.gz GIT-Tree-URL: https://github.com/wummel/patool.git Windows-installer-URL: http://wummel.github.io/patool/dist/patool-${version}.win32.exe GZIP creation support for 7z modules has been added. patool-1.4/patoolib/000077500000000000000000000000001221117163600144655ustar00rootroot00000000000000patool-1.4/patoolib/__init__.py000066400000000000000000000601771221117163600166110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from __future__ import print_function import sys if not hasattr(sys, "version_info") or sys.version_info < (2, 7, 0, "final", 0): raise SystemExit("This program requires Python 2.7 or later.") import os import shutil import stat import importlib # PEP 396 from .configuration import Version as __version__ __all__ = ['list_formats', 'list_archive', 'extract_archive', 'test_archive', 'create_archive', 'diff_archives', 'search_archive', 'repack_archive'] # Supported archive commands ArchiveCommands = ('list', 'extract', 'test', 'create') # Supported archive formats ArchiveFormats = ( '7z', 'ace', 'adf', 'alzip', 'ape', 'ar', 'arc', 'arj', 'bzip2', 'cab', 'chm', 'compress', 'cpio', 'deb', 'dms', 'flac', 'gzip', 'iso', 'lrzip', 'lzh', 'lzip', 'lzma', 'lzop', 'rar', 'rpm', 'rzip', 'shar', 'shn', 'tar', 'xz', 'zip', 'zoo') # Supported compressions (used with tar for example) # Note that all compressions must also be archive formats ArchiveCompressions = ('bzip2', 'compress', 'gzip', 'lzip', 'lzma', 'xz') # Map MIME types to archive format ArchiveMimetypes = { 'application/gzip': 'gzip', 'application/java-archive': 'zip', 'application/rar': 'rar', 'application/vnd.ms-cab-compressed': 'cab', 'application/x-7z-compressed': '7z', 'application/x-ace': 'ace', 'application/x-adf': 'adf', 'application/x-alzip': 'alzip', 'application/x-archive': 'ar', 'application/x-arc': 'arc', 'application/x-arj': 'arj', 'application/x-bzip2': 'bzip2', 'application/x-cab': 'cab', 'application/x-chm': 'chm', 'application/x-compress': 'compress', 'application/x-cpio': 'cpio', 'application/x-debian-package': 'deb', 'application/x-dms': 'dms', 'application/x-gzip': 'gzip', 'application/x-iso9660-image': 'iso', 'application/x-lzop': 'lzop', 'application/x-lzma': 'lzma', 'application/x-lzip': 'lzip', 'application/x-lha': 'lzh', 'application/x-lrzip': 'lrzip', 'application/x-lzh': 'lzh', 'application/x-rar': 'rar', 'application/x-redhat-package-manager': 'rpm', 'application/x-rpm': 'rpm', 'application/x-rzip': 'rzip', 'application/x-shar': 'shar', 'application/x-tar': 'tar', 'application/x-xz': 'xz', 'application/x-zip-compressed': 'zip', 'application/x-zoo': 'zoo', 'application/zip': 'zip', 'audio/x-ape': 'ape', 'audio/x-shn': 'shn', 'audio/flac': 'flac', } try: # use Python 3 lzma module if available import lzma py_lzma = ('py_lzma',) except ImportError: py_lzma = () # List of programs supporting the given archive format and command. # If command is None, the program supports all commands (list, extract, ...) # Programs starting with "py_" are Python modules. ArchivePrograms = { 'ace': { 'extract': ('unace',), 'test': ('unace',), 'list': ('unace',), }, 'adf': { 'extract': ('unadf',), 'test': ('unadf',), 'list': ('unadf',), }, 'alzip': { 'extract': ('unalz',), 'test': ('unalz',), 'list': ('unalz',), }, 'ape': { 'create': ('mac',), 'extract': ('mac',), 'list': ('py_echo',), 'test': ('mac',), }, 'ar': { None: ('ar',), }, 'arc': { None: ('arc',), 'extract': ('nomarch',), 'test': ('nomarch',), 'list': ('nomarch',), }, 'bzip2': { 'extract': ('pbzip2', 'lbzip2', 'bzip2', '7z', '7za', 'py_bz2'), 'test': ('pbzip2', 'lbzip2', 'bzip2', '7z', '7za'), 'create': ('pbzip2', 'lbzip2', 'bzip2', 'py_bz2'), 'list': ('py_echo', '7z', '7za'), }, 'cab': { 'extract': ('cabextract', '7z'), 'create': ('lcab',), 'list': ('cabextract', '7z'), 'test': ('cabextract', '7z'), }, 'chm': { 'extract': ('archmage', 'extract_chmLib'), 'test': ('archmage',), }, 'flac': { 'extract': ('flac',), 'test': ('flac',), 'create': ('flac',), 'list': ('py_echo',), }, 'tar': { None: ('tar', 'star', 'bsdtar', 'py_tarfile'), }, 'zip': { None: ('7z', '7za', 'py_zipfile'), 'extract': ('unzip',), 'list': ('unzip',), 'test': ('zip', 'unzip',), 'create': ('zip',), }, 'gzip': { None: ('7z', '7za', 'pigz', 'gzip'), 'extract': ('py_gzip',), 'create': ('zopfli', 'py_gzip'), }, 'iso': { 'extract': ('7z',), 'list': ('7z', 'isoinfo'), 'test': ('7z',), 'create': ('genisoimage',), }, 'lzh': { None: ('lha',), 'extract': ('lhasa',), }, 'lzip': { 'extract': ('plzip', 'lzip', 'clzip', 'pdlzip'), 'list': ('py_echo',), 'test': ('plzip', 'lzip', 'clzip', 'pdlzip'), 'create': ('plzip', 'lzip', 'clzip', 'pdlzip'), }, 'lrzip': { 'extract': ('lrzip',), 'list': ('py_echo',), 'test': ('lrzip',), 'create': ('lrzip',), }, 'compress': { 'extract': ('gzip', '7z', '7za', 'uncompress.real'), 'list': ('7z', '7za', 'py_echo',), 'test': ('gzip', '7z', '7za'), 'create': ('compress',), }, '7z': { None: ('7z', '7za'), }, 'rar': { None: ('rar',), 'extract': ('unrar', '7z'), 'list': ('unrar', '7z'), 'test': ('unrar', '7z'), }, 'arj': { None: ('arj',), 'extract': ('7z',), 'list': ('7z',), 'test': ('7z',), }, 'cpio': { 'extract': ('cpio', 'bsdcpio', '7z'), 'list': ('cpio', 'bsdcpio', '7z'), 'test': ('cpio', 'bsdcpio', '7z',), 'create': ('cpio', 'bsdcpio'), }, 'rpm': { 'extract': ('rpm2cpio', '7z'), 'list': ('rpm', '7z', '7za'), 'test': ('rpm', '7z'), }, 'deb': { 'extract': ('dpkg-deb', '7z'), 'list': ('dpkg-deb', '7z'), 'test': ('dpkg-deb', '7z'), }, 'lzop': { None: ('lzop',), }, 'lzma': { 'extract': ('7z', 'lzma') + py_lzma, 'list': ('7z', 'py_echo'), 'test': ('7z', 'lzma'), 'create': ('lzma',) + py_lzma, }, 'rzip': { 'extract': ('rzip',), 'list': ('py_echo',), 'create': ('rzip',), }, 'shar': { 'create': ('shar',), 'extract': ('unshar',), }, 'shn': { 'extract': ('shorten',), 'list': ('py_echo',), 'create': ('shorten',), }, 'xz': { None: ('xz', '7z'), 'extract': py_lzma, 'create': py_lzma, }, 'zoo': { None: ('zoo',), }, 'dms': { 'extract': ('xdms',), 'list': ('xdms',), 'test': ('xdms',), }, } # List those programs that have different python module names because of # Python module naming restrictions. ProgramModules = { '7z': 'p7zip', '7za': 'p7azip', 'uncompress.real': 'uncompress', 'dpkg-deb': 'dpkg', 'extract_chmlib': 'chmlib', } from . import util def get_archive_format (filename): """Detect filename archive format and optional compression.""" mime, compression = util.guess_mime(filename) if not (mime or compression): raise util.PatoolError("unknown archive format for file `%s'" % filename) if mime in ArchiveMimetypes: format = ArchiveMimetypes[mime] else: raise util.PatoolError("unknown archive format for file `%s' (mime-type is `%s')" % (filename, mime)) if format == compression: # file cannot be in same format compressed compression = None return format, compression def check_archive_format (format, compression): """Make sure format and compression is known.""" if format not in ArchiveFormats: raise util.PatoolError("unknown archive format `%s'" % format) if compression is not None and compression not in ArchiveCompressions: raise util.PatoolError("unkonwn archive compression `%s'" % compression) def find_archive_program (format, command, program=None): """Find suitable archive program for given format and mode.""" commands = ArchivePrograms[format] programs = [] if program is not None: # try a specific program first programs.append(program) # first try the universal programs with key None for key in (None, command): if key in commands: programs.extend(commands[key]) if not programs: raise util.PatoolError("%s archive format `%s' is not supported" % (command, format)) # return the first existing program for program in programs: if program.startswith('py_'): # it's a Python module and therefore always supported return program exe = util.find_program(program) if exe: if program == '7z' and format == 'rar' and not util.p7zip_supports_rar(): continue return exe # no programs found raise util.PatoolError("could not find an executable program to %s format %s; candidates are (%s)," % (command, format, ",".join(programs))) def program_supports_compression (program, compression): """Decide if the given program supports the compression natively. @return: True iff the program supports the given compression format natively, else False. """ if program in ('tar', 'star', 'bsdtar', 'py_tarfile'): return compression in ('gzip', 'bzip2') + py_lzma return False def list_formats (): """Print information about available archive formats to stdout.""" for format in ArchiveFormats: print(format, "files:") for command in ArchiveCommands: programs = ArchivePrograms[format] if command not in programs and None not in programs: print(" %8s: - (not supported)" % command) continue try: program = find_archive_program(format, command) print(" %8s: %s" % (command, program), end=' ') if format == 'tar': encs = [x for x in ArchiveCompressions if util.find_program(x)] if encs: print("(supported compressions: %s)" % ", ".join(encs), end=' ') elif format == '7z': if util.p7zip_supports_rar(): print("(rar archives supported)", end=' ') else: print("(rar archives not supported)", end=' ') print() except util.PatoolError: handlers = programs.get(None, programs.get(command)) print(" %8s: - (no program found; install %s)" % (command, util.strlist_with_or(handlers))) def check_program_compression(archive, command, program, compression): """Check if a program supports the given compression.""" program = os.path.basename(program) if compression: # check if compression is supported if not program_supports_compression(program, compression): if command == 'create': comp_command = command else: comp_command = 'extract' comp_prog = find_archive_program(compression, comp_command) if not comp_prog: msg = "cannot %s archive `%s': compression `%s' not supported" raise util.PatoolError(msg % (command, archive, compression)) def move_outdir_orphan (outdir): """Move a single file or directory inside outdir a level up. Never overwrite files. Return (True, outfile) if successful, (False, reason) if not.""" entries = os.listdir(outdir) if len(entries) == 1: src = os.path.join(outdir, entries[0]) dst = os.path.join(os.path.dirname(outdir), entries[0]) if os.path.exists(dst): return (False, "local file exists") shutil.move(src, dst) os.rmdir(outdir) return (True, entries[0]) return (False, "multiple files in root") def run_archive_cmdlist (archive_cmdlist, verbosity=0): """Run archive command.""" # archive_cmdlist is a command list with optional keyword arguments if isinstance(archive_cmdlist, tuple): cmdlist, runkwargs = archive_cmdlist else: cmdlist, runkwargs = archive_cmdlist, {} return util.run_checked(cmdlist, verbosity=verbosity, **runkwargs) def make_file_readable (filename): """Make file user readable if it is not a link.""" if not os.path.islink(filename): util.set_mode(filename, stat.S_IRUSR) def make_dir_readable (filename): """Make directory user readable and executable.""" util.set_mode(filename, stat.S_IRUSR|stat.S_IXUSR) def make_user_readable (directory): """Make all files in given directory user readable. Also recurse into subdirectories.""" for root, dirs, files in os.walk(directory, onerror=util.log_error): for filename in files: make_file_readable(os.path.join(root, filename)) for dirname in dirs: make_dir_readable(os.path.join(root, dirname)) def cleanup_outdir (outdir, archive): """Cleanup outdir after extraction and return target file name and result string.""" make_user_readable(outdir) # move single directory or file in outdir (success, msg) = move_outdir_orphan(outdir) if success: # msg is a single directory or filename return msg, "`%s'" % msg # outdir remains unchanged # rename it to something more user-friendly (basically the archive # name without extension) outdir2 = util.get_single_outfile("", archive) os.rename(outdir, outdir2) return outdir2, "`%s' (%s)" % (outdir2, msg) def _extract_archive(archive, verbosity=0, outdir=None, program=None, format=None, compression=None): """Extract an archive. @return: output directory if command is 'extract', else None """ if format is None: format, compression = get_archive_format(archive) check_archive_format(format, compression) program = find_archive_program(format, 'extract', program=program) check_program_compression(archive, 'extract', program, compression) get_archive_cmdlist = get_archive_cmdlist_func(program, 'extract', format) if outdir is None: outdir = util.tmpdir(dir=".") do_cleanup_outdir = True else: do_cleanup_outdir = False try: cmdlist = get_archive_cmdlist(archive, compression, program, verbosity, outdir) if cmdlist: # an empty command list means the get_archive_cmdlist() function # already handled the command (eg. when it's a builtin Python # function) run_archive_cmdlist(cmdlist, verbosity=verbosity) if do_cleanup_outdir: target, msg = cleanup_outdir(outdir, archive) else: target, msg = outdir, "`%s'" % outdir if verbosity >= 0: util.log_info("... %s extracted to %s." % (archive, msg)) return target finally: # try to remove an empty temporary output directory if do_cleanup_outdir: try: os.rmdir(outdir) except OSError: pass def _create_archive(archive, filenames, verbosity=0, program=None, format=None, compression=None): """Create an archive.""" if format is None: format, compression = get_archive_format(archive) check_archive_format(format, compression) program = find_archive_program(format, 'create', program=program) check_program_compression(archive, 'create', program, compression) get_archive_cmdlist = get_archive_cmdlist_func(program, 'create', format) origarchive = None if os.path.basename(program) == 'arc' and \ ".arc" in archive and not archive.endswith(".arc"): # the arc program mangles the archive name if it contains ".arc" origarchive = archive archive = util.tmpfile(dir=os.path.dirname(archive), suffix=".arc") cmdlist = get_archive_cmdlist(archive, compression, program, verbosity, filenames) if cmdlist: # an empty command list means the get_archive_cmdlist() function # already handled the command (eg. when it's a builtin Python # function) run_archive_cmdlist(cmdlist, verbosity=verbosity) if origarchive: shutil.move(archive, origarchive) def _handle_archive (archive, command, verbosity=0, program=None, format=None, compression=None): """Test and list archives.""" if format is None: format, compression = get_archive_format(archive) check_archive_format(format, compression) if command not in ('list', 'test'): raise util.PatoolError("invalid archive command `%s'" % command) program = find_archive_program(format, command, program=program) check_program_compression(archive, command, program, compression) get_archive_cmdlist = get_archive_cmdlist_func(program, command, format) # prepare keyword arguments for command list cmdlist = get_archive_cmdlist(archive, compression, program, verbosity) if cmdlist: # an empty command list means the get_archive_cmdlist() function # already handled the command (eg. when it's a builtin Python # function) run_archive_cmdlist(cmdlist, verbosity=verbosity) def get_archive_cmdlist_func (program, command, format): """Get the Python function that executes the given program.""" # get python module for given archive program key = util.stripext(os.path.basename(program).lower()) modulename = ".programs." + ProgramModules.get(key, key) # import the module try: module = importlib.import_module(modulename, __name__) except ImportError as msg: raise util.PatoolError(msg) # get archive handler function (eg. patoolib.programs.star.extract_tar) try: return getattr(module, '%s_%s' % (command, format)) except AttributeError as msg: raise util.PatoolError(msg) def rmtree_log_error (func, path, exc): """Error function for shutil.rmtree(). Raises a PatoolError.""" msg = "Error in %s(%s): %s" % (func.__name__, path, str(exc[1])) util.log_error(msg) def _diff_archives (archive1, archive2, verbosity=0): """Show differences between two archives. @return 0 if archives are the same, else 1 @raises: PatoolError on errors """ if util.is_same_file(archive1, archive2): return 0 diff = util.find_program("diff") if not diff: msg = "The diff(1) program is required for showing archive differences, please install it." raise util.PatoolError(msg) tmpdir1 = util.tmpdir() try: path1 = _extract_archive(archive1, outdir=tmpdir1, verbosity=-1) tmpdir2 = util.tmpdir() try: path2 = _extract_archive(archive2, outdir=tmpdir2, verbosity=-1) return util.run_checked([diff, "-urN", path1, path2], verbosity=1, ret_ok=(0, 1)) finally: shutil.rmtree(tmpdir2, onerror=rmtree_log_error) finally: shutil.rmtree(tmpdir1, onerror=rmtree_log_error) def _search_archive(pattern, archive, verbosity=0): """Search for given pattern in an archive.""" grep = util.find_program("grep") if not grep: msg = "The grep(1) program is required for searching archive contents, please install it." raise util.PatoolError(msg) tmpdir = util.tmpdir() try: path = _extract_archive(archive, outdir=tmpdir, verbosity=-1) return util.run_checked([grep, "-r", "-e", pattern, "."], ret_ok=(0, 1), verbosity=1, cwd=path) finally: shutil.rmtree(tmpdir, onerror=rmtree_log_error) def _repack_archive (archive1, archive2, verbosity=0): """Repackage an archive to a different format.""" format1, compression1 = get_archive_format(archive1) format2, compression2 = get_archive_format(archive2) if format1 == format2 and compression1 == compression2: # same format and compression allows to copy the file util.link_or_copy(archive1, archive2, verbosity=verbosity) return tmpdir = util.tmpdir() try: kwargs = dict(verbosity=verbosity, outdir=tmpdir) same_format = (format1 == format2 and compression1 and compression2) if same_format: # only decompress since the format is the same kwargs['format'] = compression1 path = _extract_archive(archive1, **kwargs) archive = os.path.abspath(archive2) files = tuple(os.listdir(path)) olddir = os.getcwd() os.chdir(path) try: kwargs = dict(verbosity=verbosity) if same_format: # only compress since the format is the same kwargs['format'] = compression2 _create_archive(archive, files, **kwargs) finally: os.chdir(olddir) finally: shutil.rmtree(tmpdir, onerror=rmtree_log_error) # the patool library API def extract_archive(archive, verbosity=0, outdir=None, program=None): """Extract given archive.""" util.check_existing_filename(archive) if verbosity >= 0: util.log_info("Extracting %s ..." % archive) return _extract_archive(archive, verbosity=verbosity, outdir=outdir, program=program) def list_archive(archive, verbosity=1, program=None): """List given archive.""" # Set default verbosity to 1 since the listing output should be visible. util.check_existing_filename(archive) if verbosity >= 0: util.log_info("Listing %s ..." % archive) return _handle_archive(archive, 'list', verbosity=verbosity, program=program) def test_archive(archive, verbosity=0, program=None): """Test given archive.""" util.check_existing_filename(archive) if verbosity >= 0: util.log_info("Testing %s ..." % archive) res = _handle_archive(archive, 'test', verbosity=verbosity, program=program) if verbosity >= 0: util.log_info("... tested ok.") return res def create_archive(archive, filenames, verbosity=0, program=None): """Create given archive with given files.""" util.check_new_filename(archive) util.check_archive_filelist(filenames) if verbosity >= 0: util.log_info("Creating %s ..." % archive) res = _create_archive(archive, filenames, verbosity=verbosity, program=program) if verbosity >= 0: util.log_info("... %s created." % archive) return res def diff_archives(archive1, archive2, verbosity=0): """Print differences between two archives.""" util.check_existing_filename(archive1) util.check_existing_filename(archive2) if verbosity >= 0: util.log_info("Comparing %s with %s ..." % (archive1, archive2)) res = _diff_archives(archive1, archive2, verbosity=verbosity) if res == 0 and verbosity >= 0: util.log_info("... no differences found.") def search_archive(pattern, archive, verbosity=0): """Search pattern in archive members.""" if not pattern: raise util.PatoolError("empty search pattern") util.check_existing_filename(archive) if verbosity >= 0: util.log_info("Searching %r in %s ..." % (pattern, archive)) res = _search_archive(pattern, archive, verbosity=verbosity) if res == 1 and verbosity >= 0: util.log_info("... %r not found" % pattern) return res def repack_archive (archive, archive_new, verbosity=0): """Repack archive to different file and/or format.""" util.check_existing_filename(archive) util.check_new_filename(archive_new) if verbosity >= 0: util.log_info("Repacking %s to %s ..." % (archive, archive_new)) res = _repack_archive(archive, archive_new, verbosity=verbosity) if verbosity >= 0: util.log_info("... repacking successful.") return res patool-1.4/patoolib/configuration.py000066400000000000000000000007211221117163600177060ustar00rootroot00000000000000# Copyright (C) 2013 Bastian Kleineidam """ Define basic configuration data like version or application name. """ import _Patool_configdata as configdata Version = configdata.version ReleaseDate = configdata.release_date AppName = configdata.name App = AppName+" "+Version Author = configdata.author Maintainer = configdata.maintainer Copyright = "Copyright (C) 2004-2008 " + Author Url = configdata.url SupportUrl = Url + "issues" Email = configdata.author_email patool-1.4/patoolib/programs/000077500000000000000000000000001221117163600163175ustar00rootroot00000000000000patool-1.4/patoolib/programs/__init__.py000066400000000000000000000035131221117163600204320ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from .. import util def extract_singlefile_standard (archive, compression, cmd, verbosity, outdir): """Standard routine to extract a singlefile archive (like gzip).""" cmdlist = [util.shell_quote(cmd)] if verbosity > 1: cmdlist.append('-v') outfile = util.get_single_outfile(outdir, archive) cmdlist.extend(['-c', '-d', '--', util.shell_quote(archive), '>', util.shell_quote(outfile)]) return (cmdlist, {'shell': True}) def test_singlefile_standard (archive, compression, cmd, verbosity): """Standard routine to test a singlefile archive (like gzip).""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-t', '--', archive]) return cmdlist def create_singlefile_standard (archive, compression, cmd, verbosity, filenames): """Standard routine to create a singlefile archive (like gzip).""" cmdlist = [util.shell_quote(cmd)] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-c', '--']) cmdlist.extend([util.shell_quote(x) for x in filenames]) cmdlist.extend(['>', util.shell_quote(archive)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/ar.py000066400000000000000000000026261221117163600173010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the ar program.""" import os def extract_ar (archive, compression, cmd, verbosity, outdir): """Extract a AR archive.""" opts = 'x' if verbosity > 1: opts += 'v' cmdlist = [cmd, opts, os.path.abspath(archive)] return (cmdlist, {'cwd': outdir}) def list_ar (archive, compression, cmd, verbosity): """List a AR archive.""" opts = 't' if verbosity > 1: opts += 'v' return [cmd, opts, archive] test_ar = list_ar def create_ar (archive, compression, cmd, verbosity, filenames): """Create a AR archive.""" opts = 'rc' if verbosity > 1: opts += 'v' cmdlist = [cmd, opts, archive] cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/arc.py000066400000000000000000000031061221117163600174360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the arc program.""" import os def extract_arc (archive, compression, cmd, verbosity, outdir): """Extract a ARC archive.""" # Since extracted files will be placed in the current directory, # the cwd argument has to be the output directory. cmdlist = [cmd, 'x', os.path.abspath(archive)] return (cmdlist, {'cwd': outdir}) def list_arc (archive, compression, cmd, verbosity): """List a ARC archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('v') else: cmdlist.append('l') cmdlist.append(archive) return cmdlist def test_arc (archive, compression, cmd, verbosity): """Test a ARC archive.""" return [cmd, 't', archive] def create_arc (archive, compression, cmd, verbosity, filenames): """Create a ARC archive.""" cmdlist = [cmd, 'a', archive] cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/archmage.py000066400000000000000000000023531221117163600204430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the archmage program.""" import os from .. import util def extract_chm (archive, compression, cmd, verbosity, outdir): """Extract a CHM archive.""" # archmage can only extract in non-existing directories # so a nice dirname is created name = util.get_single_outfile("", archive) outfile = os.path.join(outdir, name) return [cmd, '-x', os.path.abspath(archive), outfile] def test_chm (archive, compression, cmd, verbosity): """Test a CHM archive.""" return [cmd, '-d', os.path.abspath(archive)] patool-1.4/patoolib/programs/arj.py000066400000000000000000000027071221117163600174530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the arj program.""" def extract_arj (archive, compression, cmd, verbosity, outdir): """Extract an ARJ archive.""" return [cmd, 'x', '-r', '-y', archive, outdir] def list_arj (archive, compression, cmd, verbosity): """List an ARJ archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('v') else: cmdlist.append('l') cmdlist.extend(['-r', '-y', archive]) return cmdlist def test_arj (archive, compression, cmd, verbosity): """Test an ARJ archive.""" return [cmd, 't', '-r', '-y', archive] def create_arj (archive, compression, cmd, verbosity, filenames): """Create an ARJ archive.""" cmdlist = [cmd, 'a', '-r', '-y', archive] cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/bsdcpio.py000066400000000000000000000014571221117163600203230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . """Archive commands for the bsdcpio program.""" from .cpio import extract_cpio, list_cpio, test_cpio, create_cpio patool-1.4/patoolib/programs/bsdtar.py000066400000000000000000000014521221117163600201520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . """Archive commands for the BSD tar program.""" from .tar import extract_tar, list_tar, test_tar, create_tar patool-1.4/patoolib/programs/bzip2.py000066400000000000000000000024311221117163600177170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the bzip2 program.""" from .. import util from . import extract_singlefile_standard, test_singlefile_standard extract_bzip2 = extract_singlefile_standard test_bzip2 = test_singlefile_standard def create_bzip2 (archive, compression, cmd, verbosity, filenames): """Create a BZIP2 archive.""" cmdlist = [util.shell_quote(cmd)] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-c', '-z', '--']) cmdlist.extend([util.shell_quote(x) for x in filenames]) cmdlist.extend(['>', util.shell_quote(archive)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/cabextract.py000066400000000000000000000024361221117163600210160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the cabextract program.""" def extract_cab (archive, compression, cmd, verbosity, outdir): """Extract a CAB archive.""" cmdlist = [cmd, '-d', outdir] if verbosity > 0: cmdlist.append('-v') cmdlist.append(archive) return cmdlist def list_cab (archive, compression, cmd, verbosity): """List a CAB archive.""" cmdlist = [cmd, '-l'] if verbosity > 0: cmdlist.append('-v') cmdlist.append(archive) return cmdlist def test_cab (archive, compression, cmd, verbosity): """Test a CAB archive.""" return [cmd, '-t', archive] patool-1.4/patoolib/programs/chmlib.py000066400000000000000000000016211221117163600201270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the chmlib programs.""" import os def extract_chm (archive, compression, cmd, verbosity, outdir): """Extract a CHM archive.""" return [cmd, os.path.abspath(archive), outdir] patool-1.4/patoolib/programs/clzip.py000066400000000000000000000017201221117163600200120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2011-2012 Bastian Kleineidam # # 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 . """Archive commands for the clzip program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_lzip = extract_singlefile_standard test_lzip = test_singlefile_standard create_lzip = create_singlefile_standard patool-1.4/patoolib/programs/compress.py000066400000000000000000000022071221117163600205250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the uncompress.real program.""" from .. import util def create_compress (archive, compression, cmd, verbosity, filenames): """Create a compressed archive.""" cmdlist = [util.shell_quote(cmd)] if verbosity > 1: cmdlist.append('-v') cmdlist.append('-c') cmdlist.extend([util.shell_quote(x) for x in filenames]) cmdlist.extend(['>', util.shell_quote(archive)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/cpio.py000066400000000000000000000041071221117163600176250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the cpio program.""" import os import sys from .. import util def extract_cpio (archive, compression, cmd, verbosity, outdir): """Extract a CPIO archive.""" cmdlist = [util.shell_quote(cmd), '--extract', '--make-directories', '--preserve-modification-time'] if sys.platform.startswith('linux') and not cmd.endswith('bsdcpio'): cmdlist.extend(['--no-absolute-filenames', '--force-local', '--nonmatching', r'"*\.\.*"']) if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['<', util.shell_quote(os.path.abspath(archive))]) return (cmdlist, {'cwd': outdir, 'shell': True}) def list_cpio (archive, compression, cmd, verbosity): """List a CPIO archive.""" cmdlist = [cmd, '-i', '-t'] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-F', archive]) return cmdlist test_cpio = list_cpio def create_cpio(archive, compression, cmd, verbosity, filenames): """Create a CPIO archive.""" cmdlist = [util.shell_quote(cmd), '--create'] if verbosity > 1: cmdlist.append('-v') if len(filenames) != 0: findcmd = ['find'] findcmd.extend([util.shell_quote(x) for x in filenames]) findcmd.extend(['-print0', '|']) cmdlist[0:0] = findcmd cmdlist.append('-0') cmdlist.extend([">", util.shell_quote(archive)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/dpkg.py000066400000000000000000000022471221117163600176230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the dpkg-deb program.""" def extract_deb (archive, compression, cmd, verbosity, outdir): """Extract a DEB archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('--vextract') else: cmdlist.append('--extract') cmdlist.extend(['--', archive, outdir]) return cmdlist def list_deb (archive, compression, cmd, verbosity): """List a DEB archive.""" return [cmd, '--contents', '--', archive] test_deb = list_deb patool-1.4/patoolib/programs/flac.py000066400000000000000000000025231221117163600176000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the flac program.""" from .. import util def extract_flac (archive, compression, cmd, verbosity, outdir): """Decompress a FLAC archive to a WAV file.""" outfile = util.get_single_outfile(outdir, archive, extension=".wav") cmdlist = [cmd, '--decode', archive, '--output-name', outfile] return cmdlist def create_flac (archive, compression, cmd, verbosity, filenames): """Compress a WAV file to a FLAC archive.""" cmdlist = [cmd, filenames[0], '--output-name', archive] return cmdlist def test_flac (archive, compression, cmd, verbosity): """Test a FLAC file.""" return [cmd, '--test', archive] patool-1.4/patoolib/programs/genisoimage.py000066400000000000000000000021511221117163600211570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . """Archive commands for the genisoimage program.""" def create_iso (archive, compression, cmd, verbosity, filenames): """Create an ISO archive.""" # Use Joliet (-J) and Rock-Ridge (-r) format. cmdlist = [cmd, '-r', '-J'] if verbosity > 1: cmdlist.append('-v') if verbosity > 2: cmdlist.append('-v') cmdlist.extend(['-o', archive]) cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/gzip.py000066400000000000000000000023131221117163600176410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the gzip program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_gzip = extract_compress = extract_singlefile_standard test_gzip = test_compress = test_singlefile_standard create_gzip = create_singlefile_standard def list_gzip (archive, compression, cmd, verbosity): """List a GZIP archive.""" cmdlist = [cmd] if verbosity > 0: cmdlist.append('-v') cmdlist.extend(['-l', '--', archive]) return cmdlist patool-1.4/patoolib/programs/isoinfo.py000066400000000000000000000016461221117163600203460ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . """Archive commands for the isoinfo program.""" def list_iso (archive, compression, cmd, verbosity): """List an ISO archive.""" # Use Joliet (-J) and Rock-Ridge (-R) options. return [cmd, '-l', '-R', '-J', '-i', archive] patool-1.4/patoolib/programs/lbzip2.py000066400000000000000000000015101221117163600200700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . """Archive commands for the pbzip2 program.""" # bzip2 and lbzip2 are compatible from .bzip2 import extract_bzip2, test_bzip2, create_bzip2 patool-1.4/patoolib/programs/lcab.py000066400000000000000000000016701221117163600175760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the lcab program.""" def create_cab (archive, compression, cmd, verbosity, filenames): """Create a CAB archive.""" cmdlist = [cmd, '-r'] cmdlist.extend(filenames) cmdlist.append(archive) return cmdlist patool-1.4/patoolib/programs/lha.py000066400000000000000000000031201221117163600174310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the lha program.""" def extract_lzh (archive, compression, cmd, verbosity, outdir): """Extract a LZH archive.""" opts = 'x' if verbosity > 1: opts += 'v' opts += "w=%s" % outdir return [cmd, opts, archive] def list_lzh (archive, compression, cmd, verbosity): """List a LZH archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('v') else: cmdlist.append('l') cmdlist.append(archive) return cmdlist def test_lzh (archive, compression, cmd, verbosity): """Test a LZH archive.""" opts = 't' if verbosity > 1: opts += 'v' return [cmd, opts, archive] def create_lzh (archive, compression, cmd, verbosity, filenames): """Create a LZH archive.""" opts = 'a' if verbosity > 1: opts += 'v' cmdlist = [cmd, opts, archive] cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/lhasa.py000066400000000000000000000014101221117163600177550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . """Archive commands for the lhasa program.""" from .lha import extract_lzh patool-1.4/patoolib/programs/lrzip.py000066400000000000000000000030121221117163600200250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the lrzip program.""" import os from .. import util def extract_lrzip (archive, compression, cmd, verbosity, outdir): """Extract a LRZIP archive.""" cmdlist = [cmd, '-d'] if verbosity > 1: cmdlist.append('-v') outfile = util.get_single_outfile(outdir, archive) cmdlist.extend(["-o", outfile, os.path.abspath(archive)]) return cmdlist def test_lrzip (archive, compression, cmd, verbosity): """Test a LRZIP archive.""" cmdlist = [cmd, '-t'] if verbosity > 1: cmdlist.append('-v') cmdlist.append(archive) return cmdlist def create_lrzip (archive, compression, cmd, verbosity, filenames): """Create a LRZIP archive.""" cmdlist = [cmd, '-o', archive] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/lzip.py000066400000000000000000000017171221117163600176550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . """Archive commands for the lzip program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_lzip = extract_singlefile_standard test_lzip = test_singlefile_standard create_lzip = create_singlefile_standard patool-1.4/patoolib/programs/lzma.py000066400000000000000000000017171221117163600176420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . """Archive commands for the lzma program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_lzma = extract_singlefile_standard test_lzma = test_singlefile_standard create_lzma = create_singlefile_standard patool-1.4/patoolib/programs/lzop.py000066400000000000000000000030271221117163600176570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the lzop program.""" from . import extract_singlefile_standard extract_lzop = extract_singlefile_standard def list_lzop (archive, compression, cmd, verbosity): """List a LZOP archive.""" cmdlist = [cmd, '--list'] if verbosity > 1: cmdlist.append('--verbose') cmdlist.extend(['--', archive]) return cmdlist def test_lzop (archive, compression, cmd, verbosity): """Test a LZOP archive.""" cmdlist = [cmd, '--test'] if verbosity > 1: cmdlist.append('--verbose') cmdlist.extend(['--', archive]) return cmdlist def create_lzop (archive, compression, cmd, verbosity, filenames): """Create a LZOP archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-o', archive, '--']) cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/mac.py000066400000000000000000000025241221117163600174340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the MAC.exe program.""" from .. import util def extract_ape (archive, compression, cmd, verbosity, outdir): """Decompress an APE archive to a WAV file.""" outfile = util.get_single_outfile(outdir, archive, extension=".wav") return [cmd, archive, outfile, '-d'] def create_ape (archive, compression, cmd, verbosity, filenames): """Compress a WAV file to an APE archive.""" cmdlist = [cmd] cmdlist.extend(filenames) cmdlist.append(archive) cmdlist.append('-c2000') return cmdlist def test_ape (archive, compression, cmd, verbosity): """Test an APE archive.""" return [cmd, archive, '-v'] patool-1.4/patoolib/programs/nomarch.py000066400000000000000000000025641221117163600203270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the nomarch program.""" import os def extract_arc (archive, compression, cmd, verbosity, outdir): """Extract an ARC archive.""" # Since extracted files will be placed in the current directory, # the cwd argument has to be the output directory. cmdlist = [cmd, os.path.abspath(archive)] return (cmdlist, {'cwd': outdir}) def list_arc (archive, compression, cmd, verbosity): """List an ARC archive.""" cmdlist = [cmd, '-l'] if verbosity > 1: cmdlist.append('-v') cmdlist.append(archive) return cmdlist def test_arc (archive, compression, cmd, verbosity): """Test an ARC archive.""" return [cmd, '-t', archive] patool-1.4/patoolib/programs/p7azip.py000066400000000000000000000024141221117163600201040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the 7za program. From the man page: 7za is a stand-alone executable. 7za handles less archive formats than 7z, but does not need any others. """ from .p7zip import \ extract_bzip2, \ extract_gzip, \ extract_zip, \ extract_compress, \ extract_rar, \ extract_cab, \ extract_7z, \ list_bzip2, \ list_gzip, \ list_zip, \ list_compress, \ list_rar, \ list_cab, \ list_rpm, \ list_7z, \ test_bzip2, \ test_gzip, \ test_zip, \ test_compress, \ test_rar, \ test_cab, \ test_7z, \ create_7z, \ create_zip, \ create_gzip patool-1.4/patoolib/programs/p7zip.py000066400000000000000000000045471221117163600177540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the 7z program.""" def extract_7z(archive, compression, cmd, verbosity, outdir): """Extract a 7z archive.""" return [cmd, 'x', '-o%s' % outdir, '--', archive] def extract_7z_singlefile(archive, compression, cmd, verbosity, outdir): """Extract a singlefile archive (eg. gzip or bzip2) with '7z e'. This makes sure a single file and no subdirectories are created, which would cause errors with patool repack.""" return [cmd, 'e', '-o%s' % outdir, '--', archive] extract_bzip2 = \ extract_gzip = \ extract_compress = \ extract_xz = \ extract_lzma = \ extract_7z_singlefile extract_zip = \ extract_rar = \ extract_cab = \ extract_arj = \ extract_cpio = \ extract_rpm = \ extract_deb = \ extract_iso = \ extract_7z def list_7z (archive, compression, cmd, verbosity): """List a 7z archive.""" return [cmd, 'l', '--', archive] list_bzip2 = \ list_gzip = \ list_zip = \ list_compress = \ list_rar = \ list_cab = \ list_arj = \ list_cpio = \ list_rpm = \ list_deb = \ list_iso = \ list_xz = \ list_lzma = \ list_7z def test_7z (archive, compression, cmd, verbosity): """Test a 7z archive.""" return [cmd, 't', '--', archive] test_bzip2 = \ test_gzip = \ test_zip = \ test_compress = \ test_rar = \ test_cab = \ test_arj = \ test_cpio = \ test_rpm = \ test_deb = \ test_iso = \ test_xz = \ test_lzma = \ test_7z def create_7z (archive, compression, cmd, verbosity, filenames): """Create a 7z archive.""" cmdlist = [cmd, 'a', '--', archive] cmdlist.extend(filenames) return cmdlist create_zip = \ create_xz = \ create_gzip = \ create_7z patool-1.4/patoolib/programs/pbzip2.py000066400000000000000000000015151221117163600201010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . """Archive commands for the pbzip2 program.""" # bzip2 and pbzip2 are compatible from .bzip2 import extract_bzip2, test_bzip2, create_bzip2 patool-1.4/patoolib/programs/pdlzip.py000066400000000000000000000017201221117163600201730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2011-2012 Bastian Kleineidam # # 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 . """Archive commands for the clzip program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_lzip = extract_singlefile_standard test_lzip = test_singlefile_standard create_lzip = create_singlefile_standard patool-1.4/patoolib/programs/pigz.py000066400000000000000000000014531221117163600176450ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . """Archive commands for the pigz program.""" from .gzip import extract_gzip, test_gzip, create_gzip, list_gzip patool-1.4/patoolib/programs/plzip.py000066400000000000000000000017131221117163600200310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . """Archive commands for the plzip program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_lzip = extract_singlefile_standard test_lzip = test_singlefile_standard create_lzip = create_singlefile_standard patool-1.4/patoolib/programs/py_bz2.py000066400000000000000000000043611221117163600201020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the bz2 Python module.""" from .. import util try: # try external bz2file module with multi-stream support import bz2file as bz2 except ImportError: import bz2 # read in 1MB chunks READ_SIZE_BYTES = 1024*1024 def extract_bzip2 (archive, compression, cmd, verbosity, outdir): """Extract a BZIP2 archive with the bz2 Python module.""" targetname = util.get_single_outfile(outdir, archive) try: with bz2.BZ2File(archive) as bz2file: with open(targetname, 'wb') as targetfile: data = bz2file.read(READ_SIZE_BYTES) while data: targetfile.write(data) data = bz2file.read(READ_SIZE_BYTES) except Exception as err: msg = "error extracting %s to %s: %s" % (archive, targetname, err) raise util.PatoolError(msg) return None def create_bzip2 (archive, compression, cmd, verbosity, filenames): """Create a BZIP2 archive with the bz2 Python module.""" if len(filenames) > 1: raise util.PatoolError('multi-file compression not supported in Python bz2') try: with bz2.BZ2File(archive, 'wb') as bz2file: filename = filenames[0] with open(filename, 'rb') as srcfile: data = srcfile.read(READ_SIZE_BYTES) while data: bz2file.write(data) data = srcfile.read(READ_SIZE_BYTES) except Exception as err: msg = "error creating %s: %s" % (archive, err) raise util.PatoolError(msg) return None patool-1.4/patoolib/programs/py_echo.py000066400000000000000000000026641221117163600203270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands echoing data, implemented by the Python print statement.""" from __future__ import print_function from .. import util def list_bzip2 (archive, compression, cmd, verbosity): """List a BZIP2 archive.""" return stripext(cmd, archive, verbosity) list_compress = \ list_lzma = \ list_xz = \ list_lzip = \ list_lrzip = \ list_rzip = \ list_bzip2 def list_ape (archive, compression, cmd, verbosity): """List an APE archive.""" return stripext(cmd, archive, verbosity, extension=".wav") list_shn = \ list_flac = \ list_ape def stripext (cmd, archive, verbosity, extension=""): """Print the name without suffix.""" if verbosity >= 0: print(util.stripext(archive)+extension) return None patool-1.4/patoolib/programs/py_gzip.py000066400000000000000000000043351221117163600203570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the gzip Python module.""" from __future__ import absolute_import # now gzip refers to the Python standard module, not the local one import gzip from .. import util READ_SIZE_BYTES = 1024*1024 def extract_gzip (archive, compression, cmd, verbosity, outdir): """Extract a GZIP archive with the gzip Python module.""" targetname = util.get_single_outfile(outdir, archive) try: with gzip.GzipFile(archive) as gzipfile: with open(targetname, 'wb') as targetfile: data = gzipfile.read(READ_SIZE_BYTES) while data: targetfile.write(data) data = gzipfile.read(READ_SIZE_BYTES) except Exception as err: msg = "error extracting %s to %s: %s" % (archive, targetname, err) raise util.PatoolError(msg) return None def create_gzip (archive, compression, cmd, verbosity, filenames): """Create a GZIP archive with the gzip Python module.""" if len(filenames) > 1: raise util.PatoolError('multi-file compression not supported in Python gzip') try: with gzip.GzipFile(archive, 'wb') as gzipfile: filename = filenames[0] with open(filename, 'rb') as srcfile: data = srcfile.read(READ_SIZE_BYTES) while data: gzipfile.write(data) data = srcfile.read(READ_SIZE_BYTES) except Exception as err: msg = "error creating %s: %s" % (archive, err) raise util.PatoolError(msg) return None patool-1.4/patoolib/programs/py_lzma.py000066400000000000000000000057521221117163600203550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the lzma Python module.""" from .. import util import lzma READ_SIZE_BYTES = 1024*1024 def _extract(archive, compression, cmd, format, verbosity, outdir): """Extract an LZMA or XZ archive with the lzma Python module.""" targetname = util.get_single_outfile(outdir, archive) try: with lzma.LZMAFile(archive, format=format) as lzmafile: with open(targetname, 'wb') as targetfile: data = lzmafile.read(READ_SIZE_BYTES) while data: targetfile.write(data) data = lzmafile.read(READ_SIZE_BYTES) except Exception as err: msg = "error extracting %s to %s: %s" % (archive, targetname, err) raise util.PatoolError(msg) return None def extract_lzma(archive, compression, cmd, verbosity, outdir): """Extract an LZMA archive with the lzma Python module.""" return _extract(archive, compression, cmd, lzma.FORMAT_ALONE, verbosity, outdir) def extract_xz(archive, compression, cmd, verbosity, outdir): """Extract an XZ archive with the lzma Python module.""" return _extract(archive, compression, cmd, lzma.FORMAT_XZ, verbosity, outdir) def _create(archive, compression, cmd, format, verbosity, filenames): """Create an LZMA or XZ archive with the lzma Python module.""" if len(filenames) > 1: raise util.PatoolError('multi-file compression not supported in Python lzma') try: with lzma.LZMAFile(archive, 'wb', format) as lzmafile: filename = filenames[0] with open(filename, 'rb') as srcfile: data = srcfile.read(READ_SIZE_BYTES) while data: lzmafile.write(data) data = srcfile.read(READ_SIZE_BYTES) except Exception as err: msg = "error creating %s: %s" % (archive, err) raise util.PatoolError(msg) return None def create_lzma(archive, compression, cmd, verbosity, filenames): """Create an LZMA archive with the lzma Python module.""" return _create(archive, compression, cmd, lzma.FORMAT_ALONE, verbosity, filenames) def create_xz(archive, compression, cmd, verbosity, filenames): """Create an XZ archive with the lzma Python module.""" return _create(archive, compression, cmd, lzma.FORMAT_XZ, verbosity, filenames) patool-1.4/patoolib/programs/py_tarfile.py000066400000000000000000000046261221117163600210370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the tarfile Python module.""" from .. import util, py_lzma import tarfile READ_SIZE_BYTES = 1024*1024 def list_tar (archive, compression, cmd, verbosity): """List a TAR archive with the tarfile Python module.""" try: with tarfile.open(archive) as tfile: tfile.list(verbose=verbosity>1) except Exception as err: msg = "error listing %s: %s" % (archive, err) raise util.PatoolError(msg) return None test_tar = list_tar def extract_tar (archive, compression, cmd, verbosity, outdir): """Extract a TAR archive with the tarfile Python module.""" try: with tarfile.open(archive) as tfile: tfile.extractall(path=outdir) except Exception as err: msg = "error extracting %s: %s" % (archive, err) raise util.PatoolError(msg) return None def create_tar (archive, compression, cmd, verbosity, filenames): """Create a TAR archive with the tarfile Python module.""" mode = get_tar_mode(compression) try: with tarfile.open(archive, mode) as tfile: for filename in filenames: tfile.add(filename) except Exception as err: msg = "error creating %s: %s" % (archive, err) raise util.PatoolError(msg) return None def get_tar_mode (compression): """Determine tarfile open mode according to the given compression.""" if compression == 'gzip': return 'w:gz' if compression == 'bzip2': return 'w:bz2' if compression == 'lzma' and py_lzma: return 'w:xz' if compression: msg = 'pytarfile does not support %s for tar compression' raise util.PatoolError(msg % compression) # no compression return 'w' patool-1.4/patoolib/programs/py_zipfile.py000066400000000000000000000047211221117163600210470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the zipfile Python module.""" from __future__ import print_function from .. import util import zipfile import os READ_SIZE_BYTES = 1024*1024 def list_zip(archive, compression, cmd, verbosity): """List member of a ZIP archive with the zipfile Python module.""" try: with zipfile.ZipFile(archive, "r") as zfile: for name in zfile.namelist(): if verbosity >= 0: print(name) except Exception as err: msg = "error listing %s: %s" % (archive, err) raise util.PatoolError(msg) return None test_zip = list_zip def extract_zip(archive, compression, cmd, verbosity, outdir): """Extract a ZIP archive with the zipfile Python module.""" try: with zipfile.ZipFile(archive) as zfile: zfile.extractall(outdir) except Exception as err: msg = "error extracting %s: %s" % (archive, err) raise util.PatoolError(msg) return None def create_zip(archive, compression, cmd, verbosity, filenames): """Create a ZIP archive with the zipfile Python module.""" try: with zipfile.ZipFile(archive, 'w') as zfile: for filename in filenames: if os.path.isdir(filename): write_directory(zfile, filename) else: zfile.write(filename) except Exception as err: msg = "error creating %s: %s" % (archive, err) raise util.PatoolError(msg) return None def write_directory (zfile, directory): """Write recursively all directories and filenames to zipfile instance.""" for dirpath, dirnames, filenames in os.walk(directory): zfile.write(dirpath) for filename in filenames: zfile.write(os.path.join(dirpath, filename)) patool-1.4/patoolib/programs/rar.py000066400000000000000000000027521221117163600174630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the rar program.""" import os def extract_rar (archive, compression, cmd, verbosity, outdir): """Extract a RAR archive.""" cmdlist = [cmd, 'x', '--', os.path.abspath(archive)] return (cmdlist, {'cwd': outdir}) def list_rar (archive, compression, cmd, verbosity): """List a RAR archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('v') else: cmdlist.append('l') cmdlist.extend(['--', archive]) return cmdlist def test_rar (archive, compression, cmd, verbosity): """Test a RAR archive.""" return [cmd, 't', '--', archive] def create_rar (archive, compression, cmd, verbosity, filenames): """Create a RAR archive.""" cmdlist = [cmd, 'a', '-r', '--', archive] cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/rpm.py000066400000000000000000000022561221117163600174740ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the rpm program.""" def list_rpm (archive, compression, cmd, verbosity): """List a RPM archive.""" cmdlist = [cmd, '-q', '-l'] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-p', '--', archive]) return cmdlist def test_rpm (archive, compression, cmd, verbosity): """Test a RPM archive.""" cmdlist = [cmd, 'V'] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['-p', '--', archive]) return cmdlist patool-1.4/patoolib/programs/rpm2cpio.py000066400000000000000000000026531221117163600204320ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the rpm2cpio program.""" import os from .. import util def extract_rpm (archive, compression, cmd, verbosity, outdir): """Extract a RPM archive.""" # also check cpio cpio = util.find_program("cpio") if not cpio: raise util.PatoolError("cpio(1) is required for rpm2cpio extraction; please install it") path = util.shell_quote(os.path.abspath(archive)) cmdlist = [util.shell_quote(cmd), path, "|", util.shell_quote(cpio), '--extract', '--make-directories', '--preserve-modification-time', '--no-absolute-filenames', '--force-local', '--nonmatching', r'"*\.\.*"'] if verbosity > 1: cmdlist.append('-v') return (cmdlist, {'cwd': outdir, 'shell': True}) patool-1.4/patoolib/programs/rzip.py000066400000000000000000000024441221117163600176610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the rzip program.""" from .. import util def extract_rzip (archive, compression, cmd, verbosity, outdir): """Extract an RZIP archive.""" cmdlist = [cmd, '-d', '-k'] if verbosity > 1: cmdlist.append('-v') outfile = util.get_single_outfile(outdir, archive) cmdlist.extend(["-o", outfile, archive]) return cmdlist def create_rzip (archive, compression, cmd, verbosity, filenames): """Create an RZIP archive.""" cmdlist = [cmd, '-k', '-o', archive] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/shar.py000066400000000000000000000020451221117163600176270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the shar program.""" from .. import util def create_shar (archive, compression, cmd, verbosity, filenames): """Create a SHAR archive.""" cmdlist = [util.shell_quote(cmd)] cmdlist.extend([util.shell_quote(x) for x in filenames]) cmdlist.extend(['>', util.shell_quote(archive)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/shorten.py000066400000000000000000000027741221117163600203650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the shorten program.""" from .. import util def extract_shn (archive, compression, cmd, verbosity, outdir): """Decompress a SHN archive to a WAV file.""" cmdlist = [util.shell_quote(cmd)] outfile = util.get_single_outfile(outdir, archive, extension=".wav") cmdlist.extend(['-x', '-', util.shell_quote(outfile), '<', util.shell_quote(archive)]) return (cmdlist, {'shell': True}) def create_shn (archive, compression, cmd, verbosity, filenames): """Compress a WAV file to a SHN archive.""" if len(filenames) > 1: raise util.PatoolError("multiple filenames for shorten not supported") cmdlist = [util.shell_quote(cmd)] cmdlist.extend(['-', util.shell_quote(archive), '<', util.shell_quote(filenames[0])]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/star.py000066400000000000000000000030211221117163600176360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the star program.""" from .tar import add_tar_opts as add_star_opts def extract_tar (archive, compression, cmd, verbosity, outdir): """Extract a TAR archive.""" cmdlist = [cmd, '-x'] add_star_opts(cmdlist, compression, verbosity) cmdlist.extend(['-C', outdir, 'file=%s' % archive]) return cmdlist def list_tar (archive, compression, cmd, verbosity): """List a TAR archive.""" cmdlist = [cmd, '-n'] add_star_opts(cmdlist, compression, verbosity) cmdlist.append("file=%s" % archive) return cmdlist test_tar = list_tar def create_tar (archive, compression, cmd, verbosity, filenames): """Create a TAR archive.""" cmdlist = [cmd, '-c'] add_star_opts(cmdlist, compression, verbosity) cmdlist.append("file=%s" % archive) cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/tar.py000066400000000000000000000044121221117163600174600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the GNU tar program.""" import os def extract_tar (archive, compression, cmd, verbosity, outdir): """Extract a TAR archive.""" cmdlist = [cmd, '--extract'] add_tar_opts(cmdlist, compression, verbosity) cmdlist.extend(["--file", archive, '--directory', outdir]) return cmdlist def list_tar (archive, compression, cmd, verbosity): """List a TAR archive.""" cmdlist = [cmd, '--list'] add_tar_opts(cmdlist, compression, verbosity) cmdlist.extend(["--file", archive]) return cmdlist test_tar = list_tar def create_tar (archive, compression, cmd, verbosity, filenames): """Create a TAR archive.""" cmdlist = [cmd, '--create'] add_tar_opts(cmdlist, compression, verbosity) cmdlist.extend(["--file", archive, '--']) cmdlist.extend(filenames) return cmdlist def add_tar_opts (cmdlist, compression, verbosity): """Add tar options to cmdlist.""" progname = os.path.basename(cmdlist[0]) if compression == 'gzip': cmdlist.append('-z') elif compression == 'compress': cmdlist.append('-Z') elif compression == 'bzip2': cmdlist.append('-j') elif compression in ('lzma', 'xz') and progname == 'bsdtar': cmdlist.append('--%s' % compression) elif compression in ('lzma', 'xz', 'lzip'): # use the compression name as program name since # tar is picky which programs it can use program = compression # set compression program cmdlist.extend(['--use-compress-program', program]) if verbosity > 1: cmdlist.append('--verbose') patool-1.4/patoolib/programs/unace.py000066400000000000000000000024771221117163600177760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the unace program.""" def extract_ace (archive, compression, cmd, verbosity, outdir): """Extract an ACE archive.""" cmdlist = [cmd, 'x'] if not outdir.endswith('/'): outdir += '/' cmdlist.extend([archive, outdir]) return cmdlist def list_ace (archive, compression, cmd, verbosity): """List an ACE archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('v') else: cmdlist.append('l') cmdlist.append(archive) return cmdlist def test_ace (archive, compression, cmd, verbosity): """Test an ACE archive.""" return [cmd, 't', archive] patool-1.4/patoolib/programs/unadf.py000066400000000000000000000020061221117163600177640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the unadf program.""" def extract_adf (archive, compression, cmd, verbosity, outdir): """Extract an ADF archive.""" return [cmd, archive, '-d', outdir] def list_adf (archive, compression, cmd, verbosity): """List an ADF archive.""" return [cmd, '-l', archive] test_adf = list_adf patool-1.4/patoolib/programs/unalz.py000066400000000000000000000020171221117163600200220ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the unalz program.""" def extract_alzip (archive, compression, cmd, verbosity, outdir): """Extract a ALZIP archive.""" return [cmd, '-d', outdir, archive] def list_alzip (archive, compression, cmd, verbosity): """List a ALZIP archive.""" return [cmd, '-l', archive] test_alzip = list_alzip patool-1.4/patoolib/programs/uncompress.py000066400000000000000000000022341221117163600210700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the uncompress.real program.""" from .. import util def extract_compress (archive, compression, cmd, verbosity, outdir): """Extract a compressed archive.""" cmdlist = [util.shell_quote(cmd)] if verbosity > 1: cmdlist.append('-v') outfile = util.get_single_outfile(outdir, archive) cmdlist.extend(['-c', util.shell_quote(archive), '>', util.shell_quote(outfile)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/programs/unrar.py000066400000000000000000000014411221117163600200200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the unrar program.""" from .rar import extract_rar, list_rar, test_rar patool-1.4/patoolib/programs/unshar.py000066400000000000000000000016621221117163600201760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012-2013 Bastian Kleineidam # # 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 . """Archive commands for the unshar program.""" import os def extract_shar (archive, compression, cmd, verbosity, outdir): """Extract a SHAR archive.""" cmdlist = [cmd, os.path.abspath(archive)] return (cmdlist, {'cwd': outdir}) patool-1.4/patoolib/programs/unzip.py000066400000000000000000000026151221117163600200420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the unzip program.""" def extract_zip (archive, compression, cmd, verbosity, outdir): """Extract a ZIP archive.""" cmdlist = [cmd] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['--', archive, '-d', outdir]) return cmdlist def list_zip (archive, compression, cmd, verbosity): """List a ZIP archive.""" cmdlist = [cmd, '-l'] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['--', archive]) return cmdlist def test_zip (archive, compression, cmd, verbosity): """Test a ZIP archive.""" cmdlist = [cmd, '-t'] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['--', archive]) return cmdlist patool-1.4/patoolib/programs/xdms.py000066400000000000000000000031311221117163600176420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2011-2013 Bastian Kleineidam # # 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 . """Archive commands for the xdms program.""" from .. import util def extract_dms (archive, compression, cmd, verbosity, outdir): """Extract a DMS archive.""" check_archive_ext(archive) cmdlist = [cmd, '-d', outdir] if verbosity > 1: cmdlist.append('-v') cmdlist.extend(['u', archive]) return cmdlist def list_dms (archive, compression, cmd, verbosity): """List a DMS archive.""" check_archive_ext(archive) return [cmd, 'v', archive] def test_dms (archive, compression, cmd, verbosity): """Test a DMS archive.""" check_archive_ext(archive) return [cmd, 't', archive] def check_archive_ext (archive): """xdms(1) cannot handle files with extensions other than '.dms'.""" if not archive.lower().endswith(".dms"): rest = archive[-4:] msg = "xdms(1) archive file must end with `.dms', not `%s'" % rest raise util.PatoolError(msg) patool-1.4/patoolib/programs/xz.py000066400000000000000000000022501221117163600173310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the xz program.""" from . import extract_singlefile_standard, \ test_singlefile_standard, create_singlefile_standard extract_xz = extract_singlefile_standard test_xz = test_singlefile_standard create_xz = create_singlefile_standard def list_xz (archive, compression, cmd, verbosity): """List a XZ archive.""" cmdlist = [cmd] cmdlist.append('-l') if verbosity > 1: cmdlist.append('-v') cmdlist.append(archive) return cmdlist patool-1.4/patoolib/programs/zip.py000066400000000000000000000022761221117163600175020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the zip program.""" def create_zip (archive, compression, cmd, verbosity, filenames): """Create a ZIP archive.""" cmdlist = [cmd, '-r'] if verbosity > 1: cmdlist.append('-v') cmdlist.append(archive) cmdlist.extend(filenames) return cmdlist def test_zip (archive, compression, cmd, verbosity): """Test a ZIP archive.""" cmdlist = [cmd, '--test'] if verbosity > 1: cmdlist.append('-v') cmdlist.append(archive) return cmdlist patool-1.4/patoolib/programs/zoo.py000066400000000000000000000027371221117163600175110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Archive commands for the zoo program.""" import os def extract_zoo (archive, compression, cmd, verbosity, outdir): """Extract a ZOO archive.""" # Since extracted files will be placed in the current directory, # the cwd argument has to be the output directory. cmdlist = [cmd, '-extract', os.path.abspath(archive)] return (cmdlist, {'cwd': outdir}) def list_zoo (archive, compression, cmd, verbosity): """List a ZOO archive.""" return [cmd, '-list', archive] def test_zoo (archive, compression, cmd, verbosity): """Test a ZOO archive.""" return [cmd, '-test', archive] def create_zoo (archive, compression, cmd, verbosity, filenames): """Create a ZOO archive.""" cmdlist = [cmd, '-add', archive] cmdlist.extend(filenames) return cmdlist patool-1.4/patoolib/programs/zopfli.py000066400000000000000000000021021221117163600201670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . """Archive commands for the zopfli program.""" from .. import util def create_gzip(archive, compression, cmd, verbosity, filenames): """Create a GZIP archive.""" cmdlist = [util.shell_quote(cmd)] cmdlist.extend(['-c', '--']) cmdlist.extend([util.shell_quote(x) for x in filenames]) cmdlist.extend(['>', util.shell_quote(archive)]) return (cmdlist, {'shell': True}) patool-1.4/patoolib/util.py000066400000000000000000000547071221117163600160310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """Utility functions.""" from __future__ import print_function import os import sys import shutil import subprocess import mimetypes import tempfile import time import traceback from . import configuration, ArchiveMimetypes, ArchiveCompressions try: from shutil import which except ImportError: # from Python 3.3 def which(cmd, mode=os.F_OK | os.X_OK, path=None): """Given a command, mode, and a PATH string, return the path which conforms to the given mode on the PATH, or None if there is no such file. `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result of os.environ.get("PATH"), or can be overridden with a custom search path. """ def _access_check(fn, mode): """Check that a given file can be accessed with the correct mode. Additionally check that `fn` is not a directory, as on Windows directories pass the os.access check.""" return (os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn)) # If we're given a path with a directory part, look it up directly rather # than referring to PATH directories. This includes checking relative to the # current directory, e.g. ./script if os.path.dirname(cmd): if _access_check(cmd, mode): return cmd return None path = (path or os.environ.get("PATH", os.defpath)).split(os.pathsep) if sys.platform == "win32": # The current directory takes precedence on Windows. if not os.curdir in path: path.insert(0, os.curdir) # PATHEXT is necessary to check on Windows. pathext = os.environ.get("PATHEXT", "").split(os.pathsep) # See if the given file matches any of the expected path extensions. # This will allow us to short circuit when given "python.exe". # If it does match, only test that one, otherwise we have to try # others. if any(cmd.lower().endswith(ext.lower()) for ext in pathext): files = [cmd] else: files = [cmd + ext for ext in pathext] else: # On other platforms you don't have things like PATHEXT to tell you # what file suffixes are executable, so just pass on cmd as-is. files = [cmd] seen = set() for dir in path: normdir = os.path.normcase(dir) if not normdir in seen: seen.add(normdir) for thefile in files: name = os.path.join(dir, thefile) if _access_check(name, mode): return name return None # internal MIME database mimedb = None def init_mimedb(): """Initialize the internal MIME database.""" global mimedb try: mimedb = mimetypes.MimeTypes(strict=False) except Exception as msg: log_error("could not initialize MIME database: %s" % msg) return add_mimedb_data(mimedb) def add_mimedb_data(mimedb): """Add missing encodings and mimetypes to MIME database.""" mimedb.encodings_map['.bz2'] = 'bzip2' mimedb.encodings_map['.lzma'] = 'lzma' mimedb.encodings_map['.xz'] = 'xz' mimedb.encodings_map['.lz'] = 'lzip' mimedb.suffix_map['.tbz2'] = '.tar.bz2' add_mimetype(mimedb, 'application/x-lzop', '.lzo') add_mimetype(mimedb, 'application/x-adf', '.adf') add_mimetype(mimedb, 'application/x-arj', '.arj') add_mimetype(mimedb, 'application/x-lzma', '.lzma') add_mimetype(mimedb, 'application/x-xz', '.xz') add_mimetype(mimedb, 'application/java-archive', '.jar') add_mimetype(mimedb, 'application/x-rar', '.rar') add_mimetype(mimedb, 'application/x-7z-compressed', '.7z') add_mimetype(mimedb, 'application/x-cab', '.cab') add_mimetype(mimedb, 'application/x-rpm', '.rpm') add_mimetype(mimedb, 'application/x-debian-package', '.deb') add_mimetype(mimedb, 'application/x-ace', '.ace') add_mimetype(mimedb, 'application/x-archive', '.a') add_mimetype(mimedb, 'application/x-alzip', '.alz') add_mimetype(mimedb, 'application/x-arc', '.arc') add_mimetype(mimedb, 'application/x-lrzip', '.lrz') add_mimetype(mimedb, 'application/x-lha', '.lha') add_mimetype(mimedb, 'application/x-lzh', '.lzh') add_mimetype(mimedb, 'application/x-rzip', '.rz') add_mimetype(mimedb, 'application/x-zoo', '.zoo') add_mimetype(mimedb, 'application/x-dms', '.dms') add_mimetype(mimedb, 'application/x-zip-compressed', '.crx') add_mimetype(mimedb, 'application/x-shar', '.shar') add_mimetype(mimedb, 'audio/x-ape', '.ape') add_mimetype(mimedb, 'audio/x-shn', '.shn') add_mimetype(mimedb, 'audio/flac', '.flac') add_mimetype(mimedb, 'application/x-chm', '.chm') add_mimetype(mimedb, 'application/x-iso9660-image', '.iso') def add_mimetype(mimedb, mimetype, extension): """Add or replace a mimetype to be used with the given extension.""" # If extension is already a common type, strict=True must be used. strict = extension in mimedb.types_map[True] mimedb.add_type(mimetype, extension, strict=strict) class PatoolError (Exception): """Raised when errors occur.""" pass class memoized (object): """Decorator that caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned, and not re-evaluated.""" def __init__(self, func): """Set func and init cache.""" self.func = func self.cache = {} def __call__(self, *args): """Try to find result for function arguments in local cache or execute the function and fill the cache with the result.""" try: return self.cache[args] except KeyError: self.cache[args] = value = self.func(*args) return value except TypeError: # uncachable -- for instance, passing a list as an argument. # Better to not cache than to blow up entirely. return self.func(*args) def __repr__(self): """Return the function's docstring.""" return self.func.__doc__ def backtick (cmd, encoding='utf-8'): """Return decoded output from command.""" data = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] return data.decode(encoding) def run (cmd, verbosity=0, **kwargs): """Run command without error checking. @return: command return code""" # Note that shell_quote_nt() result is not suitable for copy-paste # (especially on Unix systems), but it looks nicer than shell_quote(). if verbosity >= 0: log_info("running %s" % " ".join(map(shell_quote_nt, cmd))) if kwargs: if verbosity >= 0: log_info(" with %s" % ", ".join("%s=%s" % (k, shell_quote(str(v)))\ for k, v in kwargs.items())) if kwargs.get("shell"): # for shell calls the command must be a string cmd = " ".join(cmd) if verbosity < 1: # hide command output on stdout with open(os.devnull, 'wb') as devnull: kwargs['stdout'] = devnull res = subprocess.call(cmd, **kwargs) else: res = subprocess.call(cmd, **kwargs) return res def run_checked (cmd, ret_ok=(0,), **kwargs): """Run command and raise PatoolError on error.""" retcode = run(cmd, **kwargs) if retcode not in ret_ok: msg = "Command `%s' returned non-zero exit status %d" % (cmd, retcode) raise PatoolError(msg) return retcode @memoized def guess_mime (filename): """Guess the MIME type of given filename using file(1) and if that fails by looking at the filename extension with the Python mimetypes module. The result of this function is cached. """ mime, encoding = guess_mime_file(filename) if mime is None: mime, encoding = guess_mime_mimedb(filename) assert mime is not None or encoding is None return mime, encoding Encoding2Mime = { 'gzip': "application/gzip", 'bzip2': "application/x-bzip2", 'compress': "application/x-compress", 'lzma': "application/x-lzma", 'lzip': "application/x-lzip", 'xz': "application/x-xz", } Mime2Encoding = dict([(_val, _key) for _key, _val in Encoding2Mime.items()]) # libmagic before version 5.14 identified .gz files as application/x-gzip Mime2Encoding['application/x-gzip'] = 'gzip' def guess_mime_mimedb (filename): """Guess MIME type from given filename. @return: tuple (mime, encoding) """ mime, encoding = None, None if mimedb is not None: mime, encoding = mimedb.guess_type(filename, strict=False) if mime not in ArchiveMimetypes and encoding in ArchiveCompressions: # Files like 't.txt.gz' are recognized with encoding as format, and # an unsupported mime-type like 'text/plain'. Fix this. mime = Encoding2Mime[encoding] encoding = None return mime, encoding def guess_mime_file (filename): """Determine MIME type of filename with file(1): (a) using `file --mime` (b) using `file` and look the result string @return: tuple (mime, encoding) """ mime, encoding = None, None base, ext = os.path.splitext(filename) if ext.lower() in ('.alz',): # let mimedb recognize these extensions return mime, encoding if os.path.isfile(filename): file_prog = find_program("file") if file_prog: mime, encoding = guess_mime_file_mime(file_prog, filename) if mime is None: mime = guess_mime_file_text(file_prog, filename) encoding = None if mime in Mime2Encoding: # try to look inside compressed archives cmd = [file_prog, "--brief", "--mime", "--uncompress", filename] try: outparts = backtick(cmd).strip().split(";") except OSError: # ignore errors, as file(1) is only a fallback return mime, encoding mime2 = outparts[0].split(" ", 1)[0] if mime2 in ('application/x-empty', 'application/octet-stream'): # The uncompressor program file(1) uses is not installed # or is not able to uncompress. # Try to get mime information from the file extension. mime2, encoding2 = guess_mime_mimedb(filename) if mime2 in ArchiveMimetypes: mime = mime2 encoding = encoding2 elif mime2 in ArchiveMimetypes: mime = mime2 encoding = get_file_mime_encoding(outparts) return mime, encoding def guess_mime_file_mime (file_prog, filename): """Determine MIME type of filename with file(1) and --mime option. @return: tuple (mime, encoding) """ mime, encoding = None, None cmd = [file_prog, "--brief", "--mime-type", filename] try: mime = backtick(cmd).strip() except OSError: # ignore errors, as file(1) is only a fallback pass if mime not in ArchiveMimetypes: mime, encoding = None, None return mime, encoding def get_file_mime_encoding (parts): """Get encoding value from splitted output of file --mime --uncompress.""" for part in parts: for subpart in part.split(" "): if subpart.startswith("compressed-encoding="): mime = subpart.split("=")[1].strip() return Mime2Encoding.get(mime) return None # Match file(1) output text to mime types FileText2Mime = { "7-zip archive data": "application/x-7z-compressed", "ACE archive data": "application/x-ace", "Amiga DOS disk": "application/x-adf", "ARJ archive data": "application/x-arj", "bzip2 compressed data": "application/x-bzip2", "cpio archive": "application/x-cpio", "ASCII cpio archive": "application/x-cpio", "Debian binary package": "application/x-debian-package", "gzip compressed data": "application/x-gzip", "LZMA compressed data": "application/x-lzma", "LRZIP compressed data": "application/x-lrzip", "lzop compressed data": "application/x-lzop", "Microsoft Cabinet archive data": "application/vnd.ms-cab-compressed", "RAR archive data": "application/x-rar", "RPM ": "application/x-redhat-package-manager", "POSIX tar archive": "application/x-tar", "xz compressed data": "application/x-xz", "Zip archive data": "application/zip", "compress'd data": "application/x-compress", "lzip compressed data": "application/x-lzip", "rzip compressed data": "application/x-rzip", "current ar archive": "application/x-archive", "LHa ": "application/x-lha", "ARC archive data": "application/x-arc", "Zoo archive data": "application/x-zoo", "DMS archive data": "application/x-dms", "Monkey's Audio": "audio/x-ape", "FLAC audio bitstream data": "audio/flac", "MS Windows HtmlHelp Data": "application/x-chm", } def guess_mime_file_text (file_prog, filename): """Determine MIME type of filename with file(1).""" cmd = [file_prog, "--brief", filename] try: output = backtick(cmd).strip() except OSError: # ignore errors, as file(1) is only a fallback return None # match output against known strings for matcher, mime in FileText2Mime.items(): if output.startswith(matcher) and mime in ArchiveMimetypes: return mime return None def check_existing_filename (filename, onlyfiles=True): """Ensure that given filename is a valid, existing file.""" if not os.path.exists(filename): raise PatoolError("file `%s' was not found" % filename) if not os.access(filename, os.R_OK): raise PatoolError("file `%s' is not readable" % filename) if onlyfiles and not os.path.isfile(filename): raise PatoolError("`%s' is not a file" % filename) def check_new_filename (filename): """Check that filename does not already exist.""" if os.path.exists(filename): raise PatoolError("cannot overwrite existing file `%s'" % filename) def check_archive_filelist (filenames): """Check that file list is not empty and contains only existing files.""" if not filenames: raise PatoolError("cannot create archive with empty filelist") for filename in filenames: check_existing_filename(filename, onlyfiles=False) def set_mode (filename, flags): """Set mode flags for given filename if not already set.""" try: mode = os.lstat(filename).st_mode except OSError: # ignore return if not (mode & flags): try: os.chmod(filename, flags | mode) except OSError as msg: log_error("could not set mode flags for `%s': %s" % (filename, msg)) def tmpdir (dir=None): """Return a temporary directory for extraction.""" return tempfile.mkdtemp(suffix='', prefix='Unpack_', dir=dir) def tmpfile (dir=None, prefix="temp", suffix=None): """Return a temporary file.""" return tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir)[1] def shell_quote (value): """Quote all shell metacharacters in given string value with strong (ie. single) quotes, handling the single quote especially.""" if os.name == 'nt': return shell_quote_nt(value) return "'%s'" % value.replace("'", r"'\''") def shell_quote_nt (value): """Quote argument for Windows system. Modeled after distutils _nt_quote_args() function.""" if " " in value: return '"%s"' % value return value def stripext (filename): """Return the basename without extension of given filename.""" return os.path.splitext(os.path.basename(filename))[0] def get_single_outfile (directory, archive, extension=""): """Get output filename if archive is in a single file format like gzip.""" outfile = os.path.join(directory, stripext(archive)) if os.path.exists(outfile + extension): # prevent overwriting existing files i = 1 newfile = "%s%d" % (outfile, i) while os.path.exists(newfile + extension): newfile = "%s%d" % (outfile, i) i += 1 outfile = newfile return outfile + extension def log_error (msg, out=sys.stderr): """Print error message to stderr (or any other given output).""" print("patool error:", msg, file=out) def log_info (msg, out=sys.stdout): """Print info message to stdout (or any other given output).""" print("patool:", msg, file=out) def log_internal_error(out=sys.stderr, etype=None, evalue=None, tb=None): """Print internal error message (output defaults to stderr).""" print(os.linesep, file=out) print("""********** Oops, I did it again. ************* You have found an internal error in %(app)s. Please write a bug report at %(url)s and include at least the information below: Not disclosing some of the information below due to privacy reasons is ok. I will try to help you nonetheless, but you have to give me something I can work with ;) . """ % dict(app=configuration.AppName, url=configuration.SupportUrl), file=out) if etype is None: etype = sys.exc_info()[0] if evalue is None: evalue = sys.exc_info()[1] print(etype, evalue, file=out) if tb is None: tb = sys.exc_info()[2] traceback.print_exception(etype, evalue, tb, None, out) print_app_info(out=out) print_locale_info(out=out) print(os.linesep, "******** %s internal error, over and out ********" % configuration.AppName, file=out) def print_env_info(key, out=sys.stderr): """If given environment key is defined, print it out.""" value = os.getenv(key) if value is not None: print(key, "=", repr(value), file=out) def print_locale_info(out=sys.stderr): """Print locale info.""" for key in ("LANGUAGE", "LC_ALL", "LC_CTYPE", "LANG"): print_env_info(key, out=out) def print_app_info(out=sys.stderr): """Print system and application info (output defaults to stderr).""" print("System info:", file=out) print(configuration.App, file=out) print("Python %(version)s on %(platform)s" % {"version": sys.version, "platform": sys.platform}, file=out) stime = strtime(time.time()) print("Local time:", stime, file=out) print("sys.argv", sys.argv, file=out) def strtime(t): """Return ISO 8601 formatted time.""" return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t)) + \ strtimezone() def strtimezone(): """Return timezone info, %z on some platforms, but not supported on all. """ if time.daylight: zone = time.altzone else: zone = time.timezone return "%+04d" % (-zone//3600) def p7zip_supports_rar (): """Determine if the RAR codec is installed for 7z program.""" if os.name == 'nt': # Assume RAR support is compiled into the binary. return True return os.path.exists('/usr/lib/p7zip/Codecs/Rar29.so') @memoized def find_program (program): """Look for program in environment PATH variable.""" if os.name == 'nt': path = os.environ['PATH'] path = append_to_path(path, get_nt_7z_dir()) path = append_to_path(path, get_nt_mac_dir()) else: # use default path path = None return which(program, path=path) def append_to_path (path, directory): """Add a directory to the PATH environment variable, if it is a valid directory.""" if not os.path.isdir(directory) or directory in path: return path if not path.endswith(os.pathsep): path += os.pathsep return path + directory def get_nt_7z_dir (): """Return 7-Zip directory from registry, or an empty string.""" # Python 3.x renamed the _winreg module to winreg try: import _winreg as winreg except ImportError: import winreg try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\7-Zip") try: return winreg.QueryValueEx(key, "Path")[0] finally: winreg.CloseKey(key) except WindowsError: return "" def get_nt_program_dir (): """Return the Windows program files directory.""" progvar = "%ProgramFiles%" return os.path.expandvars(progvar) def get_nt_mac_dir (): """Return Monkey Audio Compressor (MAC) directory, or an empty string.""" return os.path.join(get_nt_program_dir(), "Monkey's Audio") def strlist_with_or (alist): """Return comma separated string, and last entry appended with ' or '.""" if len(alist) > 1: return "%s or %s" % (", ".join(alist[:-1]), alist[-1]) return ", ".join(alist) def is_same_file (filename1, filename2): """Check if filename1 and filename2 point to the same file object. There can be false negatives, ie. the result is False, but it is the same file anyway. Reason is that network filesystems can create different paths to the same physical file. """ if filename1 == filename2: return True if os.name == 'posix': return os.path.samefile(filename1, filename2) return is_same_filename(filename1, filename2) def is_same_filename (filename1, filename2): """Check if filename1 and filename2 are the same filename.""" return os.path.realpath(filename1) == os.path.realpath(filename2) def link_or_copy(src, dst, verbosity=0): """Try to make a hard link from src to dst and if that fails copy the file. Hard links save some disk space and linking should fail fast since no copying is involved. """ if verbosity > 0: log_info("Copying %s -> %s" % (src, dst)) try: os.link(src, dst) except OSError: try: shutil.copy(src, dst) except OSError as msg: raise PatoolError(msg) def chdir(directory): """Remember and return current directory before calling os.chdir(). If the current directory could not be determined, return None. """ try: olddir = os.getcwd() except OSError: olddir = None os.chdir(directory) return olddir init_mimedb() patool-1.4/requirements.txt000066400000000000000000000000421221117163600161340ustar00rootroot00000000000000# no other Python packages needed patool-1.4/scripts/000077500000000000000000000000001221117163600143435ustar00rootroot00000000000000patool-1.4/scripts/build.bat000066400000000000000000000015741221117163600161410ustar00rootroot00000000000000:: Build patool :: Copyright (C) 2012 Bastian Kleineidam :: This program is free software; you can redistribute it and/or modify :: it under the terms of the GNU General Public License as published by :: the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc., :: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. @echo off :: Python version set PYDIR=C:\Python27 set PYVER=2.7 %PYDIR%\python.exe setup.py build patool-1.4/scripts/dist.bat000066400000000000000000000016051221117163600160000ustar00rootroot00000000000000:: Create patool Windows distribution file :: Copyright (C) 2010-2012 Bastian Kleineidam :: 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 . @echo off set PYDIR=c:\python27 rd /s /q build > nul 2>&1 call %~dp0\build.bat rd /s /q dist > nul 2>&1 %PYDIR%\python.exe setup.py py2exe pause patool-1.4/scripts/modpath.iss000066400000000000000000000154461221117163600165310ustar00rootroot00000000000000// ---------------------------------------------------------------------------- // // Inno Setup Ver: 5.4.2 // Script Version: 1.4.2 // Author: Jared Breland // Homepage: http://www.legroom.net/software // License: GNU Lesser General Public License (LGPL), version 3 // http://www.gnu.org/licenses/lgpl.html // // Script Function: // Allow modification of environmental path directly from Inno Setup installers // // Instructions: // Copy modpath.iss to the same directory as your setup script // // Add this statement to your [Setup] section // ChangesEnvironment=true // // Add this statement to your [Tasks] section // You can change the Description or Flags // You can change the Name, but it must match the ModPathName setting below // Name: modifypath; Description: &Add application directory to your environmental path; Flags: unchecked // // Add the following to the end of your [Code] section // ModPathName defines the name of the task defined above // ModPathType defines whether the 'user' or 'system' path will be modified; // this will default to user if anything other than system is set // setArrayLength must specify the total number of dirs to be added // Result[0] contains first directory, Result[1] contains second, etc. // const // ModPathName = 'modifypath'; // ModPathType = 'user'; // // function ModPathDir(): TArrayOfString; // begin // setArrayLength(Result, 1); // Result[0] := ExpandConstant('{app}'); // end; // #include "modpath.iss" // ---------------------------------------------------------------------------- procedure ModPath(); var oldpath: String; newpath: String; updatepath: Boolean; pathArr: TArrayOfString; aExecFile: String; aExecArr: TArrayOfString; i, d: Integer; pathdir: TArrayOfString; regroot: Integer; regpath: String; begin // Get constants from main script and adjust behavior accordingly // ModPathType MUST be 'system' or 'user'; force 'user' if invalid if ModPathType = 'system' then begin regroot := HKEY_LOCAL_MACHINE; regpath := 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'; end else begin regroot := HKEY_CURRENT_USER; regpath := 'Environment'; end; // Get array of new directories and act on each individually pathdir := ModPathDir(); for d := 0 to GetArrayLength(pathdir)-1 do begin updatepath := true; // Modify WinNT path if UsingWinNT() = true then begin // Get current path, split into an array RegQueryStringValue(regroot, regpath, 'Path', oldpath); oldpath := oldpath + ';'; i := 0; while (Pos(';', oldpath) > 0) do begin SetArrayLength(pathArr, i+1); pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1); oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath)); i := i + 1; // Check if current directory matches app dir if pathdir[d] = pathArr[i-1] then begin // if uninstalling, remove dir from path if IsUninstaller() = true then begin continue; // if installing, flag that dir already exists in path end else begin updatepath := false; end; end; // Add current directory to new path if i = 1 then begin newpath := pathArr[i-1]; end else begin newpath := newpath + ';' + pathArr[i-1]; end; end; // Append app dir to path if not already included if (IsUninstaller() = false) AND (updatepath = true) then newpath := newpath + ';' + pathdir[d]; // Write new path RegWriteStringValue(regroot, regpath, 'Path', newpath); // Modify Win9x path end else begin // Convert to shortened dirname pathdir[d] := GetShortName(pathdir[d]); // If autoexec.bat exists, check if app dir already exists in path aExecFile := 'C:\AUTOEXEC.BAT'; if FileExists(aExecFile) then begin LoadStringsFromFile(aExecFile, aExecArr); for i := 0 to GetArrayLength(aExecArr)-1 do begin if IsUninstaller() = false then begin // If app dir already exists while installing, skip add if (Pos(pathdir[d], aExecArr[i]) > 0) then updatepath := false; break; end else begin // If app dir exists and = what we originally set, then delete at uninstall if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then aExecArr[i] := ''; end; end; end; // If app dir not found, or autoexec.bat didn't exist, then (create and) append to current path if (IsUninstaller() = false) AND (updatepath = true) then begin SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True); // If uninstalling, write the full autoexec out end else begin SaveStringsToFile(aExecFile, aExecArr, False); end; end; end; end; // Split a string into an array using passed delimeter procedure MPExplode(var Dest: TArrayOfString; Text: String; Separator: String); var i: Integer; begin i := 0; repeat SetArrayLength(Dest, i+1); if Pos(Separator,Text) > 0 then begin Dest[i] := Copy(Text, 1, Pos(Separator, Text)-1); Text := Copy(Text, Pos(Separator,Text) + Length(Separator), Length(Text)); i := i + 1; end else begin Dest[i] := Text; Text := ''; end; until Length(Text)=0; end; procedure CurStepChanged(CurStep: TSetupStep); var taskname: String; begin taskname := ModPathName; if CurStep = ssPostInstall then if IsTaskSelected(taskname) then ModPath(); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var aSelectedTasks: TArrayOfString; i: Integer; taskname: String; regpath: String; regstring: String; appid: String; begin // only run during actual uninstall if CurUninstallStep = usUninstall then begin // get list of selected tasks saved in registry at install time appid := '{#emit SetupSetting("AppId")}'; if appid = '' then appid := '{#emit SetupSetting("AppName")}'; regpath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+appid+'_is1'); RegQueryStringValue(HKLM, regpath, 'Inno Setup: Selected Tasks', regstring); if regstring = '' then RegQueryStringValue(HKCU, regpath, 'Inno Setup: Selected Tasks', regstring); // check each task; if matches modpath taskname, trigger patch removal if regstring <> '' then begin taskname := ModPathName; MPExplode(aSelectedTasks, regstring, ','); if GetArrayLength(aSelectedTasks) > 0 then begin for i := 0 to GetArrayLength(aSelectedTasks)-1 do begin if comparetext(aSelectedTasks[i], taskname) = 0 then ModPath(); end; end; end; end; end; function NeedRestart(): Boolean; var taskname: String; begin taskname := ModPathName; if IsTaskSelected(taskname) and not UsingWinNT() then begin Result := True; end else begin Result := False; end; end; patool-1.4/scripts/test.bat000066400000000000000000000014501221117163600160120ustar00rootroot00000000000000:: Run patool test suite :: Copyright (C) 2010-2012 Bastian Kleineidam :: 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 . @echo off set PYDIR=C:\Python27 %PYDIR%\python.exe -m pytest tests pause patool-1.4/setup.cfg000066400000000000000000000003601221117163600144740ustar00rootroot00000000000000[global] ;command_packages = distcmds [bdist_rpm] release = 1 packager = Bastian Kleineidam doc_files = doc/*.txt provides = patool group = Applications/Archiving install_script = install-rpm.sh python = python patool-1.4/setup.py000066400000000000000000000434401221117163600143730ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: iso-8859-1 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . """ Setup file for the distuils module. """ from __future__ import print_function import sys if not hasattr(sys, "version_info") or sys.version_info < (2, 7, 0, "final", 0): raise SystemExit("This program requires Python 2.7 or later.") import os import re import shutil import glob import subprocess try: from cx_Freeze import setup, Executable except ImportError: from distutils.core import setup try: # py2exe monkey-patches the distutils.core.Distribution class # So we need to import it before importing the Distribution class import py2exe has_py2exe = True except ImportError: # py2exe is not installed has_py2exe = False try: from cx_Freeze.dist import Distribution executables = [Executable("patool")] except ImportError: from distutils.core import Distribution executables = None from distutils.command.register import register from distutils.command.install_lib import install_lib from distutils import util from distutils.file_util import write_file AppName = "Patool" AppVersion = "1.4" MyName = "Bastian Kleineidam" MyEmail = "bastian.kleineidam@web.de" py_excludes = ['doctest', 'unittest', 'Tkinter', '_ssl', 'pdb', 'email', 'calendar', 'ftplib', 'httplib', 'pickle', 'optparse','rfc822' ] # py2exe options for Windows packaging py2exe_options = dict( packages=["encodings", 'patoolib.programs'], excludes=py_excludes, # silence py2exe error about not finding msvcp90.dll dll_excludes=['MSVCP90.dll'], compressed=1, optimize=2, ) # cx_Freeze for Linux RPM packaging cxfreeze_options = dict( packages=["encodings", 'patoolib.programs'], excludes=py_excludes, ) # Microsoft Visual C++ runtime version (tested with Python 2.7.2) MSVCP90Version = '9.0.21022.8' MSVCP90Token = '1fc8b3b9a1e18e3b' def normpath (path): """Norm a path name to platform specific notation.""" return os.path.normpath(path) def cnormpath (path): """Norm a path name to platform specific notation and make it absolute.""" path = normpath(path) if os.name == 'nt': # replace slashes with backslashes path = path.replace("/", "\\") if not os.path.isabs(path): path = normpath(os.path.join(sys.prefix, path)) return path release_ro = re.compile(r"\(released (.+)\)") def get_release_date (): """Parse and return relase date as string from doc/changelog.txt.""" fname = os.path.join("doc", "changelog.txt") release_date = "unknown" with open(fname) as fd: # the release date is on the first line line = fd.readline() mo = release_ro.search(line) if mo: release_date = mo.groups(1) return release_date data_files = [] if os.name == 'nt': data_files.append(('share', ['doc/patool.txt'])) else: data_files.append(('share/man/man1', ['doc/patool.1'])) def get_nt_platform_vars (): """Return program file path and architecture for NT systems.""" platform = util.get_platform() if platform == "win-amd64": # the Visual C++ runtime files are installed in the x86 directory progvar = "%ProgramFiles(x86)%" architecture = "amd64" elif platform == "win32": progvar = "%ProgramFiles%" architecture = "x86" else: raise ValueError("Unsupported platform %r" % platform) return os.path.expandvars(progvar), architecture def add_msvc_files (files): """Add needed MSVC++ runtime files. Only Version 9.0.21022.8 is tested and can be downloaded here: http://www.microsoft.com/en-us/download/details.aspx?id=29 """ prog_dir, architecture = get_nt_platform_vars() dirname = "Microsoft.VC90.CRT" version = "%s_%s_x-ww_d08d0375" % (MSVCP90Token, MSVCP90Version) args = (architecture, dirname, version) path = r'C:\Windows\WinSxS\%s_%s_%s\*.*' % args files.append((dirname, glob.glob(path))) # Copy the manifest file into the build directory and rename it # because it must have the same name as the directory. path = r'C:\Windows\WinSxS\Manifests\%s_%s_%s.manifest' % args target = os.path.join(os.getcwd(), 'build', '%s.manifest' % dirname) shutil.copy(path, target) files.append((dirname, [target])) if 'py2exe' in sys.argv[1:]: if not has_py2exe: raise SystemExit("py2exe module could not be imported") add_msvc_files(data_files) class MyInstallLib (install_lib, object): """Custom library installation.""" def install (self): """Install the generated config file.""" outs = super(MyInstallLib, self).install() infile = self.create_conf_file() outfile = os.path.join(self.install_dir, os.path.basename(infile)) self.copy_file(infile, outfile) outs.append(outfile) return outs def create_conf_file (self): """Create configuration file.""" cmd_obj = self.distribution.get_command_obj("install") cmd_obj.ensure_finalized() # we have to write a configuration file because we need the # directory (and other stuff like author, url, ...) # all paths are made absolute by cnormpath() data = [] for d in ['purelib', 'platlib', 'lib', 'headers', 'scripts', 'data']: attr = 'install_%s' % d if cmd_obj.root: # cut off root path prefix cutoff = len(cmd_obj.root) # don't strip the path separator if cmd_obj.root.endswith(os.sep): cutoff -= 1 val = getattr(cmd_obj, attr)[cutoff:] else: val = getattr(cmd_obj, attr) if attr == 'install_data': cdir = os.path.join(val, "share", "dosage") data.append('config_dir = %r' % cnormpath(cdir)) elif attr == 'install_lib': if cmd_obj.root: _drive, tail = os.path.splitdrive(val) if tail.startswith(os.sep): tail = tail[1:] self.install_lib = os.path.join(cmd_obj.root, tail) else: self.install_lib = val data.append("%s = %r" % (attr, cnormpath(val))) self.distribution.create_conf_file(data, directory=self.install_lib) return self.get_conf_output() def get_conf_output (self): """Get filename for distribution configuration file.""" return self.distribution.get_conf_filename(self.install_lib) def get_outputs (self): """Add the generated config file to the list of outputs.""" outs = super(MyInstallLib, self).get_outputs() outs.append(self.get_conf_output()) return outs class MyDistribution (Distribution, object): """Custom distribution class generating config file.""" def __init__ (self, attrs): """Set console and windows scripts.""" super(MyDistribution, self).__init__(attrs) self.console = ['patool'] def run_commands (self): """Generate config file and run commands.""" cwd = os.getcwd() data = [] data.append('config_dir = %r' % os.path.join(cwd, "config")) data.append("install_data = %r" % cwd) data.append("install_scripts = %r" % cwd) self.create_conf_file(data) super(MyDistribution, self).run_commands() def get_conf_filename (self, directory): """Get name for config file.""" return os.path.join(directory, "_%s_configdata.py" % self.get_name()) def create_conf_file (self, data, directory=None): """Create local config file from given data (list of lines) in the directory (or current directory if not given).""" data.insert(0, "# this file is automatically created by setup.py") data.insert(0, "# -*- coding: iso-8859-1 -*-") if directory is None: directory = os.getcwd() filename = self.get_conf_filename(directory) # add metadata metanames = ("name", "version", "author", "author_email", "maintainer", "maintainer_email", "url", "license", "description", "long_description", "keywords", "platforms", "fullname", "contact", "contact_email") for name in metanames: method = "get_" + name val = getattr(self.metadata, method)() data.append("%s = %r" % (name, val)) data.append('release_date = "%s"' % get_release_date()) # write the config file util.execute(write_file, (filename, data), "creating %s" % filename, self.verbose >= 1, self.dry_run) class InnoScript: """Class to generate INNO script.""" def __init__(self, lib_dir, dist_dir, windows_exe_files=[], console_exe_files=[], service_exe_files=[], comserver_files=[], lib_files=[]): """Store INNO script infos.""" self.lib_dir = lib_dir self.dist_dir = dist_dir if not self.dist_dir[-1] in "\\/": self.dist_dir += "\\" self.name = AppName self.lname = AppName.lower() self.version = AppVersion self.windows_exe_files = [self.chop(p) for p in windows_exe_files] self.console_exe_files = [self.chop(p) for p in console_exe_files] self.service_exe_files = [self.chop(p) for p in service_exe_files] self.comserver_files = [self.chop(p) for p in comserver_files] self.lib_files = [self.chop(p) for p in lib_files] self.icon = os.path.abspath(r'doc\icon\favicon.ico') def chop(self, pathname): """Remove distribution directory from path name.""" assert pathname.startswith(self.dist_dir) return pathname[len(self.dist_dir):] def create(self, pathname=r"dist\omt.iss"): """Create Inno script.""" self.pathname = pathname self.distfilebase = "%s-%s" % (self.name, self.version) self.distfile = self.distfilebase + ".exe" with open(self.pathname, "w") as fd: self.write_inno_script(fd) def write_inno_script (self, fd): """Write Inno script contents.""" print("; WARNING: This script has been created by py2exe. Changes to this script", file=fd) print("; will be overwritten the next time py2exe is run!", file=fd) print("[Setup]", file=fd) print("AppName=%s" % self.name, file=fd) print("AppVerName=%s %s" % (self.name, self.version), file=fd) print("ChangesEnvironment=true", file=fd) print(r"DefaultDirName={pf}\%s" % self.name, file=fd) print("DefaultGroupName=%s" % self.name, file=fd) print("OutputBaseFilename=%s" % self.distfilebase, file=fd) print("OutputDir=..", file=fd) print("SetupIconFile=%s" % self.icon, file=fd) print(file=fd) print("[Tasks]", file=fd) print("Name: modifypath; Description: Add application directory to %PATH%;", file=fd) print(file=fd) # List of source files files = self.windows_exe_files + \ self.console_exe_files + \ self.service_exe_files + \ self.comserver_files + \ self.lib_files print('[Files]', file=fd) for path in files: print(r'Source: "%s"; DestDir: "{app}\%s"; Flags: ignoreversion' % (path, os.path.dirname(path)), file=fd) # Set icon filename print('[Icons]', file=fd) for path in self.windows_exe_files: print(r'Name: "{group}\%s"; Filename: "{app}\%s"' % (self.name, path), file=fd) for path in self.console_exe_files: name = os.path.basename(path).capitalize() print(r'Name: "{group}\%s help"; Filename: "cmd.exe"; Parameters: "/K %s --help";' % (name, path), file=fd) print(r'Name: "{group}\Uninstall %s"; Filename: "{uninstallexe}"' % self.name, file=fd) print(file=fd) # Uninstall optional log files print('[UninstallDelete]', file=fd) for path in (self.windows_exe_files + self.console_exe_files): exename = os.path.basename(path) print(r'Type: files; Name: "{pf}\%s\%s.log"' % (self.name, exename), file=fd) print(file=fd) # Add app dir to PATH print("[Code]", file=fd) print("""\ const ModPathName = 'modifypath'; ModPathType = 'user'; function ModPathDir(): TArrayOfString; begin setArrayLength(Result, 1) Result[0] := ExpandConstant('{app}'); end; #include "modpath.iss" """, file=fd) shutil.copy(r"scripts\modpath.iss", "dist") def compile (self): """Compile Inno script with iscc.exe.""" progpath = get_nt_platform_vars()[0] cmd = r'%s\Inno Setup 5\iscc.exe' % progpath subprocess.check_call([cmd, self.pathname]) def sign (self): """Sign InnoSetup installer with local self-signed certificate.""" print("*** signing the inno setup installer ***") pfxfile = r'C:\%s.pfx' % self.lname if os.path.isfile(pfxfile): path = get_windows_sdk_path() signtool = os.path.join(path, "bin", "signtool.exe") if os.path.isfile(signtool): cmd = [signtool, 'sign', '/f', pfxfile, self.distfile] subprocess.check_call(cmd) else: print("No signed installer: signtool.exe not found.") else: print("No signed installer: certificate %s not found." % pfxfile) def get_windows_sdk_path(): """Return path of Microsoft Windows SDK installation, or None if not found.""" try: import _winreg as winreg except ImportError: import winreg sub_key = r"Software\Microsoft\Microsoft SDKs\Windows" with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, sub_key) as key: name = "CurrentInstallFolder" return winreg.QueryValueEx(key, name)[0] return None try: from py2exe.build_exe import py2exe as py2exe_build class MyPy2exe (py2exe_build): """First builds the exe file(s), then creates a Windows installer. Needs InnoSetup to be installed.""" def run (self): """Generate py2exe installer.""" # First, let py2exe do it's work. py2exe_build.run(self) print("*** preparing the inno setup script ***") lib_dir = self.lib_dir dist_dir = self.dist_dir # create the Installer, using the files py2exe has created. script = InnoScript(lib_dir, dist_dir, self.windows_exe_files, self.console_exe_files, self.service_exe_files, self.comserver_files, self.lib_files) print("*** creating the inno setup script ***") script.create() print("*** compiling the inno setup script ***") script.compile() script.sign() except ImportError: class MyPy2exe: """Dummy py2exe class.""" pass class MyRegister (register, object): """Custom register command.""" def build_post_data(self, action): """Force application name to lower case.""" data = super(MyRegister, self).build_post_data(action) data['name'] = data['name'].lower() return data args = dict( name = AppName, version = AppVersion, description = "portable archive file manager", long_description = """Various archive formats can be created, extracted, tested, listed, searched, compared and repacked by patool. The advantage of patool is its simplicity in handling archive files without having to remember a myriad of programs and options. The archive format is determined by the file(1) program and as a fallback by the archive file extension. patool supports 7z (.7z), ACE (.ace), ADF (.adf), ALZIP (.alz), APE (.ape), AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2), CAB (.cab), COMPRESS (.Z), CPIO (.cpio), DEB (.deb), DMS (.dms), FLAC (.flac), GZIP (.gz), ISO (.iso), LRZIP (.lrz), LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm), RAR (.rar), RZIP (.rz), SHN (.shn), TAR (.tar), XZ (.xz), ZIP (.zip, .jar) and ZOO (.zoo) formats. It relies on helper applications to handle those archive formats (for example bzip2 for BZIP2 archives). The archive formats TAR, ZIP, BZIP2 and GZIP are supported natively and do not require helper applications to be installed. """, author = MyName, author_email = MyEmail, maintainer = MyName, maintainer_email = MyEmail, license = "GPL", url = "http://wummel.github.io/patool/", packages = ['patoolib', 'patoolib.programs'], data_files = data_files, scripts = ['patool'], keywords = "archiver,archive,compression,commandline,manager", classifiers = [ 'Environment :: Console', 'Topic :: System :: Archiving', 'Development Status :: 5 - Production/Stable', 'License :: OSI Approved :: GNU General Public License (GPL)', 'Programming Language :: Python', 'Operating System :: OS Independent', ], distclass = MyDistribution, cmdclass = { 'install_lib': MyInstallLib, 'py2exe': MyPy2exe, 'register': MyRegister, }, options = { "py2exe": py2exe_options, "build_exe": cxfreeze_options, }, ) if executables: args["executables"] = executables setup(**args) patool-1.4/tests/000077500000000000000000000000001221117163600140165ustar00rootroot00000000000000patool-1.4/tests/__init__.py000066400000000000000000000071041221117163600161310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . import os import sys import patoolib import pytest import importlib basedir = os.path.dirname(__file__) datadir = os.path.join(basedir, 'data') patool_cmd = os.path.join(os.path.dirname(basedir), "patool") # Python 3.x renamed the function name attribute if sys.version_info[0] > 2: fnameattr = '__name__' else: fnameattr = 'func_name' def _need_func(testfunc, name, description): """Decorator skipping test if given testfunc returns False.""" def check_func(func): def newfunc(*args, **kwargs): if not testfunc(name): raise pytest.skip("%s %r is not available" % (description, name)) return func(*args, **kwargs) setattr(newfunc, fnameattr, getattr(func, fnameattr)) return newfunc return check_func def needs_os(name): """Decorator skipping test if given operating system is not available.""" return _need_func(lambda x: os.name == x, name, 'operating system') def needs_program(name): """Decorator skipping test if given program is not available.""" return _need_func(lambda x: patoolib.util.find_program(x), name, 'program') def needs_one_program(programs): """Decorator skipping test if not one of given programs are available.""" return _need_func(lambda x: all(map(patoolib.util.find_program, x)), programs, 'programs') def needs_module(name): """Decorator skipping test if given module is not available.""" def has_module(module): try: importlib.import_module(module) return True except ImportError: return False return _need_func(has_module, name, 'Python module') def needs_codec (program, codec): """Decorator skipping test if given program codec is not available.""" def check_prog (f): def newfunc (*args, **kwargs): if not patoolib.util.find_program(program): raise pytest.skip("program `%s' not available" % program) if not has_codec(program, codec): raise pytest.skip("codec `%s' for program `%s' not available" % (codec, program)) return f(*args, **kwargs) setattr(newfunc, fnameattr, getattr(f, fnameattr)) return newfunc return check_prog def has_codec (program, codec): """Test if program supports given codec.""" if program == '7z' and codec == 'rar': return patoolib.util.p7zip_supports_rar() if patoolib.program_supports_compression(program, codec): return True return patoolib.util.find_program(codec) def skip_on_travis(): """Skip test if TRAVIS build environment is detected.""" def check_func(func): def newfunc(*args, **kwargs): if "TRAVIS" in os.environ: raise pytest.skip("Skip on TRAVIS CI build.") return func(*args, **kwargs) setattr(newfunc, fnameattr, getattr(func, fnameattr)) return newfunc return check_func patool-1.4/tests/archives/000077500000000000000000000000001221117163600156225ustar00rootroot00000000000000patool-1.4/tests/archives/__init__.py000066400000000000000000000232451221117163600177410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . import unittest import os import shutil import patoolib from .. import basedir, datadir # All text files have '42' as content. TextFileContent = '42' class Content: """The test archives have one of several set of content files. The different content file sets have each a constant defined by this class. """ # Recursive archives for extraction have a text file in a directory: # t/t.txt # Recursive archives for creation have two text files in directories: # foo dir/t.txt # foo dir/bar/t.txt Recursive = 'recursive' # Singlefile archives for extraction have a text file t.txt # Singlefile archives for creation have a text file `foo .txt' Singlefile = 'singlefile' # Multifile archives for extraction have two text files: t.txt and t2.txt # Multifile archives for creation have two text files: foo .txt and foo2 .txt Multifile = 'multifile' class ArchiveTest (unittest.TestCase): """Helper class for archive tests, handling one commandline program.""" # set program to use for archive handling in subclass program = None def archive_commands (self, filename, **kwargs): """Run archive commands list, test, extract and create. All keyword arguments are delegated to the create test function.""" self.archive_list(filename) if not kwargs.get('skip_test'): self.archive_test(filename) self.archive_extract(filename, check=kwargs.get('check', Content.Recursive)) if not kwargs.get('skip_create'): self.archive_create(filename, **kwargs) def archive_extract (self, filename, check=Content.Recursive): """Test archive extraction.""" archive = os.path.join(datadir, filename) self.assertTrue(os.path.isabs(archive), "archive path is not absolute: %r" % archive) self._archive_extract(archive, check) # archive name relative to tmpdir relarchive = os.path.join("..", archive[len(basedir)+1:]) self._archive_extract(relarchive, check, verbosity=1) def _archive_extract (self, archive, check, verbosity=0): # create a temporary directory for extraction tmpdir = patoolib.util.tmpdir(dir=basedir) try: olddir = patoolib.util.chdir(tmpdir) try: output = patoolib.extract_archive(archive, program=self.program, verbosity=verbosity) if check: self.check_extracted_archive(archive, output, check) finally: if olddir: os.chdir(olddir) finally: shutil.rmtree(tmpdir) def check_extracted_archive (self, archive, output, check): if check == Content.Recursive: # outdir is the 't' directory of the archive self.assertEqual(output, 't') self.check_directory(output, 't') txtfile = os.path.join(output, 't.txt') self.check_textfile(txtfile, 't.txt') elif check == Content.Singlefile: # a non-existing directory to ensure files do not exist in it ned = get_nonexisting_directory(os.getcwd()) expected_output = os.path.basename(patoolib.util.get_single_outfile(ned, archive)) self.check_textfile(output, expected_output) elif check == Content.Multifile: txtfile = os.path.join(output, 't.txt') self.check_textfile(txtfile, 't.txt') txtfile2 = os.path.join(output, 't2.txt') self.check_textfile(txtfile2, 't2.txt') def check_directory (self, dirname, expectedname): """Check that directory exists.""" self.assertTrue(os.path.isdir(dirname), dirname) self.assertEqual(os.path.basename(dirname), expectedname) def check_textfile (self, filename, expectedname): """Check that filename exists and has the default content.""" self.assertTrue(os.path.isfile(filename), repr(filename)) self.assertEqual(os.path.basename(filename), expectedname) self.assertEqual(get_filecontent(filename), TextFileContent) def archive_list (self, filename): """Test archive listing.""" archive = os.path.join(datadir, filename) for verbosity in (-1, 0, 1, 2): patoolib.list_archive(archive, program=self.program, verbosity=verbosity) def archive_test (self, filename): """Test archive testing.""" archive = os.path.join(datadir, filename) for verbosity in (-1, 0, 1, 2): patoolib.test_archive(archive, program=self.program, verbosity=verbosity) def archive_create (self, archive, srcfiles=None, check=Content.Recursive): """Test archive creation.""" if srcfiles is None: if check == Content.Recursive: srcfiles = ('t',) elif check == Content.Singlefile: srcfiles = ('t.txt',) elif check == Content.Multifile: srcfiles = ('t.txt', 't2.txt',) else: raise ValueError('invalid check value %r' % check) olddir = patoolib.util.chdir(datadir) try: # The format and compression arguments are needed for creating # archives with unusual file extensions. for verbosity in (-1, 0, 1, 2): self._archive_create(archive, srcfiles, program=self.program, verbosity=verbosity) finally: if olddir: os.chdir(olddir) def _archive_create (self, archive, srcfiles, program=None, verbosity=0): """Create archive from filename.""" for srcfile in srcfiles: self.assertFalse(os.path.isabs(srcfile)) self.assertTrue(os.path.exists(srcfile)) # create a temporary directory for creation tmpdir = patoolib.util.tmpdir(dir=basedir) try: archive = os.path.join(tmpdir, archive) self.assertTrue(os.path.isabs(archive), "archive path is not absolute: %r" % archive) patoolib.create_archive(archive, srcfiles, verbosity=verbosity, program=program) self.assertTrue(os.path.isfile(archive)) self.check_created_archive_with_test(archive) self.check_created_archive_with_diff(archive, srcfiles) finally: shutil.rmtree(tmpdir) def check_created_archive_with_test(self, archive): command = patoolib.test_archive program = self.program # special case for programs that cannot test what they create if self.program in ('compress', 'py_gzip'): program = 'gzip' elif self.program == 'py_bz2': program = 'bzip2' elif self.program == 'py_lzma': program = 'xz' elif self.program == 'zip': program = 'unzip' elif self.program in ('rzip', 'shorten'): program = 'py_echo' command = patoolib.list_archive elif self.program == 'lcab': program = 'cabextract' elif self.program == 'genisoimage': program = '7z' elif self.program == 'shar': return command(archive, program=program) def check_created_archive_with_diff(self, archive, srcfiles): """Extract created archive again and compare the contents.""" # diff srcfile and output diff = patoolib.util.find_program("diff") if not diff: return program = self.program # special case for programs that cannot extract what they create if self.program == 'compress': program = 'gzip' elif self.program == 'zip': program = 'unzip' elif self.program == 'lcab': program = 'cabextract' elif self.program == 'shar': program = 'unshar' elif self.program == 'genisoimage': program = '7z' tmpdir = patoolib.util.tmpdir(dir=basedir) try: olddir = patoolib.util.chdir(tmpdir) try: output = patoolib.extract_archive(archive, program=program) if len(srcfiles) == 1: source = os.path.join(datadir, srcfiles[0]) patoolib.util.run_checked([diff, "-urN", source, output]) else: for srcfile in srcfiles: source = os.path.join(datadir, srcfile) target = os.path.join(output, srcfile) patoolib.util.run_checked([diff, "-urN", source, target]) finally: if olddir: os.chdir(olddir) finally: shutil.rmtree(tmpdir) def get_filecontent(filename): """Get file data as text.""" with open(filename) as fo: return fo.read() def get_nonexisting_directory(basedir): """Note: this is _not_ intended to be used to create a directory.""" d = os.path.join(basedir, "foo") while os.path.exists(d): d += 'a' if len(d) > 100: # wtf raise ValueError('could not construct unique directory name at %r' % basedir) return d patool-1.4/tests/archives/test_7z.py000066400000000000000000000107711221117163600176010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program, needs_codec class Test7z (ArchiveTest): program = '7z' @needs_program(program) def test_7z (self): self.archive_commands('t .7z') self.archive_commands('t.zip') self.archive_commands('t.txt.xz', check=Content.Singlefile) self.archive_list('t.txt.gz') self.archive_list('t.txt.bz2') self.archive_list('t.txt.lzma') self.archive_list('t.jar') self.archive_list('t.txt.Z') self.archive_list('t.cab') self.archive_list('t.arj') self.archive_list('t.cpio') self.archive_list('t.rpm') self.archive_list('t.deb') self.archive_list('t.iso') self.archive_extract('t.txt.gz', check=Content.Singlefile) self.archive_extract('t.txt.bz2', check=Content.Singlefile) self.archive_extract('t.txt.lzma', check=Content.Singlefile) self.archive_extract('t.jar', check=None) self.archive_extract('t.txt.Z', check=Content.Singlefile) self.archive_extract('t.cab') self.archive_extract('t.arj') self.archive_extract('t.cpio') self.archive_extract('t.rpm', check=None) self.archive_extract('t.deb', check=None) self.archive_extract('t.iso') self.archive_test('t.txt.gz') self.archive_test('t.txt.bz2') self.archive_test('t.txt.lzma') self.archive_test('t.jar') self.archive_test('t.txt.Z') self.archive_test('t.cab') self.archive_test('t.arj') self.archive_test('t.cpio') self.archive_test('t.rpm') self.archive_test('t.deb') self.archive_test('t.iso') self.archive_create('t.txt.gz', check=Content.Singlefile) @needs_codec(program, 'rar') def test_7z_rar (self): # only succeeds with the rar module for 7z installed self.archive_list('t.rar') self.archive_extract('t.rar') self.archive_test('t.rar') @needs_program('file') @needs_program(program) def test_7z_file (self): self.archive_commands('t.7z.foo', skip_create=True) self.archive_commands('t.zip.foo', skip_create=True) self.archive_commands('t.txt.xz.foo', skip_create=True, check=Content.Singlefile) self.archive_list('t.txt.gz.foo') self.archive_list('t.txt.bz2.foo') self.archive_list('t.jar.foo') self.archive_list('t.txt.Z.foo') self.archive_list('t.cab.foo') self.archive_list('t.arj.foo') self.archive_list('t.cpio.foo') self.archive_list('t.rpm.foo') self.archive_list('t.deb.foo') self.archive_list('t.iso.foo') self.archive_extract('t.txt.gz.foo', check=None) self.archive_extract('t.txt.bz2.foo', check=Content.Singlefile) self.archive_extract('t.jar.foo', check=None) self.archive_extract('t.txt.Z.foo', check=Content.Singlefile) self.archive_extract('t.cab.foo') self.archive_extract('t.arj.foo') self.archive_extract('t.cpio.foo') self.archive_extract('t.rpm.foo', check=None) self.archive_extract('t.deb.foo', check=None) self.archive_extract('t.iso.foo') self.archive_test('t.txt.gz.foo') self.archive_test('t.txt.bz2.foo') self.archive_test('t.jar.foo') self.archive_test('t.txt.Z.foo') self.archive_test('t.cab.foo') self.archive_test('t.arj.foo') self.archive_test('t.cpio.foo') self.archive_test('t.rpm.foo') self.archive_test('t.deb.foo') self.archive_test('t.iso.foo') @needs_program('file') @needs_codec(program, 'rar') def test_7z_rar_file (self): # only succeeds with the rar module for 7z installed self.archive_list('t.rar.foo') self.archive_extract('t.rar.foo') self.archive_test('t.rar.foo') patool-1.4/tests/archives/test_7za.py000066400000000000000000000051461221117163600177420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class Test7za (ArchiveTest): program = '7za' @needs_program(program) def test_p7azip (self): self.archive_commands('t .7z') self.archive_commands('t.zip') self.archive_list('t.txt.gz') self.archive_list('t.txt.bz2') self.archive_list('t.jar') self.archive_list('t.txt.Z') self.archive_list('t.cab') self.archive_list('t.rpm') self.archive_extract('t.txt.gz', check=Content.Singlefile) self.archive_extract('t.txt.bz2', check=Content.Singlefile) self.archive_extract('t.jar', check=None) self.archive_extract('t.txt.Z', check=Content.Singlefile) self.archive_extract('t.cab') self.archive_test('t.txt.gz') self.archive_test('t.txt.bz2') self.archive_test('t.jar') self.archive_test('t.txt.Z') self.archive_test('t.cab') self.archive_create('t.txt.gz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_7za_file (self): self.archive_commands('t.7z.foo', skip_create=True) self.archive_commands('t.zip.foo', skip_create=True) self.archive_list('t.txt.gz.foo') self.archive_list('t.txt.bz2.foo') self.archive_list('t.jar.foo') self.archive_list('t.txt.Z.foo') self.archive_list('t.cab.foo') self.archive_list('t.rpm.foo') self.archive_extract('t.txt.gz.foo', check=None) self.archive_extract('t.txt.bz2.foo', check=Content.Singlefile) self.archive_extract('t.jar.foo', check=None) self.archive_extract('t.txt.Z.foo', check=Content.Singlefile) self.archive_extract('t.cab.foo') self.archive_test('t.txt.gz.foo') self.archive_test('t.txt.bz2.foo') self.archive_test('t.jar.foo') self.archive_test('t.txt.Z.foo') self.archive_test('t.cab.foo') patool-1.4/tests/archives/test_ar.py000066400000000000000000000022011221117163600176300ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program, needs_os class TestAr (ArchiveTest): program = 'ar' @needs_os('posix') @needs_program(program) def test_ar(self): self.archive_commands('t.txt.a', check=Content.Singlefile) @needs_os('posix') @needs_program('file') @needs_program(program) def test_ar_file(self): self.archive_commands('t.txt.a.foo', skip_create=True, check=None) patool-1.4/tests/archives/test_arc.py000066400000000000000000000021241221117163600177770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestArc(ArchiveTest): program = 'arc' @needs_program(program) def test_arc(self): self.archive_commands('t.arc', check=Content.Multifile) @needs_program('file') @needs_program(program) def test_arc_file(self): self.archive_commands('t.arc.foo', check=Content.Multifile, skip_create=True) patool-1.4/tests/archives/test_archmage.py000066400000000000000000000021701221117163600210020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestArchmage (ArchiveTest): program = 'archmage' @needs_program(program) def test_archmage (self): self.archive_extract('t.chm', check=None) self.archive_test('t.chm') @needs_program('file') @needs_program(program) def test_archmage_file (self): self.archive_extract('t.chm.foo', check=None) self.archive_test('t.chm.foo') patool-1.4/tests/archives/test_arj.py000066400000000000000000000020321221117163600200040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestArj (ArchiveTest): program = 'arj' @needs_program(program) def test_arj(self): self.archive_commands('t.arj') @needs_program('file') @needs_program(program) def test_arj_file(self): self.archive_commands('t.arj.foo', skip_create=True) patool-1.4/tests/archives/test_bsdcpio.py000066400000000000000000000020541221117163600206570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestBsdcpio (ArchiveTest): program = 'bsdcpio' @needs_program(program) def test_bsdcpio(self): self.archive_commands('t.cpio') @needs_program('file') @needs_program(program) def test_bsdcpio_file(self): self.archive_commands('t.cpio.foo', skip_create=True) patool-1.4/tests/archives/test_bsdtar.py000066400000000000000000000063411221117163600205160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program, needs_codec class TestBsdtar (ArchiveTest): program = 'bsdtar' @needs_program(program) def test_bsdtar (self): self.archive_commands('t.tar') @needs_codec(program, 'gzip') def test_bsdtar_gz (self): self.archive_commands('t.tar.gz') self.archive_commands('t.tgz') @needs_program(program) @needs_program('compress') def test_bsdtar_z (self): self.archive_commands('t.tar.Z') self.archive_commands('t.taz') @needs_codec(program, 'bzip2') def test_bsdtar_bz2 (self): self.archive_commands('t.tar.bz2') self.archive_commands('t.tbz2') @needs_codec(program, 'lzma') def test_bsdtar_lzma (self): self.archive_commands('t.tar.lzma') # bsdtar cannot read archives created with tar and lzip #@needs_program(program) #@needs_program('lzip') #def test_bsdtar_lzip (self): # self.archive_commands('t.tar.lz') @needs_codec(program, 'xz') def test_bsdtar_xz (self): self.archive_commands('t.tar.xz') @needs_program('file') @needs_program(program) def test_bsdtar_file (self): self.archive_commands('t.tar.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'gzip') def test_bsdtar_gz_file (self): self.archive_commands('t.tar.gz.foo', skip_create=True) self.archive_commands('t.tgz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'compress') def test_bsdtar_z_file (self): self.archive_commands('t.tar.Z.foo', skip_create=True) self.archive_commands('t.taz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'bzip2') def test_bsdtar_bz2_file (self): self.archive_commands('t.tar.bz2.foo', skip_create=True) self.archive_commands('t.tbz2.foo', skip_create=True) # file(1) does not recognize .lzma files (at least not with --uncompress) #@needs_program('file') #@needs_codec(program, 'lzma') #def test_bsdtar_lzma_file (self): # self.archive_commands('t.tar.lzma.foo', skip_create=True) # bsdtar cannot read archives created with tar and lzip #@needs_program('lzip') #@needs_program('file') #@needs_codec(program, 'lzip') #def test_bsdtar_lzip_file (self): # self.archive_commands('t.tar.lz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'xz') def test_bsdtar_xz_file (self): self.archive_commands('t.tar.xz.foo', skip_create=True) patool-1.4/tests/archives/test_bzip2.py000066400000000000000000000023521221117163600202630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestBzip2 (ArchiveTest): program = 'bzip2' @needs_program(program) def test_bzip2 (self): self.archive_extract('t.txt.bz2', check=Content.Singlefile) self.archive_test('t.txt.bz2') self.archive_create('t.txt.bz2', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_bzip2_file (self): self.archive_extract('t.txt.bz2.foo', check=Content.Singlefile) self.archive_test('t.txt.bz2.foo') patool-1.4/tests/archives/test_cabextract.py000066400000000000000000000022051221117163600213520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestCabextract (ArchiveTest): program = 'cabextract' @needs_program(program) def test_cabextract (self): self.archive_list('t.cab') self.archive_extract('t.cab', check=None) @needs_program('file') @needs_program(program) def test_cabextract_file(self): self.archive_list('t.cab.foo') self.archive_extract('t.cab.foo', check=None) patool-1.4/tests/archives/test_chmlib.py000066400000000000000000000020621221117163600204710ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestChmlib (ArchiveTest): program = 'extract_chmLib' @needs_program(program) def test_archmage (self): self.archive_extract('t.chm', check=None) @needs_program('file') @needs_program(program) def test_archmage_file (self): self.archive_extract('t.chm.foo', check=None) patool-1.4/tests/archives/test_clzip.py000066400000000000000000000023431221117163600203560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestClzip (ArchiveTest): program = 'clzip' @needs_program(program) def test_clzip(self): self.archive_test('t.txt.lz') self.archive_extract('t.txt.lz', check=Content.Singlefile) self.archive_create('t.txt.lz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_clzip_file(self): self.archive_test('t.txt.lz.foo') self.archive_extract('t.txt.lz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_compress.py000066400000000000000000000016721221117163600210740ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestCompress (ArchiveTest): program = 'compress' @needs_program(program) def test_compress (self): self.archive_create('t.txt.Z', check=Content.Singlefile) patool-1.4/tests/archives/test_cpio.py000066400000000000000000000020401221117163600201610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestCpio (ArchiveTest): program = 'cpio' @needs_program(program) def test_cpio(self): self.archive_commands('t.cpio') @needs_program('file') @needs_program(program) def test_cpio_file(self): self.archive_commands('t.cpio.foo', skip_create=True) patool-1.4/tests/archives/test_dpkg.py000066400000000000000000000022721221117163600201630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestDpkg (ArchiveTest): program = 'dpkg-deb' @needs_program(program) def test_dpkg(self): self.archive_list('t.deb') self.archive_extract('t.deb', check=None) self.archive_test('t.deb') @needs_program('file') @needs_program(program) def test_dpkg_file(self): self.archive_list('t.deb.foo') self.archive_extract('t.deb.foo', check=None) self.archive_test('t.deb.foo') patool-1.4/tests/archives/test_flac.py000066400000000000000000000022521221117163600201410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestFlac (ArchiveTest): program = 'flac' @needs_program(program) def test_flac(self): self.archive_extract('t.flac', check=None) self.archive_test('t.flac') self.archive_create('t.flac', srcfiles=("t.wav",)) @needs_program('file') @needs_program(program) def test_flac_file(self): self.archive_extract('t.flac.foo', check=None) self.archive_test('t.flac.foo') patool-1.4/tests/archives/test_genisoimage.py000066400000000000000000000017131221117163600215240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestGenisoimage(ArchiveTest): program = 'genisoimage' # needs 7z for testing @needs_program('7z') @needs_program(program) def test_genisoimage(self): self.archive_create('t.iso') patool-1.4/tests/archives/test_gzip.py000066400000000000000000000023341221117163600202060ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestGzip (ArchiveTest): program = 'gzip' @needs_program(program) def test_gzip (self): self.archive_commands('t.txt.gz', check=Content.Singlefile) self.archive_extract('t.txt.Z', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_gzip_file(self): self.archive_commands('t.txt.gz.foo', skip_create=True, check=None) self.archive_extract('t.txt.Z.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_isoinfo.py000066400000000000000000000017561221117163600207120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestIsoinfo(ArchiveTest): program = 'isoinfo' @needs_program(program) def test_isoinfo(self): self.archive_list('t.iso') @needs_program(program) def test_isoinfo_file(self): self.archive_list('t.iso.foo') patool-1.4/tests/archives/test_lbzip2.py000066400000000000000000000023561221117163600204430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestLbzip2 (ArchiveTest): program = 'lbzip2' @needs_program(program) def test_lbzip2 (self): self.archive_extract('t.txt.bz2', check=Content.Singlefile) self.archive_test('t.txt.bz2') self.archive_create('t.txt.bz2', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_lbzip2_file (self): self.archive_extract('t.txt.bz2.foo', check=Content.Singlefile) self.archive_test('t.txt.bz2.foo') patool-1.4/tests/archives/test_lcab.py000066400000000000000000000016531221117163600201410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestLcab (ArchiveTest): program = 'lcab' @needs_program(program) @needs_program('cabextract') def test_lcab (self): self.archive_create('t.cab') patool-1.4/tests/archives/test_lha.py000066400000000000000000000020711221117163600177770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestLha (ArchiveTest): program = 'lha' @needs_program(program) def _test_lha(self): # XXX currently fails self.archive_commands('t.lha') @needs_program('file') @needs_program(program) def test_lha_file(self): self.archive_commands('t.lha.foo', skip_create=True) patool-1.4/tests/archives/test_lhasa.py000066400000000000000000000016151221117163600203260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestLhasa (ArchiveTest): program = 'lhasa' @needs_program(program) def test_lhasa(self): self.archive_extract('t.lha') patool-1.4/tests/archives/test_lrzip.py000066400000000000000000000025271221117163600204010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestLrzip (ArchiveTest): program = 'lrzip' @needs_program(program) def test_lrzip(self): self.archive_test('t.txt.lrz') self.archive_extract('t.txt.lrz', check=Content.Singlefile) self.archive_create('t.txt.lrz', check=Content.Singlefile) # file(1) does not recognize .lrz files #@needs_program('file') #@needs_program(program) #def test_lrzip_file(self): # self.archive_test('t.txt.lrz.foo') # self.archive_extract('t.txt.lrz.foo') # self.archive_create('t.txt.lrz.foo', format="lrzip", check=Content.Singlefile) patool-1.4/tests/archives/test_lzip.py000066400000000000000000000023371221117163600202160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestLzip (ArchiveTest): program = 'lzip' @needs_program(program) def test_lzip(self): self.archive_test('t.txt.lz') self.archive_extract('t.txt.lz', check=Content.Singlefile) self.archive_create('t.txt.lz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_lzip_file(self): self.archive_test('t.txt.lz.foo') self.archive_extract('t.txt.lz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_lzma.py000066400000000000000000000023711221117163600202010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestLzma (ArchiveTest): program = 'lzma' @needs_program(program) def test_lzma(self): self.archive_test('t.txt.lzma') self.archive_extract('t.txt.lzma', check=Content.Singlefile) self.archive_create('t.txt.lzma', check=Content.Singlefile) # file(1) does not recognize .lzma files #@needs_program('file') #@needs_program(program) #def test_lzma_file(self): # self.archive_test('t.lzma.foo') # self.archive_extract('t.lzma.foo') patool-1.4/tests/archives/test_lzop.py000066400000000000000000000021431221117163600202170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestLzop (ArchiveTest): program = 'lzop' @needs_program(program) def test_lzop(self): self.archive_commands('t.txt.lzo', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_lzop_file(self): self.archive_commands('t.txt.lzo.foo', skip_create=True, check=Content.Singlefile) patool-1.4/tests/archives/test_mac.py000066400000000000000000000021731221117163600177760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestMac (ArchiveTest): program = 'mac' @needs_program(program) def test_mac(self): self.archive_extract('t.ape', check=None) self.archive_test('t.ape') self.archive_create('t.ape', srcfiles=("t.wav",)) @needs_program('file') @needs_program(program) def test_mac_file(self): self.archive_extract('t.ape.foo', check=None) patool-1.4/tests/archives/test_nomarch.py000066400000000000000000000023441221117163600206650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestNomarch(ArchiveTest): program = 'nomarch' @needs_program(program) def test_nomarch(self): self.archive_test('t.arc') self.archive_list('t.arc') self.archive_extract('t.arc', check=Content.Multifile) @needs_program('file') @needs_program(program) def test_nomarch_file(self): self.archive_test('t.arc.foo') self.archive_list('t.arc.foo') self.archive_extract('t.arc.foo', check=Content.Multifile) patool-1.4/tests/archives/test_pbzip2.py000066400000000000000000000023561221117163600204470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestPbzip2 (ArchiveTest): program = 'pbzip2' @needs_program(program) def test_pbzip2 (self): self.archive_extract('t.txt.bz2', check=Content.Singlefile) self.archive_test('t.txt.bz2') self.archive_create('t.txt.bz2', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_pbzip2_file (self): self.archive_extract('t.txt.bz2.foo', check=Content.Singlefile) self.archive_test('t.txt.bz2.foo') patool-1.4/tests/archives/test_pdlzip.py000066400000000000000000000023471221117163600205430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestPdlzip (ArchiveTest): program = 'pdlzip' @needs_program(program) def test_pdlzip(self): self.archive_test('t.txt.lz') self.archive_extract('t.txt.lz', check=Content.Singlefile) self.archive_create('t.txt.lz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_pdlzip_file(self): self.archive_test('t.txt.lz.foo') self.archive_extract('t.txt.lz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_pigz.py000066400000000000000000000021741221117163600202100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestPigz (ArchiveTest): program = 'pigz' @needs_program(program) def test_pigz (self): self.archive_commands('t.txt.gz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_pigz_file (self): self.archive_commands('t.txt.gz.foo', check=Content.Singlefile, skip_create=True, skip_test=True) patool-1.4/tests/archives/test_plzip.py000066400000000000000000000023431221117163600203730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestPlzip (ArchiveTest): program = 'plzip' @needs_program(program) def test_plzip(self): self.archive_test('t.txt.lz') self.archive_extract('t.txt.lz', check=Content.Singlefile) self.archive_create('t.txt.lz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_plzip_file(self): self.archive_test('t.txt.lz.foo') self.archive_extract('t.txt.lz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_pybz2.py000066400000000000000000000022631221117163600203040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestPybz2 (ArchiveTest): program = 'py_bz2' @needs_program('bzip2') def test_py_bz2 (self): self.archive_extract('t.txt.bz2', check=Content.Singlefile) # bzip2 is used to test the created archive self.archive_create('t.txt.bz2', check=Content.Singlefile) @needs_program('file') def test_py_bz2_file (self): self.archive_extract('t.txt.bz2.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_pyecho.py000066400000000000000000000032601221117163600205230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestPyecho (ArchiveTest): program = 'py_echo' def test_py_echo (self): self.archive_list('t.txt.bz2') self.archive_list('t.txt.Z') self.archive_list('t.txt.lzma') self.archive_list('t.txt.lz') self.archive_list('t.txt.lrz') self.archive_list('t.txt.rz') self.archive_list('t.ape') self.archive_list('t.shn') self.archive_list('t.flac') @needs_program('file') def test_py_echo_file (self): self.archive_list('t.txt.bz2.foo') self.archive_list('t.txt.Z.foo') # file(1) does not recognize .lzma files #self.archive_list('t.lzma.foo') self.archive_list('t.txt.lz.foo') self.archive_list('t.txt.lrz') self.archive_list('t.txt.rz.foo') self.archive_list('t.ape.foo') # file(1) does not recognize .shn files #self.archive_list('t.shn.foo') self.archive_list('t.flac.foo') patool-1.4/tests/archives/test_pygzip.py000066400000000000000000000022621221117163600205570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestPygzip (ArchiveTest): program = 'py_gzip' @needs_program('gzip') def test_py_gzip (self): self.archive_extract('t.txt.gz', check=Content.Singlefile) # gzip is used to test the created archive self.archive_create('t.txt.gz', check=Content.Singlefile) @needs_program('file') def test_py_gzip_file (self): self.archive_extract('t.txt.gz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_pylzma.py000066400000000000000000000026751221117163600205610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program, needs_module class TestPylzma (ArchiveTest): program = 'py_lzma' @needs_program('xz') @needs_module('lzma') def test_py_lzma (self): self.archive_extract('t.txt.lzma', check=Content.Singlefile) self.archive_extract('t.txt.xz', check=Content.Singlefile) # xz is used to test the created archive self.archive_create('t.txt.lzma', check=Content.Singlefile) self.archive_create('t.txt.xz', check=Content.Singlefile) @needs_program('file') @needs_module('lzma') def test_py_lzma_file (self): self.archive_extract('t.txt.lzma.foo', check=Content.Singlefile) self.archive_extract('t.txt.xz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_pytarfile.py000066400000000000000000000031611221117163600212330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestPytarfile (ArchiveTest): program = 'py_tarfile' def test_py_tarfile (self): self.archive_commands('t.tar') def test_py_tarfile_gz (self): self.archive_commands('t.tar.gz') self.archive_commands('t.tgz') def test_py_tarfile_bz2 (self): self.archive_commands('t.tar.bz2') self.archive_commands('t.tbz2') @needs_program('file') def test_py_tarfile_file (self): self.archive_commands('t.tar.foo', skip_create=True) @needs_program('file') def test_py_tarfile_gz_file (self): self.archive_commands('t.tar.gz.foo', skip_create=True) self.archive_commands('t.tgz.foo', skip_create=True) @needs_program('file') def test_py_tarfile_bz2_file (self): self.archive_commands('t.tar.bz2.foo', skip_create=True) self.archive_commands('t.tbz2.foo', skip_create=True) patool-1.4/tests/archives/test_pyzipfile.py000066400000000000000000000017751221117163600212600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestPyzipfile (ArchiveTest): program = 'py_zipfile' def test_py_zipfile(self): self.archive_commands('t.zip') @needs_program('file') def test_py_zipfile_file(self): self.archive_commands('t.zip.foo', skip_create=True) patool-1.4/tests/archives/test_rar.py000066400000000000000000000020321221117163600200140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestRar (ArchiveTest): program = 'rar' @needs_program(program) def test_rar(self): self.archive_commands('t.rar') @needs_program('file') @needs_program(program) def test_rar_file(self): self.archive_commands('t.rar.foo', skip_create=True) patool-1.4/tests/archives/test_rpm.py000066400000000000000000000026141221117163600200340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestRpm (ArchiveTest): program = 'rpm' @needs_program('rpm') def test_rpm(self): self.archive_list('t.rpm') # The rpm test fails on non-rpm system with missing dependencies. # I am too lazy to build a tiny rpm with one file # and no dependency. #self.archive_test('t.rpm') @needs_program('file') @needs_program(program) def test_rpm_file(self): self.archive_list('t.rpm.foo') # The rpm test fails on non-rpm system with missing dependencies. # I am too lazy to build a tiny rpm with one file # and no dependency. #self.archive_test('t.rpm.foo') patool-1.4/tests/archives/test_rpm2cpio.py000066400000000000000000000021501221117163600207640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestRpm2cpio (ArchiveTest): program = 'rpm2cpio' @needs_program(program) @needs_program('cpio') def test_rpm2cpio(self): self.archive_extract('t.rpm', check=None) @needs_program('file') @needs_program(program) @needs_program('cpio') def test_rpm2cpio_file(self): self.archive_extract('t.rpm.foo', check=None) patool-1.4/tests/archives/test_rzip.py000066400000000000000000000021641221117163600202220ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestRzip (ArchiveTest): program = 'rzip' @needs_program(program) def test_rzip(self): self.archive_extract('t.txt.rz', check=Content.Singlefile) self.archive_create('t.txt.rz', check=Content.Singlefile) @needs_program(program) def test_rzip_file(self): self.archive_extract('t.txt.rz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_shar.py000066400000000000000000000017121221117163600201710ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestShar (ArchiveTest): program = 'shar' @needs_program(program) @needs_program('unshar') def test_shar(self): self.archive_create('t.shar', check=Content.Singlefile) patool-1.4/tests/archives/test_shorten.py000066400000000000000000000022301221117163600207120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestShorten (ArchiveTest): program = 'shorten' @needs_program(program) def test_shorten(self): self.archive_extract('t.shn', check=None) self.archive_create('t.shn', srcfiles=("t.wav",)) # file(1) does not recognize .shn files #@needs_program('file') #@needs_program(program) #def test_shorten_file(self): # self.archive_extract('t.shn.foo', check=None) patool-1.4/tests/archives/test_star.py000066400000000000000000000060041221117163600202040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program, needs_codec class TestStar (ArchiveTest): program = 'star' @needs_program(program) def test_star (self): self.archive_commands('t.tar') @needs_codec(program, 'gzip') def test_star_gz (self): self.archive_commands('t.tar.gz') self.archive_commands('t.tgz') @needs_program(program) @needs_program('compress') def test_star_z (self): self.archive_commands('t.tar.Z') self.archive_commands('t.taz') @needs_codec(program, 'bzip2') def test_star_bz2 (self): self.archive_commands('t.tar.bz2') self.archive_commands('t.tbz2') @needs_codec(program, 'lzma') def test_star_lzma (self): self.archive_commands('t.tar.lzma') @needs_program(program) @needs_program('lzip') def test_star_lzip (self): self.archive_commands('t.tar.lz') @needs_codec(program, 'xz') def test_star_xz (self): self.archive_commands('t.tar.xz') @needs_program('file') @needs_program(program) def test_star_file (self): self.archive_commands('t.tar.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'gzip') def test_star_gz_file (self): self.archive_commands('t.tar.gz.foo', skip_create=True) self.archive_commands('t.tgz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'compress') def test_star_z_file (self): self.archive_commands('t.tar.Z.foo', skip_create=True) self.archive_commands('t.taz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'bzip2') def test_star_bz2_file (self): self.archive_commands('t.tar.bz2.foo', skip_create=True) self.archive_commands('t.tbz2.foo', skip_create=True) # file(1) does not recognize .lzma files #@needs_program('file') #@needs_codec(program, 'lzma') #def test_star_lzma_file (self): # self.archive_commands('t.tar.lzma.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'lzip') def test_star_lzip_file (self): self.archive_commands('t.tar.lz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'xz') def test_star_xz_file (self): self.archive_commands('t.tar.xz.foo', skip_create=True) patool-1.4/tests/archives/test_tar.py000066400000000000000000000065201221117163600200240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program, needs_codec class TestTar (ArchiveTest): program = 'tar' @needs_program(program) def test_tar (self): self.archive_commands('t.tar') @needs_codec(program, 'gzip') def test_tar_gz (self): self.archive_commands('t.tar.gz') self.archive_commands('t.tgz') @needs_program(program) @needs_program('compress') def test_tar_z (self): self.archive_commands('t.tar.Z') self.archive_commands('t.taz') @needs_codec(program, 'bzip2') def test_tar_bz2 (self): self.archive_commands('t.tar.bz2') self.archive_commands('t.tbz2') @needs_codec(program, 'lzma') def test_tar_lzma (self): self.archive_commands('t.tar.lzma') # even though clzip would support extracting .lz files, the # file(1) --uncompress command does not use it for achive detection @needs_program(program) @needs_program('lzip') def test_tar_lzip (self): self.archive_commands('t.tar.lz') @needs_codec(program, 'xz') def test_tar_xz (self): self.archive_commands('t.tar.xz') @needs_program('file') @needs_program(program) def test_tar_file (self): self.archive_commands('t.tar.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'gzip') def test_tar_gz_file (self): self.archive_commands('t.tar.gz.foo', skip_create=True) self.archive_commands('t.tgz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'compress') def test_tar_z_file (self): self.archive_commands('t.tar.Z.foo', skip_create=True) self.archive_commands('t.taz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'bzip2') def test_tar_bz2_file (self): self.archive_commands('t.tar.bz2.foo', skip_create=True) self.archive_commands('t.tbz2.foo', skip_create=True) # file(1) does not recognize .lzma files (at least not with --uncompress) #@needs_program('file') #@needs_codec(program, 'lzma') #def test_tar_lzma_file (self): # self.archive_commands('t.tar.lzma.foo', format="tar", compression="lzma") # even though clzip would support extracting .lz files, the # file(1) --uncompress command does not use it for achive detection @needs_program('lzip') @needs_program('file') @needs_codec(program, 'lzip') def test_tar_lzip_file (self): self.archive_commands('t.tar.lz.foo', skip_create=True) @needs_program('file') @needs_codec(program, 'xz') def test_tar_xz_file (self): self.archive_commands('t.tar.xz.foo', skip_create=True) patool-1.4/tests/archives/test_unace.py000066400000000000000000000022421221117163600203260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestUnace (ArchiveTest): program = 'unace' @needs_program(program) def test_unace(self): self.archive_list('t.ace') self.archive_test('t.ace') self.archive_extract('t.ace') @needs_program('file') @needs_program(program) def test_unace_file(self): self.archive_list('t.ace.foo') self.archive_test('t.ace.foo') self.archive_extract('t.ace.foo') patool-1.4/tests/archives/test_unadf.py000066400000000000000000000025131221117163600203310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program, skip_on_travis class TestUnadf (ArchiveTest): program = 'unadf' # On a Travis CI build the test fails. @skip_on_travis() @needs_program(program) def test_unadf(self): self.archive_extract('t.adf', check=None) self.archive_list('t.adf') self.archive_test('t.adf') # On a Travis CI build the test fails. @skip_on_travis() @needs_program('file') @needs_program(program) def test_unadf_file(self): self.archive_extract('t.adf.foo', check=None) self.archive_test('t.adf.foo') self.archive_list('t.adf.foo') patool-1.4/tests/archives/test_unalz.py000066400000000000000000000023241221117163600203650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestUnalz (ArchiveTest): program = 'unalz' @needs_program(program) def test_unalz(self): self.archive_test('t.alz') self.archive_list('t.alz') self.archive_extract('t.alz') # file(1) does not recognize .alz files #@needs_program('file') #@needs_program(program) #def test_unalz_file(self): # self.archive_test('t.alz.foo') # self.archive_list('t.alz.foo') # self.archive_extract('t.alz.foo') patool-1.4/tests/archives/test_uncompressreal.py000066400000000000000000000021561221117163600223010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestUncompressReal (ArchiveTest): program = 'uncompress.real' @needs_program(program) def test_uncompress (self): self.archive_extract('t.txt.Z', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_uncompress_file (self): self.archive_extract('t.txt.Z.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_unrar.py000066400000000000000000000021301221117163600203560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestUnrar (ArchiveTest): program = 'unrar' @needs_program(program) def test_unrar(self): self.archive_list('t.rar') self.archive_extract('t.rar') @needs_program('file') @needs_program(program) def test_unrar_file(self): self.archive_list('t.rar.foo') self.archive_extract('t.rar.foo') patool-1.4/tests/archives/test_unshar.py000066400000000000000000000016341221117163600205370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestUnshar (ArchiveTest): program = 'unshar' @needs_program(program) def test_unshar(self): self.archive_extract('t.shar', check=None) patool-1.4/tests/archives/test_unzip.py000066400000000000000000000026701221117163600204050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestUnzip (ArchiveTest): program = 'unzip' @needs_program(program) def test_unzip (self): self.archive_extract('t.zip', check=None) self.archive_list('t.zip') self.archive_test('t.zip') self.archive_extract('t.jar', check=None) self.archive_list('t.jar') self.archive_test('t.jar') @needs_program('file') @needs_program(program) def test_unzip_file (self): self.archive_extract('t.zip.foo', check=None) self.archive_list('t.zip.foo') self.archive_test('t.zip.foo') self.archive_extract('t.jar.foo', check=None) self.archive_list('t.jar.foo') self.archive_test('t.jar.foo') patool-1.4/tests/archives/test_xdms.py000066400000000000000000000023171221117163600202110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestXdms (ArchiveTest): program = 'xdms' @needs_program(program) def test_xdms(self): self.archive_extract('t.dms', check=None) self.archive_list('t.dms') self.archive_test('t.dms') # xdms(1) cannot handle files without '.dms' extension #@needs_program(program) #def test_xdms_file(self): # self.archive_extract('t.dms.foo') # self.archive_test('t.dms.foo') # self.archive_list('t.dms.foo') patool-1.4/tests/archives/test_xz.py000066400000000000000000000021601221117163600176730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestXz (ArchiveTest): program = 'xz' @needs_program(program) def test_xz(self): self.archive_commands('t.txt.xz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_xz_file(self): self.archive_test('t.txt.xz.foo') self.archive_extract('t.txt.xz.foo', check=Content.Singlefile) patool-1.4/tests/archives/test_zip.py000066400000000000000000000020461221117163600200370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . from . import ArchiveTest from .. import needs_program class TestZip (ArchiveTest): program = 'zip' @needs_program(program) def test_zip (self): self.archive_create('t.zip') self.archive_test('t.zip') @needs_program('file') @needs_program(program) def test_zip_file (self): self.archive_test('t.zip.foo') patool-1.4/tests/archives/test_zoo.py000066400000000000000000000023461221117163600200470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program, skip_on_travis class TestZoo (ArchiveTest): program = 'zoo' # On a Travis CI build the test fails. @skip_on_travis() @needs_program(program) def test_zoo(self): self.archive_commands('t.zoo', check=Content.Multifile) # On a Travis CI build the test fails. @skip_on_travis() @needs_program('file') @needs_program(program) def test_zoo_file(self): self.archive_commands('t.zoo.foo', skip_create=True, check=Content.Multifile) patool-1.4/tests/archives/test_zopfli.py000066400000000000000000000021161221117163600205360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . from . import ArchiveTest, Content from .. import needs_program class TestZopfli(ArchiveTest): program = 'zopfli' @needs_program(program) def test_zopfli(self): self.archive_extract('t.txt.gz', check=Content.Singlefile) @needs_program('file') @needs_program(program) def test_zopfli_file(self): self.archive_extract('t.txt.gz.foo', check=Content.Singlefile) patool-1.4/tests/data/000077500000000000000000000000001221117163600147275ustar00rootroot00000000000000patool-1.4/tests/data/t .7z000066400000000000000000000002351221117163600155140ustar00rootroot000000000000007z'ζ] h  |3%~QBsJ %8ClmҪ?`N %gvm_j;Fz V #] a Fnpatool-1.4/tests/data/t.7z.foo000066400000000000000000000002351221117163600162360ustar00rootroot000000000000007z'ζ] h  |3%~QBsJ %8ClmҪ?`N %gvm_j;Fz V #] a Fnpatool-1.4/tests/data/t.ace000066400000000000000000000002051221117163600156410ustar00rootroot00000000000000E1**ACE**!oA8(*UNREGISTERED VERSION* mA TEt]2&mA wO TEt\t.txt42patool-1.4/tests/data/t.ace.foo000066400000000000000000000002051221117163600164230ustar00rootroot00000000000000E1**ACE**!oA8(*UNREGISTERED VERSION* mA TEt]2&mA wO TEt\t.txt42patool-1.4/tests/data/t.adf000066400000000000000000033400001221117163600156460ustar00rootroot00000000000000DOSruauf/ograms from within the application. INTERRUPT. An event that alters the normal flow of control in a program. Interrupts in ARexx refer to events within the program execution and are distinct from the hardware-level interrupts managed by the Amiga EXEC system. MACRO PROGRAM. A program that implements a complex "macro" operation from a series of "micro" commands. MESSAGE PACKET. A data structure used to pass information between tasks. A message packet is allocated and initialized byrvb{b one task and then sent to another task's message port. After the recipient has processed the message,it "replies" the message to the replyport associated with the message. MESSAGE PORT. A data structure used as the rendezvous point for message passing. A message port provides the anchor for a list of message packets and identifies the task to be signalled when a message arrives. MULTITASKING. The ability to run more than one program at a time. More precisely, multitasking permits rwc"the resources of the computer to be shared among many tasks without forcing any task to be aware of the others. PROCESS. An extension to an EXEC task structure that provides the data fields required to use AmigaDOS functions. All ARexx programs run as AmigaDOS processes. REPLYPORT. A message port designated to receive a returning message packet. Each message packet includes a field that specifies its reply port. RESIDENT PROCESS. The program responsible for launching ARexx programrxds and for managing various resources used by ARexx. It is structured as a host application and opens a public message port named "REXX." SHARED LIBRARY. A collection of executable code and data managed as a resource by the EXEC operating system. As the name "shared" implies, the code and data in a library can be used by more than one task. STORAGE ENVIRONMENT. The collection of data values forming the current state of an ARexx program. Storage environments are strictly nested andrye only one environment is current at any time. TASK. An entity consisting of executable code and a data structure managed by the EXEC operating system. The task is the smallest program unit that can be scheduled and run separately. 148 TOKEN. The elementary words or atoms of a language. A token can be considered as a string of one or more characters forming the smallest unit of the language. TYPELESS. Data items having no assumed structure or usage. ARexx treats all data as tyrzQIpeless character strings and checks for specific characteristics only when required by an operation. 149 AREXX DOCS BROUGHT TO USE BY THE SOUTHERN STAR WILL ASSISTANCE BY RAP..... . A data structure used as the rendezvous point for message passing. A message port provides the anchor for a list of message packets and identifies the task to be signalled when a message arrives. MULTITASKING. The ability to run more than one program at a time. More precisely, multitasking permits rjlfine ERR10_004 (ERRC_MSG+4) /* invalid character in program */ #define ERR10_005 (ERRC_MSG+5) /* unmatched quote */ #define ERR10_006 (ERRC_MSG+6) /* unterminated comment */ #define ERR10_007 (ERRC_MSG+7) /* clause too long */ #define ERR10_008 (ERRC_MSG+8) /* unrecognized token */ #define ERR10_009 (ERRC_MSG+9) /* symbol or string too long */ #define ERR10_010 (ERRC_MSG+10) /* invalid message packet */ #define ERR10_011 (ERRC_MSG+11) /* command string error */ #define rkms5 ERR10_012 (ERRC_MSG+12) /* error return from function */ #define ERR10_013 (ERRC_MSG+13) /* host environment not found */ #define ERR10_014 (ERRC_MSG+14) /* required library not found */ #define ERR10_015 (ERRC_MSG+15) /* function not found */ #define ERR10_016 (ERRC_MSG+16) /* no return value */ #define ERR10_017 (ERRC_MSG+17) /* wrong number of arguments */ #define ERR10_018 (ERRC_MSG+18) /* invalid argument to function */ #define ERR10_019 (ERRC_MSG+19) /* invalid PROCEDrlnURE */ #define ERR10_020 (ERRC_MSG+20) /* unexpected THEN/ELSE */ #define ERR10_021 (ERRC_MSG+21) /* unexpected WHEN/OTHERWISE */ #define ERR10_022 (ERRC_MSG+22) /* unexpected LEAVE or ITERATE */ #define ERR10_023 (ERRC_MSG+23) /* invalid statement in SELECT */ #define ERR10_024 (ERRC_MSG+24) /* missing THEN clauses */ #define ERR10_025 (ERRC_MSG+25) /* missing OTHERWISE */ #define ERR10_026 (ERRC_MSG+26) /* missing or unexpected END */ #define ERR10_027 (ERRC_MSG+27) /*rmo.)D symbol mismatch on END */ #define ERR10_028 (ERRC_MSG+28) /* invalid DO syntax */ #define ERR10_029 (ERRC_MSG+29) /* incomplete DO/IF/SELECT */ 144 errors.h (cont.) #define ERR10_030 (ERRC_MSG+30) /* label not found */ #define ERR10_031 (ERRC_MSG+31) /* symbol expected */ #define ERR10_032 (ERRC_MSG+32) /* string or symbol expected */ #define ERR10_033 (ERRC_MSG+33) /* invalid sub-keyword */ #define ERR10_034 (ERRC_MSG+34) /* required keyword missing */ #define ERRrnp}^10_035 (ERRC_MSG+35) /* extraneous characters */ #define ERR10_036 (ERRC_MSG+36) /* sub-keyword conflict */ #define ERR10_037 (ERRC_MSG+37) /* invalid template */ #define ERR10_038 (ERRC_MSG+38) /* invalid TRACE request */ #define ERR10_039 (ERRC_MSG+39) /* uninitialized variable */ #define ERR10_040 (ERRC_MSG+40) /* invalid variable name */ #define ERR10_041 (ERRC_MSG+41) /* invalid expression */ #define ERR10_042 (ERRC_MSG+42) /* unbalanced parentheses */ #define ERR10_roq043 (ERRC_MSG+43) /* nesting level exceeded */ #define ERR10_044 (ERRC_MSG+44) /* invalid expression result */ #define ERR10_045 (ERRC_MSG+45) /* expression required */ #define ERR10_046 (ERRC_MSG+46) /* boolean value not 0 or 1 */ #define ERR10_047 (ERRC_MSG+47) /* arithmetic conversion error */ #define ERR10_048 (ERRC_MSG+48) /* invalid operand */ /* Return Codes for general use ... */ #define RC_FAIL -1 /* something's wrong */ #define RC_OK 0 /* success */ #derprČfine RC_WARN 5 /* warning only */ #define RC_ERROR 10 /* something's wrong */ #define RC_FATAL 20 /* complete or severe failure */ 145 GLOSSARY ALLOCATION. A grant of a system resource,such as memory space. Programs designed to run in a multitasking environment generally use dynamic allocation to avoid tying up system resources. AMIGADOS. The higher-level part of the Amiga operating system that supports the filing system and input/output operations. ARGSTRIrqsNG. An "argument string" structure used to pass data to an ARexx program. The structure is passed as a pointer to the buffer area containing the string data,and can be treated as a pointer to a null-terminated string. ARGUMENT. A data item passed to a function,sometimes called a parameter. CLAUSE. A group of one or more tokens forming a "sentence" in a language. The clause is the smallest executable language fragment. COMMAND LINE INTERFACE (CLI). A program that accepts input fromrrtm^ the user and runs programs based on the entered command. The CLI generally refers to the command interpreter supplied with the Amiga,but other command "shells" may be used instead. CONCATENATION. An operation in which two strings are joined or "chained together." ARexx provides two concatenation operators,one of which joins strings directly and the other of which embeds a blank between the operands. EXEC. The multitasking kernel of the Amiga's operating system. EXEC provides the trsuask scheduling,interrupt handlin,and message-passing primitives used to support ARexx. FUNCTION HOST. A program that manages a public message port for receiving function invocation messages. The message port may be the same one used for command messages. FUNCTION LIBRARY. A collection of functions callable from ARexx and managed as an Amiga shared library. Each function library includes an entry point to associate a function name with the code to be called. HOST ADDRESS. The name rt`of the public message port associated with a host application. The host address is used as the unique identifier for the host,and should be unique within the system message ports list. Within an ARexx program the host address identifies the external host to which commands will be sent. 147 HOST APPLICATION. An executable program that program that provides a suitable command interface to receive ARexx commands. Most host applications will also provide a means to invoke macro prr_wD rl_ReadLock; /* lock count */ LONG rl_TraceFH; /* global trace console */ struct List rl_TaskList; /* REXX task list */ WORD rl_NumTask; /* task count */ struct List rl_TaskList; /* Library List header */ WORD rl_NumLib; /* library count */ struct List rl_ClipList; /* ClipList header */ WORD rl_NumClip; /* clip node count */ struct List rl_MsgList; /* pending messages */ WORD rl_NumMsg; /* pending count */ }; /* Global flag bit definitions for RexxMaster */ #dr`xZ4 efine RLFB_TRACE RTFB_TRACE /* interactive tracing? */ #define RLFB_HALT RTFB_HALT /* halt execution? */ #define RLFB_SUSP RTFB_SUSP /* suspend execution? */ #define RLFB_TCUSE RTFB_TCUSE /* trace console in use? */ #define RLFB_TCOPN 4 /* trace console open? */ #define RLFB_STOP 6 /* deny further invocations */ #define RLFB_CLOSE 7 /* close the master */ #define RLFMASK 0x07 /* passed flags */ ; Initialization constants #define RXSVERS 2 /* main version */ rayl\#define RXSREV 1 /* revision */ #define RXSALLOC 0x800000 /* maximum allocation */ #define RXSCHUNK 1024 /* allocation quantum */ #define RXSNEST 32 /* expression nesting limit */ #define RXSTPRI 0 /* task priority */ #define RXSSTACK 4096 /* stack size */ #define RXSLISTH 4 /* number of list headers */ 140 rxslib.h (cont.) /* Character attribute flag bits used in REXX. Defined only for */ /* ASCII characters (range 0-127) */ #define CTB_SPACE 0 /* wrbzchite space characters */ #define CTB_DIGIT 1 /* decimal digits 0-9 */ #define CTB_ALPHA 2 /* alphabetic characters */ #define CTB_REXXSYM 3 /* REXX symbol characters */ #define CTB_REXXOPR 4 /* REXX operator characters */ #define CTB_REXXSPC 5 /* REXX special symbols */ #define CTB_UPPER 6 /* UPPERCASE alphabetic */ #define CTB_LOWER 7 /* lowercase alphabetic */ /* Attribute flags */ #define CTF_SPACE (1 << CTB_SPACE) #define CTF_DIGIT (1 << CTB_DIGIT) #define CTF_ALPHA (1 rc{l<<< CTB_ALPHA) #define CTF_REXXASYM (1 << CTB_REXXSYM) #define CTF_REXXOPR (1 << CTB_REXXOPR) #define CTF_REXXSPC (1 << CTB_REXXSPC) #define CTF_UPPER (1 << CTB_UPPER) #define CTF_LOWER (1 << CTB_LOWER) #endif 141 rexxio.h This file defines the data structures used for buffered I/O. ARexx uses linked lists of IoBuff structures to keep track of the files it opens. Each IoBuff node is allocated as an "auto-delete" structure and can be closed and released by a call to either Closrd|eF() or RemRsrcNode(). An entire list of files can be closed with a call to RemRsrcList(). /* ===rexx/rexxio.h======================================================== * * Copyright (c) 1986,1987 by William S. Hawes (All Rights Reserved) * *========================================================================= * Header file for ARexx Input/Output related structures */ #ifndef REXX_REXXIO_H #define REXX_REXXIO_H #ifndef REXX_STORAGE_H #include "rexx/storage.h" #endif #definre}FҖ e RXBUFFSZ 204 /* buffeg length */ /* The IoBuff is a resource node used to maintain the File List. Nodes are * allocated and linked into the list whenever a file is opened. */ struct IoBuff{ struct RexxRsrc iobNode; /* structure for files/strings */ APTR iobRpt; /* read/write pointer */ LONG iobRct; /* character count */ LONG iobDFH; /* DOS filehandle */ APTR iobLock; /* DOS lock */ LONG iobBct; /* buffer length */ BYTE iobArea[RXBUFFSZ]; /* buffer area rf~ */ }; /* size: 256 bytes */ /* Access mode definitions */ #define RXIO_EXIST -1 /* an external filehandle */ #define RXIO_STRF 0 /* a "string file" */ #define RXIO_READ 1 /* read-only access */ #define RXIO_WRITE 2 /* write mode */ #define RXIO_APPEND 3 /* append mode (existing file) */ 142 rxxio.h (cont.) /* Offset anchors for SeekF() */ #define RXIO_BEGIN -1 /* relative to start */ #define RXIO_CURR 0 /* relative to current position */ #dergɨxfine RXIO_END 1 /* relative to end */ /* The Library List contains just plain resource nodes */ #define LLOFFSET(rrp) (rrp>rr_Arg1) /* "Query" offset */ #define LLVERS(rrp) (rrp->Arg2) /* library version */ /* The RexxClipNode structure is used to maintain the Clip List. The * The ReplyList holds packets that have been received but haven't been * replied. */ struct RexxMsgPort{ struct RexxRsrc rmp_Node; /* linkage node */ struct MsgPort rmp_Port; /* the message portrh2+ */ struct List rmp_ReplyList; /* messages awaiting reply */ }; /* DOS Device types */ #define DT_DEV 0 /* a device */ #define DT_DIR 1 /* an ASSIGNed directory */ #define DT_VOL 2 /* a volume */ /* Private DOS packet types */ #define ACTION_STACK 2002 /* stack a line */ #define ACTION_QUEUE 2003 /* queue a line */ #endif 143 errors. h This file contains the definitions for all of the error messages issued by the ARexx interpreter. /* rikW== errors.h================================================================ * * Copyright (c) 1987 by Williams S. Hawes (All Rights Reserved) * * =========================================================================== * Definitions for ARexx error codes */ #define EERC_MSG 0 /* error code offset */ #define ERR10_001 (ERRC_MSG+1) /* program not found */ #define ERR10_002 (ERRC_MSG+2) /* execution halted */ #define ERR10_003 (ERRC_MSG+3) /* no memory available */ #derTGjw flags */ #define RXFF_RESULT (1<< RSFB_RESULT) #define RXFF_STRING (1<< RXFB_STRING) #define RXFF_TOKEN (1<< RXFB_TOKEN ) #define RXFF_NONRET (1<< RXFB_NONRET) #define RXCODEMASK $FF000000 #define RXARGMASK $0000000F /* The RexxRsrc structure is used to manage global resources. * The name string for each node is created as a RexxArg structure, * and the total size of the node is saved in the "rr_Size" field. * Functions are provided to allocate and release resource nodes. rU夜* If special deletion operations are required,an offset and base can * be provided in "rr_Func" and "rr_Base",respectively. This function * will be called with the base in register A6 and the node in A0. */ struct RexxRsrc { struct Node rr_Node; WORD rr_Func; /* a "auto-delete" offset */ APTR rr_Base; /* "auto-delete" base */ LONG rr_Size; /* total size of node */ LONG rr_Arg1; /* available ... */ LONG rr_Arg2; /* available ... */ }; /* size: 32 bytes */ /* Resource nrV ode types */ #define RRT_ANY 0 /* any node type ... */ #define RRT_LIB 1 /* a function library */ #define RRT_PORT 2 /* a public port */ #define RRT_FILE 3 /* a file IoBuff */ #define RRT_HOST 4 /* a function host */ #define RRT_CLIP 5 /* a Clip List node */ 136 storage.h (cont.) /* The RexxTask structure holds the fields used by REXX to communicate with * external processes,including the client task. It includes the global * data structure(and the base environmrWPpent). The structure is passed to * the newly-created task in its "wake-up" message. */ #define GLOBALSZ 200 /* total size of GlobalData */ struct RexxTask { BYTE rt_Global[GLOBALSZ]; /* global data structure */ struct MsgPort rt_MsgPort; /* global message port */ UBYTE rt_Flags; /* task flag bits */ BYTE rt_SigBit; /* signal bit */ APTR rt_ClientID; /* the client's task ID APTR rt_MsgPkt; /* the packet being processed APTR rt_TaskID; /* our task ID APTR rt_RexxPort; rXRf /* the REXX public port APTR rt_ErrTrap; /* Error trap address APTR rt_StackPtr; /* stack pointer for traps struct List rt_Header1; /* Environment list */ struct List rt_Header2; /* Memory freelist */ struct List rt_Header3; /* Memory allocation list */ struct List rt_Header4; /* Files list */ struct List rt_Header5; /* Message Ports List */ }; /* Definitions for RexxTask flag bits #define RTFB_TRACE 0 /* external trace flag */ #define RTFB_HALT 1 /* external halt frY\lag */ #define RTFB_SUSP 2 /* suspend task? */ #define RTFB_TCUSE 3 /* trace console in use? */ #define RTFB_WAIT 6 /* waiting for reply? */ #define RTFB_CLOSE 7 /* task completed? */ /* Definitions for memory allocation constants */ #define MEMQUANT 16 /* quantum of memory space */ #define MEMMASK $FFFFFFF0 /* mask for rounding the size */ #define MEMQUICK (1 << 0 ) /* EXEC flags: MEMF_PUBLIC */ #define MEMCLEAR (1 << 16) /* EXEC flags: MEMF_CLEAR */ 137 rZazzstorage.h (cont.) /* The SrcNode is a temporary structure used to hold values destined for a * segment array. It is also used to maintain the memory freelist. */ struct SrcNode { struct SrcNode *sn_Succ; /* next node */ struct SrcNode *sn_Pred; APTR sn_Ptr; /* pointer value */ LONG sn_Size; /* size of object */ }; /* size: 16 bytes */ #endif 138 rxslip.h This file defines the library base for the ARexx Systems Library. /* === rexx/rxslib.h=======================r[Xn================================= * * Copyright (c) 1986,1987 by William S. Hawes (All Rights Reserved) * *=========================================================================== * The header file for the REXX Systems Library */ #ifndef REXX_RXSLIB_H #define REXX_RXSLIB_H #ifndef REXX_STORAGE_H #include "rexx/storage.h" #endif /* Some macro definitions */ #define RXSNAME "rexxsyslib.library" #define RXSID "rexxsyslib 1.0 (23 AUG 87)" #define RXSDIR "REXX" #define RXSTNAMEr\iR "ARexx" /* The REXX systems library structure. This should be considered */ /* semi-private and read-only,except for documented exceptions */ struct RxsLib { struct Library rl_Node; /* EXEC library node */ UBYTE rl_Flags; /* global flags */ UBYTE rl_pad; APTR rl_SysBase; /* EXEC library base */ APTR rl_DOSBase; /* DOS library base */ APTR rl_IeeeDPBase; /* IEEE DP match library base */ LONG rl_SegList; /* library seglist */ LONG rl_MaxAlloc; /* maximum expression allr]E6@ocation*/ LONG rl_Chunk; /* allocation quantum */ LONG rl_MaxNest; /* maximum expression nesting */ struct NexxStr *rl_NULL; /* static string: NULL */ struct NexxStr *rl_FALSE; /* static string: FALSE */ struct NexxStr *rl_TRUE; /* static string: TRUE */ struct NexxStr *rl_REXX; /* static string: REXX */ struct NexxStr *rl_COMMAND; /* static string: COMMAND struct NexxStr *rl_STDIN; /* static string: STDIN struct NexxStr *rl_STDOUT; /* static string: STDOUT struct NexxStr *rl_r^v:STDERR; /* static string: STDERR 139 rxslib.h (cont.) STRPTR rl_Version; /* version/configuration string */ STRPTR rl_TaskName; /* name string for tasks */ LONG rl_TaskPri; /* starting prioity */ LONG rl_TaskSeg; /* startup seglist */ LONG rl_StackSize; /* stack size */ STRPTR rl_RexxDir; /* REXX directory */ STRPTR rl_CTABLE; /* character attribute table */ struct NexxStr *rl_Notice; /* copyright notice */ struct MsgPort rl_RexxPort; /* REXX public port */ UWORrIh rxoffsets.o Miscellaneous Files .info Install-ARexx README Start-Aexx 132 E-2 LISTINGS OF HEADER FILES This section of the chapter consists of listings of the header files contained in the :include directory. storage.h This is the main header file and contains definitions for all of the important data structures used by ARexx. /*===rexx/storage.h================================================= * * Copyright (c) 1986,1987 by William S. Hawes (All Rights Reserved)rJPU * *================================================================== * Header file to define ARexx data structures. */ #ifndef REXX_STORAGE_H #define REXX_STORAGE_H #ifndef EXEC_TYPES_H #include "exec/types.h" #endif #ifndef EXEC_NODES_H #include "exec/nodes.h" #endif #ifndef EXEC_LISTS_H #include "exec/lists.h" #endif #ifndef EXEC_PORTS_H #include "exec/ports.h" #endif #ifndef EXEC_LIBRARIES_H #include "exec/libraries.h" #endif /* The NexxStr structue is used to maintain the inrKW]ternal strings in REXX. * It includes the buffer area for the string and associated attributes. * This is actually a variable-length structure;it is allocated for a * specific length string,and the length is never modified thereafter * (since it's used for recycling). */ 133 storage.h(cont.) struct NexxStr{ LONG ns_Ivalue; /* integer value */ UWORD ns_Length; /* length in bytes(excl null) */ UBYTE ns_Flags; /* attribute flags */ UBYTE ns_Hash; /* hash code */ BYTrLηE ns_Buff[8]; /* buffer area for strings */ }; /* size: 16 bytes (minimum) */ #define NXADDLEN 9 /* offset plus null byte */ #define IVALUE(nsPtr) (nsPtr->ns_Ivalue) /* String attribute flag bit definitions */ #define NSB_KEEP 0 /* permanent string? */ #define NSB_STRING 1 /* string form valid? */ #define NSB_NOTNUM 2 /* non-numeric? */ #define NSB_NUMBER 3 /* a valid number? */ #define NSB_BINARY 4 /* integer value saved? */ #define NSB_FLOAT 5 /* floating point formatrM? */ #define NSB_EXT 6 /* an external string? */ #define NSB_SOURCE 7 /* part of the program source? */ /* The flag form of the string attributes */ #define NSF_KEEP (1<< NSB_KEEP ) */ #define NSF_STRING (1<< NSB_STRING) #define NSF_NOTNUM (1<< NSB_NOTNUM) #define NSF_NUMBER (1<< NSB_NUMBER) #define NSF_BINARY (1<< NSB_BINARY) #define NSF_FLOAT (1<< NSB_FLOAT ) #define NSF_EXT (1<< NSB_EXT ) #define NSF_SOURCE (1<< NSB_SOURCE) * Combinations of flags #define NSF_INTNUM (NrNYSF_NUMBER | NSF_BINARY | NSF_STRING) #define NSF_DPNUM (NSF_NUMBER | NSF_FLOAT) #define NSF_ALPHA (NSF_NOTNUM | NSF_STRING) #define NSF_OWNED (NSF_SOURCE | NSF_EXT | NSF_KEEP #define KEEPSTR (NSF_STRING | NSF_SOURCE | NSF_NOTNUM) #define KEEPNUM (NSF_STRING | NSF_SOURCE | NSF_NUMBER | NSF_BINARY) 134 storage.h (cont.) /* The RexxArg structure is identical to the NexxStr structure,but * is allocated from system memory rather than from internal storage. * This structure is urO.x2sed for passing arguments to external programs. * It is usually passed as an "argstring",a pointer to the string buffer. */ struct RexxArg { LONG ra_Size; /* total allocated length */ UWORD ra_Length; /* length of string */ UBYTE ra_Flags; /* attribute flags */ UBYTE ra_Hash; /* hash code */ BYTE ra_Buff[8]; /* buffer area */ }; /* size: 16 bytes (minimum) */ /* The RexxMsg structure is used for all communications with Rexx programs. * It is an EXEC message with a rPpparameter block appended. */ struct RexxMsg{ struct Message rm_Node; /* EXEC message structure */ APTR rm_TaskBlock; /* pointer to global structure */ APTR rm_LibBase; /* library base */ LONG rm_Action; /* command (action) code */ LONG rm_Result1; /* primary result (return code) */ LONG rm_Result2; /* secondary result */ STRPTR rm_Args[16]; /* argument block(ARGO-ARG15) */ struct MsgPort *rm_PassPort; /* forwarding port */ STRPTR rm_CommAddr; /* host address (port namerQ#F) */ STRPTR rm_FileExt; /* file extension */ LONG rm_Stdin; /* input stream(filehandle) */ LONG rm_Stdout; /* output steam(filehandle) */ LONG rm_avail; /* future expension */ }; /* size: 128 bytes */ /* Field definitions #define ARGO(rmp) (rmp->rm_Args[0] /* start of argblock */ #define ARG1(rmp) (rmp->rm_Args[1] /* first argument */ #define ARG2(rmp) (rmp->rm_Args[2] /* second argument */ #define MAXRMARG 15 /* maximum arguments */ /* Command (action) codes for mesrR^psage packets */ #define RXCOMM $01000000 /* a command-level invocation */ #define RXFUNC $02000000 /* a function call */ #define RXCLOSE $03000000 /* close the port */ #define RXQUERY $04000000 /* query for information */ #define RXADDFH $07000000 /* add a function host */ 135 storage.h (cont.) #define RXADDLIB $08000000 /* add a function library */ #define RXREMLIB $09000000 /* remove a function library */ #define RXADDCON $0A000000 /* add/update a ClipList string */ #derSzKfine RXREMCON $0B000000 /* remove a ClipList string */ #define RXTCOPN $0C000000 /* open the trace console */ #define RXTCCLS $0D000000 /* close the trace console */ /* Command modifier flag bits */ #define RXFB_NOIO 16 /* suppress I/O inheritance? */ #define RXFB_RESULT 17 /* result string expected? */ #define RXFB_STRING 18 /* program is a "string file"? */ #define RXFB_TOKEN 19 /* tokenize the command line? */ #define RXFB_NONRET 20 /* a "no-return" message? */ /* Modifierr> Port Resource strcture or '0000 000'xif the port could not be opened or initialized. An initialization failure will occur if another port of the same name already exists,or if a signal bit couldn't be allocated. 128 The message port is allocated as a Port Resource node and is linked into the program's global data structure. Ports are automatically closed when the program exits,and any pending messages are returned to the sender. See Also:CLOSEPORT() Example: myport = openportr?+1("MyPort") REPLY() Usage:REPLY(packet,rc) Returns a message packet to the sender,with the primary result field set to the value given by the rc argument. The secondary result is cleared. The packet argument must be supplied as a 4-byte address,and the rc argument must be a whole number. Example: call reply packet,10 /* error return*/ SHOWDIR() Usage:SHOWDIR(directory,['All' | 'File' | 'Dir']) Returns the contents of the specified directory as a string of names separated by blanksr@W޶. The second parameter is an option keyword that selects whether all entries,only files,or only subdirectories will be included. Example: say showdir("df1:c") ==>rx ts te hi tco tcc SHOWLIST() Usage:SHOWLIST[{'D' | 'L' | 'P' | 'R' | 'W' },[name]) The first argument is an option keyword to select a system list;the options currently supported are Devices,Libraries,Ports,Ready,and Waiting. If only the first parameter is supplied,the function scans the selected list and returns the norA{de names in a string separated by blanks. If the name parameter is supplied,the boolean return indicates whether the specified list contains a node of that name. The name matching is case-sensitive. The list is scanned with task switching forbidden so as to provide an accurate snapshot of the list at that time. Example: say showlist('P') ==>REXX MyCon say showlist('P','REXX') ==>1 129 STATEF() Usage:STATEF(filename) Returns a string containing information about an external rB00050000 CLOSEPORT() Usage:CLOSEPORT(name) Closes the message port specified by the name argument,which must have been allocated by a call to OPENPORT()within the current ARexx program. Any messages received but not yet REPLYed are automaticallyr:4b+D returned with the return code set to 10. See Also:OPENPORT() Example: call closeport myport 127 FREEMEM() Usage:FREEMEM(address,length) Releases a block of memory of the given length to the system freelist. The address parameter is a four-byte string,typically obtained by a prior call to ALLOCMEM(). FREEMEM()cannot be used to release memory allocated using GETSPACE(),the ARexx internal memory allocator. The returned value is a boolean success flag. See Also:ALLOCMEM() Exampler;̤$: say freemem('00042000'x,32) ==>1 GETARG() Usage:GETARG(packet,[n]) Extracts a command,function name,or argument string from a message packet. The packet argument must be a 4-byte address obtained from a prior call to GETPKT(). The optional n argument specifies the slot containing the string to be extracted,and must be less than or equal to the actual argument count for the packet. Commands and functions names are always in slot 0;function packets may have argument strings in slotr<ds 1-15. Examples: command = getarg(packet) function= getarg(packet,0) /* name string */ arg1 = getarg(packet,1) /* 1st argumeent*/ GETPKT() Usage:GETPKT(name) Checks the message port specified by the name argument to see whether any messages are available. The named message port must have been opened by a prior call to OPENPORT() within the current ARexx program. The returned value is the 4-byte address of the first message packet,or '0000 0000'x if no packets were available. r=Oi The function returns immediately whether or not a packet is enqueued at the message port. Programs should never be designed to "busy-loop" on a message port. If there is no useful work to be done until the next message packet arrives,the program should call WAITPKT()and allow other tasks to proceed. See Also:WAITPKT() Example: packet = getpkt('MyPort') OPENPORT() Usage:OPENPORT(name) Creates a public message port with the given name. The returned value is the 4-byte address of ther(^Ree Also:StackF() ReadF()-read characters from a file buffer Usage:count=ReadF(IoBuff,buffer,length) D0 A0 A1 D0 (CCR) Reads one or more characters from the file specified by the IoBuff pointer. The buffer argument is a pointer to a storage area,and the length argument specifies the maximum number of characters to be read. The return value is the actual number of characters read,or -1 if an error occurred. ReadStr()-read a string from a file Usage:(cor)u$0unt,pointer)=ReadStr(IoBuff,buffer,length) D0 A1 A0 A1 D0 Reads characters from the file specified by the IoBuff pointer until a "newline" character is found. The "newline" is not included in the returned string. The return value is the actual number of characters read,or -1 if an error occurred. 122 See Also:ReadF() RemClipNode()-unlink and deallocate a list Clip node. Usage:RemClipNode(node) A0 Unlinks and releases the sr*pecified Clip node. The function is the "auto-delete" function for Clip nodes,and will be called automatically by RemRsrcNode() or RemRsrcList(). See Also:AddClipNode(),RemRsrcList(),RemRsrcNode() RemRsrcList()-unlink and deallocate a list of resource nodes Usage:RemRsrcList(list) A0 Scans the supplied list and releases any nodes found. The list must consist of resource nodes(RexxRsrc structures),which contain information to allow automatic cleanup and deletion. r+YSee Also:RemRsrcNode() RemRsrcNode()-unlink and deallocate a resource node Usage:RemRsrcNode(node) A0 Unlinks and releases the specified resource node,including the name string if one is present. If an "auto-delete" function has been specified in the node,it is called to perform any required resource deallocation before the node is released. See Also:RemRsrcList() SeekF()-seek to the specified position in a file. Usage:position=SeekF(IoBuff,offset,anchor) r,_kE D0 A0 D0 D1 Seeks to a new position in the file is specified by the IoBuff pointer. The position is given by the offset argument,a byte offset relative to the supplied anchor argument. The anchor may specify the beginning(-1),the current position (0),or the end of the file(1). The return value is the new position relative to the beginning of the file. StackF()-stack a line to a file buffer. Usage:count=StackF(IoBuff,buffer,length) D0 A0 Ar-or1 D0 Stacks a buffer of characters in the stream associated with the IoBuff structure. The buffer argument is a pointer to a string of characters,and the length specifies the number of characters to be stacked. The return value is the actual count of characters to be stacked. The return value is the actual count of characters or -1 if an error occurred. 123 Stacked lines are placed in "last-in,first-out" order and are immediately available to be read from the stream. Thr.e stream must be managed by a DOS handler that supports the ACTION_STACK packet. See Also:QueueF() StcToken()-break out the next token from a string Usage:(quote,length,scan,token)=StcToken(string) D0 D1 A0 A1 A0 Scans a null-terminated string to select the next token delimited by "white space,"and returns a pointer to the start of the token. The quote return will be an ASCII single or double quote if the token was quoted and 0 otherwise; white space r/I0)[characters are ignored within quoted strings. The length return is the total length of the token,including any quote characters. The scan return is advanced beyond the current token to prepare for the next call. StrcpyA()-copy a string,converting to ASCII Usage:hash=StrcpyA(destination,source,length) D0 A0 A1 D0 Copies the source string to the destination area,converting the characters to ASCII by clearing the high-order bit of each byte. The length or0af the string (which may include embedded nulls)is considered as a 2-byte usingned integer. So the string is limited in length to 65,535 bytes. The hash return is the internal hash byte for the copied string. See Also:StrcpyN(),StrcpyU StrcpyN()-copy a string Usage:hash=StrcpyN(destination,source,length) D0 A0 A1 D0 Copies the source string to the destination area. The length of the string (which may include embedded nulls)is considered as a 2-byte unsr1Smigned integer. The hash return is the internal hash byte for the copied string. See Also:StrcpyA(),StrcpyU StrcpyU()-copy a string,converting to uppercase Usage:hash=StrcpyU(destination,source,length) D0 A0 A1 D0 Copies the source string to the destination area,converting to uppercase alphabetics. The length of the string(which may include embedded nulls)is considered as a 2-byte unsigned integer. The has return is the internal hash byte for the copier2cd string. See Also:StrcpyA(),StrcpyN 124 StrflipN()-reverse the characters in a string Usage:StrflipN(string,length) A0 D0 Reverses the sequence of characters in a string. The conversion is performed in place. Strlen()-find the length of a null-terminated string Usage:length=Strlen(string) D0 A0 (CCR) Returns the number of characters in a null-terminated string. Register A0 is preserved,and the CCR is set for the returned lengthr&pace()-allocate memory using the internal allocator. Usage:block=GetSpace(envptr,length) D0 A0 D0 A0 (CCR) Allocates a block of memory using the internal allocator. The memory is obtained from an internal pool managed by the interpreter and is returned to the operating system when the ARexx program terminates. The envptr argument is a pointer to the base or current storage environment for the program. The internal allocator must be used to allocrDDate strings for use as values for symbols,and is convenient for obtaining small blocks of memory whose lifetime will not exceed that of the ARexx program. See Also:CurrentEnv(),FreeSpace() InitList()-initialize a list header Usage:InitList(list) A0 Initializes an EXEC list header structure. InitPort()-initialize a previously-allocated message port. Usage:(signal,port)=InitPort(port,name) D0 A1 A0 A1 Initializes a message port structure for*{r which memory space has been previously allocated,typically as part of a larger structure or as static storage in a program. It installs the task ID(of the task calling the function)into the MP_SIGTASK field and allocates a signal bit. The name parameter must be a pointer to a null-terminated string. The signal return is the signal bit that was allocated for the port. In the event that a signal could not be assigned,a value of -1 is returned. Note that the port is not linked into tr The system Ports List. If the port is to be made public,this can be done after the function returns. The port address is returned in the correct register(A1)for a subsequent call to the EXEC function AddPort(). See Also:FreePort() IsRexxMsg()-check whether a message came from ARexx. Usage:boolean=IsRexxMsg(msgptr) D0 A0 Tests whether the message packet specified by the msgptr argument came from an ARexx program. ARexx marks its messages with a pointer to a star! Ѭtic string "REXX" in the LN_NAME field. The returned value is either -1(True)if the message came from ARexx or 0(False)otherwise. 120 IsSymbol()-check whether a string is a valid symbol. Usage:(code,length)=IsSymbol(string) D0 D1 A0 Scans the supplied string pointer for ARexx symbol characters. The code return is the symbol type if a symbol was found,or 0 if the string did not start with a symbol character. The length return is the total length of the r"Hisymbol. ListNames()-build a string of names from a list. Usage:argstring=ListNames(list,separator) D0 A0 D0[0:7] A0 (CCR) Scans the specified list and copies the name strings into an argstring. The list argument must be a pointer to an initialized EXEC list header. The separator argument is the character,possibly a null,to be placed as a delimiter between the node names. The list is traversed inside a Forbid()exclusion and so may be used r#`/jwith shared or system lists. The returned argstring can be released using DeleteArgstring() after the names are no longer needed. See Also:DeleteArgstring() LockRexxBase()-lock a shared resource. Usage:LockRexxBase(resource) D0 Secures the specified resource in the ARexx Systems Library base for read access. The resource argument is a manifest constant for the required resource, or zero to lock the entire structure. Note that write access to shared resources r$eais normally mediated by the ARexx resident process,which operates at an elevated priority to gain exclusive access. Locking a resource should not be attempted from a process operating at a priority higher than the resident process. See Also:UnlockRexxBase() OpenF()-open a file buffer Usage:IoBuff=OpenF(list,filename,mode,logical) D0 A0 A1 D0 D1 A0 (CCR) Attempts to open an external file in the specified mode,which should be one of the conr%zstants RXIO_READ,RXIO_WRITE,or RXIO_APPEND defined in the ARexx INCLUDE files. 121 If successful,an IoBuff structure is allocated and linked into the specified list. The list argument must be a pointer to a properly-initialized EXEC list header. The optional logical argument is the logical name for the file,and must be either a pointer to a null-terminated string or zero(NULL)if a name is not required. See Also:CloseF() OpenPublicPort()-open a public message port Usage:node=r&^zSOpenPublicPort(list,name) D0 A0 A1 A0 (CCR) Allocates a message port as an "auto-delete" resource node and links it into the specified list. The list argument must point to a properly initialized EXEC list header. The message port is initialized with the given name and linked into the system Ports List. See Also:ClosePublicPort() QueueF()-queue a line to a file buffer. Usage:count-=QueueF(IoBuff,buffer,length) D0 A0 A1 r'pz D0 Queues a buffer of characters in the stream associated with the IoBuff structure. The stream must be managed by a DOS handler that supports the ACTION_QUEUE packet. Queued lines are placed in "first-in,first-out" order and are immediately available to be read from the stream. The buffer argument is a pointer to a string of characters,and the length specifies the number of characters to be queued. The return value is the actual count of characters or -1 if an error occurred. Sr^btained from the message packet sent to an external application. DeleteArgstring()-delete(release)an argstring structure Usage:DeleteArgstring(argstring) A0 Releases an argstring (RexxArg) structure. The RexxArg structure contains the total allocated length at a negative offset from the argstring pointer. See Also:CreateArgstring() DeleteDOSPkt()-release a DOS Standard Packet structure. Usage:DeleteDOSPkt(message) A0 Releases a DOS rݲ,StandardPacket structure,typically obtained by a prior call to CreateDOSPkt(). See Also:CreateDOSPkt() DeleteRexxMsg()-delete(release)an ARexx message packet. Usage:DeleteRexxMsg(packet) A0 Release an ARexx message packet to the system free-memory list. The internal MN-LENGTH field is used as the total size of the memory block to be released,so this function can be used to release any message packet that contains the total length in this field. Any embedded arr&agument strings must be released before calling DeleteRexxMsg(). See Also:CreateRexxMsg() 117 DOSREAD()-read from a DOS file Usage:count=DOSRead(filehandle,buffer,length) D0 A0 A1 D0 (CCR) Reads one or more characters from a DOS filehandle into the supplied buffer. The length argument specifies the maximum number of characters that will be read. The returned count is the actual number of bytes transferred,or -1 if an error occurred. DOSWrirU@ate()-write to a DOS file Usage:count=DOSWrite(filehandle,buffer,length) D0 A0 A1 D0 (CCR) Writes a buffer of the specified length to a DOS filehandle. The retuned count is the actual number of bytes written,or -1 if an error occurred. ErrorMsg()-find the message associated with an error code Usage:(boolean,ss)=ErrorMsg(code) D0 A0 D0 Returns the error message(as a pointer to a string structure)associated with the specifirșNr@ed ARexx error code. The boolean return will be -1 if the supplied code was a valid ARexx error code,and 0 otherwise. ExistF()-check whether an external file exists Usage:boolean=ExistF(filename) D0 A0 (CCR) Tests whether an external file currently exists by attempting to obtain a read lock on the file. The boolean return indicates whether the operation succeeded, and the lock is released. FillRexxMsg()-convert and install arguments in message packet. Urosage:boolean=FillRexxMsg(msgptr,count,mask) D0 A0 D0 D1 This function can be used to convert and install up to 16 argument strings in a RexxMsg structure. The message packet must be allocated and the argument fields of interest set to either a pointer to a null-terminated string or an integer value. The count argument specifies the number of fields,beginning with ARGO,to be converted into argstrings and installed into the argument slot. Bits 0-15 of thrd1+e mask argument specify whether the corresponding argument is a string pointer(bit clear)or an integer value(bit set). 118 The count argument is normally set to the exact number of strings to be passed. By setting this count to less than 16,a number of the slots can be reserved for private uses. The returned value is -1(True)if all of the arguments were successfully converted. In the event of an allocation failure,all of the partial results are released and a value of 0 is retrurned. See Also:ClearRexxMsg() FindDevice()-check whether a DOS device exists. Usage:device=FindDevice(devicename,type) D0 A0 D0 A0 (CCR) Scans the DOS DeviceList for a device node of the specified type matching the null-terminated name string. The acceptable values for the type argument are the constants DLT_DEVICE,DLT_DIRECTORY,or DLT_VOLUME define in the DOS INCLUDE files. Device names are conveted to uppercase before checking for a mr̋atch. The returned value is a pointer to the matched device node,or 0 if the device was not found. FindRsrcNode()-locate a resource node with the given name. Usage:node=FindRsrcNode(list,name,type) D0 A0 A1 D0 A0 (CCR) Searchs the specified list for the first node of the selected type with the given name. The list argument must be a pointer to a properly-initialized EXEC list header. The name argument is a pointer to a null-terminated string. Ifr͡ the type argument is 0,all nodes are selected;otherwise,the supplied type must match the LN_TYPE field of the node. The returned value is a pointer to the node or 0 if no matching node was found. FreePort()-release resources associated with a message port Usage:FreePort(port) A0 This function deallocates the signal bit associated with a message port and marks the port as "closed." The task calling FreePort()must be the same one that initialized the port,since signar[l bit allocations are specific to a task. The memory space associated with the port is not released. See Also:InitPort() FreeSpace()-releases space to the internal memory allocator. Usage:FreeSpace(envptr,block,length) A0 A1 D0 Returns a block of memory to the internal allocator,which must have been obtained from a call to GetSpace(). The envptr argument is a pointer to the base or current storage environment. See Also:CurrentEnv(),GetSpace() 119 GetSrt(node) A0 Unlinks and closes the message port and releases the resource node structure. The node must have been allocated by the OpenPublicPort()function. See Also:OpenPublicPort() CmpString()-compare string structures for equality Usage:test=CmpString(ss1,ss2) D0 A0 A1 (CCR) The arguments ss1 and ss2 must be pointers to ARexx string structures and are compared for equality. String structures include the length and hash code of the rͽstring,so the actual strings are not compared unless the lengths and hash codes match. The return value sets the CCR and will be -1(True)if the strings match and 0(False)otherwise. 114 CreateArgstring()-create an argument string structure Usage:argstring=CreateArgstring(string,length) D0 A0 D0 A0 (CCR) Allocates a RexxArg structure and copies the supplied string into it. The argstring return is a pointer to the string buffer of thr эe structure,and can be treated like an ordinary string pointer. The RexxArg structure stores the structure size and string length at negative offsets to the string pointer. The string pointer can be set to NULL if only an uninitialized structure is required. See Also:DeleteArgstring() CreateDOSPkt()-allocate and initialize a DOS standard Packet. Usage:packet = CreateDOSPkt() D0 A0 (CCR) Allocates a DOS StandardPacket structure and initializes it by interlinking r !hthe EXEC message and the DOS packet substructures. No replyport is installed in either the message or the packet,as these fields are generally filled in just before the message is sent. See Also:DeleteDOSPkt() CreateRexxMsg()-allocate an ARexx message packet Usage: msgptr=CreateRexxMsg(replyport,extension,host) D0 A0 A1 D0 A0 (CCR) This function allocates an ARexx message packet from the system free memory list. The message packet consists of r m/a standard EXEC message structure extended to include space for function arguments,returned results,and internal defaults. The replyport argument points to a public or private message port and must be supplied,as it is required to return the message packet to the sender. The extension and host arguments are pointers to null-terminated strings that provide values for the default file extension and the initial host address, respectively. Additional override fields in the extended packer XOt except for the primary and secondary result fields rm_Result1 and rm_Result2. See Also: DeleteRexxMsg() CVa2i()-convert from ASCII to integer Usage: (digits,value) = CVa2i(buffer) D0 D1 A0 Converts the buffer of ASCII characters to a signed long integer value. The scan proceeds until a non-digit character is found or until an overflow is detected. The function returns both the number of digits scanned and the converted value. 115 CVc2x()-convert(unr ՔEYJpack)from character string to hex or binary digits. Usage: error = CVc2x(outbuff,string,length,mode) D0 A0 A1 D0 D1 Converts the signed integer value argument to ASCII characters using the supplied buffer pointer. The digits argument specifies the maximum number of characters that will be copied to the buffer. The returned length is the actual number of characters copied. The pointer return is the new buffer pointer. See Also: CVi2az() CVi2arg()-convra0qert from integer to argstring Usage: argstring=CVi2arg(value,digits) D0 D0 D1 A0 (CCR) Converts the signed long integer value argument to ASCII characters,and installs them in an argstring(a RexxArg structure). The returned value is an argstring pointer or 0 if the allocation failed. The allocated structure can be released using DeleteArgstring(). CVi2az()-convert from integer to ASCII with leading zeroes Usage: (length,pointer)=CVi2az(buffer,value,drdGK igits) D0 A0 A0 D0 D1 Converts the signed long integer value argument to ASCII characters in the supplied buffer,with leading zeroes to fill out the requested number of digits. This function is identical to CVi2a except that leading zeroes are supplied. See Also:CVi2a() CVs2i()-convert from string structure to integer Usage: (error,value)=CVs2i(ss) D0 D1 A0 The ss argument must be a pointer to a string structure. It is convertertd to a signed long integer value return. The error return code is 47("Arithmetic conversion error")if the string is not a valid number. 116 CVx2c()-convert from hex or binary digits to(packed)string Usage:error=CVx2c(outbuff,string,length,mode) D0 A0 A1 D0 D1 Converts the string argument of hex(0-9,A-F)or binary(0,1)digits to the packed binary representation. The mode argument specifies the(hex or binary)conversion mode,and must be set to -1 for her)Bx strings or 0 for binary strings. Blank characters may be embedded in the string for readability,but only at byte boundaries. The error return code is 47 if the string is not a valid hex or binary string. CurrentEnv()-return the current storage environment Usage:envptr=CurrentEnv(rxtptr) D0 A0 Returns a pointer to the current storage environment associated with an executing ARexx program. The rxptr argument is a pointer to the RexxTask structure,and may be orڪEe file buffer ClosePublicPort Resource Close a port resource node CmpString String Compare string structures for equality CreateArgstring Resource Create an argstring structure CreateDOSPkt Input/Output Creata a DOS Standard Packet CreateRexxMsg Resource Create a message packet CurrentEnv Resource Get current storage environment CVa2i Conversion ASCII to integer CVc2x Conversion Character to Hex or Binary digits CVi2a Conversion Integer to ASCII CVi2arg Conversion IntegrRXVer to ASCII argstring CVi2az Conversion Integer to ASCII,leading zeroes CVs2i Conversion String structure to integer CVx2c Conversion Hex or binary digits to binary DeleteArgstring Resource Release an argstring structure DeleteDOSPkt Input/Output Release a DOS Standard Packet DeleteRexxMsg Resource Release a message packet DOSRead Input/Output Read from a DOS filehandle DOSWrite Input/Output Write to a DOS filehandle ErrorMsg Conversion Get error message from error code r܏ExistF Input/Output Check whether a DOS file exists FillRexxMsg Resource Convert and install argstrings FindDevice Input/Output Locate a DOS device node FindRsrcNode Resource Locate a resource node FreePort Resource Close a message port FreeSpace Resource Release internal memory GetSpace Resource Allocate internal memory InitList Resource Initialize a list header InitPort Resource Initialize a message port IsRexxMsg Resource Test a message packet LengthArgstring Resource r+zGet length of argstring ListNames Resource Copy node names to an argstring OpenF Input/Output Open a file buffer OpenPublicPort Resource Allocate and open a port resource node QueueF Input/Output Queue a line in a file buffer ReadF Input/Output Read from a file buffer ReadStr Input/Output Read a string from a file buffer RemClipNode Resource Release a Clip node RemRsrcList Resource Release a resource list RemRsrcNode Resource Release a resource node 112 TABLE C.rހIe1 LIBRARY FUNCTIONS (cont) NAME FUNCTIONAL GROUP DESCRIPTION SeekF Input/Output Reposition a file buffer StackF Input/Output Stack a line in a file buffer StcToken String Break out a token StrcmpN String Compare strings StrcpyA String Copy a string,converting to ASCII StrcpyN String Copy a string StrCpyU String Copy a string,converting to uppercase StrflipN String Reverse characters in a string Strlen String Find length of a string ToUpper Conversion ASCII r߃4 to uppercase WriteF Input/Output Write to a file buffer C-2 LIBRARY FUNCTIONS The following descriptions of the ARexx Systems Library functions are listed alphabetically. The required arguments and register assignments are shown in parentheses after the function name. Multiple returns are shown in parentheses on the left-hand side of the call. AddClipNode()-allocate and link a Clip node Usage:node=AddClipNode(list,name,length,value) D0 A0 A1 D0 D1 A0 (CCR) Ar{sVllocates and links a Clip node into the specified list. Clip nodes are resource nodes containing a name and value string,and include an "auto-delete" function for simple maintenance. The list argument must point to a properly- initialized EXEC list header. The name argument points to a null-terminated name string,the value argument is a pointer to a storage area,and the length argument is its length in bytes. The returned value is a pointer to the allocated node,or 0 if the allocatior[Fn failed. The RemClipNode()function is installed as the "auto-delete" function for each node. Clip nodes can be intermixed with other resource nodes in a list and then released with a single call to RemRsrcList(). See Also:RemClipNode(),RemRsrcList(),RemRsrcNode() AddRsrcNode()-allocate and link a resource node Usage:node=AddRsrcNode(list,name,length) D0 A0 A1 D0 A0 (CCR) Allocates and links a resource node(a RexxRsrc structure)to the specified list. The name argumerNnt is a pointer to a null-terminated string,a copy of which is installed in the node structure. The length argument is the total length for the node;this length is saved within the node so that it may be released later. 113 The returned value is a pointer to the allocated node,or 0 if the allocation failed. See Also:RemRsrcList(),RemRsrcNode() ClearMem()-clear a block of memory Usage:ClearMem(address,length) A0 D0 Clears a block of memory beginning at the given addresrOȟs for the specified length in bytes. The address must be word-aligned and the length must be a multiple of 4 bytes;all structures allocated by ARexx meet these restrictions. Register A0 is preserved. ClearRexxMsg()-release argument strings Usage:ClearRexxMsg(msgptr,count) A0 D0 Releases one or more argstrings from a message packet and clears the corresponding slots. The count argument specifies the number of argument slots to clear,and can be set to less than 16 to reservrΫEe some to the slots for private use. No action is taken if the slot already contains a zero value. See Also:FillRexxMsg() CloseF()-close a file buffer Usage:boolean=CloseF(IoBuff) D0 A0 Release the IoBuff structure and closes the associated DOS file. CloseF()is the "auto-delete" function for the IoBuff structure,so an entire list of file buffers can be closed with a single call to RemRsrcList(). ClosePublicPort()-close a port resource node Usage:ClosePublicPorrh K 1. ERROR: 47 SEVERITY: 10 MESSAGE: ARITHMETIC CONVERSION ERROR A non-numeric operand was used in a operation requiring numeric operands. This message will also be generated by an invalid hex or binary string. ERROR: 48 SEVERITY: 10 MESSAGE: INVALID OPERAND An operand was not valid for the intended operation. This message will be generated if an attempt is made to divide by 0,or if a fractional exponent is used in an exponentiation operation. 107 APPENDIX B LIMITS AND COMPr]ATIBILITY ARexx was designed to adhere closely to the REXX language standard. This appendix discusses those areas where ARexx departs from the standard. B-1 LIMITS Language definitions seldom include predefined limits to the program structures that can be created. Only a few such restrictions were imposed in implementing ARexx,and most of the internal structure are limited only by the total amount of memory available. The current implementation limits are listed below. LENGTH OF rͮbSTRINGS. Strings,symbol names,and value strings are limited to a maximum length of 65,535 bytes. LENGTH OF CLAUSES. Clauses are limited to a maximum of 800 characters after removing comments and multiple blanks. NODES IN COMPOUND NAMES. Compound symbol names may include a maximum of 50 nodes,including the stem. ARGUMENTS TO FUNCTIONS. Built-In and external functions are limited to a maximum of 15 arguments. There is no limit to the number of arguments that may be passed to an interUrnal function. SUBEXPRESSION NESTING. The maximum nesting level for subexpressions is 32. B-2 COMPATIBILITY ARexx departs in a few ways from the language definition. The differences can be classified as omissions or extensions,and are described below. OMISSIONS. The only significant specification of the language standard omitted from this implementation is the arbitrary-precision arithmetic facility. Arithmetic operations are limited to about 14 digits of precision,and the FUZZ or鵅bption is not implemented at all. Only the SCIENTIFIC format is used for exponential notation. The full numeric capabilities will be provided in a later release. EXTENSIONS. The following extensions to the language standard have been included in this implementation: BREAK INSTRUCTION. A new instruction called BREAK has been implemented. It is used to exit from the scope of any DO or INTERPRET instruction. ECHO INSTRUCTION. The ECHO instruction has been included as a synonym for SAYrȾ. SHELL INSTRUCTION. The SHELL instructiion has been included as a synonym for ADDRESS. 109 SIGNAL OPTIONS. Several additional SIGNAL keywords have been implemented. BREAK_C,BREAK_D,BREAK_E,and BREAK_F will detect and trap the control-C through control-F signals passed by AmigaDOS. The IOERR keyword traps errors detected by the I/O system. STEM SYMBOLS. A stem symbol is valid anywhere that a simple symbol could be employed. TEMPLATE PROCESSING. Templates have been generalizerd in several ways. Variable symbols may be used as positional tokens if preceded by an operator;the "=" operator is used to denote an absolute position. Multiple templates can be used with all source forms of the PARSE instruction. 110 APPENDIX C THE AREXX SYSTEMS LIBRARY The ARexx interpreter is supplied as a shared library named rexxsyslib.library and should reside in the system LIBS:directory. While many of the library routines are highly specific to the interpreter,somerƟ of the functions will be useful to applications that use ARexx. The library is opened when the ARexx resident process is first loaded and will always be available while it remains active. The system library routines were designed to be called from assembly-language programs and,unless otherwise noted,save all registers except for A0/A1 and D0/D1. Many routines return values in more than one register to help reduce code size. In addition,the routines will set the condition-code regirpster(CCR) wherever appropriate. In mode cases the CCR reflects the value returned in D0. The library offsets are defined in the file rxslib.i,which should be INDLUDEd in the program source code. Calls may be made from "C" programs if suitable binding routines are provided when the program is linked. The definitions for the constants and data structures used in ARexx are provided as INCLUDE files on the program distribution disk. These should be reviewed carefully before attempting trXo use the library functions. C-1 FUNCTION GROUPS The library functions can be frouped into Conversion,Input/Output,Resource Management,and String Manipulation functions. DATA CONVERSION. These functions provide many of the common data-conversion requirements. INPUT/0UTPUT. Two levels of I/O support are provided. The low level functions use DOS filehandles directly,while the higher-level functions use linked lists of IoBuff structures and support logical file names. RESOURCE. ThesrLqe functions allocate,release,or otherwise manage the data structures used with ARexx. STRING FUNCTIONS. All data in ARexx are managed as strings. These functions provide some of the more common string-manipulation operations. 111 TABLE C.1 AREXX SYSTEMS LIBRARY FUNCTIONS NAME FUNCTIONAL GROUP DESCRIPTION AddClipNode Resource Allocate a Clip node ClearMem Resource Clear a block of memory ClearRexxMsg Resource Release argstrings from message CloseF Input/Output Close armH@alid only following the THEN branch of an IF range. ERROR: 22 SEVERITY: 10 MESSAGE: UNEXPECTED BREAK,LEAVE,or ITERATE The BREAK instruction is valid only within a DO range or inside an INTERPRETed string. The LEAVE and ITERATE instuctions are valid only within an iterative DO range. ERROR: 23 SEVERITY: 10 MESSAGE: INVALID STATEMENT IN SELECT A invalid statement was encountered within a SELECT range. Only WHEN,THEN,and OTHERWISE statements are valid within a SELECT range,except for r the conditional statements following THEN or OTHERWISE clauses. ERROR: 24 SEVERITY: 10 MESSAGE: MISSING OR MULTIPLE THEN An expected THEN clause was not found,or another THEN was found after one had already been executed. ERROR: 25 SEVERITY: 10 MESSAGE: MISSING OTHERWISE None of the WHEN clauses in a SELECT succeeded,but no OTHERWISE clause was supplied. ERROR: 26 SEVERITY: 10 MESSAGE: MISSING OR UNEXPECTED END The program source ended before an END was found for a DO or SELECT inr5Hstruction or an END was encountered outside of a DO or SELECT range. 105 ERROR: 27 SEVERITY: 10 MESSAGE: SYMBOL MISMATCH The symbol specified on an END,ITERATE,or LEAVE instruction did not match the index variable for the associated DO range. Check that the active loops have been nested properly. ERROR: 28 SEVERITY: 10 MESSAGE: INVALID DO SYNTAX An invalid DO instruction was executed. An initializer expression must be given if a TO or BY expression is specified,and a FOR exprer9ssion must yield a non- negative integer result. ERROR: 29 SEVERITY: 10 MESSAGE: INCOMPLETE IF OR SELECT An IF or SELECT range ended before all of the required statement were found. Check whether the conditional statement following a THEN,ELSE,or OTHERWISE clause was omitted. ERROR: 30 SEVERITY: 10 MESSAGE: LABEL NOT FOUND A label specified by a SIGNAL instruction,or implicitly referenced by an enabled interrupt,could not be found in the program source. Labels defined dynamically bruMy an INTERPRET instruction or by interactive input are not included in the search. ERROR: 31 SEVERITY: 10 MESSAGE: SYMBOL EXPECTED A non-symbol token was found where only a symbol token is valid. The DROP,END, LEAVE,ITERATE,and UPPER instructions may only be followed by a symbol token,and will generate this error if anything else is supplied. This message will also be issued if a required symbol is missing. ERROR: 32 SEVERITY: 10 MESSAGE: SYMBOL OR STRING EXPECTED An invalid token rwas found in a context where only a symbol or string is valid. ERROR: 33 SEVERITY: 10 MESSAGE: INVALID KEYWORD A symbol token in an instruction clause was identified as a keyword,but was invalid in the specific context. ERROR: 34 SEVERITY: 10 MESSAGE: REQUIRED KEYWORD MISSING An instuction clause required a specific keyword token to be present,but it was not supplied. For example,this messge will be issued if a SIGNAL ON instruction is not followed by one of the interrupt keywords(rB.,e.g.SYNTAX.) ERROR: 35 SEVERITY: 10 MESSAGE: EXTRANEOUS CHARACTERS A seemingly valid statement was executed,but extra characters were found at the end of the clause. ERROR: 36 SEVERITY: 10 MESSAGE: KEYWORD CONFLICT Two mutually exclusive keywords were included in an instruction clause,or a keyword was included twice in the same instruction. ERROR: 37 SEVERITY: 10 MESSAGE INVALID TEMPLATE The template provided with an ARG,PARSE,or PULL instruction was not properly constructed. ReferGjcr to Chapter 8 for a description of template structure and processing. 106 ERROR: 38 SEVERITY: 10 MESSAGE: INVALID TRACE REQUEST The alphabetic keyword supplied with a TRACE instruction or as the argument to the TRACE()Built-In function was not valid. Refer to Chapter 7 for the valid TRACE options. ERROR: 39 SEVERITY: 10 MESSAGE: UNINITIALIZED VARIABLE An attempt was made to use an uninitialized variable while the NOVALUE interrupt was enabled. ERROR: 40 SEVERITY: 10 MESSAGE:rҳeu INVALID VARIABLE NAME An attempt was made to assign a value to a fixed symbol. ERROR: 41 SEVERITY: 10 MESSAGE: INVALID EXPRESSION An error was detected during the evaluation an expression. Check that each operator has the correct number of operands,and that no extraneous tokens appear in the expression. This error will be detected only in expressions that are actually evaluated. No checking is performed on expressions in clauses that are being skipped. ERROR: 42 SEVERITY: 10 MESSAr7GE: UNBALANCED PARENTHESE An expression was found with an unequal number of opening and closing parentheses. ERROR: 43 SEVERITY: 43 MESSAGE: NESTING LIMIT EXCEEDED The number of subexpressions in an expression was greater than the maximum allowed. The expression should be simplified by breaking it into two or more intermediate expressions. ERROR: 44 SEVERITY: 10 MESSAGE: INVALID EXPRESSION RESULT The result of an expression was not valid within its context. For example,this messge rwwill be issued if an increment or limit expression in a DO instruction yields a non-numeric result. ERROR: 45 SEVERITY: 10 MESSAGE: EXPRESSION REQUIRED An expression was omitted in a context where one is required. For example,the SIGNAL instruction,if not followed by the keywords ON or OFF,must be followed by an expression. ERROR: 46 SEVERITY: 10 MESSAGE: BOOLEAN VALUE NOT 0 OR 1 An expression result was expected to yield a boolean result,but evaluated to something other than 0 orrzram as the primary result code. The error code itself is returned as the secondary result. The subsequent propagation or reporting of these codes is of course dependent on the external(calling)program. The following pages list all of the currently-defined error codes,along with the associated severity level and message string. ERROR: 1 SEVERITY: 5 MESSGE: PROGRAM NOT FOUND The named program could not be found,or was not an ARexx program. ARexx programs are expected to start with a rߜe"/*" sequence. This error is detected by the external interface and cannot be trapped by the SYNTAX interrupt. ERROR: 2 SEVERITY: 10 MESSAGE: EXECUTION HALTED A control-C break or an external half request was received and the program terminated. This error will be trapped if the HALT interrupt has been enabled. ERROR: 3 SEVERITY: 20 MESSAGE: INSUFFICIENT MEMORY The interpreter was unable to allocate enough memory for an operation. Since memory space is required for all parsing and rXexecution operations,this error cannot usually be trapped by the SYNTAX interrupt. ERROR: 4 SEVERITY: 10 MESSAGE: INVALID CHARACTER A non-ASCII character was found in the program. Control codes and other non- ASCII characters may be used in a program by defining them as hex or binary strings. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 5 SEVERITY: 10 MESSAGE: UNMATCHED QUOTE A closing single or double quote was missing. Check that each string isrѭ3 properly delimited. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. 103 ERROR: 6 SEVERITY: 10 MESSAGE: UNTERMINATED COMMENT The closing "*/" for a comment field was not found. Remember that comments may be nested,so each "/*" must be matched by a "*/." This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 7 SEVERITY: 10 MESSAGE: CLAUSE TOO LONG A clause was too long for the internal buffer used as temporary storage. The sour>mߑrce line in question should be broken into smaller parts. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 8 SEVERITY: 10 MESSAGE: INVALID TOKEN An unrecognized lexical token was found,or a clause could not be properly classified. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 9 SEVERITY: 10 MESSAGE: SYMBOL OR STRING TOO LONG An attempt was made to create a string longer than the maximum supported by the interpreter.r The implementation limits for internal structure are given in Appendix B. ERROR: 10 SEVERITY: 10 MESSAGE: INVALID MESSAGE PACKET An invalid action code was found in a message packet sent to the ARexx resident process. The packet was returned without being processed. This error is detected by the external interface and cannot be trapped by the SYNTAX interrupt. ERROR: 11 SEVERITY: 10 MESSAGE: COMMAND STRING ERROR A command string could not be processed. This error is detected by thrnPe external interface and cannot be trapped by the SYNTAX interrupt. ERROR: 12 SEVERITY: 10 MESSAGE: ERROR RETURN FROM FUNCTION An external function returned a non-zero error code. Check that the correct parameters were supplied to the function. ERROR: 13 SEVERITY: 10 MESSAGE: HOST ENVIRONMENT NOT FOUND The message port corresponding to a host address string could not be found. Check that the required external host is active. ERROR: 14 SEVERITY: 10 MESSAGE: REQUESTED LIBRARY NOT FOr&_UND An attempt was made to open a function library included in the Library List,but the library could not be opened. Check that the correct name and version of the library were specified when the library was added to the resource list. ERROR: 15 SEVERITY: 10 MESSGE: FUNCTION NOT FOUND A function was called that could not be found in any of the currently accessible libraries,and could not be located as an external program. Check that the appropriate function libraries have been addedr\} to the Libraries List. 104 ERROR: 16 SEVERITY: 10 MESSAGE: FUNCTION DID NOT RETURN VALUE A function was called which failed to return a result string,but did not otherwise report an error. Check that the function was programmed correctly,or invoke it using the CALL instruction. ERROR: 17 SEVERITY: 10 MESSAGE: WRONG NUMBER OF ARGUMENTS A call was made to a function which expected more(or fewer)arguments. This error will be generated if a Built-In or external function is calledrū/ with more arguments than can be accomodated in the message packet used for external communications. ERROR: 18 SEVERITY: 10 MESSAGE: INVALID ARGUMENT TO FUNCTION An inappropriate argument was supplied to a function,or a required argument was missing. Check the parameter requirements specified for the function. ERROR: 19 SEVERITY: 10 MESSAGE: INVALID PROCEDURE A PROCEDURE instruction was issued in an invalid context. Either no internal functions were active,or a PROCEDURE had alreadrNy been issued in the current storage environment. ERROR: 20 SEVERITY: 10 MESSAGE: UNEXPECTED THEN OR WHEN A WHEN or THEN instruction was executed outside of a valid context. The WHEN instruction is valid only within a SELECT range,and THEN must be the next instruciton following an IF or WHEN. ERROR: 21 SEVERITY: 10 MESSAGE: UNEXPECTED ELSE OR OTHERWISE An ELSE or OTHERWISE was found outside of a valid context. The OTHERWISE instruction is valid only within a SELECT range. ELSE is vrZHbe in A6. The structure of the message packet is the same as that in Table 10.2,but note that although a message packet is used to carry the arguments,it is not queued at a message port and does not need to be unlinked. The name of the function to be called is carried in the ARGO parameter slot. The query function must search for this function name and,if the name cannot be found,must return an error code of 1("Program not found")in register D0. The library will then be closed and ther+`8A search continued in the next function library. The query function should not modify any fields within the message packet,as it must be passed along to the next library until the function is located. PARAMETER CONVERSION Once the requested function has been found,the query funcion may need to transform the parameters passed by ARexx into the form expected by the function. Whether the parameter strings need to be converted depends on how they are to be used. In some cases it may be r:sufficient just to foward a pointer to the message packet to the called function,while in other cases the query function may need to load parameters into registers or to perform conversion operations. The parameters in ARG1-ARG15 are always passed as argstrings,and may be treated like a pointer to a null-terminated string. Further attributes are stored at negative offsets from the argstring pointer, and may be helpful in working with the string. Numeric quantities are passed as strir 7bngs of ASCII characters and will need to be converted to integer or floating-point format if arithmetic calculations are to be performed. The ARexx System Library includes a limited set of functions to do parameter conversions. The actual parameter count can be obtained from the low-order byte of the rm_Action field in the message packet. The count never includes the function name itself(in ARGO),but does include arguments specified as "defaults." Such arguments will have a zero valr *ue in the corresponding parameter slot. Note that the parameter block of the message packet,containing the fields ARG0-ARG15,is structured like the argument array expected by the main(argc, argv)function of a "C" program. This suggests a simple way that a function library could provide a bridge to a series of "C" programs. The query function would need only to determine the address of the called function,and then push the parameter block address and argument count onto the program sr Ctack. RETURNED VALUES Each library function must return an error code and a value string. The error code is returned in register D0,and should be 0 if no errors occurred. The value string must be returned as an argstring pointer in register A1,unless D0 indicates that an error occurred during the call. The mechanisms for creating the proper return values can be made part of the query function,so that all functions in the library share a common return path. 101 10-6 DIRECT MANr H%IPULATION OF DATA STRUCTURES All of the data structures maintained by the resident process are built into the ARexx Systems Library base and are therefore accessible to external programs. The Task List in the RexxBase structure links the global data structures for all currently active ARexx programs. This linkage uses the node contained in the message port of the RexxTask structure,rather than at the head of the structure. The RexxTask structure is the global data structure and initr oial storage environment for the ARexx program,and all descendant storage environments are linked into the Environment List. The linkage of internal data structures is such that the complete internal state of all ARexx programs can be reached starting from the library base pointer. Two library functions,LockRexxBase() and UnlockRexxBase(),are provided to mediate access to the global structures. The structure base should be locked before reading any of the data items or traversing anyr[v of the lists. The present version of these functions provides only a global lock,but future extensions will allow individual resources to be locked. In general it should not be necessary to manipulate directly any of these data structures. Functions have been provided in the ARexx Systems Library to perform all of the operations required to interface external program to the ARexx system. It is therefore recommended that applictions developers avoid using any of the internal structur !res except as provided through the library functions. 102 APPENDIX A ERROR MESSAGES When the ARexx interpeter detects an error in a program,it returns an error code to indicate the nature of the problem. Errors are normally handled by displaying the error code,the source line number where the error occurred,and a brief message explaining the error condition. Unless the SYNTAX interrupt has been previously enabled(using the SIGNAL instruction),the program then terminates andrky control returns to the caller. Most syntax and execution errors can be trapped by the SYNTAX interrupt,allowing the user to retain control and perform whatever special error processing is required. Certain errors are generated outside of the context of an ARexx program,and therefore cannot be trapped by this mechanism. Refer to chapter 7 for further information on error trapping and processing. Associated with each error code is a severity level that is reported to the calling progrGIB Once the console is open,all active ARexx programs will divert their tracing output to the console. Tracing input(for interactive debugging)will also be diverted to the new console. Only one console can be opened;subsequent RXTCOPN requests will be returned with a warning error message. MODIFIER FLAGS Command codes may include modifier flags to select various processing options. Modifier flags are specific to certain commands,and are ignored otherwise. RXFB_NOIO. This modifier isrS used with the RXCOMM and RXFUNC command codes to suppress the automatic inheritance of the host's input and output streams. RXFB_NONRET. Specifies that the message packet is to be recycled by the resident process rather than being returned to the sender. This implies that the sender doesn't care about whether the requested action succeeded,since the returned packet provides the only means of acknowledgement. Messge packets are released using the library function DeleteRexxMsg(). RrJ%XFB_RESULT. This modifer is valid with the RXCOMM and RXFUNC commands,and requests that the called program return a result string. If the program EXITs(or RETURNs)with an expression,the expression result is returned to the caller as an argstring. It is then the caller's responsibility to release the argstring when it is no longer needed;this can be done using the library function DeleteArgstring(). RXFB_STRING. This modifer is valid with the RXCOMM and RXFUNC command codes. It indicraates that the command or function argument(in slot ARGO)is a "string file" rahter than a file name. RXFB_TOKEN. This flag is used with the RXCOMM code to request that the command string be completely tokenized before being passed to the invoked program. Programs invoked as commands normally have only a single argument string. The tokenization process uses "white space" to separate the tokens,except within quoted strings. Quoted strings can use either single or double quotes,and the rhend of the command string(a null character)is considered as an implicit closing quote. 99 RESULT FIELDS The resident process uses the standard command-level conventions for the primary return code installed in rm_Result1. Minor or warning errors are indicated by a value of 5,and more serious errors are returned as values of 10 or 20. The secondary result field rm-Result2 will either be zero or an ARexx error code if applicable. Note that RXCOMM and RXFUNC messages are returnert4^d directly by the invoked macro program,rathe than by the residen process. 10-5 EXTERNAL FUNCTION LIBRARIES ARexx supports external function libraries as a mechanism for user-defined extensions to the language. Function libraries may be written and maintained by users or applications developers. DESIGN CONSIDERATIONS There are several different purposes for which a function library might be designed. In the simplest case,a library could be used to extend the string manipulation oror mathematical capabilities of the language by defining new functions. Such a library could be entirely self-contained or might call other system libraries to perform specific operations. Another alternative would be to build a library that interacts closely with an external applications program. This could allow specific operations in the host application to be performed as function calls rather than as commands. There are several advantages to this approach,as it avoids the need tr5io parse command strings and does not require the multiple task context changes associated with message-passing. The library might include entry points for specific operaions as well as functions to support processing required by the applications program. Function libraries can also serve as bridges to other system or applications libraries. For example,if a program needed to call the functions in a graphics library,a bridge library could be built to match the function names in the prrogram with the appropriate entry point in the graphics library. A related possibility would be to use ARexx as a test driver for a program under development. Once the query table and parameter passing mechanisms for the function library have been built,new routines under development could be tested by just adding a table entry. Since building test programs is ofter very time- consuming,the flexibility and interactive debugging capabilities of ARexx make it an attractive alternative rjNdto compiled languages like "C." Regardless of the intended application,all function libraries share a common structure. The initial design follows that of the standard EXEC shared library, with the three required entry points Open,Close,and Expunge,plus a reserved slot. The library must also have a "query" entry point,which serves to match the name supplied by ARexx with the intended function. Typically,this will consist of a table of function names and a routine to search for the srQ`!pecified one. REENTRANCY. Functions libraries should be designed to be fully reentrant,since any number of ARexx programs may be running at any time. If this is not feasible due to other design constraints,the query function should include a lockout mechanism to prevent multiple calls to the library routines. 100 CALLING CONVENTION The library's query function will be called from the interpreter's context with the address of a message packet in register A0 and the library basru9%DPROCESS All communications with the resident process are handled by passing message packets,which were previously diagrammed in Table 10.2. The packet has a command field that describes the action to be performed and parameter fields that are specific to the command. Message packets are processed as they are received,and are then either returned to the sender or passed along to another process(in the case of a program invocation.) The packet includes two result fields that are used rto return error codes or result strings. The parameter fields of the message packet may contain either(long)integer values or pointers to argument strings. String arguments are assumed to be argstring pointers unless otherwise specified. COMMAND(ACTION)CODES The command codes that are currently implemented in the resident process are described below. Commands are listed by their mnemonic codes,followed by the valid modifier flags. The final code value is always the logical OR of thr ǣe code value and all of the modifier flags selected. The command code is installed in the rm_Action field of the message packet. USAGE: RXADDCON [RXFB_NONRET] This code specifies an entry to be added to the Clip List. Parameter slot ARGO points to the name string,slot ARG1 points to the value string,and slot ARG2 contains the length of the value string. 97 The name and value arguments do not need to be argstrings,but can be just pointers to storage areas. The name should be a rsnull-terminated string,but the value can contain arbitrary data including nulls. USAGE: RXADDFH [RSFB_NONRET] This action code specifies a function host to be added to the Library List. Parameter slot ARGO points to the(null-terminated)host name string,and slot ARG1 holds the search priority for the node. The search priority should be an integer between 100 and -100 inclusive;the remaining priority ranges are reserved for future extensions. If a none already exists with the same namr l^e,the packet is returned with a warning level error code. Note that no test is made at this time as to whether the host port exists. USAGE:RXADDLIB [RXFB_NONRET] This code specifies an entry to be added to the Library List. Parameter slot ARGO points to a null-terminated name string referring either to a function library or a function host. Slot ARG1 is the priority for the node and should be an integer between 100 and -100 inclusive;the remaining priority ranges are reserved for fur!|ture extensions. Slot ARG2 contains the entry oint offset and slot ARG3 is the library version number. If a node already exists with the same name,the packet is returned with a warning level error code. Otherwise,a new entry is added and the library or host becomes available to ARexx programs. Note that no test is made at this time as to whether the library exists and can be opened. USAGE:RXCOMM [RXFB_TOKEN] [RXFB_STRING] [RXFB_RESULT] [RXFB_NOIO] Specifies a command-mode invocationr"g of an ARexx program. Parameter slot ARGO must contain an argstring ointer to the command string. The RXFB_TOKEN flag specifies that the command line is to be tokenized before being passed to the invoked program. The RXFB_STRING flag bit indicates that the command string is a "string file." Command invocations do not normally return result strings,but the RXFB_RESULT flag can be set if the caller is prepared to handle the cleanup associated with a returned string. The RXFB_NOIO modifr#Oier suppresses the inheritance of the host's input and output streams. USAGE:RXFUNC [RXFB_RESULT] [RXFB_STRING] [RXFB_NOIO] argcount This command code specifies a function invoction. Parameter slot ARGO contains a pointer to the function name string,and slots ARG1 through ARG15 point to the argument strings,all of which must be passed as argstrings. The lower byte of the command code is the argument count;this count excludes the function name string itself. Function calls normally sr$ et the RXFB_RESULT flag,but this is not mandatory. The RXFB_STRING modifier indicates that the function name string is actually a "string file". The RXFB_NOIO modifier suppresses the inheritance of the host's input and output streams. USAGE:RXREMCON [RXFB_NONRET] This code requests that an entry be removed from the Clip List. Parameter slot ARGO points to the null-terminated name to be removed. The Clip List is searched for a node matching the supplied name,and if a match is found tr%!4Hhe list node is removed and recycled. If no match is found the packet is returned with a warning error code. USAGE:RXREMLIB [RXFB_NONRET] This command removes a Library List entry. Parameter slot ARGO points to the null terminated string specifying the library to be removed. The Library List is searched for a node matching the library name,and if a match is found the 98 node is removed and released. If no match is found the packet is returned with a warning error code. The libr'ary node will not be removed if the library is currently being used by an ARexx program. USAGE:RXTCCLS [RXFB_NONRET] This code requests that the global tracing console be closed. The console window will be closed immediately unless one or more ARexx programs are waiting for input from the console. In this event,the window will be closed as soon as the active programs are no longer using it. USAGE:RXTCOPN [RXFB_NONRET] This command requests that the global tracing console be opened.r'yth begins with the current directory and proceeds to the system REXX: directory. To further the above example,invoking the program as "rx test 1 2 3" would search for the files test.rexx,test,REXX:test.rexx,and REXX:test,in that order. If an ARexx program cannot be found,one alternative action may be taken. If the rm_PassPort field of an extended packet was supplied,the message packet is passed along to that port,which might be the next process in a search chain. Otherwise the messar(z}'ge is returned with a "Program not found"error indication (error code 1.) 95 EXTENSION FIELDS The RexxMsg structure includes several "extension fields" that can be used to override various defaults when a program is invoked. These extension fields can be filled in selectively,and only the non-zero values will override the corresponding default. ARexx never modifies the extension area. Host applications should supply values for the file extension and host address fields of ther)[k message packet. The file extension affects which program files will match a given command name,and allows macro programs specific to the host to be given distinctive names. The host address must refer to a public message port,and will usually indicate the host's own port. Any appropriate(but usually short)strings can be chosen for these values. Oftern,the name of the applications program itself can be used as its host address and file extension. PASSPORT. The rm_PassPort field allor*Mows the search for a program to be "passed along" to another messsage port after checking for an ARexx program. If the command or function name doesn't resolve to an ARexx program,the message packet is forwarded to the message port specified as the PassPort. This allows applications to maintain control over the search order for external program files. Note that the rm_PassPort field must be the actual address of a message port, rather than a name string. The PassPort therefore does nr+o%׀ot have a public port, but the port should be a secured resource,since the message is sent directly to this address without checking to see whether it is a valid message port. HOST ADDRESS. The rm_ComAddr field overrides the default initial host address, which is "REXX." The host address is the name of the messsage port to which commands will be directed,and is supplied as a pointer to a null-terminated string. Applications that support multiple instances of user data will usually cr,yreate a separate message port for each instance. The name of this port would then be supplied as the host address for any commands issued from that instance. FILE EXTENSION. The rm_FileExt field is used to override the default file extension for ARexx programs,which is "REXX". Host applications can use the file extension to distinguish the names of the macro programs specific to that application. It is supplied as a pointer to a null-terminated string. INPUT AND OUTPUT STREAMS. Ther-~ default input and output steams for an ARexx program are inherited from the host application's process structure,if the host is a process rather than just a task. One or both of these streams may be overridden by supplying an appropriate value in the rm-Stdin or rm_stdout fields. The values supplied must be valid DOS filehandles,and must not be closed while the program is executing. The steams are installed directly into the program's process structure,replacing the prior values. Tr.mRahe output stream is also used as the default tracing stream for the program. If interactive tracing is to be used in a program,the output stream should refer to a console device,since it will be used for input as well. 96 In the event than an ARexx program is invoked by an EXEC task,rather than by an DOS process,the extension field streams are the only way that the launched program can be given default I/O streams. INTERPRETING THE RESULT FIELDS The message packet that invoker/Kod an ARexx program is returned to the client when the program finishes. The two result fields will contain error codes or possibly a result string. The interpretation of the result fields depends partly on the mode of invocation. If the primary result field rm_Result1 is zero,the program executed normally and the secondary field rm_Result2 will contain a pointer to a result string,assuming that one was requested(and available.) If the primary result is non-zero,it represents either r0h=an error severity level or else the return code from a command invocation. The two cases can be distinguished by examining the secondary result. If the secondary field is also non-zero,an error occurred and the secondary field is an ARexx error code. If the secondary result is zero,then the primary result is the return code passed by an "EXIT rc" or "RETURN rc" instruction in the program. The application program can use this return code either as an error indication or to initiate sorme particular processing action. Result strings are always returned as an argstring and become the property(that is,responsibility)of the host. When the string is no longer needed,it can be released using the DelArgstring() function. Errors occurring in macro programs should usually be reported to the user. Explanatory messages are available for all ARexx error codes,and can be obtained by calling the ARexx Systems Library function ErrorMsg(). 10-4 COMMUNICATING WITH THE RESIDENT r2}Fy time. To be absolutely safe,the calls to FindPort() and PutMsg()should be bracketed by calls to the EXEC routines Forbid()and Permit(). This will exclude the slight possibility that the message port could close in the few microseconds before the message packet is actually sent to the port address. After sending the packet the host can return to its normal processing,since the macro program will execute as a separate task. In most cases it will be advisable to "lock-out" further usr3U@Yer commands while the ARexx program is running,to preserve te integrity of any shared data structures that may be accessed externally. COMMAND INVOCATIONS In the command mode of invocation the host supplies a command string consisting of a name token followed by an argument string. ARexx parses the string to extract the command name,which is usually the name of a program file. The default action is to use the remainder of the command string as the(single) argument string for the prr4Jj%ogram. This may be overridden by requesting command tokenization,which is done by setting the RXFB_TOKEN modifier flag in the action code of the message packet. In this case the entire command string will be parsed,and the program may have many argument strings.(There is no limit to the number of arguments that may be derived from the command string,since they don't have to fit into the parameter slots of the message packet.) The parsing process uses "white space" (blanks,tabs,etc.)r5 as the token separators,and has a several special features. QUOTING CONVENTION. Either single(')or double(")quotes may be used to surround items that include "white space" and would otherwise be separated during parsing. Single quotes may appear within a double-quote-delimited token,and vice versa;however,double-delimiter sequences are not accepted. The quotes are removed from the parsed token. An "implicit" quote at the end of the string is also recognized. If the command string enr6PA4ds before the closing delimiter has been found,the null byte is accepted as the final delimiter. For example, look.rexx "Now is the time" "can't ou see is a command with the two arguments strings "Now is the time" and "can't you see"(but without the quotes.) STRING FILES. If the command name(the first token of the string)is quoted,it is assumed to be a "string file" --an ARexx program in a string,rather than the name of a disk file. This is a convenient way to run very brief progrr7ams, although programs of any length may be stored this way. If command tokenization has not been specified,the remainder of the string is not scanned and no quote characters are removed. In this case the quoting convention isuseful only for indicating "string file" programs. The entire command string can be declared as a "string file" by setting the RXFB_STRING modifier flag of the action code. When this flag is set,no parsing at all is applied to the command. RESULT STRING. Commanr8fd invocations do not usually request a result string,but can do so by setting the RXFB_RESULT modifier flag. The host application must be prepared to recycle the returned result string once it is no longer needed. 94 FUNCTION INVOCATIONS In a function invocation the host application supplies a function name string and from 0 to 15 argument strings. The name string is used to locate an external program file and may include directory specifiers and a file extension. The actual ar9#rgument count(not including the name string)must be placed in the low-order byte of the command code. This mode of invocation is normally used when a result string is expected and the argument strings are conveniently available. Note that a result does not have to be requested,however. RESULT STRINGS. Function invocations request a result string by setting the RXFB_RESULT modifier flag bit. If no errors occurred and a result string was requested,the secondary result field in the rer:6dturned packet will be a pointer to the result string. However,if the program exited without supplying a result, the secondary field will be zero. STRING FILES. The function name argument may specify a "string file" rather than the name of a filing system object. This is indicated by setting the RXFB_STRING modifier flag. SEARCH ORDER The search for a program file matching a command or function name is normaly a two-step process. For each directory to be checked,a search is made fir;aS)rst with the current file extension appended to the name string. If this search fails, the second search uses the unmodified name string. The first step is skipped if the command or function name includes an explicit file extension. The default file extension is ".rexx,"but this can be changed by supplying a file extension string in an extended message packet. Host applications will usually specify a file extension,since it provides a convenient way to distinguish the macro programsr&I that are specific to that application. Refer to the section on Extension Fields for further details. The search path for a program depends on the way the program name was specified. If an explicit device or directory specification precedes the program name,only that directory will be searched. For example,the command- level invocation of "rx df0:s/test" will search only the df0:s directory for a file named test.rexx or test. If the program name does not include a path,the search par=r designer. RECEIVING COMMAND MESSAGES Each host application must open a public message port to support the command interface. When a macro program issues a command to the host,a message packet containing the command is sent to this public port. The structure of these message packets is shown in Table 10.2. The rm_Action field will be set to RXCOMM,and the ARGO parameter slot will contain the command as an argstring pointer. Parameter slots ARG1-ARG15 are not used for command messagr>i!es. Two other fields are potentially of interest: the rm_RexxTask field contains a pointer to the global data structure for the program that issued the command, and the rm_LibBase field has the ARexx library base address. The fields in the extension area may also be of interest to the host program;these are described later on. Except for setting the result fields rm_Result1 and rm_Result2,the host application should not alter the message packet. RESULT FIELDS When the host program r?Vfinishes processing the command,it must set the primary result field rm_Result1 to an error severity level or zero if no errors occurred. This is the field which will be assigned to the special variable RC in the macro program. The secondary result field rm_Result2 should be set to zero unless a result string(as described below)is being returned. The packet can then be returned to the sender using the EXEC function ReplyMsg(). In some cases a macro program may request a result strinr@g by setting the RXFB_RESULT modifier bit in the command code. If possible,the host application should then return the result as an argstring pointer in the secondary result field rm-Result2. A result string should only be returned if explicitly requested and if no errors occurred during the call(rm_Result1 set to zero). Failure to observe these rules will result either in memory loss or in corruption of the system free-memory list. MULTIPLE HOST PROCESSES Many applications programrAs support concurrent activities on several sets of data. For example,most text editors allow several files to be edited at once. A command issued from a particular instance of the editor might invoke an ARexx macro program,so clearly any commands issued from that macro would have to be directed to the correct instance of the editor. ARexx provides for this by 92 allowing the applications program to declare an initial host address when a program is invoked. A separate message porBځrt would be opened for each instance of the host application,and this port would be named as the initial host address for all invocations from that instance. In the example above,if the editor opened two ports named "MyEdit1" and "MyEdit2,"then programs invoked by the "MyEdit1" instance would send commands back to the "MyEdit1" port. MULTIPLE MESSAGE PORTS. Host applications are not limited to having a single message port for commands. If several different kinds of commands are to brCe received,it might be appropriate to set up more than one port. Macro programs would then use the ADDRESS instruction to direct commands to the appropriate port. The different ports could be used simultaneously,since ARexx programs execute as separate tasks. 10-3 INVOKING AREXX PROGRAMS ARexx programs are invoked by sending a message packet to the resident process. Programs may be invoked as either a command or as a function. The command mode of invocation is generally simpler,as rDZit requires setting only a few fields in the message packet. MESSAGE PACKETS The structure of the message packet supported by ARexx is shown in Table 10.2. This structure provides fields for passing arguments and for specifying overrides to various internal defaults. The packets are cleared(set to 0)when allocated,and the client-supplied fields are never altered by ARexx. Message packets can be reused after being returned,and generally only one is required. COMMAND(ACTION)CODE. ThrE֬$e rm_Action field of the message packet determines the mode of invocation. It can be set to either RXCOMM or RXFUNC for command or function mode,respectively. Several modifier flags can be used with the command code;these are described later in this chapter. ARGUMENT STRINGS. Command strings,function names,and argument strings must be supplied as argstrings. Strings can be conveniently packaged into argstrings using the CreateArgstring()library function,which takes a string pointer rF>and a length as its arguments. Argstrings point to a null-terminated string and may be treated like an ordinary string pointer in most cases. In principle,a host application could build the argstrings directly,but since the strings must remain unchanged for the duration of a ARexx program,the host might need to maintain many such structures. The argstrng pointer returned by CreateArgstring()is installed in the appropriate parameter slot of the message package:ARGO for the command str1Cring or function name,and ARG1-ARG15 for argument strings. Argstrings can be recycled after a packet has returned by calling the DeleteArgstring() function. SENDING THE PACKET. Once the required fields have been filled in,the host application can send the packet to the "REXX" public port using the EXEC function PutMsg(). The address of the "REXX" port can be obtained by a call to the FindPort()function,but this address should not be cached internally,since the port could close at anrHjARE RexxArg,0 LONG ra_Size ; allocated length UWORD ra_Length ; length of string UBYTE ra_Flags ; attribute flags UBYTE ra_Hash ; hash code STRUCT ra_Buff,8 ; buffer (argstring points here) Library functions are available to create and delete argstrings,and for converting integers into argstring format. The function CreateArgstring() allocates a structure and copies a string into it,and returns an argstring pointer to the structure. The function DeleteArgstring()can be usrIv;&ed to release an argstring when it is no longer needed. MESSAGE PACKETS. All communications between ARexx and external programs are mediated with with message packets,whose structure is diagrammed in Table 10.2 below. Functions are provided in the ARexx Systems Library to create, initialize,and delete these message packets. Each packet sent from ARexx to an external program is marked with a special pointer in its name field. This can be used to distinguish the message packets from trJ{]~hose belonging to other programs,in case a message port is being shared. Message packets are created using the CreateRexxMsg()function,and can be released using the DeleteRexxMsg(). Note that the message packets passed by ARexx to a host application(as a command,for instance)are identical to the packets the host would use to invoke an ARexx program. This commonality of design means that only one set of functions is needed to create and delete message packets,and that external prograrKOms can use the same routines that the interpreter uses to handle the packets. RESOURCE NODES. A somewhat higher-level data structure called a "resource node" (a RexxRsrc structure)is used extensively within ARexx to maintain resource lists. These nodes are variable-length structures that include the total allocated length as a field within the node,and that also provide for an "auto-delete" function. This latter capability allows the address of a clean-up 90 function to be assrL_cociated with the node so that an entire(possibly inhomogeneous)list of resource nodes can be deallocated with a single function call. Table 10.2 The RexxMsg Structures STRUCTURE RexxMsg,MN_SIZE APTR rm_TaskBlock ; global pointer APTR rm_LibBase ; library pointer LONG rm_Action ; command code LONG rm_Result1 ; primary result LONG rm_Result2 ; secondary result STRUCT rm_Args,16*4 ; arguments (ARGO-ARG15) ; the extension area APTR rm_PassPort ; forwarding rM3port APTR rm_CommAddr ; host address APTR rm_FileExt ; file extention LONG rm_Stdin ; input stream LONG rm_Stdout ; output steam LONG rm_avail ; reserved LABEL rm_SIZEOF ; 128 bytes 10-2 DESIGNING A COMMAND INTERFACE The minimal command interface between ARexx and an applications program requires only a public message port and a routine to process the commands received. For most host applications this will require little extra machinery, as the program will probably alrrN eady have several message ports for key and menu events,timer messages,and so on. Processing the command strings should be relatively straightforward for command-oriented applications. Hosts that are entirely menu-driven will require somewhat more additional programming,unless commands are supported only as simulated menu events. The specific choice of which commands to support is always left up to the applications designer,as ARexx imposes no restrictions on the structure of the comrOSmands that can be issued. The basic sequence of events in the command interface begins when the host sends a command invocation message to the ARexx resident process. This is usually in response primitives supported by the host. When the resident process receives the message packet,it spawns a new DOS process the run the macro program. The command line is parsed to extract the command token(the first word),and the interpreter searches for a file that matches the command name. Once rP>>a macro program file has been found,it is executed by the interpreter and (usually)results in one or more commands being issued back to the host application's public port. The macro program waits while each command is processed by the host,and takes appropriate actions if the return code indicates that an error occurred. Eventually the macro program finishes and returns the invocation message packet back to the host. Error handling is an important consideration in the interface desirQ&xgn. Macro programs must receive return codes so that processing actions can be altered when errors occur. 91 Normally,the host application should not return a message packet until the command has been processed and its error status in known. Hosts that support two streams of commands(from the user and from the command interface)will need a flag to indicate the source of each command. Errors in user commands might normally be reported on the screen,but errors in ARexx commands mr0y. When the flag is set,any program not already in interactive tracing mode will enter it immediately. The internal trace option is set to RESULTS unless it is currently set to INTERMEDIATES or SCAN,in which case it remains unchanged. Programs invoked while the external tracing flag is set will begin executing in interactive tracing mode. The external tracing flag provides a way to regain control over programs that are caught in loops or are otherwise unresponsive. Once a program enrN#_ ters interactive tracing mode,the user can step through the program statements and diagnose the problem. There is one caveat,though:external tracing is global flag,so all currently-active programs are affected by it. The tracing flag remains set until it is cleared using the "te" command utility. Each program maintains an internal copy of the last state of the tracing flag,and sets its tracing option to OFF when it observes that the tracing flag has been cleared. 7-4 INTERRUPTS ARerO)xx maintains an internal interrupt system that can be used to detect and trap certain error conditions. When an interrupt is enabled and its corresponding condition arises,a transfer of control to the label specific to that interrupt occurs. This allows a program to retain control in circumstances that might otherwise cause the program to terminate. The interrupt conditions can caused by either synchronous events like a syntax error,or asynchronous events like a "control-C" break reqrPP 2uest. Note that these internal interrupts are completely separate from the hardware interrupt system managed by the EXEC operating system. The interrupts supported by ARexx are described below. The name assigned to each is actually the label to which control will be tranferred. Thus,a SYNTAX interrupt will transfer control to the label "SYNTAX:." Interrupts can be enabled or disabled using the SIGNAL instruction. For example,the instruction "SIGNAL ON SYNTAX" would enable the SYNTAXrQy interrupt. 74 BREAK_C. This interrupt will trap a control-C break request generated by DOS. If the interrupt is not enabled,the program terminates immediately with the error message "Execution halted" and returns with the error code set to 2. BREAK_D. The interrupt will detect and trap a control-D break request issued by DOS. The break request is ignored if the interrupt is not enabled. BREAK_E. The interrupt will detect and trap a control-E break request issued by DOS. The rRl$break request is ignored if the interrupt is not enabled. BREAK_F. The interrupt will detect and trap a control-F break request issued by DOS. The break request is ignored if the interrupt is not enabled. ERROR. This interrupt is generated by any host command that returns a non-zero code. HALT. An external halt request will be trapped if this interrupt is enabled. Otherwise,the program terminates immediately with the error message "Execution halted" and returns with the error coderSRH set to 2. IOERR. Errors detected by the I/O system will be trapped if this interrupt is enabled. NOVALUE. An interrupt will occur if an uninitialized variable is used while this condition is enabled. The usage could be within an expression,in the UPPER instruction,or with the VALUE()built-in function. SYNTAX. A syntax or execution error will generate this interrupt. Not all errors such errors can be trapped,however. In particular,certain errors occurring before a program is actuarTlly executing,and those detected by the ARexx external interface,cannot be trapped by the SYNTAX interrupt. When an interrupt forces a transfer of control,all of the currently active control ranges are dismantled,and the interrupt that caused the transfer is disabled. This latter action is necessary to prevent a possible recursive interrupt loop. Only the control structures in the current environment are affected,so an interrupt generated within a function will not affect the callerrU9's environment. SPECIAL VARIABLES. Two special variables are affected when an interrupt occurs. The variable SIGL is always set to the current line number before the transfer of control takes place,so that the program can determine which source line was being executed. When an ERROR or SYNTAX interrupt occurs,the variable RC is set to the error code that caused the condition. For ERROR interrupts this value will be a command return code,and can usually be interpreted as an error sevrV~#erity level. The value for SYNTAX interrupts is always an ARexx error code. Interrupts are useful primarily to allow a program to take special error-recovery actions. Such actions might involve informing external programs that an error ocurred,or simply reporting further diagnostics to help in isolating the problem. In the following example,the program issues a "message" command to an external host called "MyEdit" whenever a syntax error is detected: 75 /* A macro program forrAQ-Z one of two logical streams. The interpreter first checks for a stream named STDERR,and directs the output there if the steam exists. Otherwise the trace output goes to the standard output stream STDOUT and will be interleaved with the normal console output of the program. The STDERR and STDOUT streams can be opened and closed under program control,so the programmer has complete control over the destination of tracing output. In some cases a program may not have a predefined output rB}stream. For example,a program invoked from a host application that did not provide input and output streams would not have an output console. To provide a tracing facility for such programs,the resident process can open a special global tracing console for use by any active program. When this console opens,the interpreter automatically opens a stream named STDERR for each ARexx program in which STDERR is not currently defined,and the program then diverts its tracing output to the newrCЮm stream. The global console can be opened and closed using the command utilities too and tcc,respectively. The console may not close immediately upon request,however. The resident process waits until all active programs have diverted their tracing streams back to the default state before actually closing the console. Applications programs may provide direct control over the tracing console by sending request packets to the resident process,which is discussed in Chapter 10. The tracrDIge stream(STDERR or STDOUT)is also used for trace input,so a program in interactive tracing mode will wait for user input from this console. The global tracing console is always shared among all currently active programs. Since it may be confusing to have several programs simultaneously writing to the same console,it is recommended that only one program at a time be traced using the global console. 72 COMMAND INHIBITION ARexx provides a tracing mode called command inhibition thrEceU4at suppresses host commands. In this mode command clauses are evaluated in the normal manner,but the command is not actually sent to the external host,and the return code is set to zero. This provides a way to test programs that issue potentially destructive commands,such as erasing files or formatting disks. Command inhibition does not apply to command clauses that are entered interactively. These commands are always performed,but the value of the special variable RC is left unchangrF#ed. Command inhibition may be used in conjunction with any trace option. It is controlled by the "!" character,which may appear by itself or may precede any of the alphabetic options in a TRACE instruction. Each occurrence of the "!" character "toggles" the inhibition mode currently in effect. Command inhibition is cleared when tracing is set to OFF. 7-3 INTERACTIVE TRACING Interactive tracing is a debugging facility that allows the user to enter source statements while a program rGAis executing. These statements may be used to examine or modify variable values,issue commands,or otherwise interact with the program. Any valid language statements can be entered interactively,with the same rules and restrictions that apply to the INTERPRET instruction. In particular,compound statements such as DO and SELECT must be complete within the entered line. Interactive tracing can be used with any of the trace options. While in interactive tracing mode,the interpreter pausrH<+^es after each traced clause and prompts for input with the code "+++." At each pause,three types of user responses are possible. If a null line is entered,the program continues to the next pause point. If an "=" character is entered,the preceding clause is executed again. Any other input is treated as a debugging statement,and is scanned and executed. The pause points during interactive tracing are determined by the tracing option currently in effect,as the interpreter pauses rIWs{only after a traced clause. However,certain instructions cannot be safely(or sensibly)re-executed, so the interpreter will not pause after executing one of these. The "no-pause" instructions are CALL,DO,ELSE,IF,THEN,and OTHERWISE. The interpreter will also not pause after any clause that generate and execution error. Interactive tracing mode is controlled by the "?" character,either by itself or in combination with an alphabetic trace option. Any number of "?" characters may precederJ an option,and each occurrence toggles the mode currently in effect. For example,if the current trace option was NORMAL,then "TRACE ?R" would set the option to RESULTS and select interactive tracing mode. A subsequent "TRACE ?" would turn off interactive tracing. 73 ERROR PROCESSING The ARexx interpreter provides special error processing while it executes debugging statements. Errors that occur during interactive debugging are reported,but do not cause the program to terminaterK+. This special processing applies only to the statements that were entered interactively. Errors occuring in the program source statements are treated in the usual way whether or not the interpreter is in interactive tracing mode. In addition to the special error processing,the interpreter also disables the internal interrupt flags during interactive debugging. This is necessary to prevent an accidental transfer of control due to an error or uninitialized variable. However,if a "SIGr6bYst character which is in the list,or 0 if none of the characters are. Examples: say verify('123456','0123456789') ==>0 say verify('123a56','0123456789') ==>4 say verify('123a45','abcdefghij','m') ==>4 WORD() Usage:WORD(string,n) Returns the nth word in the string argument,or the null string if there are fewer than n words. Example: say word('Now is the time ',2) ==>is WORDINDEX() Usage:WORINDEX(string,n) Returns the starting position of the nth word in the argument string,or 0r78 WORDLENGTH() Usage:WORDLENGTH(string,n) Returns the length of the nth word in the string argument. Example: say wordlength('one two three',3) ==>5 68 WORDS() Usage:WORDS(string) Returns the number of words in the string argument. Example: say words("You don't say!") ==>3 WRITECH() Usage:WRITECH(file,string) Writes the string argument to the given logical file. The returned value is the actr8.ual number of characters written. Example: say writech('output','Testing') ==>7 WRITELN() Usage:WRITELN(file,string) Writes the string argument to the given logical file with a "newline" appended. The returned value is the actual number of characters written. Example: say writeln('output','Testing') ==>8 X2C() Usage:X2C(string) Converts a string of hex digits into the(packed)character representation. Blank characters are permitted in the argument string at byte boundaries. Examr9Cples: say x2c('12ab') ==>'12ab'x say x2c('12 ab') ==>'12ab'x XRANGE() Usage:XRANGE([start],[end]) Generates a string consisting of all characters numerically between the specified start and end values. The default start character is '00'x,and the default end character is 'FF'x. Only the first character of the start and end arguments is significant. Examples: say xrange() ==>'00010203 ... FDFEFF'x say xrange('a','f') ==>'abcdef' say xrange(,'10'x) ==>'000102030405060708r:EO09010'x 69 CHAPTER 7 TRACING AND INTERRUPTS ARexx provides tracing and source-level debugging facilities that are unusual in a high-level language. Tracing refers to the ability to display selected statements in a program as the program executes. When a clause is traced,its line number,source text,and related information are displayed on the console. The tracing action of the interpreter is determined by a trace option that selects which source clauses will be traced,and twr;35o modifier flags that control command inhibition and interactive tracing. The internal interrupt system enables an ARexx program to detect certain synchronous or asynchronous events and to take special actions when they occur. Events such as a syntax error or an external halt request that would normally cause the program to exit can instead be trapped so that corrective actions can be taken. 7-1 TRACING OPTIONS Trace options are sometimes called an alphabetic options,since the keyr<[Gwords that select an option can be shortened to one letter for convenience. The alphabetic options are: ALL. All clauses are traced. COMMANDS. All command clauses are traced before being sent to the external host. Non-zero return codes are displayed on the console. ERRORS. Commands that generate a non-zero return code are traced after the clause is executed. INTERMEDIATES. All clauses are traced,and intermediate results are displayed during expression evaluation. These include the vr=Wevalues retrieved for variables, expanded compound names,and the results of function calls. LABELS. All label clauses are traced as they are executed. A label will be displayed each time a transfer of control takes place. NORMAL. Command clauses will return codes that exceed the current error failure level are traced after execution,and an error message is displayed. This is the default trace option. RESULTS. All clauses are traced before execution,and the final result of each expressir>2on is displayed. Values assigned to variables by ARG,PARSE,or PULL instructions are also displayed. SCAN. This is a special option that traces all clauses and checks for errors, but suppresses the actual execution of the statements. It is helpful as a preliminary screening steop for a newly-created program. The tracing mode can be set using either the TRACE instruction or the TRACE() Built-In function. The RESULTS trace option is recommended for general-purpose testing. Tracing can r?#-2be selectively disabled from within a program so that previously-tested parts of a program can be skipped. 71 7-2 DISPLAY FORMATTING Each trace line displayed on the console is indented to show the effective control(nesting)level at that clause,and is identified by a special three- character code,as shown in Table 7.1 below. The source for each clause is preceded by its line number in the program. Expression results or intermediates are enclosed in double quotes so that leadinr@ߚg and trailing blanks will be apparent. TABLE 7.1 TRACING PREFIX CODES CODE DISPLAYED VALUES +++ Command or syntax error >C> Expanded compound name >F> Result of a function call >L> Label clause >O> Result of a dyadic operation >P> Result of a prefix operation >U> Uninitialized variable >V> Value of a variable >>> Expression or template result >.> "Placeholder" token value TRACING OUTPUT The tracing output from a program is always directed tor+dicated memory area. The length parameter specifies the maximum number of bytes to be copied,and defaults to the length of the string. If the specified length is longer than the string,the remaining area is filled with the pad character or nulls('00'x.) The returned value is the previous contents of the memory area. This can be used in a subsequent call to restore the original contents. Caution is advised in using this function. Any area of memory can be overwritten,possibly causinr, PDg a system crash. Task switching is forbidden while the copy is being done,so system performance may be degraded if long strings are copied. See Also:EXPORT() Examples: say storage() ==>248400 oldval = storage('0004 000'x,'The answer') call storage '0004 0000'x,,32,'+' STRIP() Usage:STRIP(string,[{'B' | 'L' | 'T'}],[pad]) If neither of the optional parameters is supplied,the function removes both leading and trailing blanks from the string argument. The second argument specifier-(&s whether Leading,Trailing,or Both(leading and trailing)characters are to be removed. The optional pad(or unpad,perhaps)argument selects the character to be removed. Examples: say strip(' say what? ') ==>'say what?' say strip(' say what? ','L') ==>'say what? ' say strip('++123+++','B','+') ==>'123' SUBSTR() Usage:SUBSTR(string,start,[length],[pad]) Returns the substring of the string argument beginning at the specified start position for the specified length. The starting posir.tion must be positive,and the default length is the remaining length of the string. If the substring is shorter than the requested length,it is padded on the left with the blanks or the specified pad character. Examples: say substr('23456',4,2) ==>45 say substr('myname',3,6,'=') ==>name== 65 SUBWORD() Usage:SUBWORD(string,n,[length]) Returns the substring of the string argument beginning with the nth word for the specified length in words. The default length is the remainingr/ length of the string. The returned string will never have leading or trailing blanks. Example: say subword('Now is the time ',2,2) ==>is the SYMBOL() Usage:SYMBOL(name) Tests whether the name argument is a valid REXX symbol. If the name is not a valid symbol,the function returns the string BAD. Otherwise,the returned string is LIT if the symbol is uninitialized and VAR if it has been assigned a value. Examples: say symbol('J') ==>VAR say symbol('x') ==>LIT say symbol('++') r0:R -->BAD TIME() Usage:TIME(option) Returns the current system time or controls the internal elapsed time counter. The valid option keywords are listed below. Table 6.2 TIME()Options OPTION KEYWORD DESCRIPTION Elapsed Elapsed time in seconds. Hours Current time in hours since midnight Minutes Current time in minutes since midnight Reset Reset the elapsed time clock Seconds Current time in seconds since midnight If no option is specified,the function returns ther1} current system time in the form HH:MM:SS. Examples: /* Suppose that the time is 1:02 AM ... */ say time('Hours') ==>1 say time('m') ==>62 say time('S') ==>3720 call time 'R' /* reset timer */ say time('E') ==>.020 66 TRACE() Usage:TRACE(option) Sets the tracing mode to that specified by the option keyword,which must be one of the valid alphabetic or prefix options. The tracing options are described in Chapter 7. The TRACE()function will alter the tracing mode er2'ߨven during interactive tracing,when TRACE instructions in the source program are ignored. The returned value is the mode in effect before the function call;this allows the previous trace mode to be restored later. Example: /* Assume tracing mode is ?AL */ say trace('Results') ==>?A TRANSLATE() Usage:TRANSLATE(string,[output],[input],[pad]) This function constructs a translation table and uses it to replace selected characters in the argument string. If only the string argument ir31s given,it is translated to uppercase. If an input table is supplied,it modifies the translation table so that characters in the argument string that occur in the input table are replaced with the corresponding character in the output table. Characters beyond the end of the output table are replaced with the specified pad character or a blank. Note that the result string is always of the same length as the original string. The input and output tables may be of any length. Examples: r4Y_ say translate("abcde","123","cbade","+") ==>321++ say translate("low") ==>LOW say translate("0110","10","01") ==>1001 TRIM() Usage:TRIM(string) Removes trailing blanks from the string argument. Example: say length(trim(' abc ')) ==>4 UPPER() Usage:UPPER(string) Translates the strip to uppercase. The action of this function is equivalent to that of TRANSLATE(string),but it is slightly faster for short strings. Example: say upper('One Fine Day') ==>ONE FINE DAY 67 Vr5ALUE() Usage:VALUE(name) Returns the value of the symbol represented by the name argument. Example: /* Assume that J has the value of 12 */ say value('j') ==>12 VERIFY() Usage:VERIFY(string,list,['Match']) If the Match argument is omitted,the function returns the index of the first character in the string argument which is not contained in the list argument,or 0 if all of the characters are in the list. If the Match keyword is supplied, the function returns the index of the firr HZority higher than that of the resident process,which currently runs at priority 4. The returned value is the previous priority level. 61 Examples: say pragma('priority',-5) ==>0 call pragma 'Directory','df0:system' RANDOM() Usage:RANDOM([min],[max],[seed]) Returns a pseudorandom integer in the interval specified by the min and max arguments. The default minimum value is 0 and the default maximum value is 999. The interval max-min must be less than or equal to 1000. If a grer! q REMLIB() Usage:REMLIB(name) Removes an entry with the given name from the Library List maintained by the resident process. The boolean return is 1 if the entry was found and successfully removed. Note that this function does not make a distinction between function libraries and function hosts,but simply removes a named entry. See Also:ADDLIB() Example: say remlib('MyLibrary.library')==>1 REVERSE() Usage:REVERSE(string) Reverses the sequence of characters in the string. Example: sr%y|ay reverse('?ton yhw') ==>why not? RIGHT() Usage:RIGHT(string,length,[pad]) Returns the rightmost substring in the given string argument with the specified length. If the substring is shorter than the requested length,it is padded on the left with the supplied pad character or blanks. Examples: say right('123456',4) ==>3456 say right('123456',8,'+') ==>++123456 SEEK() Usage:SEEK(file,offset,['Begin' | 'Current' | 'End']) Moves to a new position in the given logical file,specifir&ujed as an offset from an anchor position. The default anchor is Current. The returned value is the new position relative to the start of the file. Examples: say seek('input',10,'B') ==>10 say seek('input',O,'E') ==>356 /* file length */ 63 SETCLIP() Usage:SETCLIP(name,[value]) Adds a name-value pair to the Clip List maintained by the resident process. If an entry of the same name already exists,its value is updated to the supplied value string. Entries may be removed by specr')ifying a null value. The function returns a boolean value that indicates whether the operation was successful. Examples: say setclip('path','df0:s') ==>1 say setclip('path') ==>1 SHOW() Usage:SHOW(option,[name],[pad]) Returns the names in the resource list specified by the option argument,or tests to see whether an entry with the specified name is available. The currently implemented options keywords are Clip,Files,Libraries,and Ports, which are described below. Clip. Examines tr(+es#he names in the Clip List. Files. Examines the names of the currently open logical file names. Libraries. Examines the names in the Library List,which are either function libraries or function hosts. Ports. Examine the names in the system Ports List. If the name argument is omitted,the function returns a string with the resource names separated by a blank space or the pad character,if one was supplied. If the name argument is given,the returned boolean value indicates whether the nar)E\Kme was found in the resource list. The name entries are case-sensitive. SIGN() Usage:SIGN(number) Returns 1 if the number argument is positive or zero,and -1 if number is negative. The argument must be numeric. Examples: say sign(12) ==>1 say sign(-33) ==>-1 SPACE() Usage:SPACE(string,n,[pad]) Reformats the string argument so that there are n spaces(blank characters) between each pair of words. If the pad character is specified,it is used instead of blanks as the separator chr*,%Caracter. Specifying n as 0 will remove all blanks from the string. Examples: say space('Now is the time',3) ==>'Now is the time' say space('Now is the time',0) ==>'Nowisthetime' say space('1 2 3',1,'+') ==>'1+2+3' 64 STORAGE() Usage:STORAGE([address],[string],[length],[pad]) Calling STORAGE()with no arguments returns the available system memory. If the address argument is given,it must be a 4-byte string,and the function copies data from the(optional)string into the inrSupport Library(described in Appendix D)includes the function ALLOCMEM()which to allocate memory from the system free list. See Also:FREESPACE() Example: say c2x(getspace(32)) ==>'0003BF40'x HASH() Usage:HASH(string) Returns the hash attribute of a string as a decimal number,and updates the internal hash value of the string. 58 Example: say hash('1') ==>49 IMPORT() Usage:IMPORT(address,[length]) Creates a string by copying data from the specified 4-byte address. If the lrªsength parameter is not supplied,the copy terminates when a null byte is found. See Also:EXPORT() Example: extval = import('0004 0000'x,8) INDEX() Usage:INDEX(string,pattern,[start]) Searches for the first occurrence of the pattern argument in the string argument,beginning at the specified start position. The default start position is 1. The returned value is the index of the matched pattern,or 0 if the pattern was not found. Examples: say index("123456","23") ==>2 say index("1234rÖ4b56","77") ==>0 say index("123123","23",3) ==>5 INSERT() Usage:INSERT(new,old,[start],[length],[pad]) Inserts the new string into the old string after the specified start position. The default starting position is 0. The new string is truncated or padded to the specified length as required,using the supplied pad character or blanks. If the start position is beyond the end of the old string,the old string is padded on the right. Examples: say insert('ab,'12345') ==>ab12345 say insruert('123','++',3,5,'-') ==>++-123-- LASTPOS() Usage:LASTPOS(pattern,string,[start]) Searches backwards for the first occurrence of the pattern argument in the string argument,beginning at the specified start position. The default starting position is the end of the string. The returned value is the index of the matched pattern,or 0 if the pattern was not found. 59 Examples: say lastpos("123234","2") ==>4 say lastpos("123234","5") ==>0 say lastpos("123234","2",3) ==>2 LEFT(r) Usage:LEFT(string,length,[pad]) Returns the leftmost substring in the given string argument with the specified length. If the substring is shorter than the requested length,it is padded on the left with the supplied pad character or blanks. Examples: say left('123456',3) ==>123 say left('123456',8,'+') ==>123456++ LENGTH() Usage:LENGTH(string) Returns the length of the string. Example: say length('three') ==>5 MAX() Usage:MAX(number,number[,number,...]) Returns the maximum or"1f the supplied arguments,all of which must be numeric. At least two parameters must be supplied. Example: say max(2.1,3,-1_ ==>3 MIN() Usage:MIN(number,number[,number,...]) Returns the minimum of the supplied arguments,all of which must be numeric. At least two parameters must be supplied. Example: say min(2.1,3,-1) ==>-1 OPEN() Usage:OPEN(file,filename,['Append' | 'Read' | 'Write']) Opens an external file for the specified operation. The file argument defines the logical name rǜ7Qby which the file will be referenced. The filename is the external name of the file,and may include device and directory specifications. The function returns a boolean value that indicates whether the operation was successful. There is no limit to the number of files that can be open 60 simultaneusly,and all open files are closed automatically when the program exits. See Also:CLOSE(),READ(),WRITE() Examples: say open('MyCon','CON:160/50/320/100/MyCon/cds') ==>1 say open('outfrm^ile','ram:temp','W') ==>1 OVERLAY() Usage:OVERLAY(new,old,[start],[length],[pad]) Overlays the new string onto the old string beginning at the specified start position,which must be positive. The default starting position is 1. The new string is truncated or padded to the specified length as required,using the supplied pad character or blanks. If the start position is beyond the end of the old string,the old string is padded on the right. Examples: say overlay('bb,'abcd') ==>bbr{lcd say overlay('4','123',5,5,'-') ==>123--4---- POS() Usage:POS(pattern,string,[start]) Searches for the first occurrence of the pattern argument in the string argument,beginning at the position specified by the start argument. The default starting position is 1. The returned value is the index of the matched string,or 0 if the pattern wasn't found. Examples: say pos('23','123234') ==>2 say pos('77','123234') ==>0 say pos('23','123234',3) ==>4 PRAGMA() Usage:PRAGMA(optionr2ڑ,[value]) This function allows a program to change various attributes relating to the system environment within which the program executes. The option argument is a keyword that specifies an environmental attribute;the currently implemented options are Directory and Priority. The value argument supplies the new attribute value to be installed. The value returned by the function depends on the attribute selected. Some attributes return the previous value installed,while others may simrBNply set a boolean success flag. The currently defined option keywords are listed below. DIRECTORY. Specifies a new "current" directory. The current directory is used as the "root" for filenames that do not explicitly include a device specification. The return value is a boolean success flag. PRIORITY. Specifies a new task priority. The priority value must be an integer in the range -128 to 127,but the practical range is much more limited. ARexx programs should never be run at a prir 0 is omitted,the function removes leading,trailing,or embedded blank characters from the string argument. If the optional list is supplied,it specifies the characters to be removed from the string. Examples: say compress (' why not ') ==>whynot say compress ('++12-34-+','+-') ==>1234 COMPARE() Usage:COMPARE(string1,string2,[pad]) Compares two strings and returns the index of the first position in which they differ,or 0 if the strings are identical. The shorter string is padded as rer "Tquired using the supplied character or blanks. Examples: say compare('abcde','abcce') ==>4 say compare('abcde',abcde') ==>0 say compare('abc++','abc+-','+') ==>5 COPIES() Usage:COPIES(string,number) Creates a new string by concatenating the specified number of copies of the original. The number argument may be zero,in which case the null string is returned. 55 Example: say copies('abc',3) ==>abcabcabc D2C() Usage:D2C(number) Creates a string whose value is the binary(pacr $#ked)representation of the given decimal number. Example: d2c(31) ==>'1F'x DATATYPE() Usage:DATATYPE9string,[option]) If the option parameter is not specified,DATATYPE()tests whether the string parameter is a valid number and returns either NUM or CHAR. If an option keyword is given,the boolean return indicates whether the string satisfied the requested test. The following option keywords are recognized: Table 6.1 DATATYPE()Options KEYWORD CHARACTERS ACCEPTED Alphanumerir ϯ9c Alphabetics (A-Z,a-z) or Numerics (0-9) Binary Binary Digits String Lowercase Lowercase Alphabetics (a-z) Mixed Mixed Upper/Lowercase Numeric Valid Numbers Symbol Valid REXX Symbols Upper Uppercase Alphabetics (A-Z) Whole Integer Numbers X Hex Digits String Examples: say datatype('123') ==>NUM say datatype('1a f2','x') ==>1 say datatype('aBcde','L') ==>0 DELSTR() Usage:DELSTR(string,n,[length]) Deletes the substring of the string argument beginnirи}}ng with the nth character for the specified length in characters. The default length is the remaining length of the string. Example: say delstr('123456',2,3) ==>156 56 DELWORD() Usage:DELWORD(string,n,[length]) Deletes the substring of the string argument beginning with the nth word for the specified length in words. The default length is the remaining length of the string. The deleted string includes any trailing blanks following the last word. Examples: say delword('Tell mrQ?e a story',2,2)==>'Tell story' say delword('one two three',3) ==>'one two ' EOF() Usage:EOF(file) Checks the specified logical file name and returns the boolean value 1(True)if the end-of-file has been reached,and 0(False)otherwise. Example: say eof(infile) ==>1 ERRORTEXT() Usage:ERRORTEXT(n) Returns the error message associated with the specified ARexx code. The null string is returned if the number is not a valid error code. Example: say errortext(41) ==>Invalid expressior䣼mn EXISTS() Usage:EXISTS(filename) Tests whether an external file of the given filename exists. The name string may include device and directory specifications. Example: say exists('df0:c/ed') ==>1 EXPORT() Usage:EXPORT(address,[string],[length],[pad]) Copies data from the (optional) string into a previously-allocated memory area, which must be specified as a 4-byte address. The length parameter specifies the maximum number of characters to be copied; the default is the length of rӕ4the string. If the specified length is longer than the string,the remaining area is filled with the pad character or nulls('00'x). The returned value is the number of characters copied. Caution is advised in using this function. Any area of memory can be overwritten,possibly causing a system crash. Task switching is forbidden while the copy is being done,so system performance may be degraded if long strings are copied. See Also:IMPORT(),STORAGE() 57 Example: count = export('0r\'004 0000'x,'The answer') FREESPACE() Usage:FREESPACE(address,length) Returns a block of memory of the given length to the interpreter's internal pool. The address argument must be a 4-byte string obtained by a prior call to GETSPACE(),the internal allocator. It is not always necessary to release internally-allocated memory,since it will be released to the system when the program terminates. However,if a very large block has been allocated,returning it to the pool may avoid memory sprհace problems. The return value is a boolean success flag. See Also:GETSPACE() Example: say freespace('00042000'x,32) ==>1 GETCLIP() Usage:GETCLIP(name) Searches the Clip List for an entry matching the supplied name parameter,and returns the associated value string. The name-matching is case-sensitive,and the null string is returned if the name cannot be found. The usage and maintenance of Clip List entries is described in the Chapter 9. See Also:SETCLIP() Example: /* Assume 'numbr_ers' contains 'PI=3.14159' */ say getclip('numbers') ==>PI=3.14159 GETSPACE() Usage:GETSPACE(length) Allocates a block of memory of the specified length from the interpreter's internal pool. The returned value is the 4-byte address of the allocated block, which is not cleared or otherwise initialized. Internal memory is automatically returned to the system when the ARexx program terminates,so this function should not be used to allocate memory for use by external programs. The r㋑burrent host address string. The host address is the message port to which commands will be sent. The SHOW()function can be used to check whether the required external host is actually available. See Also:SHOW() Example: say address() ==>REXX ARG() Usage:ARG([number],['Exists' | 'Omitted']) ARG()returns the number of arguments supplied to the current environment. If the number parameter alone is supplied,the corresponding argument string is returned. If a number and one of the ker؋-ywords Exists or Omitted is given,the boolean return indicates the status of the corresponding argument. Note that the existence or omission test does not indicate whether the string has a null value,but only whether a string was supplied. Examples: /* Assume arguments were: ('one,,10) */ say arg() ==>3 say arg(1) ==>one say arg(2,'0') ==>1 B2C() Usage:B2C(string) Converts a string of binary digits(0,1)into the corresponding(packed)character representation. The conversir Ǒon is the same as though the argument string had been specified as a literal binary string(e.g. '1010'B). Blanks are permitted in the string,but only at byte boundaries. This function is particularly useful for creating strings that are to be used as bit masks. See also:X2C() Examples: say b2c('00110011') ==>3 say b2c('01100001') ==>a BITAND() Usage:BITAND(string1,string2,[pad]) The argument strings are logically ANDed together,with the length of the result being the longer ofrڪ the two operand strings. If a pad character is supplied,the shorter string is padded on the right;otherwise,the operation terminates at the end of the shorter string and the remainder of the longer string is appended to the result. Example: bitand('0313'x,'FFF0'x) ==>'0310'x 52 BITCHG() Usage:BITCHG(string,bit) Changes the state of the specified bit in the argument string. Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte of the string. Examr8 ple: bitchg('0313'x,4) ==>'0303'x BITCLR() Usage:BITCLR(string,bit) Clears(sets to zero)the specified bit in the argument string. Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte of the string. Example: bitclr('0313'x,4) ==>'0303'x BITCOMP() Usage:BITCOMP(string1,string2,[pad]) Compares the argument strings bit-by-bit,starting at bit number 0. The returned value is the bit number of the first bit in which the strings differ,or -1 if the stringsr are identical. Examples: bitcomp('7F'x,'FF'x) ==>7 bitcomp('FF'x,'FF'x) ==>-1 BITOR() Usage:BITOR(string1,string2,[pad]) The argument strings are logically ORed together,with the length of the result being the longer of the two operand strings. If a pad character is supplied,the shorter string is padded on the right;otherwise,the operation terminates at the end of the shorter string and the remainder of the longer string is appended to the result. Example: bitor('0313'x,'003F'rx) ==>'033F'x BITSET() Usage:BITSET(string,bit) Sets the specified bit in the argument string is 1. Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte of the string. Example: bitset('0313'x,2) ==>'0317'x BITTST() Usage:BITTST(string,bit) The boolean return indicates the state of the specified bit in the argument string. 53 Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte to the string. Example: bittst('0313r6a'x,4) ==>1 BITXOR() Usage:BITAND(string1,string2,[pad]) The argument strings are logically exclusively-ORed together,with the length of the result being the longer of the two operand strings. If a pad character is supplied,the shorter string is padded on the right;otherwise,the operation terminates at the end of the shorter string and the remainder of the longer string is appended to the result. Example: bitxor('0313'x,'001F'x) ==>'030C'x C2B() Usage:C2B(string) Converts the char߿[racter string into the equivalent string of binary digits. See Also:C2X() Example: say c2b('abc') ==>011000010110001001100011 C2D() Usage:C2D(string,[n]) Converts the string argument from its character representation to the corresponding decimal number,expressed as ASCII digits(0-9). If n is supplied, the character string is considered to be a number expressed in n bytes. The string is truncated or padded with nulls on the left as required,and the sign bit is extended for the conrd$version. Examples: say c2d('0020'x) ==>32 say c2d('FFFF') ==>1 say c2d('FF0100',x,2) ==>256 C2X() Usage:C2X(string) Converts the string argument from its character representation to the corresponding hexadecimal number,expressed as the ACSII characters 0-9 and A-F. See Also:C2B() Example: say c2x('abc') ==>616263 54 CENTER() or CENTRE() Usage:CENTER(string,length,[pad])or CENTRE(string,length,[pad]) Centers the string argument in a string with the specified length. Ir f the length is longer than that of the string,pad characters or blanks are added as necessary. Examples: say center('abc',6) ==>' abc ' say center('abc',6,'+') ==>'+abc++' say center('123456',3) ==>'234' CLOSE() Usage:CLOSE(file) Closes the file specified by the given logical name. The returned value is a boolean success flag,and will be 1 unless the specified file was not open. Example: say close('input') ==>1 COMPRESS() Usage:COMPRESS(string,[list]) If the list argument rCutem includes an external function library in a file called "rexxsupport.library". It contains a number of Amiga-specific functions and is described in Appendix D. Chapter 10 provides information on designing and implementing function libraries. 49 FUNCTION HOSTS Function hosts are called by sending a function invocation message packet to the public message port identified by the host's name. No constraints are imposed on the iternal design of the host except that it must eventrrually return the invocation message with an appropriate return code and result string. The function call may result in a new program being loaded and run,or might even be sent to a network handler as a remote procedure call. The available function hosts,along with the function libraries,are contained in the Library List maintained by the resident process. This list provides a general mechanism for resolving function names in a priority-controlled manner. The ARexx resident process rW is an example of a function host. It is added to the Library List at a nominal priority of -60 when the resident process is started, using the same name ("REXX")that is used for command invocations. When it receives a function invocation packet,it searches for an external file matching the function name,just as it would for a command invocation of the same name. In particular,the search begins with the current directory and process is not case-sensitive,but is affected by the presencr6e of explicit directory specifications or file extensions in the name string. The rules governing the search for external programs are covered in Chapter 9. External programs are always run as a separate process in the Amiga's multitasking system. The calling program "sleeps" until the called function finishes and the message packet returns. The result string and error code are returned in the packet. 6-2 THE BUILT-IN FUNCTION LIBRARY This section of the chapter is devoted to descrӫriptions of the individual Built In functions,which are listed alphabetically. Many of the functions have optional as well as required arguments. The optional arguments are shown in brackets,and generally have a default value that is used if the argument is omitted. MAXIMUM ARGUMENTS. While internal functions can be called with any number of arguments,the Built-In functions(and external functions as well)are limited to a maximum of 15 arguments. PAD AND OPTION CHARACTERS. For functr ions that accept a "pad" character argument,only the first character of the argument string is significant. If a null string is supplied,the default padding character(usually a blank)will be used. Similarly,where an option keyword is specified as an argument,only the first character is significant. Option keywords may be given in uppercase or lowercase. I/O SUPPORT FUNCTIONS. ARexx provides functions for creating and manipulating external DOS files. The functions available at the prresent time are OPEN(), CLOSE(),READCH(),READLN(),WRITECH(),WRITELN(),EOF(),SEEK(),and EXISTS(). Files are referenced by a "logical name," a case-sensitive name that is assigned to a file when it is first opened. 50 There is no limit to the number of files that may be open simultaneously,and all open files are closed automatically when the program exits. BIT-MANIPULATION FUNCTIONS. The functions BITCHG(),BITCLR(),BITCOMP(),BITSET(), and BITTST() are provided to implement extendrH} oed bit-testing on character strings. These functions differ from similar string-manipulation functions in that the elementary unit of comparison is the bit rather than the byte. Bit number are defined such that bit 0 is the low-order bit of the rightmost byte of the string. ABBREV() Usage:ABBREV(string1,string2,[length] Returns a boolean value that indicates whether string2 is an abbreviation of string1 with length greater than or equal to the specified length argument. The defaultr< length is 0,so the null string is an acceptable abbreviation. Example: say abbrev('fullname','ful' ==>1 say abbrev('almost','alm',4) ==>0 say abbrev('any','') ==>1 ABS() Usage:ABS(number) Returns the absolute value of the number argument,which must be numeric. Examples: say abs(-5.35) ==>5.35 say abs(10) ==>10 ADDLIB() Usage ADDLIB(name,priority,[offset,version]) Adds a function library or a function host to the Library List maintained by the resident processr]. The name argument specifies either the name of a function library or the public message port associated with a function host. The name is case-sensitive,and any libraries thus declared should reside in the system LIBS: directory. The priority argument specifies the search priority and must be an integer between 100 and -100,inclusive. The offset and version arguments apply only to libraries. The offset is the integer offset to the library's "query" entry point,and the version is anrַ integer specifying the minimum acceptable release level of the library. The function returns a boolean result that indicates whether the operation was successful. Note that if a library is specified,it is not actually opened at this time;similarly,no check is performed as to whether a specified function host port has been opened yet. Example: say addlib("rexxsupport.library",0,-30,0)==>1 call addlib "EtherNet",-20 /* a gateway */ 51 ADDRESS() Usage:ADDRESS() Returns the crW~xspecified name. All of these functions are defined by uppercase names,and the library has been specially organized to make the search as efficient as possible. 47 3. Function Libraries and Function Hosts. The available function libraries and function hosts are maintained in a prioritized list,which is searched starting at the highest priority until the requested function is found or the end of the list is reached. Each function library is opened and called at a special entry porint to determine whether it contains a function matching the given name. Function hosts are called using a message-passing protocol similar to that used for commands,and may be used as gateways for remote procedure calls to other machines in a network. 4. External ARexx Programs. The final search step is to check for an external ARexx program file by sending an invocation message to the ARexx resident process. The search always begins in the current directory,and follows the same serrarch path as the original ARexx program invocation. The name matching process is not case-sensitive. Note that the function name-matching procedure may be case-sensitive for some of the search steps but not for others. The matching procedure used in a function library or function host is left to the discretion of the applications designer. Functions defined with mixed-case names must be called using a string token,since symbol names are always translated to uppercase. The full searr'ch order is followed whenever the function name is defined by a symbol token. However,the search for internal functions is bypassed if the name is specified by a string token. This allows internal functions to usurp the names of external functions,as in the following example: CENTER: /* internal "CENTER" */ arg string,length /* get arguments */ length = min(length,60) /* compute length */ return 'CENTER'(string,length) Here the Built-In fuction CENTER()has been replacedrJ by an internal function of the same name,which calls the original function after modifying the length argument. INTERNAL FUNCTIONS The interpreter creates a new storage environment when an internal function is called,so that the previous(caller's)environment is preserved. The new environment inherits the values from its predecessor,but subsequent changes to the environment variables do not affect the previous environment. The specific values that are preserved are: The current anrtd previous host addresses, The NUMERIC DIGITS,FUZZ,and FORM settings, The trace option,inhibit flag,and interace flag, The state of the interrupt flags defined by the SIGNAL instruction,and The current prompt string as set by the OPTIONS PROMPT instruction. The new environment does not automatically get a new symbol table,so initially all of the variables in the previous environment are available to the called function. The PROCEDURE instruction can be used to create a new symbol tarble 48 and thereby protect the caller's symbol values. Execution of the internal function proceeds until a RETURN instruction is executed. At this point the new environment is dismantled and control resumes at the point of the function call. The expression supplied with the RETURN instruction is evaluated and passed back to the caller as the fuction result. BUILT-IN FUNCTIONS ARexx provides a substantial library of predefined functions as part of the language system. These frOunctions are always available and have been optimized to work with the internal data structures. In general the Built-In functions execute much faster than an equivalent interpreted function,so their usage is strongly recommended. The Built-In Function Library is not user-extensible,but additional functions will be included in later releases. EXTERNAL FUNCTION LIBRARIES External function libraries provide a mechanism with which users and applications developers can extend the funcr ]{tionality of ARexx. A function library is a collection of one or more functions together with a "query" entry point that serves to match a name string with the appropriate function. External function libraries are supported as standard Amiga shared libraries, and may be either memory or disk-resident. Disk-resident libraries are loaded and opened as needed. The ARexx resident process maintains a list,called the Library List,of the currently available function libraries and function r hosts. Applications programs can add or remove function libraries as required. The Library List is maintained as a priority-sorted queue,and entries can be added at an appropriate priority to control the function name resolution. Libraries with higher priorities are searched first;within a given priority level,those libraries added first are searched first. During the search process the ARexx interpreter opens each library and calls its "query" entry point. The query function must trQwhen check to see whether the requested function name is in the library. If not,it returns a "function not found" error code and the search continues with the next library in the list. Function libraries are always closed after being checked so that the operatiing system can reclaim the memory space if required. Once the requested function has been found,it is called with the arguments passed by the interpreter,and must return an error code and a result string. The ARexx language sysrGa well-designed macro language interface the user will be usually unaware of whether a given action is implemented as a primitive operations or as a macro program. The starting point in designing a macro program is to examine the commands that would be required to perform it manually. The documentation for the host application program should then describe the possible return codes for each command;these codes can be used to determine whether the operation performed by the command war6s successful. Check also for "shortcut" commands that may be available only to macro programs;some applications programs may include very powerful functions that were implemented specifically for use in macro programs. 5-5 USING AREXX WITH COMMAND SHELLS Although ARexx was designed to work most effectively with programs that support its specific command interface,it can be used with any "command shell" program that uses standards I/O mechanisms to obtain its input stream. There arerƀ7 several ways to use ARexx to prepare a stream of commands for such program. One obvious technique is to create an actual command file on the "RAM:" disk and then pass it directly to the command shell. For example,you could open a new CLI window to run a standard "execute" script using the following short program: /* Launch a new CLI */ address command conwindow = "CON:0/0/640/100/NewOne" /* create a command file on the fly */ call open out,"ram:$$temp",write call writeln ort%3ut,'echo "this is a test"' call close out /* open the new CLI window */ 'newcli' conwindow "ram:$$temp"' exit Since no disk accesses are required,this method is actually fairly fast,if not very elegant. Another alternative is to use the command stacking facility provided by the PUSH and QUEUE instructions. These instructions allow an ARexx program to stack an arbitrary stream of commands and data for the command shell or other program to read. Any set of commands that could ber3| "typed ahead" at a command prompt can be prepared in this fashion. After the ARexx program exits,the next program that uses the input stream will read the prepared commands and can process them in the normal fashion. 45 5-6 COMMAND INHIBITION Sometimes it is necessary to write and test macro programs that issue potentially destructive commands. For instance,a program to find and delete unneeded files would be difficult to test safely,since it might accidentally delete the wrorGng files and would require a continual source of new files for testing. To simply the development and testing of such programs,ARexx provides a special tracing mode called command inhibition that suppresses host commands. While in command inhibition mode,command processing proceeds normally except that the command is not actually issued and the variable RC is set to 0. This allows the program logic to be verified before any commands are actually sent to the external program. Chapterr| 7 has further information on this facility. 46 CHAPTER 6 FUNCTIONS The basic concept of a function is a program or group of statements that will be executed whenever the function name appears in a certain context. Functions are an important building block of most computer languages in that they allow modular programming -- the ability to build a large program from a series of smaller,more easily developed modules. In ARexx a function may be definedrͳ as part of(internal to)a program,as part of a library,or as a separate external program. 6-1 SYNTAX AND SEARCH ORDER Function calls in an expression are defined syntactically as a symbol or string followed immediately by an open parenthesis. The symbol or string(taken an a literal)specifies the function name,and the open parenthesis begins the argument list. Between the opening and eventual closing parentheses are zero or more argument expressions,separated by commas,that supply tr_he data being passed to the function. For example, CENTER('title",20) ADDRESS() 'AllocMem'(256*4,1) are all valid function calls. Each argument expression is evaluated in turn and the resulting strings are passed as the argument list to the function. There is no limit to the number of arguments that may be passed to an internal function,but calls to Built-In or external functions are limited to a maximum of 15 arguments. Note that each argument expression,while ofter just a singr@KZle literal value,can include arithmetic or string operations or even other function calls. Argument expressions are evaluated from left to right. Functions can also be invoked using the CALL instruction. The syntax of this form is slightly different,and is described in Chapter 4. The CALL instruction can be used to invoke a function that may not return a value. SEARCH ORDER Function linkages in ARexx are established dynamically at the time of the function call. A specific search orI0rder is followed until a function matching the name symbol or string is found. If the specified function cannot be located, an error is generated and the expression evaluation is terminated. The full search order is: 1. Internal Functions. The program source is examined for a label that matches the function name. If a match is found,a new storage environment is created and control is transferred to the label. 2. Built-In Functions. The Build-In function library is searched for the rxram becomes fully programmable,and with even a limited set of predefined operations can be customized by the end user. This chapter discusses the ARexx command interface and examines some of the ways in which commands can be used to build programs for an external program. Such programs are ofter called "macro programs" because they implement a complex ("macro") action from a series of simpler "micro" commands. Chapter 10 has detailed information on the data structers required to imre?plement a command interface for an applications program. 5-1 COMMAND CLAUSES Syntactically,a command clause is just an expression that can't be classified as another type of clause. The actual structure of the command is dictated by the external host to which it is intended,but in most cases will follow the model of a name or letter followed by parameter data. Command names can be given as either a symbol or a string. However,it is generally safer to use a string for the name,sincerSF it can't be assigned a value or be mistaken for an instruction keyword. For example,the following might be commands for a text editor: JUMP current+10 /* advance to next */ 'insert' newstring /* blast it in */ 'TOP' /* back to the top */ Since command clauses are expressions,they are fully evaluated before being sent to the host. Any part of the final command string can be computed within the program,so virtually any sort of command structure can be created. The interpretarD0tion of the received commands depends entirely on the host application. In the simplest case the command strings will correspond exactly to commands that could be entered directly by a user. For instance,positional control(up/down)commands for a text editor would probably have identical interpretations whether issued by the user or from a program. Other commands may be valid only when issued from a macro program;a command to simulate a menu operation would probably not be entered by r^Jthe user. 43 5-2 THE HOST ADDRESS The destination for a command is determined by the current host address,which is the name of the public message port managed by an external program. ARexx maintains two implicit host addresses,a "current" and a "previous" value,as part of the program's storage environment. These values can be changed at any time using the ADDRESS instruction(or its synonym,SHELL,)and the current host address can be inspected with the ADDRESS()Built-In fuction.rg6 The default host address string is "REXX",but this can be overridden when a program is invoked. In particular,most host applications will supply the name of their public port when they invoke a macro program,so that the macro can automatically issue commands back to the host. One special host address is recognized: the string COMMAND indicates that the command should be issued directly to the underlying DOS. All other host addresses are assumed to refer to a public message port. Anr ʥZ attempt to send a commmand to a non-existent message port will generate the syntax error "Host environment not found." Single commands can be sent to a specific host without disturbing the host address settings. This is done using the ADDRESS instruction,as the following example illustrates: ADDRESS MYEDIT 'jump top' This example would send the command "jump top" to an external host named "MYEDIT." It is important to note that you cannot send commands to a host application withor 9Tut knowing the name of its public message port. Writing macro programs to communicate with two or more hosts may require some clever programming to determine whether both hosts are active and what their respective host addresses are. 5-3 THE COMMAND INTERFACE ARexx implements its command interface using the message-passing facilities provided by the EXEC operating system. Each host application must provide a public message port,the name of which is referred to as the host address. r ZϸARexx programs issue commands by placing the command string in a message packet and sending the packet to the host's message port. The program "sleeps" while the host processes the command,and awakens when the message packet returns. The entire process can be regarded as a dialogue between the host application and a macro program:the host initiates the dialogue by invoking the macro,and the macro program replies with one or more command strings. The commands that can be sent are not r Wʻlimited to simple text strings,but might be address pointers or even bit-mapped images. After it finishes processing a command,the host "replies" the message packet with a return code that indicates the status of the command. This return code is placed in the ARexx special variable RC so that it can be examined by the program. A value of zero is assumed to mean that no errors occurred,while positive values usually indicate progressively more severe error conditions. The return code r_ allows the macro program to determine whether the command succeeded and to take action if it failed,so it is important for each applictions program to document the meanings of the return codes for its commands. 44 5-4 USING COMMANDS IN MACRO PROGRAMS ARexx can be used to write programs for any host application that includes a suitable command interface. Some applications programs are designed with an embedded macro language,and may include many predefined macro commands. With rM control to the label ERROR:. The condition label must of course be defined in the program;otherwise,an immediate SYNTAX error results and the program exits. In the second form of the instruction,the tokens following SIGNAL are evaluated as an expression. An immediate interrupt is generated that transfers control to the label specified by the expression result. The instruction thus acts as a "computed goto." INTERRUPTS. Whenever an interrupt occurs,all currently active control rangr es (IF,DO,SELECT,INTERPRET,or interactive TRACE) are dismantled before the transfer of control. Thus,the transfer cannot be used to jump into the range of a DO-loop or other control structure. Only the control structures in the current environment are affected by a SIGNAL condition,so it is safe to SIGNAL from within an internal function without affecting the state of the caller's environment. SPECIAL VARIABLES. The special variable SIGL is set to the current line number whenever a rR.transfer of control occurs. The program can inspect SIGL to determine which line was being executed before the transfer. If an ERROR or SYNTAX condition causes an interrupt,the special variable RC is set to the error code that triggered the interrupt. For the ERROR condition,this code is usually an error secerity level. The SYNTAX condition will always indicate an ARexx error code. Examples: signal on error /* enable interrupt */ signal off syntax /* disable SYNTAX */ signal starVzrt /* goto START */ 4-29 THEN Usage:THEN[;] [conditional statement] The THEN instruction must be the next statement following an IF or WHEN instruction,and is valid only in that context. It tests whether the preceding expression evaluated to 1(True),in which case the conditional statement following the THEN is performed. If the expression result was a 0(False),the conditional statement is skipped. 39 Example: if i=j then say 'equal' else say 'not equal' 4-30 TRACr?K'E Usage:TRACE [symbol|string|[[VALUE] expression]] The TRACE instruction is used to set the internal tracing mode. If a symbol or string is supplied,it is taken as a literal. Otherwise,the tokens following the VALUE keyword are evaluated as an expression. The VALUE keyword can be omitted if the expression doesn't start with a symbol or string token. In either case the result string is converted to uppercase and checked first for one of the "alphabetic" options. The valid alphabeticrQ options are ALL, COMMANDS,ERRORS,INTERMEDIATES,LABELS,RESULTS,and SCAN. These can be spelled out in full or shortened to the initial character,and are described in Chapter 7. If the result doesn't match any of these options,the interpreter attempts to convert it to an integer. A conversion failure here will be reported as an error. PREFIX CHARACTERS. Two special symbol characters may precede any of the alphabetic keywords. The "?" character interactive tracing,and the "!" characterrYh controls command inhibition. These characters act as "toggles" to alternatively select and de-select the respective modes. Any number of prefix characters may precede an alphabetic option. Interactive tracing and command inhibition are described in Chapter 7. NUMERIC OPTION. If the specified trace option is a negative whole number,it is accepted as a trace suppression count. The suppression count is the number of clauses(that would otherwise be traced)to be passed over before resumr$; oing the tracing display. Suppression counts are ignored execept during interactive tracing. Examples: trace ?r /* interactive RESULTS */ trace off trace -20 /* skip 20 clauses */ 4-31 UPPER Usage:UPPER variable [variable...] The values of the variables in the list are converted to uppercase. It is not an error to include an uninitialized variable in the list,but it will be trapped if the NOVALUE interrupt has been enabled. The TRANSLATE() or UPPER() Built-In functions could rTalso be used to convert variables to uppercase,but the instruction form is more concise(and faster) if several variables are being converted. 40 Example: when='Now is the time' upper when say when /* NOW IS THE TIME */ 4-32 WHEN Usage:WHEN expression [THEN [;] [conditional statement]] The WHEN instruction is similar to the IF instruction,but is valid only within a SELECT range. Each WHEN expression is evaluated in turn and must result in a boolean value. If the result isrF+ a 1,the conditional statement is executed and control passes to the END statement that terminates the SELECT. As in the case of the IF instruction,the THEN need not be part of the same clause. Example: select; when i9 */ say fuzz /* =>0 *r(N/ say from /*=> SCEIENTIFIC */ PARSING BY POSITION. If the fields in the input string have known positions, value strings can be specified by absolute or relative positions. Relative positions are indicated by a number preceded by a "+" or "-" operator. Each positional marker updates the scan position in the string. The value assigned to a variable is the string from the current position up to,but not including, the next position in the string. 34 Example: /* assume argumer)nt is "1234567890" */ parse arg 1 a 3 b +2 1 c say a b c /* ==> 12 34 1234567890 */ PARSING WITH PATTERNS. Fields in the input string separated by specific characters or strings can be parsed using a pattern,which is matched against the input string. A pattern is specified in the template as a string token,or alternatively as a symbol enclosed in parentheses. The position in the parse string matched by the pattern determines the value strings. The pattern is removed from the inr*tput string when a match is found;this is the only parsing operation that modifies the input string. Example: check = 'one,two,three' parse var check a ',' b ',' c say a b c /* ==> one two three */ 4-20 PROCEDURE Usage:PROCEDURE [EXPOSE variable [variable...]] The PROCEDURE instruction is used within an internal function to create a new symbol table. This protects the symbols defined in the caller's environment from being altered by the execution of the function. PROCEDURE is usr+Iually the first statement within the function,although it is valid anywhere withing the function body. It is an error to execute two PROCEDURE statements within the function. EXPOSING VARIABLES. The EXPOSE subkeyword provides a selective mechanism for accessing the caller's symbol table,and for passing global variables to a function. The variables following the EXPOSE keyword are taken to refer to symbols in the caller's table. Any subsequent changes made to these variables will be r,0reflected in the caller's environment. The variables in the EXPOSE list may include stems or compound symbols,in which case the ordering of the variables becomes significant. The EXPOSE list is processed from left to right,and compound symbols are expanded based on the values in effect in the new generation. For example,suppose that the value of the symbol J in the previous gneration is 123,and that J is unitialized in the new generation. Then PROCEDURE EXPOSE J A.J will expose J anr-صd A.123,whereas PROCEDURE EXPOSE A.J J will expose A. J. and J. Exposing a stem has the effect of exposing all possible compound symbols derived from that stem. Example: fact: procedure /* a recursive function */ arg i if i <=1 then return 1 else return i*fact(i-1) 35 Usage:PULL [template] [,template...] This is a shorthand form of the PARSE UPPER PULL instruction. It reads a string from the input console,translates it to uppercase,and parses it using tr(he template. Multiple strings can be ready by supplying additional templates. The instruction will read from the console even if no template is given. Templates are described briefly with the PARSE instruction and in greater depth in Chapter 8. Example: pull first last. /* read names */ 4-22 PUSH Usage: PUSH [expression] The PUSH instruction is used to prepare a stream of data to be ready by a command shell or other program. It appends a "newline" to the result of the expressior/kless than the current DIGITS setting. NUMERIC FORM SCIENTIFIC. Specifies that numbers that require exponential notation be expressed in SCIENTIFIC notation. The exponent is adjusted so that the mantissa (for non-zero) numbers) is between 1 and 10. This is the default format. 31 NUMERIC FORM ENGINEERING. Selects ENGINEERING format for numbers that require exponential notation. ENGINEERING format normalizes a number so that its exponent is a multiple of three and the mantissa(ifr0 not 0)is between 1 and 1000. The numberic options are preserved when an internal function is called. Examples: numeric digits 12 /* precision */ numeric form scientific /* format */ 4-17 OPTIONS Usage: OPTIONS [FAILAT expression] or: OPTIONS [PROMPT expression] or: OPTIONS [RESULTS] The OPTIONS instruction is used to set various internal defaults. The FAILAT expression sets the limit at or above which command return codes will be signalled as errors,and must evaluater1Bb to an integer value. The PROMPT expression provides a string to be used as the prompt with the PULL (or PARSE PULL)instruction. The RESULTS keyword indicates that the interpreter should request a result string when it issues commands to an external host. The internal options controlled by this instruction are preserved across function calls,so an OPTIONS instruction can be issued within an internal function without affecting the callers environment. If no keyword is specified with r2s" the OPTIONS instuction,all controlled options revert to their default settings. Example: options failat 10 options prompt "Yes Boss?" options results 4-18 OTHERWISE Usage: OTHERWISE [;] [conditional statement] This instruction is valid only within the range of a SELECT instruction,and must follow the "WHEN ... THEN" statements. If none of the preceding WHEN clauses have succeeded,the statement following the OTHERWISE instruction is executed. An OTHERWISE is not mandatory withinr3,c a SELECT range. However,an error will result if the OTHERWISE clause is omitted and none of the WHEN instructions succeed. Example: select when i=1 then say 'one' when i=2 then say 'two' otherwise say 'other' end 32 4-19 PARSE Usage: PARSE [UPPER] inputsorce [template] [,template...] The PARSE instruction provides a mechanism to extract one or more substrings from a string and assign them to variables. The input string can come from a variety of sources,including arr4$?gument strings,an expression,or from the console. The template provides both the variables to be given values and the way to determine the value strings. The template may be omitted if the instruction is intended only to create the input string. The different options of the instruction are described below. INPUT SOURCES The sources for the input strings are specified by the keyword symbols listed below. When multiple templates are supplied,each template receives a new input string,r5,j although for some source options the new string will be identical to the previous one. The input source string is copied before being parsed,so the original strings are never altered by the parsing process. UPPER. This optional keyword may be used with any of the input sources,and specifies that the input string is to be translated to uppercase before being parsed. It must be the first token following PARSE. ARG. This input option retrieves the argument strings supplied when the pr6GProgram was invoked. Command invocations normally have only a single argument string, but functions may have up to 15 argument strings. Multiple templates may be given to retrieve successive argument strings. EXTERNAL. The input strings is read from the console. If multiple templates are supplied,each template will read a new string. This source option is the same as PULL. NUMERIC. The current numeric options are placed in a string in the order DIGITS,FUZZ,and FORM,separated by a sir7Ingle space. PULL. Reads a string from the input console. If multiple templates are supplied,each template will read a new string. SOURCE. The "source" string for the program is retrieved. This string is formatted as "{COMMAND | FUNCTION} {0 | 1} called resolved ext host." The first token indicates whether the program was invoked as a command or as a function. The second token is a boolean flag indicating whether a result string was requested by the caller. The called token is the nr8qame used to invoke this program,while the resolved token is the final resolved name of the program. The ext token is the file extension to be used for searching(the default is "REXX"). Finally,the host token is the initial host address for commands. VALUE expression WITH. The input string is the result of the supplied expression. The WITH keyword is required to separate the expression from the template. The expression result may be parsed repeatedly by using multiple templates,but tr#vhe expression is not reevaluated. VAR variable. The value of the specified variable is used as the input string. When multiple templates are provided,each template uses the current value of the variable. 33 This value may change if the variable is included as an assignment target in any of the templates. VERSION. The current configuation of the ARexx interpreter is supplied in the form "ARexx version cpu mpu video freq". The version toekn is the release level of the interpretr:1Onywhere within a program. The evaluated expression is passed back to the caller as the function or command result. Results Processing. The processing of the EXIT result depends on whether a result string was requested by the calling program,and whether the current invocation resulted from a command or function call. If a result string was requested,the expression result is copied to a block of allocated memory and a pointer to the block is returned as the secondary result of the calr;GDl. If the caller did not request a result string,and the program was invoked as a command,then an attempt is made to convert the expression result to an integer. This value is then returned as the primary result,with 0 as the secondary result. This allows the EXIT expression to be interpreted as a "return code" by the caller. Refer to Chapter 10 for further information on the data structures used to return the result string. Examples: exit /* no result needed */ exit 12 /* an er<j݇rror return? */ 4-11 IF Usage: IF expression [THEN] [;] [conditional statement] The IF instruction is used in conjunction with THEN and ELSE instruction to conditionally execute a statement. The result of the expression must be a boolean value. If the result is 1 (True),the statement following the THEN symbol is executed;otherwise,control passes to the next statement(which might be an ELSE clause.) The THEN keyword need not immediately follow the IF expression,but may appear as a sr=#Feparate clause. The instruction 29 is actually analyzed as "IF expression; THEN; statement;." In essence,the IF statement begins a syntactic range and establishes the test condition that determines whether subsequent THEN or ELSE clauses will be performed. Any valid statement may follow the THEN symbol;in particular,a "DO; ... END;" group allows a series of statements to be performed conditionally. Examples: if result < 0 then exit /* all done? */ 4-12 INTERPRET Usage:r>DRq INTERPRET expression The expression is evaluated and the result is executed as one or more program statements. The statements are considered as a group,as though surrounded by a "DO; ...;END" combination. Any statements can be included in the INTERPRETed source,including DO or SELECT instruction. An INTERPRET instruction activates a control range when it is executed,which serves as a "fence" for LEAVE and ITERATE instructions. These instructions can therefore be used only with DO-lr?woops defined within the INTERPRET. The BREAK instuction can be used to terminate the processing of INTERPRETed statements. While it is not an error to include label clauses within the interpreted string,only those labels defined in the original source code are searched during a transfer of control. The INTERPRET instruction can be used to solve programming problems in interesting and novel ways. Programs can be constructed dynamically and then executed using this instruction,or progr@ram fragments may be passed as arguments to functions,which then INTERPRET them. Example: inst = 'say' /* an instruction */ interpret inst hello /* ..."say HELLO" */ 4-13 ITERATE Usage: ITERATE [variable] The ITERATE instruction terminates the current iteration of a DO instruction and begins the next iteration. Effectively,control passes to the END statement and then(depending on the outcome of the UNTIL expression)back to the DO statement. The instruction normally acts on the inrAEknermost iterative DO range containing the instruction. An error results if the LEAVE instruction is not contained within an iterative DO instruction. The optional variable symbol specifies which DO range is to be exited,in the event that several nested ranges exist. The variable is taken as a literal and must match the index variable of a currently active DO instruction. An error results if no such matching DO instruction is found. 30 Example: do i=1 to 3 if i=j then iterB1rate i end 4-14 LEAVE Usage:LEAVE [variable] LEAVE forces an immediate exit from the iterative DO range containing the instruction. An error results if the LEAVE instruction is not contained within an iterative DO instruction. The optional variable symbol specifies which DO range is to be exited,in the event that several nested ranges exist. The variable is taken as a literal and must match the index variable of a currently active DO instruction. An error results if no such marC%Ntching DO instruction is found. Example: do i=1 to limit if i > 5 then leave /* maximum iterations */ end 4-15 NOP Usage: NOP The NOP or "no-operation" instruction does just that:nothing. It is provided to control the binding of ELSE clauses in compound IF statements. Example: if i=j then /* first (outer) IF */ if j=k then a=o /* inner IF */ else nop /* binds to inner IF */ else a=a+1 /* binds to outer IF */ 4-16 NUMERIC Usage: NUMERIC {DIGITS | FUZZ} exr.x(Ŏpression or: NUMERIC FORM {SCIENTIFIC | ENGINEERING} This instruction sets options relating to the numeric precision and format. The valid forms of the NUMERIC instruction are: NUMERIC DIGITS expression. Specifies the number of digits of precision for arithmetic calculations. The expression must evaluate to a positive whole number. NUMERIC FUZZ expression. Specifies the number of digits to be ignored in numeric comparison operations. This must be a positive whole number that is rE\&t called function;this process is described in Chapter 6. Example: call center name,length+4,'+' 26 Usage: DO [var=exp] [To exp] [BY exp]] [FOR exp] [FOREVER] [WHILE exp | UNTIL exp] The DO instruction begins a group of instructions to be executed as a block. The range of the DO instruction includes all statements up to and including an eventual END instruction. There are two basic forms of the instruction: The DO keyword by itself defines a block of instructions to be executrFv_7ed once. If any iteration specifiers follow the DO keyword,the block of instructions is executed repeatedly until a termination condition occurs. An interative DO instruction is sometimes called a "loop",since the interpreter "loops back" to perform the instruction repeatedly. The various parts of the DO instruction are described below. Initializer expression. An initializer expression of the form "variable= expression" defines the index variable of the loop. The expression is evarG$>gluated when the DO range is first activated,and the result is assigned to the index variable. On subsequent iterations an expression of the form "variable = variable + increment" is evaluated,where the increment is the result of the BY expression. If specified, the initializer expression must precede any of the other subkeywords. BY expression. The expression following a BY symbol defines the increment to be added to the index variable in each subsequent iteration. The expression murHNjbst yield a numeric result,which may be positive or negative and need not be an integer. The default increment is 1. TO expression. The result of the TO expression specifies the upper(or lower) limit for the index variable. At each iteration the index variable is compared to the TO result. If the increment(BY result)is positive and the variable is greater than the limit,the DO instruction terminates and control passes to the statement following the END instruction. Similarly,the looprI terminates if the increment is negative and the index variable is less than the limit. FOR expression. The FOR expression must yield a positive whole number when evaluated,and specifies the maximum number of iterations to be performed. The loop terminates when this limit is reached irrespective of the value of the index variable. FOREVER. The FOREVER keyword can be used if an iterative DO instruction is required but no index variable is necessary. Presumably the loop will be termirJ8nated by a LEAVE or BREAK instruction contained within the loop body. WHILE expression. The WHILE expression is evaluated at the beginning of each iteration and must result in a boolean value. The iteration proceeds if the result is 1;otherwise,the loop terminates. 27 UNTIL expression. The UNTIL expression is evaluated at the end of each iteration and must result in a boolean value. The instruction continues with the next iteration if the result is 0,and terminates otherwise. rKnܹ The initializer,BY,TO,and FOR expressions are evaluated only when the instruction is first activated,so the increment and limits are fixed throughout the execution. Note that a limit need not be supplied;for example,the instruction "DO i=1" will simply count away forever. Note also that only one of the WHILE or UNTIL keywords can be specified. Example: do i=1 to limit for 5 while time <50 y.1=i*time end 4-6 DROP Usage: DROP variable [variable...] The specified variable symbrLh*ols are reset to their uninitialized state,in which the value of the variable is the variable name itself. It is not an error to DROP a variable that is already uninitialized. DROPping a stem symbol is equivalent to DROPping the values of all possible compound symbols derived from that stem. Example: a=123 /* assign a value */ drop a b /* drop some */ say a b /* ==>A B */ 4-7 ECHO Usage: ECHO [expression] The ECHO instruction is a synonym for the SAY instruction. It displays trM(he expression result on the console. Example: echo "You don't SAY!" 4-8 ELSE Usage: ELSE [;] [conditional statement] The ELSE instruction provides the alternative conditional branch for an IF statement. It is valid only within the range of an IF instruction,and must follow the conditional statement of the THEN branch. If the THEN branch wasn't executed,the statement following the ELSE clause is performed. Binding. ELSE clauses always bind to the nearest(preceding)IF statement. IrN5t may be necessary to provide "dummy" ELSE clauses for the inner IF ranges of a compound IF statement in order to allow alternative branches for the outer IF statements. In this case it is not sufficient to follow the else with a semicolon or a null clause. Instead,the NOP(no-operation)instruction can be used for this purpose. 28 Example: if 1 > 2 then say 'really?' else say 'I thought so' 4-9 END Usage: END [variable] The END instruction terminates the range of a Dr9]O or SELECT instruction. If the optional variable symbol is supplied,it is compared to the index variable of the DO statement(which must therefore be iterative). An error is generated if the symbols do not match,so this provides a simple mechanism for matching the DO and END statements. Example: do i=1 to 5 /* index variable is I */ say i end i /* end "I" loop */ 4-10 EXIT Usage: EXIT [expression] The EXIT instruction terminates the execution of a program,and is valid arP¬Dgram. These resources include memory space,DOS files and related structures,and the message port structures supported by ARexx. The tracking system was designed to allow a program to "bail out" at any point(perhaps due to an execution error)without leaving any hanging resources. It is possible to go outside of the interpreter's resource tracking net by making calls directly to the Amiga's operating system from within an ARexx program. In these cases it is the programer's responsibilrQT\;ity to track and return all of the allocated resources. ARexx provides a special interrupt facility so that a program can retain control after an execution error,perform the required cleanup,and then make an orderly exit. Chapter 7 has information on the ARexx interrupt system. 24 CHAPTER 4 INSTRUCTIONS Instruction clauses are identified by an initial keyword symbol that is not followed by a colon(:)or an equals(=)operator. Each instruction signifies a specific action,and rRK`may be followed by one or more subkeywords,expressions,or other instruction-specific information. Instruction keywords and subkeywords are recognized only in this specific context,and are therefore not "reserved words" in the usual sense of the term. Keywords may be used freely as variables or function names,although such usage may become confusing at times. In the descriptions that follow,keywords are shown in uppercase and optional parts of the instruction are enclosed in bracketsrSf~. Alternative selections are separated by a vertical bar(|),and required alternative are enclosed in braces ({}). 4-1 ADDRESS Usage: ADDRESS [Symbol|string|VALUE] [expression]] This instruction specifies a host address for commands issued by the interpreter. A host address is the name associated with an external program to which commands can be sent;external hosts are described in Chapter 5. ARexx maintains two host addresses:a "current" and a "previous"address is lost,and the "currT_Nrent" and a "previous" value. Whenever a new host address is supplied, the "previous" address is lost,and the "current" address becomes the "previous" one. These host addresses are part of a program's storage environment and are preserved across internal function calls. The current address can be retrieved with the Built-In function ADDRESS(). There are four distinct forms for the ADDRESS instruction: ADDRESS {string | symbol} expression. The expression is evaluated and the result irU'JZys issued to the host specified by the string or symbol,which is taken as a literal. No changes are made to the current or previous address strings. This provides a convenient way to issue a single command to an external host without disturbing the current host addresses. The return code from the command is treated as it would be from a command clause. ADDRESS {string | symbol}. The string or symbol,taken as a literal,specifies the new host address. The current host address becomes trV>"he previous address. ADDRESS [VALUE] expression. The result of the expression specifies the new host address,and the current address becomes the previous address. The VALUE keyword may be omitted if the first token of the expression is not a symbol or string. ADDRESS. This form interchanges the current and previous hosts. Repeated execution will therefore "toggle" between the two host addresses. Examples: address edit /* set an new host address */ address edit 'top' /* move rWto the top */ address VALUE edit n /* compute a new host address */ address /* swap current and previous */ 25 Usage: ARG [template] [,template...] ARG is shorthand form for the PARSE UPPER ARG instruction. It retrieves one or more of the argument strings available to the program,and assigns values to the variables in the template. The number of argument strings available depends on the whether the program was invoked as a command or a function. Command invocations normally rXȇhave only one argument string,but functions may have up to 15. The argument strings are not altered by the ARG instruction. The structure and processing of templates is described briefly with the PARSE instruction,and in greater depth in Chapter 8. Example: arg first,second /* fetch arguments */ 4-3 BREAK Usuage: BREAK The BREAK instruction is used to exit from the range of a DO instruction or from within an INTERPRETed string,and is valid only in these contexts. If used within rYNda DO statement,BREAK exits from the innermost DO statement containing the BREAK. This contrasts with the otherwise similar LEAVE instruction,which exits only from an interative DO. Example: do /* begin block */ if i>3 then break /* all done? */ a = a + 1 y.a = name end /* end block */ 4-4 CALL Usage: CALL {symbol | string} [expression] [,expression,...] The CALL instruction is used to invoke an internal or external function. The function name is specified by the syrD g\mbol or string token,which is taken as a literal. Any expressions that follow are evaluated and become the arguments to the called function. The value returned by the function is assigned to the special variable RESULT. It is not an error if a result string is not returned; in this case the variable RESULT is DROPed(becomes uninitialized.) The linkage to the function is established dynamically at the time of the call. ARexx follows a specific search order in attempting to locate ther{[yol the given name was found,say in NAME.12,and then retrieving NUMBER.12. With compound symbols,the symbol NAME could hold the name to be looked-up,and NUMBER.NAME would then expand to NUMBER.Bill(for example),which be the corresponding number. Of course,compound symbols can also be used as conventional indexed arrays,with the added convenience that only a single assignment(to the stem)is required to initialize the entire array. 3-8 THE EXECUTION ENVIRONMENT The ARexx interpreter pr|\"rovides a uniform environment by running each program as a separate task(actually,as a DOS process)in the Amiga's multitasking operating system. This allows for a flexible interface between an external host program and the interpreter,as the host can either proceed concurrently with its operations or can simply wait for the interpreted program to finish. THE EXTERNAL ENVIRONMENT The external environment of a program includes its task(process)structure, input and output streams,and r}]ncurrent directory. When each ARexx task is created,it inherits the input and output streams and current directory from its client,the external program that invoked the ARexx program. The current directory is used as the starting point in a search for a program or data file. EXTERNAL PROGRAMS. The external environment usually includes one or more external programs with which the ARexx program may communicate. Any program that supports a suitable interface can receive commands from ARr~^h?exx programs. The command interface is discussed in Chapter 5. THE INTERNAL ENVIRONMENT The internal environment of an ARexx program consists of a static global structure and one or more storage environments. The global data values are fixed at a time the program is invoked,and include the argument strings,program source code,and static data strings. The storage environment includes the symbol table used for variable values,the numeric options,trace options,and host address stringsr_M. While the global environment is unique,there may be many storage environments during the course of the program execution. Each time an internal function is called a new storage environment is activated and initialized. The initial values for most fields are inherited from the previous environment,but values may be changed afterwards without affecting the caller's environment. The new environment persists until control returns from the function. 22 ARGUMENT STRINGS. A program r`-8may receive one or more argument strings when it is first invoked. These arguments persist for the duration of the program and are never altered. The number of arguments a program receives depends in part on the mode of invocation. ARexx programs invoked as commands normally have only one argument string,although the "command tokenization" option may provide more than one. A program invoked as a function can have any number of arguments if called as an internal function,but external rafunctions are limited to a maximum of 15 arguments. The argument strings can be retrieved using either the ARG instruction or the ARG() Built-In function. ARG() can also return the total number of arguments,or the status(as "exists" or "omitted")of a particular argument. THE SYMBOL TABLE. Every storage environment includes a symbol table to store the value strings that have been assigned to variables. This symbol table is organized as a two-level stores entries for simple and stem rb: %symbols,and the secondary level is used for compound symbols. All of the compound symbols associated with a particular stem are stored in one tree,with the root of the tree held by the entry for the stem. Symbols are not entered into the table until an assignment is made to the symbol. Once created,entries at the primary level are never removed,even if the symbol subsequently becomes uninitialized. Secondary trees are released whenever an assignment is made to the stem associated wircdth the tree. For the most part ARexx programmers need not be concerned with the details of storage environments except to understand what values are saved when a function is called. Applications developers who need to manipulate environment values should refer to the structure definitions in the INCLUDE files provided on the ARexx distribution disk. INPUT AND OUTPUT Most computer programs require some means of communicating with the outside world,either to accept input data or to rdtpass along results. The REXX language includes only a minimal specification of input and output (I/O)operations, leaving the choice of additional functionality to the language implementor. This is in keeping with the design of many computer languages. For instance,the "C" language has no statements dedicated to I/O,but instead relies on a standardized set of I/O functions. ARexx extends the I/O facilities fo REXX by providing Built-In functions to manipulate external files. Files arrO%e referenced by a logical name associated with the file when it is first opened. The initial input and output streams are given the names STDIN and STDOUT. ARexx maintains a list of all of the files opened by a program and automatically closes them when the program finishes. There is no limit to the number of files that may be open simultaneously. 23 RESOURCE TRACKING ARexx provides complete tracking for all of the dynamically-allocated resources that it uses to execute a prorpftgnd is raised to the power specified by the right operand,which must be an integer. The number of decimal places for the result is the product of the exponent and the number of decimal places in the base. Examples: 2**3 ==>8 3**-1 ==>.333333333 0.5**3 ==>0.125 MULTIPLICATION(*). The product of two numbers is computed. The number of decimal places for the result is the sum of the decimal places of the operands. Examples: 12 * 3 ==>36 1.5 * 1.50 ==>2.250 DIVISION(/). TrqgW{he quotient of two numbers is computed. The number of decimal places for the result depends on the current setting of the numeric DIGITS variable;the nuber is formatted to the maximum precision required. Examples: 6 / 3 ==>2 8 / 3 ==>2.66666667 INTEGER DIVISION(%). The quotient of two numbers is computed,and the integer part of the quotient is used as the result. Examples: 5 % 3 ==>1 -8 % 3 ==>-2 REMAINDER(//). The result is the remainder after the two operands are dirrh9kvided. The remainder for "a//b" is calculated as "a-(a%b)*b." If both operands are positive integers,this operation yields the usual "modulo" result. 19 Examples: 5 // 3 ==>2 -5 // 3 ==>-2 5.1 // 0.2 ==>0.1 ADDITION(+). The sum of two numbers is computed. The number of decimal places for the result is the larger of the decimal places of the operands. Examples: 12 + 3 ==>15 3.1 + 4.05 ==>7.15 SUBTRATION(-). The difference of two numbers is computed. As in the carsi1KKse of addition,the number of decimals places for the result is the larger of the decimal places of the operands. Examples: 12 - 3 ==>9 5.55 - 1.55 ==>4.00 CONCATENATION OPERATORS ARexx defines two concatenation operators,both of which require two operands. The first,identified by the operator sequence "||",joins two strings into a single string with no intervening blank. The second concatenation operation is identified by the blank operator,and joins the two operand strings wrtj8with one intervening blank. An implicit concatenation operator is recognized when a symbol and a string are directly abutted in an expression. Concatenation by abuttal uses the "||" operator,and behaves exactly as though the operator had been provided explicitly. Examples: 'why me,' || 'Mom?' ==>why me,Mom? 'good' 'times' ==>good times one'two'three ==>ONEtwoTHREE COMPARISON OPERATORS Comparisons are performed in one of three modes,and always result in a boolean value(0 orruk 1.) Exact comparisons proceed character-by-character,including any leading blanks that may be present. String comparisons ignore leading blanks,and pad the shorter string with blanks if necessary. 20 Numeric comparisons first convert the operands to an internal numeric form using the current Numeric Digits setting,and then perform a standard arithmetic comparison. Except for the exact equality and exact inequality operators,all comparison operators dynamically determine whetrvlher a string of numeric comparison is to be performed. A numeric comparison is performed if both operands are valid numbers otherwise,the operands are compared as strings. TABLE 3.3 COMPARISON OPERATORS SEQUENCE PRIORITY OPERATION MODE == 3 Exact Equality Exact ~== 3 Exact Inequality Exact = 3 Equality String/Numeric ~= 3 Inequality String/Numeric > 3 Greater Than String/Numeric >=,~< 3 Greater Than or Equal String/Numeric < 3 Less Than String/Numeric <=,~> rwmbX 3 Less Than or Equal String/Numeric LOGICAL (BOOLEAN) OPERATORS ARexx defines the four logical operations NOT,AND,OR,and Exclusive OR,all of which require boolean operands and produce a boolean result. Boolean operands must have values of either 0(False)or 1(True.) An attempt to perform a logical operation on a non-boolean operand will generate an error. TABLE 3.4 LOGICAL OPERATORS SEQUENCE PRIORITY OPERATION ~ 8 NOT(Inversion) & 2 AND | 1 OR ^,&& 1 Exclusive Orxn]6YR 3-7 STEMS AND COMPOUND SYMBOLS Stems and compound symbols have special properties that allow for some interesting and unusual programming. A compound symbol can be regarded as having the structure stem.n1.n2.n3...nk where the leading name is a stem symbol and each node n1...nk is a fixed or simple symbol. Whenever a compound symbol appears in a program,its name is expanded by replacing each node with its current value as a (simple) symbol. The value string may consist of any charryoi$acters,including embedded blanks,and is not converted to uppercase. The result of the expansion is a new name that is used in place of the compound symbol. For example if j has the value of 3 and k has the value 7,then the compound symbol a.j.k will expand to A.3.7. Stem symbols provide a way to initialize a whole class of compound symbols. When an assignment is made to a stem symbol,it assigns that value to all possible compound symbols derived from the stem. Thus,the value of a corzZ;mpound symbol depends on the prior assignments made to itself or its associated stem. 21 Compound symbols can be regarded as a form of "associative" or "content- addressable" memory. For example,suppose that you needed to store and retrieve a set of names and telephone numbers. The conventional approach would be to set up two arrays NAME and NUMBER,each indexed by an integer running from one to the number of entries. A number would be "looked up" by scanning the name array untiHֽjr+4 AREXX Manual!++ #qHv+rrHtq}tb+ arexx.doxpuˬ{c?}* tcopy.lzhprE AREXX TABLE OF CONTENTS AREXX USER'S REFERENCE MANUAL INTRODUCTION....................................................1 1. Organization of this Document...............................1 1 Using this Manual.........................................2 2 Typographic Conventions...................................2 2. Future Directions...........................................2 CHAPTER 1. WHAT IS AREXX?.......................................3 1. Language FeatureuHOYXWVUTSRQPOdcba`_^]\[Zonmlkjihgfe~}|{rvvHv "! -,+*)('&%$#876543210/.CBA@?>=<;:9NMLKJIHGFEDrwwH%    rxxH9yxwvuts~ryyHN'&;:987654321FEDCBA@?>=<QPONMLKJIHG\[ZYXWVUTSRgfedcba`_^]rqponmlkjih}|{zrzzHb`     %$#"! 0/.-,+*)(rqre| ression can proceed,the interpreter must obtain a value for each symbol in the expression. For fixed symbols the value is just the symbol name itself,but variable symbols must be looked up in the current symbol table. In the example above,the expression after symbol resolution would be "3 'factorial is' FACT(3)," assuming that the symbol J had the value 3. Suppose that the example above had been "FACT(J) 'is' J 'factorial'." Would the second occurrence of symbol J still resolve to 3rf}c' in this case? In general, function calls may have "side effects" that include altering the values of variables,so the value of J might have been changed by the call to FACT. In order to avoid ambiguities in the values assigned to symbols during the resolution process, ARexx guarantees a strict left-to-right resolution order. Symbol resolution proceeds irrespective of operator priority or parenthetical grouping;if a function call is found,the resolution is suspended while the functiorg~ n is evaluated. Note that it is possible for the same symbol to have more than one value in an expression. ORDER OF EVALUATION After all symbol values have been resolved,the expression is evaluated based on operator priority and subexpression grouping. Operators of higher priority are evaluated first. ARexx does not guarantee an order of evaluation among operators of equal priority,and does not employ a "fast path" evaluation of boolean operators. For example,in the expression (1rh8 = 2) & (FACT(3) = 6) the call to the FACT function will be made,although it is clear that the final result will be 0,since the first term of the AND operation is 0. 16 3-5 NUMBERS AND NUMERIC PRECISION An important class of operands are those representing numbers. Numbers consist of the characters 0-9,.+-,and blanks;an e or E may follow a number to indicate exponential notation,in which case it must be followed by a (signed) integer). Both string tokens and symbol tokens mariy be used to specify numbers. Since the language is typeless,variables do not have to be declared as "numeric" before being used in an arithmetic operation. Instead,each value string is examined when it is used to verify that it represents a number. The following examples are all valid numbers: 33 " 12.3 " 0.321e12 ' + 15.' Note that leading and trailing blanks are permitted,and that blanks may be embedded between a "+" or "-" sign and the number body(but not within the bodrj>y.) BOOLEAN VALUES The numbers 0 and 1 are used to represent the boolean values False and True, respectively. The use of a value other than 0 or 1 when a boolean operand is expected will generate an error. Any number equivalent to 0 or 1,for example "0.000" or "0.1E1," is also acceptable as a boolean value. NUMERIC PRECISION ARexx allows the basic precision used for arithmetic calculations to be modified while a program is executing. The number of significant figures used in aritrkhmetic operations is determined by the Numeric Digits environment variable, and may be modified using the NUMERIC instruction. The number of decimal places used for a result depends on the operation performed and the number of decimal places in the operands. Unlike many languages,ARexx preserves trailing zeroes to indicate the precision of the result. If the total number of digits required to express a value exceeds the current Numeric Digits setting,the number is formatted in exponrl}kuential notation. Two such formats are provided: In SCIENTIFIC notation,the exponent is adjusted so that a single digit is placed to the left of the decimal point. in ENGINEERING notation,the number is scaled so that the exponent is a multiple of 3 and the digits to the left of the decimal point range from 1 to 999. The numeric precision and format can be set using the NUMERIC instruction. 17 3-6 OPERATORS Operators can be grouped into four categories: Arithmetic operators rmytrequire one or two numeric operands,and produce a numeric result. Concatenation operators join two strings into a single string. Comparison operators require two operands,and produce a boolean(0 or 1) result. Logical Operators require one or two boolean operands,and produce a boolean result. ARITHMETIC OPERATORS The aritmetic operators are listed in Table 3.2 below. Note the inclusion of the integer division(%)and remainder(//)operators,along with the usual arithmetic operations. Trn?he result of an arithmetic operation is always foratted based on the current Numeric Digits setting,and will never have leading or trailing blanks. TABLE 3.2 ARITHMETIC OPERATORS SEQUENCE PRIORITY OPERATION + 8 Prefix Conversion - 8 Prefix Negation ** 7 Exponentiation * 6 Multiplication / 6 Division % 6 Integer Division // 6 Remainder + 5 Addition - 5 Subtraction PREFIX CONVERSION(+). This unary operator converts the operand to androe internal numeric form and formats the result based on the current Numeric Digits settings. This causes any leading and trailing blanks to be removed,and may result in a loss of precision. Examples: ' 3.12 ' ==> 3.12 1.5001 ==> 1.500 /* If digits = 3 */ PREFIX NEGATION(-). This unary operator negates the operand. The result is formatted based on the current Numeric Digits setting. 18 Examples: -' 3.12 ' ==> -3.12 1.5E2 ==>-150 EXPONENTIATION(**). The left operarZ@Bunction call. 3-3 CLAUSES Tokens are grouped together to form clauses,the smallest language unit that can be executed as a statement. Every clause in ARexx can be classified as either a null,label,assignment,instruction,or command clause. The classification process is very simple,since no more than two tokens are required to classify any clause. Assignment,instruction,and command clauses are jointly termed statements. CLAUSE CONTINUATION. The end of a source line normally acts as r[9-athe implicit end of a clause. A clause can be continued on the next source line by ending the line with a comma (,). The commas is then removed,and the next line is considered as a continuation of the clause. There is no limit to the number of continuations that may occur. String and comment tokens are automatically continued if a line end before the closing delimiter has been found,and the "newline" character is not considered to be part of the token. MULTIPLE CLAUSES. Several claur\>ses can be placed on a single line by separating them with semicolons(;). NULL CLAUSES Lines consisting only of blanks or comments are called null clauses. They have no function in the execution of a program,except to aid its readability and to increment the source line count. Null clauses may appear anywhere in a program. Example: /* perform annuity calculations */ LABEL CLAUSES A symbol followed immediately by a colon defines a label clause. A label acts as a placemarker in r]Vthe program,but no action occurs with the "execution" of a label. The colon is considered as an implicit clause terminator,so each label stands as a separate clause. Label clauses may appear anywhere in a program. Examples: start: /* begin execution */ syntax: /* error processing */ ASSIGNMENT CLAUSES Assignments are identified by a variable symbol followed by an "=" operator. In this context the operator's normal definition(an equality comparison)is overridden,and it becomes r^yan assignment operator. The tokens to the right of the "=" are evaluated as an expression,and the result is assigned to(becomes the value of)the variable symbol. 14 Examples: when= 'Now is the time' answ= 3.14 * fact(5) INSTRUCTION CLAUSES Instructions begin with certain keyword symbols,each of which denotes a particular action to be performed. Instruction keywords are recognized as such only at the beginning of a clause,and may otherwise be used freely as symbols (althougr_@h such use may become confusing at times.) The ARexx instructions are described in detail in Chapter 4. Examples: drop a b c /* reset variables */ say 'please' /* a polite program */ if j > 5 then leave; /* several instructions */ COMMAND CLAUSES Commands are any ARexx expression that can't be classified as one of the preceding types of clauses. The expression is evaluated and the result is issued as a command to an external host,which might be the native operating system orr` an application program. Commands are discussed in Chapter 5,and the details of the host command interface are given in Chapter 10. Examples: 'delete' 'myfile' /* a DOS command */ 'jump' current+10 /* an editor command? */ CLAUSE CLASSIFICATION The process by which program lines are divided into clauses and then classified is important in understanding the operation of an ARexx program. The language interpreter splits the program source into groups of clauses as the program is rra_S ead,using the end of each line as a clause separator and applying the continuation rule as required. These groups of one or more clauses are then tokenized,and each clause is classified into one of the above types. Note that seemingly small syntactic differences may completely change the semantic content of a statement. For example, SAY 'Hello, Bill' is an instruction clause and will display "Hello, Bill" on the console,but ""SAY 'Hello, Bill' is a command clause,and will issurb]e "SAY Hello, Bill" as a command to an external program. The presence of the leading null string changes the classification from an instruction clause to a command clause. 15 3-4 EXPRESSIONS Expression evaluation is an important part of ARexx programs,since most statements include at least one expression. Expressions are composed of strings,symbols,operators,and parentheses. Strings are used as literals in an expression;their value in an operation is just the string itself. Firc.xed symbols are also literals(remember that symbols are always translated to uppercase,) but variable symbols may have an assigned value. Operator tokens represent the predefined operations of ARexx;each operator has an associated priority that determines the order in which operations will be performed. Parentheses may be used to alter the normal order of evaluation in the expression,or to identify function calls. A symbol or string followed immediately by an open parenthesis definesrd{9Y9, the function name,and the tokens between the opening and(final)closing parenthesis form the argument list for the function. For example,the expression "J 'fractorial is' fact(J)" is composed of a symbol J,a blank operator,the string 'factorial is',another blank,the symbol fact,an open parenthesis,the symbol J again,and a closing parenthesis. FACT is a function name and (J) is its argument list,in this case the single expression J. SYMBOL RESOLUTION Before the evaluation of an exprO{L the language are called tokens. A token may be series of characters,as in the symbol MyName,or just a single character like the "+" operator. Tokens can be categorized into comments, symbols,strings,operators,and special characters. Each of these groups are described below. COMMENT TOKENS Any group of characters beginning with the sequence "/*" and ending with "*/" defines a comment token. Comments may be placed anywhere in a program and cost little in terms of execution speed,sinrP'ce they are stripped(removed)when the program is first scanned by the interpreter. Comments may be "nested" within one another,but each "/*" must have a matching "*/" in the program. Examples: /* Your basic comment */ /* a /* nested! */ comment */ SYMBOL TOKENS Any group of the characters a-z,A-Z,0-9,and .!?$_defines a symbol token. Symbols are translated to uppercase as the program is scanned by the interpreter,so the symbol MyName is equivalent to MYNAME. Four types of rQ?symbols are recognized: Fixed symbols begin with a digit (0-9) or a period(.). Simple symbols do not begin with a digit,and do not contain any periods. Stem symbols have exactly one period at the end of the symbol name. Compound symbols include one or more periods in the interior of the name. Stems and compound symbols have special properties that make them useful for building arrays and lists. 11 SYMBOLS VALUES. The value used for a fixed symbol is always the symbol narR%rme itself(as translated to uppercase.) Simple,stem,and compound symbols are called variables and may be assigned a value;the value used for an uninitialized variable is just the variable name itself. Examples: 123.45 /*a fixed symbol */ MyName /*same as MyName */ a. /*a stem symbol */ a.1.Index /*a compound symbol */ STRING TOKENS A group of characters beginning and ending with a quote (')or double quote(") delimiter defines a string token. The delimiter character itself rS'Smay be included within the string by a double-delimiter sequence (" or ""). The number of characters in the string is called its length,and a string of length zero is called a null string. A string is treated as a literal in an expression;that is,its value is just the string itself. Strings followed immediately by an "X" or "B" character that is not part of a longer symbol are classified as hex or binary strings,respectively,and must be composed of hexadecimal digits(0-9,A-F) or binrTY\ary digits(0,1). Blanks are permitted at byte boundaries for added readability. Hex and binary strings are convenient for specifying non-ASCII characters and for machine-specific information like addresses in a program. They are converted immediately to the "packed" internal form. Examples: "Now is the time" /*a simple example */ "" /*a null string */ 'Can't you see??' /*Can't you see?? */ '4A 3B CO'X /*a hex string */ '00110111'b /*binary for '7' */ OPERATORS The characrUkters +-*/=><*| may be combined in the sequences shown in Table 3.1 to form operator tokens. Operator sequences may include leading,trailing,and embedded blanks,all of which are removed when the program is scanned. In addition to the above characters,the blank character as a concatenation operator if it follows a symbol or string and is not adjacent to an operator or special character. Each operator has an associated priority that determines the order in which operations will be perrVGsformed in an expression. Operators with higher priorities before those with lower priorities. 12 TABLE 3.1 OPERATOR SEQUENCES SEQUENCE PRIORITY OPERATOR DEFINITION 8 Logical NOT + 8 Prefix Conversion - 8 Prefix Negation ** 7 Exponentiation * 6 Multiplication / 6 Division % 6 Integer Division // 6 Remainder + 5 Addition - 5 Subtration || 4 Concatenation (blank) 4 Blank Concatenation == 3 Exact Equality ~== 3 Exact IrWGpnequality = 3 Equality ~= 3 Inequality > 3 Greater Than >=,~< 3 Greater Than or Equal To < 3 Less Than <=,~> 3 Less Than or Equal To & 2 Logical AND | 1 Logical Inclusive OR ^,&& 1 Logical Exclusive OR SPECIAL CHARACTER TOKENS The characters :():,are each treated as a separate special character token and have particular meanings within an ARexx program. Blanks adjacent to these special characters are removed,except for those preceding an open parrX6enthesis or following a close parenthesis. COLON (:). A colon,if preceded by a symbol token,defines a label within the program. Lavels are locations in the program to which control may be transferred under various conditions. OPENING AND CLOSING PARENTHESES (()). Parentheses are used in expressions to group operators and operands into subexpressions,in order to override the normal operator primorities. An open parenthesis also serves to identify a function call within an expressionrYZ;a symbol or string followed immediately by an open parenthesis defines a function name. Parentheses must always be balanced within a statement. SEMICOLON (;). The semicolon acts as a program statement terminator. Several statements may be placed on a single source line if separated by semicolons. 13 COMMA (,). A comma token acs as the continuation character for statements that must be entered on several source lines. It is also used to separate the argument expressions in a frDIis run,so the symbol say here is equivalent to SAY. Following say is an example of a string,which is a series of characters surrounded by quotes ('). Double quotes (") could also have been used to define the string. In the next program we'll display a prompt for input and then read some information from the user. /* Calculate age in days */ say 'Please enter your age' pull age say 'You are about' age*365 'days old' This program uses the pull instruction to read a line of inputrE: into a variable called age,which is then used with a say instuction. Variables are symbols that may be assigned a value. The words following say form an expression in which strings are joined and an arithmetic calculation is performed. Note that the variable age did not have to be declared as a number;instead,its value was checked when it was actually used in the expression. To see what would happen if age wasn't a number,try rerunning the program with a non-numeric entry for the arF+"ge. The resulting error message shows the line number and type of error that occurred,after which the program ends. 7 The next program introduces the do instruction,which allows program statements to be executed repeatedly. It also illustrates the exponentiation operator, which is used to raise a number to an integral power. /* Calculate some squares and cubes */ do i = 1 to 10 /* 10 interations */ say i i**2 i**3 /* calculations */ end say ' all rG6gdone ' The do instruction causes the statements between the do and end instructions to be executed 10 times. The variable i is the index variable for the loop,and is incremented by 1 for each iteration. The number following the symbol to is the limit for the do instruction,and could have been a full expression rather than just the constant 10. Note that the statements within the loop have been indented. This is not required by the language,but it makes the program more readable and rHpis therefore good programming practice. The subject of the next example is the if instruction,a often-used control statement that allows statements to be conditionally executed. The numbers from 1 to 10 are classified as even or odd by dividing them by 2 and then checking the remainder. /* Even or odd? */ do i = 1 to 10 if i//2 = 0 then type = 'even' else type = 'odd' say i 'is' type end This example intoduces the // arithmetic operator,which calculatrIes the remainder after a division operation. The if instruction tests whether the remainder is 0 and executes the then branch if it is,thereby setting the variable type to "even." If the remainder was not 0,the alternative else branch is executed and type is set to "odd." The next example introduces the concept of a function,which is a group of statements that can be executed by mentioning the function name in a suitable context. Functions are an important part of most programming lrJ$yanguages,as they allow large,complex programs to be built from smaller modules. Functions are specified in an expression as a name followed by an open parenthesis. One or more expressions called arguments may follow the parenthesis;these are used to pass information to the function for processing. 8 /* Defining and calling a function */ do i = 1 to 5 say i square(i) /* call square */ end exit /* all done */ square: /* function name rKUHX */ arg x /* get the "argument" */ return x**2 /* square it and return*/ The function square is defined in the lines followed the label square: up through the return instruction. Two new instructions are introduced here: arg retrieves the value of the argument string,and return passes the functon's result back to the point where the function was called. One final example will suffice for now. A new instruction called trace is used here to activate the tracing features ofrL,n ARexx. /* Demonstrate "results" tracing */ trace results sum=0;sumsq=0; do i = 1 to 5 sum = sum + i sumsq = sumsq + i**2 end say 'sum=' sum 'sumsq=' sumsq When this program is run,the console displays the source lines as they are excuted,and shows the final results of expressions. This makes it easy to tell what the program is really doing,and helps reduce the time required to develop and test a new program. One minor point is illustrated here: the third line showrM>w,s two distinct statements separated by a semicolon (;). The semicolon is an example of a special character,characters that have particular meanings within ARexx programs. The following chapters will present further information on the language statements illustrated here and will introduce others that have not been shown. Take heart,though;ARexx is a "small" language and there are relatively few words and rules to learn. 9 THERE WAS NO PAGE 10 ELEMENTS OF THE LANGUAGE ThisrN: chapter introduces the rules and concepts that make up the REXX language. The intent is not to present a formalized definition,but rather to convey a practical understanding of how the language elements "fit together" to form programs. 3-1 FORMAT ARexx programs are compossed of ASCII characters and may be created using any text editor. No special formatting of the program statements is required or imposed on the programmer. 3-2 TOKENS The smallest distinct entities or "words" ofr9T_Commmand Line Interface (CLI)environment on the Amiga. INSTALLATION The ARexx language system consists of a shared library,a resident program,and several command utilities. All of the required files are contained in the :c and :libs directories of the distribution disk. ARexx may be installed on any of the system disks with which it will be used,but first check the :c and :libs directores of each disk to make sure that there are no naming conflicts. The following steps will then inr:^_Rstall ARexx on the system disk,provided that two disk drives are available: 1. Activate a CLI window. 2. Copy the ARexx :libs directory to the system LIBS: directory with the command "copy df1:libs to libs:". 3. Copy the ARexx :c directory to the system C: directory with the command "copy df1:C to c:". SINGLE DRIVE SYSTEMS. Installing software in a single-drive system can be very confusing,so an installation utility has been provided with the ARexx distribution disk. It copies the r;48m^:c and :libs directories of the distribution disk into memory,and then prompts the user to insert each disk that is to receive the files. Follow these steps to run the installation utility: 5 1. Activate a CLI window. 2. Insert the distribution disk into drive 0 and type "df0:rxinstall". 3. At the program prompt,insert the system disk on which ARexx is to be installed into drive 0. 4. Repeat step 3 as required. STARTING THE RESIDENT PROCESS ARexx programs are launched by a bar<4 nckground program called the resident process. It can be started by issuing the command rexxmast and must be active before any ARexx programs can be run. The rexxmast program briefly displays a small window to announce itself,and then disappears into the background to await your next request. If you will be using ARexx frequently,you can place the rexxmast command in the "startup-sequence" file that resides in the system S: directory. This will start the resident process automaticallyr=<' when you reboot the computer. After the resident process has been loaded,ARexx programs can be run from the CLI by typing the command rx followed by the program name and any arguments. For example,the sample program calc.rexx,which evaluates an expression,could be run by typeing "rx :rexx/calc 1+1." You may not need to start up the resident process if you are using a software package that starts it automatically. Applications that use ARexx can test whether the resident process isr>1HJ active by checking for a public message port named "REXX." If the port hasn't been opened,the program can issue the rexxmast command directly. The resident process can be closed using the command rxc;it will then exit as soon as the last ARexx program finishes execution. Unless you are very short on memory space,there is usually no reason to close ARexx,as it simply waits in the background for the next program to run. NAMING CONVENTIONS ARexx programs can be named anything,but adr?JBopting a simple naming convention will make managing the programs much easier. Programs to be run from the CLI are usually given the file extention .rexx to distinguish them from programs written in other languages. Programs written as "macros" or "scripts" for a particular applications program should be given a file extension specific to that program. For example,a macro written for a communications program called "MyComm" might be named "download.myc". ARexx uses this file extentior@QaCn when it searches for a program file to be executed. THE REXX: DIRECTORY You can designate one directory as the system-wide source for ARexx programs by defining a REXX: "device" with the assign command. This directory should reside on a volume that is usually mounted,such as SYS: or a hard disk. For example, the command "assign rexx: sys:rexx" defines the REXX: device as the :rexx directory on the system disk. Once defined,the REXX: device is searched after the current directoryrAV` when looking for an ARexx program. 6 2-2 PROGRAM EXAMPLES Before introducing the structure and syntax of the language,let's look at a few examples of ARexx programs. Readers familiar with other high-level programming languages should find many points of similarity between ARexx and other languages. In the examples that follow,new terms are highlighted in the text as they are introduced,and will be convered in depth in the next few chapters. These short programs can be createrB}Md using any text editor and then run from the Command Line Interface (CLI),or may simply be read as samples of the language. If the examples are to be run,first complete the installation procedures outlined in the previous section,and then start the ARexx resident process. Example programs can then be run by entering,for example,"rx age" at the CLI prompt. We'll begin with a "Hello,World" program that simply displays a message on the console screen. /* A simple program */ say 'HerCfllo,World' This program consists of a comment line that describes the program and an instruction that displays text on the console. For historical reasons, ARexx programs begin with a comment line;the initial "/*" says "I'm an ARexx program" to the interpreter when it searches for a program. Instructions are language statements that denote a certain action to be performed,and always start with a symbol,in this case the word say. Symbols are translated to uppercase when the program r.[hat you think would be of interest to a more general audience,please send it to the author for consideration. Programs should be of interest either in terms of their specific funtionality or as an example of programming technique. Each program submitted should include an author credit and a few lines of commentary on its intended fuction. 2 ARexx is a high-level language useful for prototyping,software integration,and general programming tasks. It is an implementation of the REr/Z-XX language described by M.F. Cowlishaw in The REXX Language:A Practical Approach to Programming(Prentice-Hall,1985),and follow the language definition closely. ARexx is particularly well suited as a command language. Command programs, sometimes called "scripts" or "macros",are widely used to extend the predefined commands of an operating system or to customize an applications program. As a programming language,ARexx can be useful to a wide cross section of users. For the novice pror0^!ugrammer,ARexx is an easy-to-learn yet powerful language that serves as a good introduction to programming techniques. Its source-level debugging facilities will help take some of the mystery out of how programs work(or don't work,as is more frequently the case.) For the more sophisticated user,ARexx provides the means to build fully integrated software packages,combining different applications programs into an environment tailored to their needs. A common command language among applr1Eications that support ARexx will bring uniformity to procedural interfaces, much as the Amiga's Intuition provides uniformity in the graphical interface. Finally,for the software developer,ARexx offers a straightforward way to build fully programmable applications programs. Developers can concentrate their efforts on making the basic operations of their programs fast and efficient,and let the end user add the frills and custom features. 1-1 LANGUAGE FEATURES Some of the important r2%features of the language are: TYPELESS DATA. Data are treated as typeless character strings. Variables do not have to be declared before being used,and all operations dynamically check the validity of the operands. COMMAND INTERFACE. ARexx programs can issue commands to external programs that provide a suitable command interface. Any software package that implements the command interface is then fully programmable using ARexx,and can be extended and customized by the end user. TRAr3.HCING AND DEBUGGING. ARexx includes source-level debugging facilities that allow the programmer to see the step-by-step actions of a program as it runs, thereby reducing the time required to develop and test programs. An internal interrupt system permits special handling of errors that would otherwise cause the program to terminate. 3 INTERPRETED EXECUTION. ARexx programs are run by an interpreter,so separate compilation and linking steps are not required. This makes it especialr4ly useful for prototyping and as a learning tool. FUNCTION LIBRARIES. External function libraries can be used to extend the capabilities of the language or as bridges to other programs. Libraries also allow ARexx programs to be used as "test drivers" for software development and testing. AUTOMATIC RESOURCE MANAGEMENT. Internal memory allocation related to the creation and destruction of strings and other data structures is handled automatically. 1-2 AREXX ON THE AMIGA ARexx was dr5}UDesigned to run on the Amiga,and makes use of many of the features of its multitasking operating system. ARexx programs run as separate tasks and may communicate with each other or with external programs. The interpreter follows the design guidelines expected of well-behaved programs in a multitasking environment: specifcally,it uses as little memory as possible and is careful to reutrn resources to the operating system when they are no longer needed. Memory requirements were minimizer6Fd by implementing the entire ARexx system as a shared library,so that only one copy of the program code must be loaded. 1-3 FURTHER INFORMATION The aforementioned book by M.F. Cowlishaw is highly recommended to those interested in further information about REXX. It presents an interesting discussion of the design and development of the language. 4 CHAPTER 2 GETTING ACQUAINTED This chapter explains how to install ARexx on your Amiga computer and shows some example programsr7bZ,. 2-1 INSTALLING AREXX ARexx requires an Amiga computer with at least 256k of memory,and will operate under V1.1 or V1.2 of the operating system. It uses the double-precision math library called "mathieeedoubbas.library" that is supplied with the Amiga WorkBench disk,so make sure that this file is present in your LIBS: directory. The distribution disk includes the language system,some example programs,and a set of the INCLUDE files required for integrating ARexx with other softwarer8 packages. The distribution files are listed in Appendix E. AREXX AND WORKBENCH ARexx can be installed and loaded from within the icon-based environment provided by the Amiga WorkBench. However,it is a primarily a text-oriented language system and requires a good text editor and file management environment to be most effective. Unless you purchased ARexx as part of an applications package that includes an integrated editor,you'll probably find it useful to become familiar with the r#wH....................129 10 STATEF()................................................130 11 WAITPKT()...............................................130 APPENDIX E. DISTRIBUTION FILES................................131 1 Directories................................................131 1 The :C Directory.........................................131 2 The :INCLUDE Directory...................................131 3 The :LIBS Directory......................................132 r$Ƽ 4 The :REXX Directory......................................132 5 The :TOOLS Directory.....................................132 6 Miscellaneous Files......................................132 2 Listings of Header Files...................................133 1 storage.h................................................133 2 rxslib.h.................................................139 3 rexxio.h.................................................142 4 errors.h...............r%V2..................................144 GLOSSARY......................................................147 INDEX.........................................................151 vi INTRODUCTION Welcome to ARexx,an implementation of the REXX language for the Amiga computer. ARexx is a powerful programming took,but one which by virtue of its clean syntax and sparse vocabulary is also easy to learn and easy to use. 1 ORGANIZATION OF THIS DOCUMENT This document will attempt to filr&85?l the roles of User's Manual,Language Reference,and Programmer's Guide. The chapters that follow have been organized to provide a gently introduction to the language. Chapter 1,What is ARexx?,gives an overview of the ARexx language and its implementation of the Amiga. Chapter 2,Getting Acquainted,tells how to install ARexx on your Amiga and presents several example programs to illustrate the features of the language. Chapter 3,Elements of the Language,introduces the language strucr'U2ture and syntax. Chapter 4,Instructions,describes the action statements of ARexx. Chapter 5,Commands,describes the program statements used to communicate with external programs. Chapter 6,Functions,explains how functions are called and documents the Built- In Function library. Chapter 7,Tracing and Interrupts,describes the source level debugging features useful for developing and testing programs. Chapter 8,Parsing and Templates,describes the instructions used to extract words or(?}r fields from strings. Chapter 9,The Resident Process,describes the capabilities of the global communications and resources manager. Chapter 10,Interfacing to ARexx,describes how to design and implement an interface between ARexx and an external program. Appendix A,Error Messages,lists the error messages issued by the interpreter. Appendix B,Limits and Compatibility,discusses the compatibility of ARexx with the language standard. Appendix C,The ARexx Systems Library,documents thr)?N~e functions of ARexx systems library. Appendix D,The Support Library,documents the library of Amiga specific functions. Appendix E,Distribution Files,lists the files on the distribution disk. Finally,a Glossary and an Index are provided. 1 USING THIS MANUAL If you are new to the REXX language,or perhaps to programming itself,you should review chapters 1 through 4 and then play with ARexx by running some of the sample programs given in chapter 2. Further examples are availabr*Yle in the :rexx directory of the distribution disk. If you are already familiar with REXX you may wish to skip directly to chapter 5,which begins to present some of the system-dependent features of this implementation. A summary of the compatibility of ARexx with the language definition is contained in Appendix B. TYPOGRAPHIC CONVENTIONS Describing a language is sometimes difficult because of the multiple and changing contexts involved. To help clarify the presentation here,a simpr+#rr_Arg1) /* "Query" offset */ #define LLVERS(rrp) (rrp->Arg2) /* library version */ /* The RexxClipNode structure is used to maintain the Clip List. The * The ReplyList holds packets that have been received but haven't been * replied. */ struct RexxMsgPort{ struct RexxRsrc rmp_Node; /* linkage node */ struct MsgPort rmp_Port; /* the message portrh2+ */ struct List rmp_ReplyList; /* messages awaiting reply */ }; /* DOS Device types */ #define DT_DEV 0 /* a device */ #define DT_DIR 1 /* an ASSIGNed directory */ #define DT_VOL 2 /* a volume */ /* Private DOS packet types */ #define ACTION_STACK 2002 /* stack a line */ #define ACTION_QUEUE 2003 /* queue a line */ #endif 143 errors. h This file contains the definitions for all of the error messages issued by the ARexx interpreter. /* rikW== errors.h================================================================ * * Copyright (c) 1987 by Williams S. Hawes (All Rights Reserved) * * =========================================================================== * Definitions for ARexx error codes */ #define EERC_MSG 0 /* error code offset */ #define ERR10_001 (ERRC_MSG+1) /* program not found */ #define ERR10_002 (ERRC_MSG+2) /* execution halted */ #define ERR10_003 (ERRC_MSG+3) /* no memory available */ #derTGjw flags */ #define RXFF_RESULT (1<< RSFB_RESULT) #define RXFF_STRING (1<< RXFB_STRING) #define RXFF_TOKEN (1<< RXFB_TOKEN ) #define RXFF_NONRET (1<< RXFB_NONRET) #define RXCODEMASK $FF000000 #define RXARGMASK $0000000F /* The RexxRsrc structure is used to manage global resources. * The name string for each node is created as a RexxArg structure, * and the total size of the node is saved in the "rr_Size" field. * Functions are provided to allocate and release resource nodes. rU夜* If special deletion operations are required,an offset and base can * be provided in "rr_Func" and "rr_Base",respectively. This function * will be called with the base in register A6 and the node in A0. */ struct RexxRsrc { struct Node rr_Node; WORD rr_Func; /* a "auto-delete" offset */ APTR rr_Base; /* "auto-delete" base */ LONG rr_Size; /* total size of node */ LONG rr_Arg1; /* available ... */ LONG rr_Arg2; /* available ... */ }; /* size: 32 bytes */ /* Resource nrV ode types */ #define RRT_ANY 0 /* any node type ... */ #define RRT_LIB 1 /* a function library */ #define RRT_PORT 2 /* a public port */ #define RRT_FILE 3 /* a file IoBuff */ #define RRT_HOST 4 /* a function host */ #define RRT_CLIP 5 /* a Clip List node */ 136 storage.h (cont.) /* The RexxTask structure holds the fields used by REXX to communicate with * external processes,including the client task. It includes the global * data structure(and the base environmrWPpent). The structure is passed to * the newly-created task in its "wake-up" message. */ #define GLOBALSZ 200 /* total size of GlobalData */ struct RexxTask { BYTE rt_Global[GLOBALSZ]; /* global data structure */ struct MsgPort rt_MsgPort; /* global message port */ UBYTE rt_Flags; /* task flag bits */ BYTE rt_SigBit; /* signal bit */ APTR rt_ClientID; /* the client's task ID APTR rt_MsgPkt; /* the packet being processed APTR rt_TaskID; /* our task ID APTR rt_RexxPort; rXRf /* the REXX public port APTR rt_ErrTrap; /* Error trap address APTR rt_StackPtr; /* stack pointer for traps struct List rt_Header1; /* Environment list */ struct List rt_Header2; /* Memory freelist */ struct List rt_Header3; /* Memory allocation list */ struct List rt_Header4; /* Files list */ struct List rt_Header5; /* Message Ports List */ }; /* Definitions for RexxTask flag bits #define RTFB_TRACE 0 /* external trace flag */ #define RTFB_HALT 1 /* external halt frY\lag */ #define RTFB_SUSP 2 /* suspend task? */ #define RTFB_TCUSE 3 /* trace console in use? */ #define RTFB_WAIT 6 /* waiting for reply? */ #define RTFB_CLOSE 7 /* task completed? */ /* Definitions for memory allocation constants */ #define MEMQUANT 16 /* quantum of memory space */ #define MEMMASK $FFFFFFF0 /* mask for rounding the size */ #define MEMQUICK (1 << 0 ) /* EXEC flags: MEMF_PUBLIC */ #define MEMCLEAR (1 << 16) /* EXEC flags: MEMF_CLEAR */ 137 rZazzstorage.h (cont.) /* The SrcNode is a temporary structure used to hold values destined for a * segment array. It is also used to maintain the memory freelist. */ struct SrcNode { struct SrcNode *sn_Succ; /* next node */ struct SrcNode *sn_Pred; APTR sn_Ptr; /* pointer value */ LONG sn_Size; /* size of object */ }; /* size: 16 bytes */ #endif 138 rxslip.h This file defines the library base for the ARexx Systems Library. /* === rexx/rxslib.h=======================r[Xn================================= * * Copyright (c) 1986,1987 by William S. Hawes (All Rights Reserved) * *=========================================================================== * The header file for the REXX Systems Library */ #ifndef REXX_RXSLIB_H #define REXX_RXSLIB_H #ifndef REXX_STORAGE_H #include "rexx/storage.h" #endif /* Some macro definitions */ #define RXSNAME "rexxsyslib.library" #define RXSID "rexxsyslib 1.0 (23 AUG 87)" #define RXSDIR "REXX" #define RXSTNAMEr\iR "ARexx" /* The REXX systems library structure. This should be considered */ /* semi-private and read-only,except for documented exceptions */ struct RxsLib { struct Library rl_Node; /* EXEC library node */ UBYTE rl_Flags; /* global flags */ UBYTE rl_pad; APTR rl_SysBase; /* EXEC library base */ APTR rl_DOSBase; /* DOS library base */ APTR rl_IeeeDPBase; /* IEEE DP match library base */ LONG rl_SegList; /* library seglist */ LONG rl_MaxAlloc; /* maximum expression allr]E6@ocation*/ LONG rl_Chunk; /* allocation quantum */ LONG rl_MaxNest; /* maximum expression nesting */ struct NexxStr *rl_NULL; /* static string: NULL */ struct NexxStr *rl_FALSE; /* static string: FALSE */ struct NexxStr *rl_TRUE; /* static string: TRUE */ struct NexxStr *rl_REXX; /* static string: REXX */ struct NexxStr *rl_COMMAND; /* static string: COMMAND struct NexxStr *rl_STDIN; /* static string: STDIN struct NexxStr *rl_STDOUT; /* static string: STDOUT struct NexxStr *rl_r^v:STDERR; /* static string: STDERR 139 rxslib.h (cont.) STRPTR rl_Version; /* version/configuration string */ STRPTR rl_TaskName; /* name string for tasks */ LONG rl_TaskPri; /* starting prioity */ LONG rl_TaskSeg; /* startup seglist */ LONG rl_StackSize; /* stack size */ STRPTR rl_RexxDir; /* REXX directory */ STRPTR rl_CTABLE; /* character attribute table */ struct NexxStr *rl_Notice; /* copyright notice */ struct MsgPort rl_RexxPort; /* REXX public port */ UWORrIh rxoffsets.o Miscellaneous Files .info Install-ARexx README Start-Aexx 132 E-2 LISTINGS OF HEADER FILES This section of the chapter consists of listings of the header files contained in the :include directory. storage.h This is the main header file and contains definitions for all of the important data structures used by ARexx. /*===rexx/storage.h================================================= * * Copyright (c) 1986,1987 by William S. Hawes (All Rights Reserved)rJPU * *================================================================== * Header file to define ARexx data structures. */ #ifndef REXX_STORAGE_H #define REXX_STORAGE_H #ifndef EXEC_TYPES_H #include "exec/types.h" #endif #ifndef EXEC_NODES_H #include "exec/nodes.h" #endif #ifndef EXEC_LISTS_H #include "exec/lists.h" #endif #ifndef EXEC_PORTS_H #include "exec/ports.h" #endif #ifndef EXEC_LIBRARIES_H #include "exec/libraries.h" #endif /* The NexxStr structue is used to maintain the inrKW]ternal strings in REXX. * It includes the buffer area for the string and associated attributes. * This is actually a variable-length structure;it is allocated for a * specific length string,and the length is never modified thereafter * (since it's used for recycling). */ 133 storage.h(cont.) struct NexxStr{ LONG ns_Ivalue; /* integer value */ UWORD ns_Length; /* length in bytes(excl null) */ UBYTE ns_Flags; /* attribute flags */ UBYTE ns_Hash; /* hash code */ BYTrLηE ns_Buff[8]; /* buffer area for strings */ }; /* size: 16 bytes (minimum) */ #define NXADDLEN 9 /* offset plus null byte */ #define IVALUE(nsPtr) (nsPtr->ns_Ivalue) /* String attribute flag bit definitions */ #define NSB_KEEP 0 /* permanent string? */ #define NSB_STRING 1 /* string form valid? */ #define NSB_NOTNUM 2 /* non-numeric? */ #define NSB_NUMBER 3 /* a valid number? */ #define NSB_BINARY 4 /* integer value saved? */ #define NSB_FLOAT 5 /* floating point formatrM? */ #define NSB_EXT 6 /* an external string? */ #define NSB_SOURCE 7 /* part of the program source? */ /* The flag form of the string attributes */ #define NSF_KEEP (1<< NSB_KEEP ) */ #define NSF_STRING (1<< NSB_STRING) #define NSF_NOTNUM (1<< NSB_NOTNUM) #define NSF_NUMBER (1<< NSB_NUMBER) #define NSF_BINARY (1<< NSB_BINARY) #define NSF_FLOAT (1<< NSB_FLOAT ) #define NSF_EXT (1<< NSB_EXT ) #define NSF_SOURCE (1<< NSB_SOURCE) * Combinations of flags #define NSF_INTNUM (NrNYSF_NUMBER | NSF_BINARY | NSF_STRING) #define NSF_DPNUM (NSF_NUMBER | NSF_FLOAT) #define NSF_ALPHA (NSF_NOTNUM | NSF_STRING) #define NSF_OWNED (NSF_SOURCE | NSF_EXT | NSF_KEEP #define KEEPSTR (NSF_STRING | NSF_SOURCE | NSF_NOTNUM) #define KEEPNUM (NSF_STRING | NSF_SOURCE | NSF_NUMBER | NSF_BINARY) 134 storage.h (cont.) /* The RexxArg structure is identical to the NexxStr structure,but * is allocated from system memory rather than from internal storage. * This structure is urO.x2sed for passing arguments to external programs. * It is usually passed as an "argstring",a pointer to the string buffer. */ struct RexxArg { LONG ra_Size; /* total allocated length */ UWORD ra_Length; /* length of string */ UBYTE ra_Flags; /* attribute flags */ UBYTE ra_Hash; /* hash code */ BYTE ra_Buff[8]; /* buffer area */ }; /* size: 16 bytes (minimum) */ /* The RexxMsg structure is used for all communications with Rexx programs. * It is an EXEC message with a rPpparameter block appended. */ struct RexxMsg{ struct Message rm_Node; /* EXEC message structure */ APTR rm_TaskBlock; /* pointer to global structure */ APTR rm_LibBase; /* library base */ LONG rm_Action; /* command (action) code */ LONG rm_Result1; /* primary result (return code) */ LONG rm_Result2; /* secondary result */ STRPTR rm_Args[16]; /* argument block(ARGO-ARG15) */ struct MsgPort *rm_PassPort; /* forwarding port */ STRPTR rm_CommAddr; /* host address (port namerQ#F) */ STRPTR rm_FileExt; /* file extension */ LONG rm_Stdin; /* input stream(filehandle) */ LONG rm_Stdout; /* output steam(filehandle) */ LONG rm_avail; /* future expension */ }; /* size: 128 bytes */ /* Field definitions #define ARGO(rmp) (rmp->rm_Args[0] /* start of argblock */ #define ARG1(rmp) (rmp->rm_Args[1] /* first argument */ #define ARG2(rmp) (rmp->rm_Args[2] /* second argument */ #define MAXRMARG 15 /* maximum arguments */ /* Command (action) codes for mesrR^psage packets */ #define RXCOMM $01000000 /* a command-level invocation */ #define RXFUNC $02000000 /* a function call */ #define RXCLOSE $03000000 /* close the port */ #define RXQUERY $04000000 /* query for information */ #define RXADDFH $07000000 /* add a function host */ 135 storage.h (cont.) #define RXADDLIB $08000000 /* add a function library */ #define RXREMLIB $09000000 /* remove a function library */ #define RXADDCON $0A000000 /* add/update a ClipList string */ #derSzKfine RXREMCON $0B000000 /* remove a ClipList string */ #define RXTCOPN $0C000000 /* open the trace console */ #define RXTCCLS $0D000000 /* close the trace console */ /* Command modifier flag bits */ #define RXFB_NOIO 16 /* suppress I/O inheritance? */ #define RXFB_RESULT 17 /* result string expected? */ #define RXFB_STRING 18 /* program is a "string file"? */ #define RXFB_TOKEN 19 /* tokenize the command line? */ #define RXFB_NONRET 20 /* a "no-return" message? */ /* Modifierr> Port Resource strcture or '0000 000'xif the port could not be opened or initialized. An initialization failure will occur if another port of the same name already exists,or if a signal bit couldn't be allocated. 128 The message port is allocated as a Port Resource node and is linked into the program's global data structure. Ports are automatically closed when the program exits,and any pending messages are returned to the sender. See Also:CLOSEPORT() Example: myport = openportr?+1("MyPort") REPLY() Usage:REPLY(packet,rc) Returns a message packet to the sender,with the primary result field set to the value given by the rc argument. The secondary result is cleared. The packet argument must be supplied as a 4-byte address,and the rc argument must be a whole number. Example: call reply packet,10 /* error return*/ SHOWDIR() Usage:SHOWDIR(directory,['All' | 'File' | 'Dir']) Returns the contents of the specified directory as a string of names separated by blanksr@W޶. The second parameter is an option keyword that selects whether all entries,only files,or only subdirectories will be included. Example: say showdir("df1:c") ==>rx ts te hi tco tcc SHOWLIST() Usage:SHOWLIST[{'D' | 'L' | 'P' | 'R' | 'W' },[name]) The first argument is an option keyword to select a system list;the options currently supported are Devices,Libraries,Ports,Ready,and Waiting. If only the first parameter is supplied,the function scans the selected list and returns the norA{de names in a string separated by blanks. If the name parameter is supplied,the boolean return indicates whether the specified list contains a node of that name. The name matching is case-sensitive. The list is scanned with task switching forbidden so as to provide an accurate snapshot of the list at that time. Example: say showlist('P') ==>REXX MyCon say showlist('P','REXX') ==>1 129 STATEF() Usage:STATEF(filename) Returns a string containing information about an external rB00050000 CLOSEPORT() Usage:CLOSEPORT(name) Closes the message port specified by the name argument,which must have been allocated by a call to OPENPORT()within the current ARexx program. Any messages received but not yet REPLYed are automaticallyr:4b+D returned with the return code set to 10. See Also:OPENPORT() Example: call closeport myport 127 FREEMEM() Usage:FREEMEM(address,length) Releases a block of memory of the given length to the system freelist. The address parameter is a four-byte string,typically obtained by a prior call to ALLOCMEM(). FREEMEM()cannot be used to release memory allocated using GETSPACE(),the ARexx internal memory allocator. The returned value is a boolean success flag. See Also:ALLOCMEM() Exampler;̤$: say freemem('00042000'x,32) ==>1 GETARG() Usage:GETARG(packet,[n]) Extracts a command,function name,or argument string from a message packet. The packet argument must be a 4-byte address obtained from a prior call to GETPKT(). The optional n argument specifies the slot containing the string to be extracted,and must be less than or equal to the actual argument count for the packet. Commands and functions names are always in slot 0;function packets may have argument strings in slotr<ds 1-15. Examples: command = getarg(packet) function= getarg(packet,0) /* name string */ arg1 = getarg(packet,1) /* 1st argumeent*/ GETPKT() Usage:GETPKT(name) Checks the message port specified by the name argument to see whether any messages are available. The named message port must have been opened by a prior call to OPENPORT() within the current ARexx program. The returned value is the 4-byte address of the first message packet,or '0000 0000'x if no packets were available. r=Oi The function returns immediately whether or not a packet is enqueued at the message port. Programs should never be designed to "busy-loop" on a message port. If there is no useful work to be done until the next message packet arrives,the program should call WAITPKT()and allow other tasks to proceed. See Also:WAITPKT() Example: packet = getpkt('MyPort') OPENPORT() Usage:OPENPORT(name) Creates a public message port with the given name. The returned value is the 4-byte address of ther(^Ree Also:StackF() ReadF()-read characters from a file buffer Usage:count=ReadF(IoBuff,buffer,length) D0 A0 A1 D0 (CCR) Reads one or more characters from the file specified by the IoBuff pointer. The buffer argument is a pointer to a storage area,and the length argument specifies the maximum number of characters to be read. The return value is the actual number of characters read,or -1 if an error occurred. ReadStr()-read a string from a file Usage:(cor)u$0unt,pointer)=ReadStr(IoBuff,buffer,length) D0 A1 A0 A1 D0 Reads characters from the file specified by the IoBuff pointer until a "newline" character is found. The "newline" is not included in the returned string. The return value is the actual number of characters read,or -1 if an error occurred. 122 See Also:ReadF() RemClipNode()-unlink and deallocate a list Clip node. Usage:RemClipNode(node) A0 Unlinks and releases the sr*pecified Clip node. The function is the "auto-delete" function for Clip nodes,and will be called automatically by RemRsrcNode() or RemRsrcList(). See Also:AddClipNode(),RemRsrcList(),RemRsrcNode() RemRsrcList()-unlink and deallocate a list of resource nodes Usage:RemRsrcList(list) A0 Scans the supplied list and releases any nodes found. The list must consist of resource nodes(RexxRsrc structures),which contain information to allow automatic cleanup and deletion. r+YSee Also:RemRsrcNode() RemRsrcNode()-unlink and deallocate a resource node Usage:RemRsrcNode(node) A0 Unlinks and releases the specified resource node,including the name string if one is present. If an "auto-delete" function has been specified in the node,it is called to perform any required resource deallocation before the node is released. See Also:RemRsrcList() SeekF()-seek to the specified position in a file. Usage:position=SeekF(IoBuff,offset,anchor) r,_kE D0 A0 D0 D1 Seeks to a new position in the file is specified by the IoBuff pointer. The position is given by the offset argument,a byte offset relative to the supplied anchor argument. The anchor may specify the beginning(-1),the current position (0),or the end of the file(1). The return value is the new position relative to the beginning of the file. StackF()-stack a line to a file buffer. Usage:count=StackF(IoBuff,buffer,length) D0 A0 Ar-or1 D0 Stacks a buffer of characters in the stream associated with the IoBuff structure. The buffer argument is a pointer to a string of characters,and the length specifies the number of characters to be stacked. The return value is the actual count of characters to be stacked. The return value is the actual count of characters or -1 if an error occurred. 123 Stacked lines are placed in "last-in,first-out" order and are immediately available to be read from the stream. Thr.e stream must be managed by a DOS handler that supports the ACTION_STACK packet. See Also:QueueF() StcToken()-break out the next token from a string Usage:(quote,length,scan,token)=StcToken(string) D0 D1 A0 A1 A0 Scans a null-terminated string to select the next token delimited by "white space,"and returns a pointer to the start of the token. The quote return will be an ASCII single or double quote if the token was quoted and 0 otherwise; white space r/I0)[characters are ignored within quoted strings. The length return is the total length of the token,including any quote characters. The scan return is advanced beyond the current token to prepare for the next call. StrcpyA()-copy a string,converting to ASCII Usage:hash=StrcpyA(destination,source,length) D0 A0 A1 D0 Copies the source string to the destination area,converting the characters to ASCII by clearing the high-order bit of each byte. The length or0af the string (which may include embedded nulls)is considered as a 2-byte usingned integer. So the string is limited in length to 65,535 bytes. The hash return is the internal hash byte for the copied string. See Also:StrcpyN(),StrcpyU StrcpyN()-copy a string Usage:hash=StrcpyN(destination,source,length) D0 A0 A1 D0 Copies the source string to the destination area. The length of the string (which may include embedded nulls)is considered as a 2-byte unsr1Smigned integer. The hash return is the internal hash byte for the copied string. See Also:StrcpyA(),StrcpyU StrcpyU()-copy a string,converting to uppercase Usage:hash=StrcpyU(destination,source,length) D0 A0 A1 D0 Copies the source string to the destination area,converting to uppercase alphabetics. The length of the string(which may include embedded nulls)is considered as a 2-byte unsigned integer. The has return is the internal hash byte for the copier2cd string. See Also:StrcpyA(),StrcpyN 124 StrflipN()-reverse the characters in a string Usage:StrflipN(string,length) A0 D0 Reverses the sequence of characters in a string. The conversion is performed in place. Strlen()-find the length of a null-terminated string Usage:length=Strlen(string) D0 A0 (CCR) Returns the number of characters in a null-terminated string. Register A0 is preserved,and the CCR is set for the returned lengthr&pace()-allocate memory using the internal allocator. Usage:block=GetSpace(envptr,length) D0 A0 D0 A0 (CCR) Allocates a block of memory using the internal allocator. The memory is obtained from an internal pool managed by the interpreter and is returned to the operating system when the ARexx program terminates. The envptr argument is a pointer to the base or current storage environment for the program. The internal allocator must be used to allocrDDate strings for use as values for symbols,and is convenient for obtaining small blocks of memory whose lifetime will not exceed that of the ARexx program. See Also:CurrentEnv(),FreeSpace() InitList()-initialize a list header Usage:InitList(list) A0 Initializes an EXEC list header structure. InitPort()-initialize a previously-allocated message port. Usage:(signal,port)=InitPort(port,name) D0 A1 A0 A1 Initializes a message port structure for*{r which memory space has been previously allocated,typically as part of a larger structure or as static storage in a program. It installs the task ID(of the task calling the function)into the MP_SIGTASK field and allocates a signal bit. The name parameter must be a pointer to a null-terminated string. The signal return is the signal bit that was allocated for the port. In the event that a signal could not be assigned,a value of -1 is returned. Note that the port is not linked into tr The system Ports List. If the port is to be made public,this can be done after the function returns. The port address is returned in the correct register(A1)for a subsequent call to the EXEC function AddPort(). See Also:FreePort() IsRexxMsg()-check whether a message came from ARexx. Usage:boolean=IsRexxMsg(msgptr) D0 A0 Tests whether the message packet specified by the msgptr argument came from an ARexx program. ARexx marks its messages with a pointer to a star! Ѭtic string "REXX" in the LN_NAME field. The returned value is either -1(True)if the message came from ARexx or 0(False)otherwise. 120 IsSymbol()-check whether a string is a valid symbol. Usage:(code,length)=IsSymbol(string) D0 D1 A0 Scans the supplied string pointer for ARexx symbol characters. The code return is the symbol type if a symbol was found,or 0 if the string did not start with a symbol character. The length return is the total length of the r"Hisymbol. ListNames()-build a string of names from a list. Usage:argstring=ListNames(list,separator) D0 A0 D0[0:7] A0 (CCR) Scans the specified list and copies the name strings into an argstring. The list argument must be a pointer to an initialized EXEC list header. The separator argument is the character,possibly a null,to be placed as a delimiter between the node names. The list is traversed inside a Forbid()exclusion and so may be used r#`/jwith shared or system lists. The returned argstring can be released using DeleteArgstring() after the names are no longer needed. See Also:DeleteArgstring() LockRexxBase()-lock a shared resource. Usage:LockRexxBase(resource) D0 Secures the specified resource in the ARexx Systems Library base for read access. The resource argument is a manifest constant for the required resource, or zero to lock the entire structure. Note that write access to shared resources r$eais normally mediated by the ARexx resident process,which operates at an elevated priority to gain exclusive access. Locking a resource should not be attempted from a process operating at a priority higher than the resident process. See Also:UnlockRexxBase() OpenF()-open a file buffer Usage:IoBuff=OpenF(list,filename,mode,logical) D0 A0 A1 D0 D1 A0 (CCR) Attempts to open an external file in the specified mode,which should be one of the conr%zstants RXIO_READ,RXIO_WRITE,or RXIO_APPEND defined in the ARexx INCLUDE files. 121 If successful,an IoBuff structure is allocated and linked into the specified list. The list argument must be a pointer to a properly-initialized EXEC list header. The optional logical argument is the logical name for the file,and must be either a pointer to a null-terminated string or zero(NULL)if a name is not required. See Also:CloseF() OpenPublicPort()-open a public message port Usage:node=r&^zSOpenPublicPort(list,name) D0 A0 A1 A0 (CCR) Allocates a message port as an "auto-delete" resource node and links it into the specified list. The list argument must point to a properly initialized EXEC list header. The message port is initialized with the given name and linked into the system Ports List. See Also:ClosePublicPort() QueueF()-queue a line to a file buffer. Usage:count-=QueueF(IoBuff,buffer,length) D0 A0 A1 r'pz D0 Queues a buffer of characters in the stream associated with the IoBuff structure. The stream must be managed by a DOS handler that supports the ACTION_QUEUE packet. Queued lines are placed in "first-in,first-out" order and are immediately available to be read from the stream. The buffer argument is a pointer to a string of characters,and the length specifies the number of characters to be queued. The return value is the actual count of characters or -1 if an error occurred. Sr^btained from the message packet sent to an external application. DeleteArgstring()-delete(release)an argstring structure Usage:DeleteArgstring(argstring) A0 Releases an argstring (RexxArg) structure. The RexxArg structure contains the total allocated length at a negative offset from the argstring pointer. See Also:CreateArgstring() DeleteDOSPkt()-release a DOS Standard Packet structure. Usage:DeleteDOSPkt(message) A0 Releases a DOS rݲ,StandardPacket structure,typically obtained by a prior call to CreateDOSPkt(). See Also:CreateDOSPkt() DeleteRexxMsg()-delete(release)an ARexx message packet. Usage:DeleteRexxMsg(packet) A0 Release an ARexx message packet to the system free-memory list. The internal MN-LENGTH field is used as the total size of the memory block to be released,so this function can be used to release any message packet that contains the total length in this field. Any embedded arr&agument strings must be released before calling DeleteRexxMsg(). See Also:CreateRexxMsg() 117 DOSREAD()-read from a DOS file Usage:count=DOSRead(filehandle,buffer,length) D0 A0 A1 D0 (CCR) Reads one or more characters from a DOS filehandle into the supplied buffer. The length argument specifies the maximum number of characters that will be read. The returned count is the actual number of bytes transferred,or -1 if an error occurred. DOSWrirU@ate()-write to a DOS file Usage:count=DOSWrite(filehandle,buffer,length) D0 A0 A1 D0 (CCR) Writes a buffer of the specified length to a DOS filehandle. The retuned count is the actual number of bytes written,or -1 if an error occurred. ErrorMsg()-find the message associated with an error code Usage:(boolean,ss)=ErrorMsg(code) D0 A0 D0 Returns the error message(as a pointer to a string structure)associated with the specifirșNr@ed ARexx error code. The boolean return will be -1 if the supplied code was a valid ARexx error code,and 0 otherwise. ExistF()-check whether an external file exists Usage:boolean=ExistF(filename) D0 A0 (CCR) Tests whether an external file currently exists by attempting to obtain a read lock on the file. The boolean return indicates whether the operation succeeded, and the lock is released. FillRexxMsg()-convert and install arguments in message packet. Urosage:boolean=FillRexxMsg(msgptr,count,mask) D0 A0 D0 D1 This function can be used to convert and install up to 16 argument strings in a RexxMsg structure. The message packet must be allocated and the argument fields of interest set to either a pointer to a null-terminated string or an integer value. The count argument specifies the number of fields,beginning with ARGO,to be converted into argstrings and installed into the argument slot. Bits 0-15 of thrd1+e mask argument specify whether the corresponding argument is a string pointer(bit clear)or an integer value(bit set). 118 The count argument is normally set to the exact number of strings to be passed. By setting this count to less than 16,a number of the slots can be reserved for private uses. The returned value is -1(True)if all of the arguments were successfully converted. In the event of an allocation failure,all of the partial results are released and a value of 0 is retrurned. See Also:ClearRexxMsg() FindDevice()-check whether a DOS device exists. Usage:device=FindDevice(devicename,type) D0 A0 D0 A0 (CCR) Scans the DOS DeviceList for a device node of the specified type matching the null-terminated name string. The acceptable values for the type argument are the constants DLT_DEVICE,DLT_DIRECTORY,or DLT_VOLUME define in the DOS INCLUDE files. Device names are conveted to uppercase before checking for a mr̋atch. The returned value is a pointer to the matched device node,or 0 if the device was not found. FindRsrcNode()-locate a resource node with the given name. Usage:node=FindRsrcNode(list,name,type) D0 A0 A1 D0 A0 (CCR) Searchs the specified list for the first node of the selected type with the given name. The list argument must be a pointer to a properly-initialized EXEC list header. The name argument is a pointer to a null-terminated string. Ifr͡ the type argument is 0,all nodes are selected;otherwise,the supplied type must match the LN_TYPE field of the node. The returned value is a pointer to the node or 0 if no matching node was found. FreePort()-release resources associated with a message port Usage:FreePort(port) A0 This function deallocates the signal bit associated with a message port and marks the port as "closed." The task calling FreePort()must be the same one that initialized the port,since signar[l bit allocations are specific to a task. The memory space associated with the port is not released. See Also:InitPort() FreeSpace()-releases space to the internal memory allocator. Usage:FreeSpace(envptr,block,length) A0 A1 D0 Returns a block of memory to the internal allocator,which must have been obtained from a call to GetSpace(). The envptr argument is a pointer to the base or current storage environment. See Also:CurrentEnv(),GetSpace() 119 GetSrt(node) A0 Unlinks and closes the message port and releases the resource node structure. The node must have been allocated by the OpenPublicPort()function. See Also:OpenPublicPort() CmpString()-compare string structures for equality Usage:test=CmpString(ss1,ss2) D0 A0 A1 (CCR) The arguments ss1 and ss2 must be pointers to ARexx string structures and are compared for equality. String structures include the length and hash code of the rͽstring,so the actual strings are not compared unless the lengths and hash codes match. The return value sets the CCR and will be -1(True)if the strings match and 0(False)otherwise. 114 CreateArgstring()-create an argument string structure Usage:argstring=CreateArgstring(string,length) D0 A0 D0 A0 (CCR) Allocates a RexxArg structure and copies the supplied string into it. The argstring return is a pointer to the string buffer of thr эe structure,and can be treated like an ordinary string pointer. The RexxArg structure stores the structure size and string length at negative offsets to the string pointer. The string pointer can be set to NULL if only an uninitialized structure is required. See Also:DeleteArgstring() CreateDOSPkt()-allocate and initialize a DOS standard Packet. Usage:packet = CreateDOSPkt() D0 A0 (CCR) Allocates a DOS StandardPacket structure and initializes it by interlinking r !hthe EXEC message and the DOS packet substructures. No replyport is installed in either the message or the packet,as these fields are generally filled in just before the message is sent. See Also:DeleteDOSPkt() CreateRexxMsg()-allocate an ARexx message packet Usage: msgptr=CreateRexxMsg(replyport,extension,host) D0 A0 A1 D0 A0 (CCR) This function allocates an ARexx message packet from the system free memory list. The message packet consists of r m/a standard EXEC message structure extended to include space for function arguments,returned results,and internal defaults. The replyport argument points to a public or private message port and must be supplied,as it is required to return the message packet to the sender. The extension and host arguments are pointers to null-terminated strings that provide values for the default file extension and the initial host address, respectively. Additional override fields in the extended packer XOt except for the primary and secondary result fields rm_Result1 and rm_Result2. See Also: DeleteRexxMsg() CVa2i()-convert from ASCII to integer Usage: (digits,value) = CVa2i(buffer) D0 D1 A0 Converts the buffer of ASCII characters to a signed long integer value. The scan proceeds until a non-digit character is found or until an overflow is detected. The function returns both the number of digits scanned and the converted value. 115 CVc2x()-convert(unr ՔEYJpack)from character string to hex or binary digits. Usage: error = CVc2x(outbuff,string,length,mode) D0 A0 A1 D0 D1 Converts the signed integer value argument to ASCII characters using the supplied buffer pointer. The digits argument specifies the maximum number of characters that will be copied to the buffer. The returned length is the actual number of characters copied. The pointer return is the new buffer pointer. See Also: CVi2az() CVi2arg()-convra0qert from integer to argstring Usage: argstring=CVi2arg(value,digits) D0 D0 D1 A0 (CCR) Converts the signed long integer value argument to ASCII characters,and installs them in an argstring(a RexxArg structure). The returned value is an argstring pointer or 0 if the allocation failed. The allocated structure can be released using DeleteArgstring(). CVi2az()-convert from integer to ASCII with leading zeroes Usage: (length,pointer)=CVi2az(buffer,value,drdGK igits) D0 A0 A0 D0 D1 Converts the signed long integer value argument to ASCII characters in the supplied buffer,with leading zeroes to fill out the requested number of digits. This function is identical to CVi2a except that leading zeroes are supplied. See Also:CVi2a() CVs2i()-convert from string structure to integer Usage: (error,value)=CVs2i(ss) D0 D1 A0 The ss argument must be a pointer to a string structure. It is convertertd to a signed long integer value return. The error return code is 47("Arithmetic conversion error")if the string is not a valid number. 116 CVx2c()-convert from hex or binary digits to(packed)string Usage:error=CVx2c(outbuff,string,length,mode) D0 A0 A1 D0 D1 Converts the string argument of hex(0-9,A-F)or binary(0,1)digits to the packed binary representation. The mode argument specifies the(hex or binary)conversion mode,and must be set to -1 for her)Bx strings or 0 for binary strings. Blank characters may be embedded in the string for readability,but only at byte boundaries. The error return code is 47 if the string is not a valid hex or binary string. CurrentEnv()-return the current storage environment Usage:envptr=CurrentEnv(rxtptr) D0 A0 Returns a pointer to the current storage environment associated with an executing ARexx program. The rxptr argument is a pointer to the RexxTask structure,and may be orڪEe file buffer ClosePublicPort Resource Close a port resource node CmpString String Compare string structures for equality CreateArgstring Resource Create an argstring structure CreateDOSPkt Input/Output Creata a DOS Standard Packet CreateRexxMsg Resource Create a message packet CurrentEnv Resource Get current storage environment CVa2i Conversion ASCII to integer CVc2x Conversion Character to Hex or Binary digits CVi2a Conversion Integer to ASCII CVi2arg Conversion IntegrRXVer to ASCII argstring CVi2az Conversion Integer to ASCII,leading zeroes CVs2i Conversion String structure to integer CVx2c Conversion Hex or binary digits to binary DeleteArgstring Resource Release an argstring structure DeleteDOSPkt Input/Output Release a DOS Standard Packet DeleteRexxMsg Resource Release a message packet DOSRead Input/Output Read from a DOS filehandle DOSWrite Input/Output Write to a DOS filehandle ErrorMsg Conversion Get error message from error code r܏ExistF Input/Output Check whether a DOS file exists FillRexxMsg Resource Convert and install argstrings FindDevice Input/Output Locate a DOS device node FindRsrcNode Resource Locate a resource node FreePort Resource Close a message port FreeSpace Resource Release internal memory GetSpace Resource Allocate internal memory InitList Resource Initialize a list header InitPort Resource Initialize a message port IsRexxMsg Resource Test a message packet LengthArgstring Resource r+zGet length of argstring ListNames Resource Copy node names to an argstring OpenF Input/Output Open a file buffer OpenPublicPort Resource Allocate and open a port resource node QueueF Input/Output Queue a line in a file buffer ReadF Input/Output Read from a file buffer ReadStr Input/Output Read a string from a file buffer RemClipNode Resource Release a Clip node RemRsrcList Resource Release a resource list RemRsrcNode Resource Release a resource node 112 TABLE C.rހIe1 LIBRARY FUNCTIONS (cont) NAME FUNCTIONAL GROUP DESCRIPTION SeekF Input/Output Reposition a file buffer StackF Input/Output Stack a line in a file buffer StcToken String Break out a token StrcmpN String Compare strings StrcpyA String Copy a string,converting to ASCII StrcpyN String Copy a string StrCpyU String Copy a string,converting to uppercase StrflipN String Reverse characters in a string Strlen String Find length of a string ToUpper Conversion ASCII r߃4 to uppercase WriteF Input/Output Write to a file buffer C-2 LIBRARY FUNCTIONS The following descriptions of the ARexx Systems Library functions are listed alphabetically. The required arguments and register assignments are shown in parentheses after the function name. Multiple returns are shown in parentheses on the left-hand side of the call. AddClipNode()-allocate and link a Clip node Usage:node=AddClipNode(list,name,length,value) D0 A0 A1 D0 D1 A0 (CCR) Ar{sVllocates and links a Clip node into the specified list. Clip nodes are resource nodes containing a name and value string,and include an "auto-delete" function for simple maintenance. The list argument must point to a properly- initialized EXEC list header. The name argument points to a null-terminated name string,the value argument is a pointer to a storage area,and the length argument is its length in bytes. The returned value is a pointer to the allocated node,or 0 if the allocatior[Fn failed. The RemClipNode()function is installed as the "auto-delete" function for each node. Clip nodes can be intermixed with other resource nodes in a list and then released with a single call to RemRsrcList(). See Also:RemClipNode(),RemRsrcList(),RemRsrcNode() AddRsrcNode()-allocate and link a resource node Usage:node=AddRsrcNode(list,name,length) D0 A0 A1 D0 A0 (CCR) Allocates and links a resource node(a RexxRsrc structure)to the specified list. The name argumerNnt is a pointer to a null-terminated string,a copy of which is installed in the node structure. The length argument is the total length for the node;this length is saved within the node so that it may be released later. 113 The returned value is a pointer to the allocated node,or 0 if the allocation failed. See Also:RemRsrcList(),RemRsrcNode() ClearMem()-clear a block of memory Usage:ClearMem(address,length) A0 D0 Clears a block of memory beginning at the given addresrOȟs for the specified length in bytes. The address must be word-aligned and the length must be a multiple of 4 bytes;all structures allocated by ARexx meet these restrictions. Register A0 is preserved. ClearRexxMsg()-release argument strings Usage:ClearRexxMsg(msgptr,count) A0 D0 Releases one or more argstrings from a message packet and clears the corresponding slots. The count argument specifies the number of argument slots to clear,and can be set to less than 16 to reservrΫEe some to the slots for private use. No action is taken if the slot already contains a zero value. See Also:FillRexxMsg() CloseF()-close a file buffer Usage:boolean=CloseF(IoBuff) D0 A0 Release the IoBuff structure and closes the associated DOS file. CloseF()is the "auto-delete" function for the IoBuff structure,so an entire list of file buffers can be closed with a single call to RemRsrcList(). ClosePublicPort()-close a port resource node Usage:ClosePublicPorrh K 1. ERROR: 47 SEVERITY: 10 MESSAGE: ARITHMETIC CONVERSION ERROR A non-numeric operand was used in a operation requiring numeric operands. This message will also be generated by an invalid hex or binary string. ERROR: 48 SEVERITY: 10 MESSAGE: INVALID OPERAND An operand was not valid for the intended operation. This message will be generated if an attempt is made to divide by 0,or if a fractional exponent is used in an exponentiation operation. 107 APPENDIX B LIMITS AND COMPr]ATIBILITY ARexx was designed to adhere closely to the REXX language standard. This appendix discusses those areas where ARexx departs from the standard. B-1 LIMITS Language definitions seldom include predefined limits to the program structures that can be created. Only a few such restrictions were imposed in implementing ARexx,and most of the internal structure are limited only by the total amount of memory available. The current implementation limits are listed below. LENGTH OF rͮbSTRINGS. Strings,symbol names,and value strings are limited to a maximum length of 65,535 bytes. LENGTH OF CLAUSES. Clauses are limited to a maximum of 800 characters after removing comments and multiple blanks. NODES IN COMPOUND NAMES. Compound symbol names may include a maximum of 50 nodes,including the stem. ARGUMENTS TO FUNCTIONS. Built-In and external functions are limited to a maximum of 15 arguments. There is no limit to the number of arguments that may be passed to an interUrnal function. SUBEXPRESSION NESTING. The maximum nesting level for subexpressions is 32. B-2 COMPATIBILITY ARexx departs in a few ways from the language definition. The differences can be classified as omissions or extensions,and are described below. OMISSIONS. The only significant specification of the language standard omitted from this implementation is the arbitrary-precision arithmetic facility. Arithmetic operations are limited to about 14 digits of precision,and the FUZZ or鵅bption is not implemented at all. Only the SCIENTIFIC format is used for exponential notation. The full numeric capabilities will be provided in a later release. EXTENSIONS. The following extensions to the language standard have been included in this implementation: BREAK INSTRUCTION. A new instruction called BREAK has been implemented. It is used to exit from the scope of any DO or INTERPRET instruction. ECHO INSTRUCTION. The ECHO instruction has been included as a synonym for SAYrȾ. SHELL INSTRUCTION. The SHELL instructiion has been included as a synonym for ADDRESS. 109 SIGNAL OPTIONS. Several additional SIGNAL keywords have been implemented. BREAK_C,BREAK_D,BREAK_E,and BREAK_F will detect and trap the control-C through control-F signals passed by AmigaDOS. The IOERR keyword traps errors detected by the I/O system. STEM SYMBOLS. A stem symbol is valid anywhere that a simple symbol could be employed. TEMPLATE PROCESSING. Templates have been generalizerd in several ways. Variable symbols may be used as positional tokens if preceded by an operator;the "=" operator is used to denote an absolute position. Multiple templates can be used with all source forms of the PARSE instruction. 110 APPENDIX C THE AREXX SYSTEMS LIBRARY The ARexx interpreter is supplied as a shared library named rexxsyslib.library and should reside in the system LIBS:directory. While many of the library routines are highly specific to the interpreter,somerƟ of the functions will be useful to applications that use ARexx. The library is opened when the ARexx resident process is first loaded and will always be available while it remains active. The system library routines were designed to be called from assembly-language programs and,unless otherwise noted,save all registers except for A0/A1 and D0/D1. Many routines return values in more than one register to help reduce code size. In addition,the routines will set the condition-code regirpster(CCR) wherever appropriate. In mode cases the CCR reflects the value returned in D0. The library offsets are defined in the file rxslib.i,which should be INDLUDEd in the program source code. Calls may be made from "C" programs if suitable binding routines are provided when the program is linked. The definitions for the constants and data structures used in ARexx are provided as INCLUDE files on the program distribution disk. These should be reviewed carefully before attempting trXo use the library functions. C-1 FUNCTION GROUPS The library functions can be frouped into Conversion,Input/Output,Resource Management,and String Manipulation functions. DATA CONVERSION. These functions provide many of the common data-conversion requirements. INPUT/0UTPUT. Two levels of I/O support are provided. The low level functions use DOS filehandles directly,while the higher-level functions use linked lists of IoBuff structures and support logical file names. RESOURCE. ThesrLqe functions allocate,release,or otherwise manage the data structures used with ARexx. STRING FUNCTIONS. All data in ARexx are managed as strings. These functions provide some of the more common string-manipulation operations. 111 TABLE C.1 AREXX SYSTEMS LIBRARY FUNCTIONS NAME FUNCTIONAL GROUP DESCRIPTION AddClipNode Resource Allocate a Clip node ClearMem Resource Clear a block of memory ClearRexxMsg Resource Release argstrings from message CloseF Input/Output Close armH@alid only following the THEN branch of an IF range. ERROR: 22 SEVERITY: 10 MESSAGE: UNEXPECTED BREAK,LEAVE,or ITERATE The BREAK instruction is valid only within a DO range or inside an INTERPRETed string. The LEAVE and ITERATE instuctions are valid only within an iterative DO range. ERROR: 23 SEVERITY: 10 MESSAGE: INVALID STATEMENT IN SELECT A invalid statement was encountered within a SELECT range. Only WHEN,THEN,and OTHERWISE statements are valid within a SELECT range,except for r the conditional statements following THEN or OTHERWISE clauses. ERROR: 24 SEVERITY: 10 MESSAGE: MISSING OR MULTIPLE THEN An expected THEN clause was not found,or another THEN was found after one had already been executed. ERROR: 25 SEVERITY: 10 MESSAGE: MISSING OTHERWISE None of the WHEN clauses in a SELECT succeeded,but no OTHERWISE clause was supplied. ERROR: 26 SEVERITY: 10 MESSAGE: MISSING OR UNEXPECTED END The program source ended before an END was found for a DO or SELECT inr5Hstruction or an END was encountered outside of a DO or SELECT range. 105 ERROR: 27 SEVERITY: 10 MESSAGE: SYMBOL MISMATCH The symbol specified on an END,ITERATE,or LEAVE instruction did not match the index variable for the associated DO range. Check that the active loops have been nested properly. ERROR: 28 SEVERITY: 10 MESSAGE: INVALID DO SYNTAX An invalid DO instruction was executed. An initializer expression must be given if a TO or BY expression is specified,and a FOR exprer9ssion must yield a non- negative integer result. ERROR: 29 SEVERITY: 10 MESSAGE: INCOMPLETE IF OR SELECT An IF or SELECT range ended before all of the required statement were found. Check whether the conditional statement following a THEN,ELSE,or OTHERWISE clause was omitted. ERROR: 30 SEVERITY: 10 MESSAGE: LABEL NOT FOUND A label specified by a SIGNAL instruction,or implicitly referenced by an enabled interrupt,could not be found in the program source. Labels defined dynamically bruMy an INTERPRET instruction or by interactive input are not included in the search. ERROR: 31 SEVERITY: 10 MESSAGE: SYMBOL EXPECTED A non-symbol token was found where only a symbol token is valid. The DROP,END, LEAVE,ITERATE,and UPPER instructions may only be followed by a symbol token,and will generate this error if anything else is supplied. This message will also be issued if a required symbol is missing. ERROR: 32 SEVERITY: 10 MESSAGE: SYMBOL OR STRING EXPECTED An invalid token rwas found in a context where only a symbol or string is valid. ERROR: 33 SEVERITY: 10 MESSAGE: INVALID KEYWORD A symbol token in an instruction clause was identified as a keyword,but was invalid in the specific context. ERROR: 34 SEVERITY: 10 MESSAGE: REQUIRED KEYWORD MISSING An instuction clause required a specific keyword token to be present,but it was not supplied. For example,this messge will be issued if a SIGNAL ON instruction is not followed by one of the interrupt keywords(rB.,e.g.SYNTAX.) ERROR: 35 SEVERITY: 10 MESSAGE: EXTRANEOUS CHARACTERS A seemingly valid statement was executed,but extra characters were found at the end of the clause. ERROR: 36 SEVERITY: 10 MESSAGE: KEYWORD CONFLICT Two mutually exclusive keywords were included in an instruction clause,or a keyword was included twice in the same instruction. ERROR: 37 SEVERITY: 10 MESSAGE INVALID TEMPLATE The template provided with an ARG,PARSE,or PULL instruction was not properly constructed. ReferGjcr to Chapter 8 for a description of template structure and processing. 106 ERROR: 38 SEVERITY: 10 MESSAGE: INVALID TRACE REQUEST The alphabetic keyword supplied with a TRACE instruction or as the argument to the TRACE()Built-In function was not valid. Refer to Chapter 7 for the valid TRACE options. ERROR: 39 SEVERITY: 10 MESSAGE: UNINITIALIZED VARIABLE An attempt was made to use an uninitialized variable while the NOVALUE interrupt was enabled. ERROR: 40 SEVERITY: 10 MESSAGE:rҳeu INVALID VARIABLE NAME An attempt was made to assign a value to a fixed symbol. ERROR: 41 SEVERITY: 10 MESSAGE: INVALID EXPRESSION An error was detected during the evaluation an expression. Check that each operator has the correct number of operands,and that no extraneous tokens appear in the expression. This error will be detected only in expressions that are actually evaluated. No checking is performed on expressions in clauses that are being skipped. ERROR: 42 SEVERITY: 10 MESSAr7GE: UNBALANCED PARENTHESE An expression was found with an unequal number of opening and closing parentheses. ERROR: 43 SEVERITY: 43 MESSAGE: NESTING LIMIT EXCEEDED The number of subexpressions in an expression was greater than the maximum allowed. The expression should be simplified by breaking it into two or more intermediate expressions. ERROR: 44 SEVERITY: 10 MESSAGE: INVALID EXPRESSION RESULT The result of an expression was not valid within its context. For example,this messge rwwill be issued if an increment or limit expression in a DO instruction yields a non-numeric result. ERROR: 45 SEVERITY: 10 MESSAGE: EXPRESSION REQUIRED An expression was omitted in a context where one is required. For example,the SIGNAL instruction,if not followed by the keywords ON or OFF,must be followed by an expression. ERROR: 46 SEVERITY: 10 MESSAGE: BOOLEAN VALUE NOT 0 OR 1 An expression result was expected to yield a boolean result,but evaluated to something other than 0 orrzram as the primary result code. The error code itself is returned as the secondary result. The subsequent propagation or reporting of these codes is of course dependent on the external(calling)program. The following pages list all of the currently-defined error codes,along with the associated severity level and message string. ERROR: 1 SEVERITY: 5 MESSGE: PROGRAM NOT FOUND The named program could not be found,or was not an ARexx program. ARexx programs are expected to start with a rߜe"/*" sequence. This error is detected by the external interface and cannot be trapped by the SYNTAX interrupt. ERROR: 2 SEVERITY: 10 MESSAGE: EXECUTION HALTED A control-C break or an external half request was received and the program terminated. This error will be trapped if the HALT interrupt has been enabled. ERROR: 3 SEVERITY: 20 MESSAGE: INSUFFICIENT MEMORY The interpreter was unable to allocate enough memory for an operation. Since memory space is required for all parsing and rXexecution operations,this error cannot usually be trapped by the SYNTAX interrupt. ERROR: 4 SEVERITY: 10 MESSAGE: INVALID CHARACTER A non-ASCII character was found in the program. Control codes and other non- ASCII characters may be used in a program by defining them as hex or binary strings. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 5 SEVERITY: 10 MESSAGE: UNMATCHED QUOTE A closing single or double quote was missing. Check that each string isrѭ3 properly delimited. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. 103 ERROR: 6 SEVERITY: 10 MESSAGE: UNTERMINATED COMMENT The closing "*/" for a comment field was not found. Remember that comments may be nested,so each "/*" must be matched by a "*/." This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 7 SEVERITY: 10 MESSAGE: CLAUSE TOO LONG A clause was too long for the internal buffer used as temporary storage. The sour>mߑrce line in question should be broken into smaller parts. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 8 SEVERITY: 10 MESSAGE: INVALID TOKEN An unrecognized lexical token was found,or a clause could not be properly classified. This is a scan phase error and cannot be trapped by the SYNTAX interrupt. ERROR: 9 SEVERITY: 10 MESSAGE: SYMBOL OR STRING TOO LONG An attempt was made to create a string longer than the maximum supported by the interpreter.r The implementation limits for internal structure are given in Appendix B. ERROR: 10 SEVERITY: 10 MESSAGE: INVALID MESSAGE PACKET An invalid action code was found in a message packet sent to the ARexx resident process. The packet was returned without being processed. This error is detected by the external interface and cannot be trapped by the SYNTAX interrupt. ERROR: 11 SEVERITY: 10 MESSAGE: COMMAND STRING ERROR A command string could not be processed. This error is detected by thrnPe external interface and cannot be trapped by the SYNTAX interrupt. ERROR: 12 SEVERITY: 10 MESSAGE: ERROR RETURN FROM FUNCTION An external function returned a non-zero error code. Check that the correct parameters were supplied to the function. ERROR: 13 SEVERITY: 10 MESSAGE: HOST ENVIRONMENT NOT FOUND The message port corresponding to a host address string could not be found. Check that the required external host is active. ERROR: 14 SEVERITY: 10 MESSAGE: REQUESTED LIBRARY NOT FOr&_UND An attempt was made to open a function library included in the Library List,but the library could not be opened. Check that the correct name and version of the library were specified when the library was added to the resource list. ERROR: 15 SEVERITY: 10 MESSGE: FUNCTION NOT FOUND A function was called that could not be found in any of the currently accessible libraries,and could not be located as an external program. Check that the appropriate function libraries have been addedr\} to the Libraries List. 104 ERROR: 16 SEVERITY: 10 MESSAGE: FUNCTION DID NOT RETURN VALUE A function was called which failed to return a result string,but did not otherwise report an error. Check that the function was programmed correctly,or invoke it using the CALL instruction. ERROR: 17 SEVERITY: 10 MESSAGE: WRONG NUMBER OF ARGUMENTS A call was made to a function which expected more(or fewer)arguments. This error will be generated if a Built-In or external function is calledrū/ with more arguments than can be accomodated in the message packet used for external communications. ERROR: 18 SEVERITY: 10 MESSAGE: INVALID ARGUMENT TO FUNCTION An inappropriate argument was supplied to a function,or a required argument was missing. Check the parameter requirements specified for the function. ERROR: 19 SEVERITY: 10 MESSAGE: INVALID PROCEDURE A PROCEDURE instruction was issued in an invalid context. Either no internal functions were active,or a PROCEDURE had alreadrNy been issued in the current storage environment. ERROR: 20 SEVERITY: 10 MESSAGE: UNEXPECTED THEN OR WHEN A WHEN or THEN instruction was executed outside of a valid context. The WHEN instruction is valid only within a SELECT range,and THEN must be the next instruciton following an IF or WHEN. ERROR: 21 SEVERITY: 10 MESSAGE: UNEXPECTED ELSE OR OTHERWISE An ELSE or OTHERWISE was found outside of a valid context. The OTHERWISE instruction is valid only within a SELECT range. ELSE is vrZHbe in A6. The structure of the message packet is the same as that in Table 10.2,but note that although a message packet is used to carry the arguments,it is not queued at a message port and does not need to be unlinked. The name of the function to be called is carried in the ARGO parameter slot. The query function must search for this function name and,if the name cannot be found,must return an error code of 1("Program not found")in register D0. The library will then be closed and ther+`8A search continued in the next function library. The query function should not modify any fields within the message packet,as it must be passed along to the next library until the function is located. PARAMETER CONVERSION Once the requested function has been found,the query funcion may need to transform the parameters passed by ARexx into the form expected by the function. Whether the parameter strings need to be converted depends on how they are to be used. In some cases it may be r:sufficient just to foward a pointer to the message packet to the called function,while in other cases the query function may need to load parameters into registers or to perform conversion operations. The parameters in ARG1-ARG15 are always passed as argstrings,and may be treated like a pointer to a null-terminated string. Further attributes are stored at negative offsets from the argstring pointer, and may be helpful in working with the string. Numeric quantities are passed as strir 7bngs of ASCII characters and will need to be converted to integer or floating-point format if arithmetic calculations are to be performed. The ARexx System Library includes a limited set of functions to do parameter conversions. The actual parameter count can be obtained from the low-order byte of the rm_Action field in the message packet. The count never includes the function name itself(in ARGO),but does include arguments specified as "defaults." Such arguments will have a zero valr *ue in the corresponding parameter slot. Note that the parameter block of the message packet,containing the fields ARG0-ARG15,is structured like the argument array expected by the main(argc, argv)function of a "C" program. This suggests a simple way that a function library could provide a bridge to a series of "C" programs. The query function would need only to determine the address of the called function,and then push the parameter block address and argument count onto the program sr Ctack. RETURNED VALUES Each library function must return an error code and a value string. The error code is returned in register D0,and should be 0 if no errors occurred. The value string must be returned as an argstring pointer in register A1,unless D0 indicates that an error occurred during the call. The mechanisms for creating the proper return values can be made part of the query function,so that all functions in the library share a common return path. 101 10-6 DIRECT MANr H%IPULATION OF DATA STRUCTURES All of the data structures maintained by the resident process are built into the ARexx Systems Library base and are therefore accessible to external programs. The Task List in the RexxBase structure links the global data structures for all currently active ARexx programs. This linkage uses the node contained in the message port of the RexxTask structure,rather than at the head of the structure. The RexxTask structure is the global data structure and initr oial storage environment for the ARexx program,and all descendant storage environments are linked into the Environment List. The linkage of internal data structures is such that the complete internal state of all ARexx programs can be reached starting from the library base pointer. Two library functions,LockRexxBase() and UnlockRexxBase(),are provided to mediate access to the global structures. The structure base should be locked before reading any of the data items or traversing anyr[v of the lists. The present version of these functions provides only a global lock,but future extensions will allow individual resources to be locked. In general it should not be necessary to manipulate directly any of these data structures. Functions have been provided in the ARexx Systems Library to perform all of the operations required to interface external program to the ARexx system. It is therefore recommended that applictions developers avoid using any of the internal structur !res except as provided through the library functions. 102 APPENDIX A ERROR MESSAGES When the ARexx interpeter detects an error in a program,it returns an error code to indicate the nature of the problem. Errors are normally handled by displaying the error code,the source line number where the error occurred,and a brief message explaining the error condition. Unless the SYNTAX interrupt has been previously enabled(using the SIGNAL instruction),the program then terminates andrky control returns to the caller. Most syntax and execution errors can be trapped by the SYNTAX interrupt,allowing the user to retain control and perform whatever special error processing is required. Certain errors are generated outside of the context of an ARexx program,and therefore cannot be trapped by this mechanism. Refer to chapter 7 for further information on error trapping and processing. Associated with each error code is a severity level that is reported to the calling progrGIB Once the console is open,all active ARexx programs will divert their tracing output to the console. Tracing input(for interactive debugging)will also be diverted to the new console. Only one console can be opened;subsequent RXTCOPN requests will be returned with a warning error message. MODIFIER FLAGS Command codes may include modifier flags to select various processing options. Modifier flags are specific to certain commands,and are ignored otherwise. RXFB_NOIO. This modifier isrS used with the RXCOMM and RXFUNC command codes to suppress the automatic inheritance of the host's input and output streams. RXFB_NONRET. Specifies that the message packet is to be recycled by the resident process rather than being returned to the sender. This implies that the sender doesn't care about whether the requested action succeeded,since the returned packet provides the only means of acknowledgement. Messge packets are released using the library function DeleteRexxMsg(). RrJ%XFB_RESULT. This modifer is valid with the RXCOMM and RXFUNC commands,and requests that the called program return a result string. If the program EXITs(or RETURNs)with an expression,the expression result is returned to the caller as an argstring. It is then the caller's responsibility to release the argstring when it is no longer needed;this can be done using the library function DeleteArgstring(). RXFB_STRING. This modifer is valid with the RXCOMM and RXFUNC command codes. It indicraates that the command or function argument(in slot ARGO)is a "string file" rahter than a file name. RXFB_TOKEN. This flag is used with the RXCOMM code to request that the command string be completely tokenized before being passed to the invoked program. Programs invoked as commands normally have only a single argument string. The tokenization process uses "white space" to separate the tokens,except within quoted strings. Quoted strings can use either single or double quotes,and the rhend of the command string(a null character)is considered as an implicit closing quote. 99 RESULT FIELDS The resident process uses the standard command-level conventions for the primary return code installed in rm_Result1. Minor or warning errors are indicated by a value of 5,and more serious errors are returned as values of 10 or 20. The secondary result field rm-Result2 will either be zero or an ARexx error code if applicable. Note that RXCOMM and RXFUNC messages are returnert4^d directly by the invoked macro program,rathe than by the residen process. 10-5 EXTERNAL FUNCTION LIBRARIES ARexx supports external function libraries as a mechanism for user-defined extensions to the language. Function libraries may be written and maintained by users or applications developers. DESIGN CONSIDERATIONS There are several different purposes for which a function library might be designed. In the simplest case,a library could be used to extend the string manipulation oror mathematical capabilities of the language by defining new functions. Such a library could be entirely self-contained or might call other system libraries to perform specific operations. Another alternative would be to build a library that interacts closely with an external applications program. This could allow specific operations in the host application to be performed as function calls rather than as commands. There are several advantages to this approach,as it avoids the need tr5io parse command strings and does not require the multiple task context changes associated with message-passing. The library might include entry points for specific operaions as well as functions to support processing required by the applications program. Function libraries can also serve as bridges to other system or applications libraries. For example,if a program needed to call the functions in a graphics library,a bridge library could be built to match the function names in the prrogram with the appropriate entry point in the graphics library. A related possibility would be to use ARexx as a test driver for a program under development. Once the query table and parameter passing mechanisms for the function library have been built,new routines under development could be tested by just adding a table entry. Since building test programs is ofter very time- consuming,the flexibility and interactive debugging capabilities of ARexx make it an attractive alternative rjNdto compiled languages like "C." Regardless of the intended application,all function libraries share a common structure. The initial design follows that of the standard EXEC shared library, with the three required entry points Open,Close,and Expunge,plus a reserved slot. The library must also have a "query" entry point,which serves to match the name supplied by ARexx with the intended function. Typically,this will consist of a table of function names and a routine to search for the srQ`!pecified one. REENTRANCY. Functions libraries should be designed to be fully reentrant,since any number of ARexx programs may be running at any time. If this is not feasible due to other design constraints,the query function should include a lockout mechanism to prevent multiple calls to the library routines. 100 CALLING CONVENTION The library's query function will be called from the interpreter's context with the address of a message packet in register A0 and the library basru9%DPROCESS All communications with the resident process are handled by passing message packets,which were previously diagrammed in Table 10.2. The packet has a command field that describes the action to be performed and parameter fields that are specific to the command. Message packets are processed as they are received,and are then either returned to the sender or passed along to another process(in the case of a program invocation.) The packet includes two result fields that are used rto return error codes or result strings. The parameter fields of the message packet may contain either(long)integer values or pointers to argument strings. String arguments are assumed to be argstring pointers unless otherwise specified. COMMAND(ACTION)CODES The command codes that are currently implemented in the resident process are described below. Commands are listed by their mnemonic codes,followed by the valid modifier flags. The final code value is always the logical OR of thr ǣe code value and all of the modifier flags selected. The command code is installed in the rm_Action field of the message packet. USAGE: RXADDCON [RXFB_NONRET] This code specifies an entry to be added to the Clip List. Parameter slot ARGO points to the name string,slot ARG1 points to the value string,and slot ARG2 contains the length of the value string. 97 The name and value arguments do not need to be argstrings,but can be just pointers to storage areas. The name should be a rsnull-terminated string,but the value can contain arbitrary data including nulls. USAGE: RXADDFH [RSFB_NONRET] This action code specifies a function host to be added to the Library List. Parameter slot ARGO points to the(null-terminated)host name string,and slot ARG1 holds the search priority for the node. The search priority should be an integer between 100 and -100 inclusive;the remaining priority ranges are reserved for future extensions. If a none already exists with the same namr l^e,the packet is returned with a warning level error code. Note that no test is made at this time as to whether the host port exists. USAGE:RXADDLIB [RXFB_NONRET] This code specifies an entry to be added to the Library List. Parameter slot ARGO points to a null-terminated name string referring either to a function library or a function host. Slot ARG1 is the priority for the node and should be an integer between 100 and -100 inclusive;the remaining priority ranges are reserved for fur!|ture extensions. Slot ARG2 contains the entry oint offset and slot ARG3 is the library version number. If a node already exists with the same name,the packet is returned with a warning level error code. Otherwise,a new entry is added and the library or host becomes available to ARexx programs. Note that no test is made at this time as to whether the library exists and can be opened. USAGE:RXCOMM [RXFB_TOKEN] [RXFB_STRING] [RXFB_RESULT] [RXFB_NOIO] Specifies a command-mode invocationr"g of an ARexx program. Parameter slot ARGO must contain an argstring ointer to the command string. The RXFB_TOKEN flag specifies that the command line is to be tokenized before being passed to the invoked program. The RXFB_STRING flag bit indicates that the command string is a "string file." Command invocations do not normally return result strings,but the RXFB_RESULT flag can be set if the caller is prepared to handle the cleanup associated with a returned string. The RXFB_NOIO modifr#Oier suppresses the inheritance of the host's input and output streams. USAGE:RXFUNC [RXFB_RESULT] [RXFB_STRING] [RXFB_NOIO] argcount This command code specifies a function invoction. Parameter slot ARGO contains a pointer to the function name string,and slots ARG1 through ARG15 point to the argument strings,all of which must be passed as argstrings. The lower byte of the command code is the argument count;this count excludes the function name string itself. Function calls normally sr$ et the RXFB_RESULT flag,but this is not mandatory. The RXFB_STRING modifier indicates that the function name string is actually a "string file". The RXFB_NOIO modifier suppresses the inheritance of the host's input and output streams. USAGE:RXREMCON [RXFB_NONRET] This code requests that an entry be removed from the Clip List. Parameter slot ARGO points to the null-terminated name to be removed. The Clip List is searched for a node matching the supplied name,and if a match is found tr%!4Hhe list node is removed and recycled. If no match is found the packet is returned with a warning error code. USAGE:RXREMLIB [RXFB_NONRET] This command removes a Library List entry. Parameter slot ARGO points to the null terminated string specifying the library to be removed. The Library List is searched for a node matching the library name,and if a match is found the 98 node is removed and released. If no match is found the packet is returned with a warning error code. The libr'ary node will not be removed if the library is currently being used by an ARexx program. USAGE:RXTCCLS [RXFB_NONRET] This code requests that the global tracing console be closed. The console window will be closed immediately unless one or more ARexx programs are waiting for input from the console. In this event,the window will be closed as soon as the active programs are no longer using it. USAGE:RXTCOPN [RXFB_NONRET] This command requests that the global tracing console be opened.r'yth begins with the current directory and proceeds to the system REXX: directory. To further the above example,invoking the program as "rx test 1 2 3" would search for the files test.rexx,test,REXX:test.rexx,and REXX:test,in that order. If an ARexx program cannot be found,one alternative action may be taken. If the rm_PassPort field of an extended packet was supplied,the message packet is passed along to that port,which might be the next process in a search chain. Otherwise the messar(z}'ge is returned with a "Program not found"error indication (error code 1.) 95 EXTENSION FIELDS The RexxMsg structure includes several "extension fields" that can be used to override various defaults when a program is invoked. These extension fields can be filled in selectively,and only the non-zero values will override the corresponding default. ARexx never modifies the extension area. Host applications should supply values for the file extension and host address fields of ther)[k message packet. The file extension affects which program files will match a given command name,and allows macro programs specific to the host to be given distinctive names. The host address must refer to a public message port,and will usually indicate the host's own port. Any appropriate(but usually short)strings can be chosen for these values. Oftern,the name of the applications program itself can be used as its host address and file extension. PASSPORT. The rm_PassPort field allor*Mows the search for a program to be "passed along" to another messsage port after checking for an ARexx program. If the command or function name doesn't resolve to an ARexx program,the message packet is forwarded to the message port specified as the PassPort. This allows applications to maintain control over the search order for external program files. Note that the rm_PassPort field must be the actual address of a message port, rather than a name string. The PassPort therefore does nr+o%׀ot have a public port, but the port should be a secured resource,since the message is sent directly to this address without checking to see whether it is a valid message port. HOST ADDRESS. The rm_ComAddr field overrides the default initial host address, which is "REXX." The host address is the name of the messsage port to which commands will be directed,and is supplied as a pointer to a null-terminated string. Applications that support multiple instances of user data will usually cr,yreate a separate message port for each instance. The name of this port would then be supplied as the host address for any commands issued from that instance. FILE EXTENSION. The rm_FileExt field is used to override the default file extension for ARexx programs,which is "REXX". Host applications can use the file extension to distinguish the names of the macro programs specific to that application. It is supplied as a pointer to a null-terminated string. INPUT AND OUTPUT STREAMS. Ther-~ default input and output steams for an ARexx program are inherited from the host application's process structure,if the host is a process rather than just a task. One or both of these streams may be overridden by supplying an appropriate value in the rm-Stdin or rm_stdout fields. The values supplied must be valid DOS filehandles,and must not be closed while the program is executing. The steams are installed directly into the program's process structure,replacing the prior values. Tr.mRahe output stream is also used as the default tracing stream for the program. If interactive tracing is to be used in a program,the output stream should refer to a console device,since it will be used for input as well. 96 In the event than an ARexx program is invoked by an EXEC task,rather than by an DOS process,the extension field streams are the only way that the launched program can be given default I/O streams. INTERPRETING THE RESULT FIELDS The message packet that invoker/Kod an ARexx program is returned to the client when the program finishes. The two result fields will contain error codes or possibly a result string. The interpretation of the result fields depends partly on the mode of invocation. If the primary result field rm_Result1 is zero,the program executed normally and the secondary field rm_Result2 will contain a pointer to a result string,assuming that one was requested(and available.) If the primary result is non-zero,it represents either r0h=an error severity level or else the return code from a command invocation. The two cases can be distinguished by examining the secondary result. If the secondary field is also non-zero,an error occurred and the secondary field is an ARexx error code. If the secondary result is zero,then the primary result is the return code passed by an "EXIT rc" or "RETURN rc" instruction in the program. The application program can use this return code either as an error indication or to initiate sorme particular processing action. Result strings are always returned as an argstring and become the property(that is,responsibility)of the host. When the string is no longer needed,it can be released using the DelArgstring() function. Errors occurring in macro programs should usually be reported to the user. Explanatory messages are available for all ARexx error codes,and can be obtained by calling the ARexx Systems Library function ErrorMsg(). 10-4 COMMUNICATING WITH THE RESIDENT r2}Fy time. To be absolutely safe,the calls to FindPort() and PutMsg()should be bracketed by calls to the EXEC routines Forbid()and Permit(). This will exclude the slight possibility that the message port could close in the few microseconds before the message packet is actually sent to the port address. After sending the packet the host can return to its normal processing,since the macro program will execute as a separate task. In most cases it will be advisable to "lock-out" further usr3U@Yer commands while the ARexx program is running,to preserve te integrity of any shared data structures that may be accessed externally. COMMAND INVOCATIONS In the command mode of invocation the host supplies a command string consisting of a name token followed by an argument string. ARexx parses the string to extract the command name,which is usually the name of a program file. The default action is to use the remainder of the command string as the(single) argument string for the prr4Jj%ogram. This may be overridden by requesting command tokenization,which is done by setting the RXFB_TOKEN modifier flag in the action code of the message packet. In this case the entire command string will be parsed,and the program may have many argument strings.(There is no limit to the number of arguments that may be derived from the command string,since they don't have to fit into the parameter slots of the message packet.) The parsing process uses "white space" (blanks,tabs,etc.)r5 as the token separators,and has a several special features. QUOTING CONVENTION. Either single(')or double(")quotes may be used to surround items that include "white space" and would otherwise be separated during parsing. Single quotes may appear within a double-quote-delimited token,and vice versa;however,double-delimiter sequences are not accepted. The quotes are removed from the parsed token. An "implicit" quote at the end of the string is also recognized. If the command string enr6PA4ds before the closing delimiter has been found,the null byte is accepted as the final delimiter. For example, look.rexx "Now is the time" "can't ou see is a command with the two arguments strings "Now is the time" and "can't you see"(but without the quotes.) STRING FILES. If the command name(the first token of the string)is quoted,it is assumed to be a "string file" --an ARexx program in a string,rather than the name of a disk file. This is a convenient way to run very brief progrr7ams, although programs of any length may be stored this way. If command tokenization has not been specified,the remainder of the string is not scanned and no quote characters are removed. In this case the quoting convention isuseful only for indicating "string file" programs. The entire command string can be declared as a "string file" by setting the RXFB_STRING modifier flag of the action code. When this flag is set,no parsing at all is applied to the command. RESULT STRING. Commanr8fd invocations do not usually request a result string,but can do so by setting the RXFB_RESULT modifier flag. The host application must be prepared to recycle the returned result string once it is no longer needed. 94 FUNCTION INVOCATIONS In a function invocation the host application supplies a function name string and from 0 to 15 argument strings. The name string is used to locate an external program file and may include directory specifiers and a file extension. The actual ar9#rgument count(not including the name string)must be placed in the low-order byte of the command code. This mode of invocation is normally used when a result string is expected and the argument strings are conveniently available. Note that a result does not have to be requested,however. RESULT STRINGS. Function invocations request a result string by setting the RXFB_RESULT modifier flag bit. If no errors occurred and a result string was requested,the secondary result field in the rer:6dturned packet will be a pointer to the result string. However,if the program exited without supplying a result, the secondary field will be zero. STRING FILES. The function name argument may specify a "string file" rather than the name of a filing system object. This is indicated by setting the RXFB_STRING modifier flag. SEARCH ORDER The search for a program file matching a command or function name is normaly a two-step process. For each directory to be checked,a search is made fir;aS)rst with the current file extension appended to the name string. If this search fails, the second search uses the unmodified name string. The first step is skipped if the command or function name includes an explicit file extension. The default file extension is ".rexx,"but this can be changed by supplying a file extension string in an extended message packet. Host applications will usually specify a file extension,since it provides a convenient way to distinguish the macro programsr&I that are specific to that application. Refer to the section on Extension Fields for further details. The search path for a program depends on the way the program name was specified. If an explicit device or directory specification precedes the program name,only that directory will be searched. For example,the command- level invocation of "rx df0:s/test" will search only the df0:s directory for a file named test.rexx or test. If the program name does not include a path,the search par=r designer. RECEIVING COMMAND MESSAGES Each host application must open a public message port to support the command interface. When a macro program issues a command to the host,a message packet containing the command is sent to this public port. The structure of these message packets is shown in Table 10.2. The rm_Action field will be set to RXCOMM,and the ARGO parameter slot will contain the command as an argstring pointer. Parameter slots ARG1-ARG15 are not used for command messagr>i!es. Two other fields are potentially of interest: the rm_RexxTask field contains a pointer to the global data structure for the program that issued the command, and the rm_LibBase field has the ARexx library base address. The fields in the extension area may also be of interest to the host program;these are described later on. Except for setting the result fields rm_Result1 and rm_Result2,the host application should not alter the message packet. RESULT FIELDS When the host program r?Vfinishes processing the command,it must set the primary result field rm_Result1 to an error severity level or zero if no errors occurred. This is the field which will be assigned to the special variable RC in the macro program. The secondary result field rm_Result2 should be set to zero unless a result string(as described below)is being returned. The packet can then be returned to the sender using the EXEC function ReplyMsg(). In some cases a macro program may request a result strinr@g by setting the RXFB_RESULT modifier bit in the command code. If possible,the host application should then return the result as an argstring pointer in the secondary result field rm-Result2. A result string should only be returned if explicitly requested and if no errors occurred during the call(rm_Result1 set to zero). Failure to observe these rules will result either in memory loss or in corruption of the system free-memory list. MULTIPLE HOST PROCESSES Many applications programrAs support concurrent activities on several sets of data. For example,most text editors allow several files to be edited at once. A command issued from a particular instance of the editor might invoke an ARexx macro program,so clearly any commands issued from that macro would have to be directed to the correct instance of the editor. ARexx provides for this by 92 allowing the applications program to declare an initial host address when a program is invoked. A separate message porBځrt would be opened for each instance of the host application,and this port would be named as the initial host address for all invocations from that instance. In the example above,if the editor opened two ports named "MyEdit1" and "MyEdit2,"then programs invoked by the "MyEdit1" instance would send commands back to the "MyEdit1" port. MULTIPLE MESSAGE PORTS. Host applications are not limited to having a single message port for commands. If several different kinds of commands are to brCe received,it might be appropriate to set up more than one port. Macro programs would then use the ADDRESS instruction to direct commands to the appropriate port. The different ports could be used simultaneously,since ARexx programs execute as separate tasks. 10-3 INVOKING AREXX PROGRAMS ARexx programs are invoked by sending a message packet to the resident process. Programs may be invoked as either a command or as a function. The command mode of invocation is generally simpler,as rDZit requires setting only a few fields in the message packet. MESSAGE PACKETS The structure of the message packet supported by ARexx is shown in Table 10.2. This structure provides fields for passing arguments and for specifying overrides to various internal defaults. The packets are cleared(set to 0)when allocated,and the client-supplied fields are never altered by ARexx. Message packets can be reused after being returned,and generally only one is required. COMMAND(ACTION)CODE. ThrE֬$e rm_Action field of the message packet determines the mode of invocation. It can be set to either RXCOMM or RXFUNC for command or function mode,respectively. Several modifier flags can be used with the command code;these are described later in this chapter. ARGUMENT STRINGS. Command strings,function names,and argument strings must be supplied as argstrings. Strings can be conveniently packaged into argstrings using the CreateArgstring()library function,which takes a string pointer rF>and a length as its arguments. Argstrings point to a null-terminated string and may be treated like an ordinary string pointer in most cases. In principle,a host application could build the argstrings directly,but since the strings must remain unchanged for the duration of a ARexx program,the host might need to maintain many such structures. The argstrng pointer returned by CreateArgstring()is installed in the appropriate parameter slot of the message package:ARGO for the command str1Cring or function name,and ARG1-ARG15 for argument strings. Argstrings can be recycled after a packet has returned by calling the DeleteArgstring() function. SENDING THE PACKET. Once the required fields have been filled in,the host application can send the packet to the "REXX" public port using the EXEC function PutMsg(). The address of the "REXX" port can be obtained by a call to the FindPort()function,but this address should not be cached internally,since the port could close at anrHjARE RexxArg,0 LONG ra_Size ; allocated length UWORD ra_Length ; length of string UBYTE ra_Flags ; attribute flags UBYTE ra_Hash ; hash code STRUCT ra_Buff,8 ; buffer (argstring points here) Library functions are available to create and delete argstrings,and for converting integers into argstring format. The function CreateArgstring() allocates a structure and copies a string into it,and returns an argstring pointer to the structure. The function DeleteArgstring()can be usrIv;&ed to release an argstring when it is no longer needed. MESSAGE PACKETS. All communications between ARexx and external programs are mediated with with message packets,whose structure is diagrammed in Table 10.2 below. Functions are provided in the ARexx Systems Library to create, initialize,and delete these message packets. Each packet sent from ARexx to an external program is marked with a special pointer in its name field. This can be used to distinguish the message packets from trJ{]~hose belonging to other programs,in case a message port is being shared. Message packets are created using the CreateRexxMsg()function,and can be released using the DeleteRexxMsg(). Note that the message packets passed by ARexx to a host application(as a command,for instance)are identical to the packets the host would use to invoke an ARexx program. This commonality of design means that only one set of functions is needed to create and delete message packets,and that external prograrKOms can use the same routines that the interpreter uses to handle the packets. RESOURCE NODES. A somewhat higher-level data structure called a "resource node" (a RexxRsrc structure)is used extensively within ARexx to maintain resource lists. These nodes are variable-length structures that include the total allocated length as a field within the node,and that also provide for an "auto-delete" function. This latter capability allows the address of a clean-up 90 function to be assrL_cociated with the node so that an entire(possibly inhomogeneous)list of resource nodes can be deallocated with a single function call. Table 10.2 The RexxMsg Structures STRUCTURE RexxMsg,MN_SIZE APTR rm_TaskBlock ; global pointer APTR rm_LibBase ; library pointer LONG rm_Action ; command code LONG rm_Result1 ; primary result LONG rm_Result2 ; secondary result STRUCT rm_Args,16*4 ; arguments (ARGO-ARG15) ; the extension area APTR rm_PassPort ; forwarding rM3port APTR rm_CommAddr ; host address APTR rm_FileExt ; file extention LONG rm_Stdin ; input stream LONG rm_Stdout ; output steam LONG rm_avail ; reserved LABEL rm_SIZEOF ; 128 bytes 10-2 DESIGNING A COMMAND INTERFACE The minimal command interface between ARexx and an applications program requires only a public message port and a routine to process the commands received. For most host applications this will require little extra machinery, as the program will probably alrrN eady have several message ports for key and menu events,timer messages,and so on. Processing the command strings should be relatively straightforward for command-oriented applications. Hosts that are entirely menu-driven will require somewhat more additional programming,unless commands are supported only as simulated menu events. The specific choice of which commands to support is always left up to the applications designer,as ARexx imposes no restrictions on the structure of the comrOSmands that can be issued. The basic sequence of events in the command interface begins when the host sends a command invocation message to the ARexx resident process. This is usually in response primitives supported by the host. When the resident process receives the message packet,it spawns a new DOS process the run the macro program. The command line is parsed to extract the command token(the first word),and the interpreter searches for a file that matches the command name. Once rP>>a macro program file has been found,it is executed by the interpreter and (usually)results in one or more commands being issued back to the host application's public port. The macro program waits while each command is processed by the host,and takes appropriate actions if the return code indicates that an error occurred. Eventually the macro program finishes and returns the invocation message packet back to the host. Error handling is an important consideration in the interface desirQ&xgn. Macro programs must receive return codes so that processing actions can be altered when errors occur. 91 Normally,the host application should not return a message packet until the command has been processed and its error status in known. Hosts that support two streams of commands(from the user and from the command interface)will need a flag to indicate the source of each command. Errors in user commands might normally be reported on the screen,but errors in ARexx commands mr0y. When the flag is set,any program not already in interactive tracing mode will enter it immediately. The internal trace option is set to RESULTS unless it is currently set to INTERMEDIATES or SCAN,in which case it remains unchanged. Programs invoked while the external tracing flag is set will begin executing in interactive tracing mode. The external tracing flag provides a way to regain control over programs that are caught in loops or are otherwise unresponsive. Once a program enrN#_ ters interactive tracing mode,the user can step through the program statements and diagnose the problem. There is one caveat,though:external tracing is global flag,so all currently-active programs are affected by it. The tracing flag remains set until it is cleared using the "te" command utility. Each program maintains an internal copy of the last state of the tracing flag,and sets its tracing option to OFF when it observes that the tracing flag has been cleared. 7-4 INTERRUPTS ARerO)xx maintains an internal interrupt system that can be used to detect and trap certain error conditions. When an interrupt is enabled and its corresponding condition arises,a transfer of control to the label specific to that interrupt occurs. This allows a program to retain control in circumstances that might otherwise cause the program to terminate. The interrupt conditions can caused by either synchronous events like a syntax error,or asynchronous events like a "control-C" break reqrPP 2uest. Note that these internal interrupts are completely separate from the hardware interrupt system managed by the EXEC operating system. The interrupts supported by ARexx are described below. The name assigned to each is actually the label to which control will be tranferred. Thus,a SYNTAX interrupt will transfer control to the label "SYNTAX:." Interrupts can be enabled or disabled using the SIGNAL instruction. For example,the instruction "SIGNAL ON SYNTAX" would enable the SYNTAXrQy interrupt. 74 BREAK_C. This interrupt will trap a control-C break request generated by DOS. If the interrupt is not enabled,the program terminates immediately with the error message "Execution halted" and returns with the error code set to 2. BREAK_D. The interrupt will detect and trap a control-D break request issued by DOS. The break request is ignored if the interrupt is not enabled. BREAK_E. The interrupt will detect and trap a control-E break request issued by DOS. The rRl$break request is ignored if the interrupt is not enabled. BREAK_F. The interrupt will detect and trap a control-F break request issued by DOS. The break request is ignored if the interrupt is not enabled. ERROR. This interrupt is generated by any host command that returns a non-zero code. HALT. An external halt request will be trapped if this interrupt is enabled. Otherwise,the program terminates immediately with the error message "Execution halted" and returns with the error coderSRH set to 2. IOERR. Errors detected by the I/O system will be trapped if this interrupt is enabled. NOVALUE. An interrupt will occur if an uninitialized variable is used while this condition is enabled. The usage could be within an expression,in the UPPER instruction,or with the VALUE()built-in function. SYNTAX. A syntax or execution error will generate this interrupt. Not all errors such errors can be trapped,however. In particular,certain errors occurring before a program is actuarTlly executing,and those detected by the ARexx external interface,cannot be trapped by the SYNTAX interrupt. When an interrupt forces a transfer of control,all of the currently active control ranges are dismantled,and the interrupt that caused the transfer is disabled. This latter action is necessary to prevent a possible recursive interrupt loop. Only the control structures in the current environment are affected,so an interrupt generated within a function will not affect the callerrU9's environment. SPECIAL VARIABLES. Two special variables are affected when an interrupt occurs. The variable SIGL is always set to the current line number before the transfer of control takes place,so that the program can determine which source line was being executed. When an ERROR or SYNTAX interrupt occurs,the variable RC is set to the error code that caused the condition. For ERROR interrupts this value will be a command return code,and can usually be interpreted as an error sevrV~#erity level. The value for SYNTAX interrupts is always an ARexx error code. Interrupts are useful primarily to allow a program to take special error-recovery actions. Such actions might involve informing external programs that an error ocurred,or simply reporting further diagnostics to help in isolating the problem. In the following example,the program issues a "message" command to an external host called "MyEdit" whenever a syntax error is detected: 75 /* A macro program forrAQ-Z one of two logical streams. The interpreter first checks for a stream named STDERR,and directs the output there if the steam exists. Otherwise the trace output goes to the standard output stream STDOUT and will be interleaved with the normal console output of the program. The STDERR and STDOUT streams can be opened and closed under program control,so the programmer has complete control over the destination of tracing output. In some cases a program may not have a predefined output rB}stream. For example,a program invoked from a host application that did not provide input and output streams would not have an output console. To provide a tracing facility for such programs,the resident process can open a special global tracing console for use by any active program. When this console opens,the interpreter automatically opens a stream named STDERR for each ARexx program in which STDERR is not currently defined,and the program then diverts its tracing output to the newrCЮm stream. The global console can be opened and closed using the command utilities too and tcc,respectively. The console may not close immediately upon request,however. The resident process waits until all active programs have diverted their tracing streams back to the default state before actually closing the console. Applications programs may provide direct control over the tracing console by sending request packets to the resident process,which is discussed in Chapter 10. The tracrDIge stream(STDERR or STDOUT)is also used for trace input,so a program in interactive tracing mode will wait for user input from this console. The global tracing console is always shared among all currently active programs. Since it may be confusing to have several programs simultaneously writing to the same console,it is recommended that only one program at a time be traced using the global console. 72 COMMAND INHIBITION ARexx provides a tracing mode called command inhibition thrEceU4at suppresses host commands. In this mode command clauses are evaluated in the normal manner,but the command is not actually sent to the external host,and the return code is set to zero. This provides a way to test programs that issue potentially destructive commands,such as erasing files or formatting disks. Command inhibition does not apply to command clauses that are entered interactively. These commands are always performed,but the value of the special variable RC is left unchangrF#ed. Command inhibition may be used in conjunction with any trace option. It is controlled by the "!" character,which may appear by itself or may precede any of the alphabetic options in a TRACE instruction. Each occurrence of the "!" character "toggles" the inhibition mode currently in effect. Command inhibition is cleared when tracing is set to OFF. 7-3 INTERACTIVE TRACING Interactive tracing is a debugging facility that allows the user to enter source statements while a program rGAis executing. These statements may be used to examine or modify variable values,issue commands,or otherwise interact with the program. Any valid language statements can be entered interactively,with the same rules and restrictions that apply to the INTERPRET instruction. In particular,compound statements such as DO and SELECT must be complete within the entered line. Interactive tracing can be used with any of the trace options. While in interactive tracing mode,the interpreter pausrH<+^es after each traced clause and prompts for input with the code "+++." At each pause,three types of user responses are possible. If a null line is entered,the program continues to the next pause point. If an "=" character is entered,the preceding clause is executed again. Any other input is treated as a debugging statement,and is scanned and executed. The pause points during interactive tracing are determined by the tracing option currently in effect,as the interpreter pauses rIWs{only after a traced clause. However,certain instructions cannot be safely(or sensibly)re-executed, so the interpreter will not pause after executing one of these. The "no-pause" instructions are CALL,DO,ELSE,IF,THEN,and OTHERWISE. The interpreter will also not pause after any clause that generate and execution error. Interactive tracing mode is controlled by the "?" character,either by itself or in combination with an alphabetic trace option. Any number of "?" characters may precederJ an option,and each occurrence toggles the mode currently in effect. For example,if the current trace option was NORMAL,then "TRACE ?R" would set the option to RESULTS and select interactive tracing mode. A subsequent "TRACE ?" would turn off interactive tracing. 73 ERROR PROCESSING The ARexx interpreter provides special error processing while it executes debugging statements. Errors that occur during interactive debugging are reported,but do not cause the program to terminaterK+. This special processing applies only to the statements that were entered interactively. Errors occuring in the program source statements are treated in the usual way whether or not the interpreter is in interactive tracing mode. In addition to the special error processing,the interpreter also disables the internal interrupt flags during interactive debugging. This is necessary to prevent an accidental transfer of control due to an error or uninitialized variable. However,if a "SIGr6bYst character which is in the list,or 0 if none of the characters are. Examples: say verify('123456','0123456789') ==>0 say verify('123a56','0123456789') ==>4 say verify('123a45','abcdefghij','m') ==>4 WORD() Usage:WORD(string,n) Returns the nth word in the string argument,or the null string if there are fewer than n words. Example: say word('Now is the time ',2) ==>is WORDINDEX() Usage:WORINDEX(string,n) Returns the starting position of the nth word in the argument string,or 0r78 WORDLENGTH() Usage:WORDLENGTH(string,n) Returns the length of the nth word in the string argument. Example: say wordlength('one two three',3) ==>5 68 WORDS() Usage:WORDS(string) Returns the number of words in the string argument. Example: say words("You don't say!") ==>3 WRITECH() Usage:WRITECH(file,string) Writes the string argument to the given logical file. The returned value is the actr8.ual number of characters written. Example: say writech('output','Testing') ==>7 WRITELN() Usage:WRITELN(file,string) Writes the string argument to the given logical file with a "newline" appended. The returned value is the actual number of characters written. Example: say writeln('output','Testing') ==>8 X2C() Usage:X2C(string) Converts a string of hex digits into the(packed)character representation. Blank characters are permitted in the argument string at byte boundaries. Examr9Cples: say x2c('12ab') ==>'12ab'x say x2c('12 ab') ==>'12ab'x XRANGE() Usage:XRANGE([start],[end]) Generates a string consisting of all characters numerically between the specified start and end values. The default start character is '00'x,and the default end character is 'FF'x. Only the first character of the start and end arguments is significant. Examples: say xrange() ==>'00010203 ... FDFEFF'x say xrange('a','f') ==>'abcdef' say xrange(,'10'x) ==>'000102030405060708r:EO09010'x 69 CHAPTER 7 TRACING AND INTERRUPTS ARexx provides tracing and source-level debugging facilities that are unusual in a high-level language. Tracing refers to the ability to display selected statements in a program as the program executes. When a clause is traced,its line number,source text,and related information are displayed on the console. The tracing action of the interpreter is determined by a trace option that selects which source clauses will be traced,and twr;35o modifier flags that control command inhibition and interactive tracing. The internal interrupt system enables an ARexx program to detect certain synchronous or asynchronous events and to take special actions when they occur. Events such as a syntax error or an external halt request that would normally cause the program to exit can instead be trapped so that corrective actions can be taken. 7-1 TRACING OPTIONS Trace options are sometimes called an alphabetic options,since the keyr<[Gwords that select an option can be shortened to one letter for convenience. The alphabetic options are: ALL. All clauses are traced. COMMANDS. All command clauses are traced before being sent to the external host. Non-zero return codes are displayed on the console. ERRORS. Commands that generate a non-zero return code are traced after the clause is executed. INTERMEDIATES. All clauses are traced,and intermediate results are displayed during expression evaluation. These include the vr=Wevalues retrieved for variables, expanded compound names,and the results of function calls. LABELS. All label clauses are traced as they are executed. A label will be displayed each time a transfer of control takes place. NORMAL. Command clauses will return codes that exceed the current error failure level are traced after execution,and an error message is displayed. This is the default trace option. RESULTS. All clauses are traced before execution,and the final result of each expressir>2on is displayed. Values assigned to variables by ARG,PARSE,or PULL instructions are also displayed. SCAN. This is a special option that traces all clauses and checks for errors, but suppresses the actual execution of the statements. It is helpful as a preliminary screening steop for a newly-created program. The tracing mode can be set using either the TRACE instruction or the TRACE() Built-In function. The RESULTS trace option is recommended for general-purpose testing. Tracing can r?#-2be selectively disabled from within a program so that previously-tested parts of a program can be skipped. 71 7-2 DISPLAY FORMATTING Each trace line displayed on the console is indented to show the effective control(nesting)level at that clause,and is identified by a special three- character code,as shown in Table 7.1 below. The source for each clause is preceded by its line number in the program. Expression results or intermediates are enclosed in double quotes so that leadinr@ߚg and trailing blanks will be apparent. TABLE 7.1 TRACING PREFIX CODES CODE DISPLAYED VALUES +++ Command or syntax error >C> Expanded compound name >F> Result of a function call >L> Label clause >O> Result of a dyadic operation >P> Result of a prefix operation >U> Uninitialized variable >V> Value of a variable >>> Expression or template result >.> "Placeholder" token value TRACING OUTPUT The tracing output from a program is always directed tor+dicated memory area. The length parameter specifies the maximum number of bytes to be copied,and defaults to the length of the string. If the specified length is longer than the string,the remaining area is filled with the pad character or nulls('00'x.) The returned value is the previous contents of the memory area. This can be used in a subsequent call to restore the original contents. Caution is advised in using this function. Any area of memory can be overwritten,possibly causinr, PDg a system crash. Task switching is forbidden while the copy is being done,so system performance may be degraded if long strings are copied. See Also:EXPORT() Examples: say storage() ==>248400 oldval = storage('0004 000'x,'The answer') call storage '0004 0000'x,,32,'+' STRIP() Usage:STRIP(string,[{'B' | 'L' | 'T'}],[pad]) If neither of the optional parameters is supplied,the function removes both leading and trailing blanks from the string argument. The second argument specifier-(&s whether Leading,Trailing,or Both(leading and trailing)characters are to be removed. The optional pad(or unpad,perhaps)argument selects the character to be removed. Examples: say strip(' say what? ') ==>'say what?' say strip(' say what? ','L') ==>'say what? ' say strip('++123+++','B','+') ==>'123' SUBSTR() Usage:SUBSTR(string,start,[length],[pad]) Returns the substring of the string argument beginning at the specified start position for the specified length. The starting posir.tion must be positive,and the default length is the remaining length of the string. If the substring is shorter than the requested length,it is padded on the left with the blanks or the specified pad character. Examples: say substr('23456',4,2) ==>45 say substr('myname',3,6,'=') ==>name== 65 SUBWORD() Usage:SUBWORD(string,n,[length]) Returns the substring of the string argument beginning with the nth word for the specified length in words. The default length is the remainingr/ length of the string. The returned string will never have leading or trailing blanks. Example: say subword('Now is the time ',2,2) ==>is the SYMBOL() Usage:SYMBOL(name) Tests whether the name argument is a valid REXX symbol. If the name is not a valid symbol,the function returns the string BAD. Otherwise,the returned string is LIT if the symbol is uninitialized and VAR if it has been assigned a value. Examples: say symbol('J') ==>VAR say symbol('x') ==>LIT say symbol('++') r0:R -->BAD TIME() Usage:TIME(option) Returns the current system time or controls the internal elapsed time counter. The valid option keywords are listed below. Table 6.2 TIME()Options OPTION KEYWORD DESCRIPTION Elapsed Elapsed time in seconds. Hours Current time in hours since midnight Minutes Current time in minutes since midnight Reset Reset the elapsed time clock Seconds Current time in seconds since midnight If no option is specified,the function returns ther1} current system time in the form HH:MM:SS. Examples: /* Suppose that the time is 1:02 AM ... */ say time('Hours') ==>1 say time('m') ==>62 say time('S') ==>3720 call time 'R' /* reset timer */ say time('E') ==>.020 66 TRACE() Usage:TRACE(option) Sets the tracing mode to that specified by the option keyword,which must be one of the valid alphabetic or prefix options. The tracing options are described in Chapter 7. The TRACE()function will alter the tracing mode er2'ߨven during interactive tracing,when TRACE instructions in the source program are ignored. The returned value is the mode in effect before the function call;this allows the previous trace mode to be restored later. Example: /* Assume tracing mode is ?AL */ say trace('Results') ==>?A TRANSLATE() Usage:TRANSLATE(string,[output],[input],[pad]) This function constructs a translation table and uses it to replace selected characters in the argument string. If only the string argument ir31s given,it is translated to uppercase. If an input table is supplied,it modifies the translation table so that characters in the argument string that occur in the input table are replaced with the corresponding character in the output table. Characters beyond the end of the output table are replaced with the specified pad character or a blank. Note that the result string is always of the same length as the original string. The input and output tables may be of any length. Examples: r4Y_ say translate("abcde","123","cbade","+") ==>321++ say translate("low") ==>LOW say translate("0110","10","01") ==>1001 TRIM() Usage:TRIM(string) Removes trailing blanks from the string argument. Example: say length(trim(' abc ')) ==>4 UPPER() Usage:UPPER(string) Translates the strip to uppercase. The action of this function is equivalent to that of TRANSLATE(string),but it is slightly faster for short strings. Example: say upper('One Fine Day') ==>ONE FINE DAY 67 Vr5ALUE() Usage:VALUE(name) Returns the value of the symbol represented by the name argument. Example: /* Assume that J has the value of 12 */ say value('j') ==>12 VERIFY() Usage:VERIFY(string,list,['Match']) If the Match argument is omitted,the function returns the index of the first character in the string argument which is not contained in the list argument,or 0 if all of the characters are in the list. If the Match keyword is supplied, the function returns the index of the firr HZority higher than that of the resident process,which currently runs at priority 4. The returned value is the previous priority level. 61 Examples: say pragma('priority',-5) ==>0 call pragma 'Directory','df0:system' RANDOM() Usage:RANDOM([min],[max],[seed]) Returns a pseudorandom integer in the interval specified by the min and max arguments. The default minimum value is 0 and the default maximum value is 999. The interval max-min must be less than or equal to 1000. If a grer! q REMLIB() Usage:REMLIB(name) Removes an entry with the given name from the Library List maintained by the resident process. The boolean return is 1 if the entry was found and successfully removed. Note that this function does not make a distinction between function libraries and function hosts,but simply removes a named entry. See Also:ADDLIB() Example: say remlib('MyLibrary.library')==>1 REVERSE() Usage:REVERSE(string) Reverses the sequence of characters in the string. Example: sr%y|ay reverse('?ton yhw') ==>why not? RIGHT() Usage:RIGHT(string,length,[pad]) Returns the rightmost substring in the given string argument with the specified length. If the substring is shorter than the requested length,it is padded on the left with the supplied pad character or blanks. Examples: say right('123456',4) ==>3456 say right('123456',8,'+') ==>++123456 SEEK() Usage:SEEK(file,offset,['Begin' | 'Current' | 'End']) Moves to a new position in the given logical file,specifir&ujed as an offset from an anchor position. The default anchor is Current. The returned value is the new position relative to the start of the file. Examples: say seek('input',10,'B') ==>10 say seek('input',O,'E') ==>356 /* file length */ 63 SETCLIP() Usage:SETCLIP(name,[value]) Adds a name-value pair to the Clip List maintained by the resident process. If an entry of the same name already exists,its value is updated to the supplied value string. Entries may be removed by specr')ifying a null value. The function returns a boolean value that indicates whether the operation was successful. Examples: say setclip('path','df0:s') ==>1 say setclip('path') ==>1 SHOW() Usage:SHOW(option,[name],[pad]) Returns the names in the resource list specified by the option argument,or tests to see whether an entry with the specified name is available. The currently implemented options keywords are Clip,Files,Libraries,and Ports, which are described below. Clip. Examines tr(+es#he names in the Clip List. Files. Examines the names of the currently open logical file names. Libraries. Examines the names in the Library List,which are either function libraries or function hosts. Ports. Examine the names in the system Ports List. If the name argument is omitted,the function returns a string with the resource names separated by a blank space or the pad character,if one was supplied. If the name argument is given,the returned boolean value indicates whether the nar)E\Kme was found in the resource list. The name entries are case-sensitive. SIGN() Usage:SIGN(number) Returns 1 if the number argument is positive or zero,and -1 if number is negative. The argument must be numeric. Examples: say sign(12) ==>1 say sign(-33) ==>-1 SPACE() Usage:SPACE(string,n,[pad]) Reformats the string argument so that there are n spaces(blank characters) between each pair of words. If the pad character is specified,it is used instead of blanks as the separator chr*,%Caracter. Specifying n as 0 will remove all blanks from the string. Examples: say space('Now is the time',3) ==>'Now is the time' say space('Now is the time',0) ==>'Nowisthetime' say space('1 2 3',1,'+') ==>'1+2+3' 64 STORAGE() Usage:STORAGE([address],[string],[length],[pad]) Calling STORAGE()with no arguments returns the available system memory. If the address argument is given,it must be a 4-byte string,and the function copies data from the(optional)string into the inrSupport Library(described in Appendix D)includes the function ALLOCMEM()which to allocate memory from the system free list. See Also:FREESPACE() Example: say c2x(getspace(32)) ==>'0003BF40'x HASH() Usage:HASH(string) Returns the hash attribute of a string as a decimal number,and updates the internal hash value of the string. 58 Example: say hash('1') ==>49 IMPORT() Usage:IMPORT(address,[length]) Creates a string by copying data from the specified 4-byte address. If the lrªsength parameter is not supplied,the copy terminates when a null byte is found. See Also:EXPORT() Example: extval = import('0004 0000'x,8) INDEX() Usage:INDEX(string,pattern,[start]) Searches for the first occurrence of the pattern argument in the string argument,beginning at the specified start position. The default start position is 1. The returned value is the index of the matched pattern,or 0 if the pattern was not found. Examples: say index("123456","23") ==>2 say index("1234rÖ4b56","77") ==>0 say index("123123","23",3) ==>5 INSERT() Usage:INSERT(new,old,[start],[length],[pad]) Inserts the new string into the old string after the specified start position. The default starting position is 0. The new string is truncated or padded to the specified length as required,using the supplied pad character or blanks. If the start position is beyond the end of the old string,the old string is padded on the right. Examples: say insert('ab,'12345') ==>ab12345 say insruert('123','++',3,5,'-') ==>++-123-- LASTPOS() Usage:LASTPOS(pattern,string,[start]) Searches backwards for the first occurrence of the pattern argument in the string argument,beginning at the specified start position. The default starting position is the end of the string. The returned value is the index of the matched pattern,or 0 if the pattern was not found. 59 Examples: say lastpos("123234","2") ==>4 say lastpos("123234","5") ==>0 say lastpos("123234","2",3) ==>2 LEFT(r) Usage:LEFT(string,length,[pad]) Returns the leftmost substring in the given string argument with the specified length. If the substring is shorter than the requested length,it is padded on the left with the supplied pad character or blanks. Examples: say left('123456',3) ==>123 say left('123456',8,'+') ==>123456++ LENGTH() Usage:LENGTH(string) Returns the length of the string. Example: say length('three') ==>5 MAX() Usage:MAX(number,number[,number,...]) Returns the maximum or"1f the supplied arguments,all of which must be numeric. At least two parameters must be supplied. Example: say max(2.1,3,-1_ ==>3 MIN() Usage:MIN(number,number[,number,...]) Returns the minimum of the supplied arguments,all of which must be numeric. At least two parameters must be supplied. Example: say min(2.1,3,-1) ==>-1 OPEN() Usage:OPEN(file,filename,['Append' | 'Read' | 'Write']) Opens an external file for the specified operation. The file argument defines the logical name rǜ7Qby which the file will be referenced. The filename is the external name of the file,and may include device and directory specifications. The function returns a boolean value that indicates whether the operation was successful. There is no limit to the number of files that can be open 60 simultaneusly,and all open files are closed automatically when the program exits. See Also:CLOSE(),READ(),WRITE() Examples: say open('MyCon','CON:160/50/320/100/MyCon/cds') ==>1 say open('outfrm^ile','ram:temp','W') ==>1 OVERLAY() Usage:OVERLAY(new,old,[start],[length],[pad]) Overlays the new string onto the old string beginning at the specified start position,which must be positive. The default starting position is 1. The new string is truncated or padded to the specified length as required,using the supplied pad character or blanks. If the start position is beyond the end of the old string,the old string is padded on the right. Examples: say overlay('bb,'abcd') ==>bbr{lcd say overlay('4','123',5,5,'-') ==>123--4---- POS() Usage:POS(pattern,string,[start]) Searches for the first occurrence of the pattern argument in the string argument,beginning at the position specified by the start argument. The default starting position is 1. The returned value is the index of the matched string,or 0 if the pattern wasn't found. Examples: say pos('23','123234') ==>2 say pos('77','123234') ==>0 say pos('23','123234',3) ==>4 PRAGMA() Usage:PRAGMA(optionr2ڑ,[value]) This function allows a program to change various attributes relating to the system environment within which the program executes. The option argument is a keyword that specifies an environmental attribute;the currently implemented options are Directory and Priority. The value argument supplies the new attribute value to be installed. The value returned by the function depends on the attribute selected. Some attributes return the previous value installed,while others may simrBNply set a boolean success flag. The currently defined option keywords are listed below. DIRECTORY. Specifies a new "current" directory. The current directory is used as the "root" for filenames that do not explicitly include a device specification. The return value is a boolean success flag. PRIORITY. Specifies a new task priority. The priority value must be an integer in the range -128 to 127,but the practical range is much more limited. ARexx programs should never be run at a prir 0 is omitted,the function removes leading,trailing,or embedded blank characters from the string argument. If the optional list is supplied,it specifies the characters to be removed from the string. Examples: say compress (' why not ') ==>whynot say compress ('++12-34-+','+-') ==>1234 COMPARE() Usage:COMPARE(string1,string2,[pad]) Compares two strings and returns the index of the first position in which they differ,or 0 if the strings are identical. The shorter string is padded as rer "Tquired using the supplied character or blanks. Examples: say compare('abcde','abcce') ==>4 say compare('abcde',abcde') ==>0 say compare('abc++','abc+-','+') ==>5 COPIES() Usage:COPIES(string,number) Creates a new string by concatenating the specified number of copies of the original. The number argument may be zero,in which case the null string is returned. 55 Example: say copies('abc',3) ==>abcabcabc D2C() Usage:D2C(number) Creates a string whose value is the binary(pacr $#ked)representation of the given decimal number. Example: d2c(31) ==>'1F'x DATATYPE() Usage:DATATYPE9string,[option]) If the option parameter is not specified,DATATYPE()tests whether the string parameter is a valid number and returns either NUM or CHAR. If an option keyword is given,the boolean return indicates whether the string satisfied the requested test. The following option keywords are recognized: Table 6.1 DATATYPE()Options KEYWORD CHARACTERS ACCEPTED Alphanumerir ϯ9c Alphabetics (A-Z,a-z) or Numerics (0-9) Binary Binary Digits String Lowercase Lowercase Alphabetics (a-z) Mixed Mixed Upper/Lowercase Numeric Valid Numbers Symbol Valid REXX Symbols Upper Uppercase Alphabetics (A-Z) Whole Integer Numbers X Hex Digits String Examples: say datatype('123') ==>NUM say datatype('1a f2','x') ==>1 say datatype('aBcde','L') ==>0 DELSTR() Usage:DELSTR(string,n,[length]) Deletes the substring of the string argument beginnirи}}ng with the nth character for the specified length in characters. The default length is the remaining length of the string. Example: say delstr('123456',2,3) ==>156 56 DELWORD() Usage:DELWORD(string,n,[length]) Deletes the substring of the string argument beginning with the nth word for the specified length in words. The default length is the remaining length of the string. The deleted string includes any trailing blanks following the last word. Examples: say delword('Tell mrQ?e a story',2,2)==>'Tell story' say delword('one two three',3) ==>'one two ' EOF() Usage:EOF(file) Checks the specified logical file name and returns the boolean value 1(True)if the end-of-file has been reached,and 0(False)otherwise. Example: say eof(infile) ==>1 ERRORTEXT() Usage:ERRORTEXT(n) Returns the error message associated with the specified ARexx code. The null string is returned if the number is not a valid error code. Example: say errortext(41) ==>Invalid expressior䣼mn EXISTS() Usage:EXISTS(filename) Tests whether an external file of the given filename exists. The name string may include device and directory specifications. Example: say exists('df0:c/ed') ==>1 EXPORT() Usage:EXPORT(address,[string],[length],[pad]) Copies data from the (optional) string into a previously-allocated memory area, which must be specified as a 4-byte address. The length parameter specifies the maximum number of characters to be copied; the default is the length of rӕ4the string. If the specified length is longer than the string,the remaining area is filled with the pad character or nulls('00'x). The returned value is the number of characters copied. Caution is advised in using this function. Any area of memory can be overwritten,possibly causing a system crash. Task switching is forbidden while the copy is being done,so system performance may be degraded if long strings are copied. See Also:IMPORT(),STORAGE() 57 Example: count = export('0r\'004 0000'x,'The answer') FREESPACE() Usage:FREESPACE(address,length) Returns a block of memory of the given length to the interpreter's internal pool. The address argument must be a 4-byte string obtained by a prior call to GETSPACE(),the internal allocator. It is not always necessary to release internally-allocated memory,since it will be released to the system when the program terminates. However,if a very large block has been allocated,returning it to the pool may avoid memory sprհace problems. The return value is a boolean success flag. See Also:GETSPACE() Example: say freespace('00042000'x,32) ==>1 GETCLIP() Usage:GETCLIP(name) Searches the Clip List for an entry matching the supplied name parameter,and returns the associated value string. The name-matching is case-sensitive,and the null string is returned if the name cannot be found. The usage and maintenance of Clip List entries is described in the Chapter 9. See Also:SETCLIP() Example: /* Assume 'numbr_ers' contains 'PI=3.14159' */ say getclip('numbers') ==>PI=3.14159 GETSPACE() Usage:GETSPACE(length) Allocates a block of memory of the specified length from the interpreter's internal pool. The returned value is the 4-byte address of the allocated block, which is not cleared or otherwise initialized. Internal memory is automatically returned to the system when the ARexx program terminates,so this function should not be used to allocate memory for use by external programs. The r㋑burrent host address string. The host address is the message port to which commands will be sent. The SHOW()function can be used to check whether the required external host is actually available. See Also:SHOW() Example: say address() ==>REXX ARG() Usage:ARG([number],['Exists' | 'Omitted']) ARG()returns the number of arguments supplied to the current environment. If the number parameter alone is supplied,the corresponding argument string is returned. If a number and one of the ker؋-ywords Exists or Omitted is given,the boolean return indicates the status of the corresponding argument. Note that the existence or omission test does not indicate whether the string has a null value,but only whether a string was supplied. Examples: /* Assume arguments were: ('one,,10) */ say arg() ==>3 say arg(1) ==>one say arg(2,'0') ==>1 B2C() Usage:B2C(string) Converts a string of binary digits(0,1)into the corresponding(packed)character representation. The conversir Ǒon is the same as though the argument string had been specified as a literal binary string(e.g. '1010'B). Blanks are permitted in the string,but only at byte boundaries. This function is particularly useful for creating strings that are to be used as bit masks. See also:X2C() Examples: say b2c('00110011') ==>3 say b2c('01100001') ==>a BITAND() Usage:BITAND(string1,string2,[pad]) The argument strings are logically ANDed together,with the length of the result being the longer ofrڪ the two operand strings. If a pad character is supplied,the shorter string is padded on the right;otherwise,the operation terminates at the end of the shorter string and the remainder of the longer string is appended to the result. Example: bitand('0313'x,'FFF0'x) ==>'0310'x 52 BITCHG() Usage:BITCHG(string,bit) Changes the state of the specified bit in the argument string. Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte of the string. Examr8 ple: bitchg('0313'x,4) ==>'0303'x BITCLR() Usage:BITCLR(string,bit) Clears(sets to zero)the specified bit in the argument string. Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte of the string. Example: bitclr('0313'x,4) ==>'0303'x BITCOMP() Usage:BITCOMP(string1,string2,[pad]) Compares the argument strings bit-by-bit,starting at bit number 0. The returned value is the bit number of the first bit in which the strings differ,or -1 if the stringsr are identical. Examples: bitcomp('7F'x,'FF'x) ==>7 bitcomp('FF'x,'FF'x) ==>-1 BITOR() Usage:BITOR(string1,string2,[pad]) The argument strings are logically ORed together,with the length of the result being the longer of the two operand strings. If a pad character is supplied,the shorter string is padded on the right;otherwise,the operation terminates at the end of the shorter string and the remainder of the longer string is appended to the result. Example: bitor('0313'x,'003F'rx) ==>'033F'x BITSET() Usage:BITSET(string,bit) Sets the specified bit in the argument string is 1. Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte of the string. Example: bitset('0313'x,2) ==>'0317'x BITTST() Usage:BITTST(string,bit) The boolean return indicates the state of the specified bit in the argument string. 53 Bit numbers are defined such that bit 0 is the low-order bit of the rightmost byte to the string. Example: bittst('0313r6a'x,4) ==>1 BITXOR() Usage:BITAND(string1,string2,[pad]) The argument strings are logically exclusively-ORed together,with the length of the result being the longer of the two operand strings. If a pad character is supplied,the shorter string is padded on the right;otherwise,the operation terminates at the end of the shorter string and the remainder of the longer string is appended to the result. Example: bitxor('0313'x,'001F'x) ==>'030C'x C2B() Usage:C2B(string) Converts the char߿[racter string into the equivalent string of binary digits. See Also:C2X() Example: say c2b('abc') ==>011000010110001001100011 C2D() Usage:C2D(string,[n]) Converts the string argument from its character representation to the corresponding decimal number,expressed as ASCII digits(0-9). If n is supplied, the character string is considered to be a number expressed in n bytes. The string is truncated or padded with nulls on the left as required,and the sign bit is extended for the conrd$version. Examples: say c2d('0020'x) ==>32 say c2d('FFFF') ==>1 say c2d('FF0100',x,2) ==>256 C2X() Usage:C2X(string) Converts the string argument from its character representation to the corresponding hexadecimal number,expressed as the ACSII characters 0-9 and A-F. See Also:C2B() Example: say c2x('abc') ==>616263 54 CENTER() or CENTRE() Usage:CENTER(string,length,[pad])or CENTRE(string,length,[pad]) Centers the string argument in a string with the specified length. Ir f the length is longer than that of the string,pad characters or blanks are added as necessary. Examples: say center('abc',6) ==>' abc ' say center('abc',6,'+') ==>'+abc++' say center('123456',3) ==>'234' CLOSE() Usage:CLOSE(file) Closes the file specified by the given logical name. The returned value is a boolean success flag,and will be 1 unless the specified file was not open. Example: say close('input') ==>1 COMPRESS() Usage:COMPRESS(string,[list]) If the list argument rCutem includes an external function library in a file called "rexxsupport.library". It contains a number of Amiga-specific functions and is described in Appendix D. Chapter 10 provides information on designing and implementing function libraries. 49 FUNCTION HOSTS Function hosts are called by sending a function invocation message packet to the public message port identified by the host's name. No constraints are imposed on the iternal design of the host except that it must eventrrually return the invocation message with an appropriate return code and result string. The function call may result in a new program being loaded and run,or might even be sent to a network handler as a remote procedure call. The available function hosts,along with the function libraries,are contained in the Library List maintained by the resident process. This list provides a general mechanism for resolving function names in a priority-controlled manner. The ARexx resident process rW is an example of a function host. It is added to the Library List at a nominal priority of -60 when the resident process is started, using the same name ("REXX")that is used for command invocations. When it receives a function invocation packet,it searches for an external file matching the function name,just as it would for a command invocation of the same name. In particular,the search begins with the current directory and process is not case-sensitive,but is affected by the presencr6e of explicit directory specifications or file extensions in the name string. The rules governing the search for external programs are covered in Chapter 9. External programs are always run as a separate process in the Amiga's multitasking system. The calling program "sleeps" until the called function finishes and the message packet returns. The result string and error code are returned in the packet. 6-2 THE BUILT-IN FUNCTION LIBRARY This section of the chapter is devoted to descrӫriptions of the individual Built In functions,which are listed alphabetically. Many of the functions have optional as well as required arguments. The optional arguments are shown in brackets,and generally have a default value that is used if the argument is omitted. MAXIMUM ARGUMENTS. While internal functions can be called with any number of arguments,the Built-In functions(and external functions as well)are limited to a maximum of 15 arguments. PAD AND OPTION CHARACTERS. For functr ions that accept a "pad" character argument,only the first character of the argument string is significant. If a null string is supplied,the default padding character(usually a blank)will be used. Similarly,where an option keyword is specified as an argument,only the first character is significant. Option keywords may be given in uppercase or lowercase. I/O SUPPORT FUNCTIONS. ARexx provides functions for creating and manipulating external DOS files. The functions available at the prresent time are OPEN(), CLOSE(),READCH(),READLN(),WRITECH(),WRITELN(),EOF(),SEEK(),and EXISTS(). Files are referenced by a "logical name," a case-sensitive name that is assigned to a file when it is first opened. 50 There is no limit to the number of files that may be open simultaneously,and all open files are closed automatically when the program exits. BIT-MANIPULATION FUNCTIONS. The functions BITCHG(),BITCLR(),BITCOMP(),BITSET(), and BITTST() are provided to implement extendrH} oed bit-testing on character strings. These functions differ from similar string-manipulation functions in that the elementary unit of comparison is the bit rather than the byte. Bit number are defined such that bit 0 is the low-order bit of the rightmost byte of the string. ABBREV() Usage:ABBREV(string1,string2,[length] Returns a boolean value that indicates whether string2 is an abbreviation of string1 with length greater than or equal to the specified length argument. The defaultr< length is 0,so the null string is an acceptable abbreviation. Example: say abbrev('fullname','ful' ==>1 say abbrev('almost','alm',4) ==>0 say abbrev('any','') ==>1 ABS() Usage:ABS(number) Returns the absolute value of the number argument,which must be numeric. Examples: say abs(-5.35) ==>5.35 say abs(10) ==>10 ADDLIB() Usage ADDLIB(name,priority,[offset,version]) Adds a function library or a function host to the Library List maintained by the resident processr]. The name argument specifies either the name of a function library or the public message port associated with a function host. The name is case-sensitive,and any libraries thus declared should reside in the system LIBS: directory. The priority argument specifies the search priority and must be an integer between 100 and -100,inclusive. The offset and version arguments apply only to libraries. The offset is the integer offset to the library's "query" entry point,and the version is anrַ integer specifying the minimum acceptable release level of the library. The function returns a boolean result that indicates whether the operation was successful. Note that if a library is specified,it is not actually opened at this time;similarly,no check is performed as to whether a specified function host port has been opened yet. Example: say addlib("rexxsupport.library",0,-30,0)==>1 call addlib "EtherNet",-20 /* a gateway */ 51 ADDRESS() Usage:ADDRESS() Returns the crW~xspecified name. All of these functions are defined by uppercase names,and the library has been specially organized to make the search as efficient as possible. 47 3. Function Libraries and Function Hosts. The available function libraries and function hosts are maintained in a prioritized list,which is searched starting at the highest priority until the requested function is found or the end of the list is reached. Each function library is opened and called at a special entry porint to determine whether it contains a function matching the given name. Function hosts are called using a message-passing protocol similar to that used for commands,and may be used as gateways for remote procedure calls to other machines in a network. 4. External ARexx Programs. The final search step is to check for an external ARexx program file by sending an invocation message to the ARexx resident process. The search always begins in the current directory,and follows the same serrarch path as the original ARexx program invocation. The name matching process is not case-sensitive. Note that the function name-matching procedure may be case-sensitive for some of the search steps but not for others. The matching procedure used in a function library or function host is left to the discretion of the applications designer. Functions defined with mixed-case names must be called using a string token,since symbol names are always translated to uppercase. The full searr'ch order is followed whenever the function name is defined by a symbol token. However,the search for internal functions is bypassed if the name is specified by a string token. This allows internal functions to usurp the names of external functions,as in the following example: CENTER: /* internal "CENTER" */ arg string,length /* get arguments */ length = min(length,60) /* compute length */ return 'CENTER'(string,length) Here the Built-In fuction CENTER()has been replacedrJ by an internal function of the same name,which calls the original function after modifying the length argument. INTERNAL FUNCTIONS The interpreter creates a new storage environment when an internal function is called,so that the previous(caller's)environment is preserved. The new environment inherits the values from its predecessor,but subsequent changes to the environment variables do not affect the previous environment. The specific values that are preserved are: The current anrtd previous host addresses, The NUMERIC DIGITS,FUZZ,and FORM settings, The trace option,inhibit flag,and interace flag, The state of the interrupt flags defined by the SIGNAL instruction,and The current prompt string as set by the OPTIONS PROMPT instruction. The new environment does not automatically get a new symbol table,so initially all of the variables in the previous environment are available to the called function. The PROCEDURE instruction can be used to create a new symbol tarble 48 and thereby protect the caller's symbol values. Execution of the internal function proceeds until a RETURN instruction is executed. At this point the new environment is dismantled and control resumes at the point of the function call. The expression supplied with the RETURN instruction is evaluated and passed back to the caller as the fuction result. BUILT-IN FUNCTIONS ARexx provides a substantial library of predefined functions as part of the language system. These frOunctions are always available and have been optimized to work with the internal data structures. In general the Built-In functions execute much faster than an equivalent interpreted function,so their usage is strongly recommended. The Built-In Function Library is not user-extensible,but additional functions will be included in later releases. EXTERNAL FUNCTION LIBRARIES External function libraries provide a mechanism with which users and applications developers can extend the funcr ]{tionality of ARexx. A function library is a collection of one or more functions together with a "query" entry point that serves to match a name string with the appropriate function. External function libraries are supported as standard Amiga shared libraries, and may be either memory or disk-resident. Disk-resident libraries are loaded and opened as needed. The ARexx resident process maintains a list,called the Library List,of the currently available function libraries and function r hosts. Applications programs can add or remove function libraries as required. The Library List is maintained as a priority-sorted queue,and entries can be added at an appropriate priority to control the function name resolution. Libraries with higher priorities are searched first;within a given priority level,those libraries added first are searched first. During the search process the ARexx interpreter opens each library and calls its "query" entry point. The query function must trQwhen check to see whether the requested function name is in the library. If not,it returns a "function not found" error code and the search continues with the next library in the list. Function libraries are always closed after being checked so that the operatiing system can reclaim the memory space if required. Once the requested function has been found,it is called with the arguments passed by the interpreter,and must return an error code and a result string. The ARexx language sysrGa well-designed macro language interface the user will be usually unaware of whether a given action is implemented as a primitive operations or as a macro program. The starting point in designing a macro program is to examine the commands that would be required to perform it manually. The documentation for the host application program should then describe the possible return codes for each command;these codes can be used to determine whether the operation performed by the command war6s successful. Check also for "shortcut" commands that may be available only to macro programs;some applications programs may include very powerful functions that were implemented specifically for use in macro programs. 5-5 USING AREXX WITH COMMAND SHELLS Although ARexx was designed to work most effectively with programs that support its specific command interface,it can be used with any "command shell" program that uses standards I/O mechanisms to obtain its input stream. There arerƀ7 several ways to use ARexx to prepare a stream of commands for such program. One obvious technique is to create an actual command file on the "RAM:" disk and then pass it directly to the command shell. For example,you could open a new CLI window to run a standard "execute" script using the following short program: /* Launch a new CLI */ address command conwindow = "CON:0/0/640/100/NewOne" /* create a command file on the fly */ call open out,"ram:$$temp",write call writeln ort%3ut,'echo "this is a test"' call close out /* open the new CLI window */ 'newcli' conwindow "ram:$$temp"' exit Since no disk accesses are required,this method is actually fairly fast,if not very elegant. Another alternative is to use the command stacking facility provided by the PUSH and QUEUE instructions. These instructions allow an ARexx program to stack an arbitrary stream of commands and data for the command shell or other program to read. Any set of commands that could ber3| "typed ahead" at a command prompt can be prepared in this fashion. After the ARexx program exits,the next program that uses the input stream will read the prepared commands and can process them in the normal fashion. 45 5-6 COMMAND INHIBITION Sometimes it is necessary to write and test macro programs that issue potentially destructive commands. For instance,a program to find and delete unneeded files would be difficult to test safely,since it might accidentally delete the wrorGng files and would require a continual source of new files for testing. To simply the development and testing of such programs,ARexx provides a special tracing mode called command inhibition that suppresses host commands. While in command inhibition mode,command processing proceeds normally except that the command is not actually issued and the variable RC is set to 0. This allows the program logic to be verified before any commands are actually sent to the external program. Chapterr| 7 has further information on this facility. 46 CHAPTER 6 FUNCTIONS The basic concept of a function is a program or group of statements that will be executed whenever the function name appears in a certain context. Functions are an important building block of most computer languages in that they allow modular programming -- the ability to build a large program from a series of smaller,more easily developed modules. In ARexx a function may be definedrͳ as part of(internal to)a program,as part of a library,or as a separate external program. 6-1 SYNTAX AND SEARCH ORDER Function calls in an expression are defined syntactically as a symbol or string followed immediately by an open parenthesis. The symbol or string(taken an a literal)specifies the function name,and the open parenthesis begins the argument list. Between the opening and eventual closing parentheses are zero or more argument expressions,separated by commas,that supply tr_he data being passed to the function. For example, CENTER('title",20) ADDRESS() 'AllocMem'(256*4,1) are all valid function calls. Each argument expression is evaluated in turn and the resulting strings are passed as the argument list to the function. There is no limit to the number of arguments that may be passed to an internal function,but calls to Built-In or external functions are limited to a maximum of 15 arguments. Note that each argument expression,while ofter just a singr@KZle literal value,can include arithmetic or string operations or even other function calls. Argument expressions are evaluated from left to right. Functions can also be invoked using the CALL instruction. The syntax of this form is slightly different,and is described in Chapter 4. The CALL instruction can be used to invoke a function that may not return a value. SEARCH ORDER Function linkages in ARexx are established dynamically at the time of the function call. A specific search orI0rder is followed until a function matching the name symbol or string is found. If the specified function cannot be located, an error is generated and the expression evaluation is terminated. The full search order is: 1. Internal Functions. The program source is examined for a label that matches the function name. If a match is found,a new storage environment is created and control is transferred to the label. 2. Built-In Functions. The Build-In function library is searched for the rxram becomes fully programmable,and with even a limited set of predefined operations can be customized by the end user. This chapter discusses the ARexx command interface and examines some of the ways in which commands can be used to build programs for an external program. Such programs are ofter called "macro programs" because they implement a complex ("macro") action from a series of simpler "micro" commands. Chapter 10 has detailed information on the data structers required to imre?plement a command interface for an applications program. 5-1 COMMAND CLAUSES Syntactically,a command clause is just an expression that can't be classified as another type of clause. The actual structure of the command is dictated by the external host to which it is intended,but in most cases will follow the model of a name or letter followed by parameter data. Command names can be given as either a symbol or a string. However,it is generally safer to use a string for the name,sincerSF it can't be assigned a value or be mistaken for an instruction keyword. For example,the following might be commands for a text editor: JUMP current+10 /* advance to next */ 'insert' newstring /* blast it in */ 'TOP' /* back to the top */ Since command clauses are expressions,they are fully evaluated before being sent to the host. Any part of the final command string can be computed within the program,so virtually any sort of command structure can be created. The interpretarD0tion of the received commands depends entirely on the host application. In the simplest case the command strings will correspond exactly to commands that could be entered directly by a user. For instance,positional control(up/down)commands for a text editor would probably have identical interpretations whether issued by the user or from a program. Other commands may be valid only when issued from a macro program;a command to simulate a menu operation would probably not be entered by r^Jthe user. 43 5-2 THE HOST ADDRESS The destination for a command is determined by the current host address,which is the name of the public message port managed by an external program. ARexx maintains two implicit host addresses,a "current" and a "previous" value,as part of the program's storage environment. These values can be changed at any time using the ADDRESS instruction(or its synonym,SHELL,)and the current host address can be inspected with the ADDRESS()Built-In fuction.rg6 The default host address string is "REXX",but this can be overridden when a program is invoked. In particular,most host applications will supply the name of their public port when they invoke a macro program,so that the macro can automatically issue commands back to the host. One special host address is recognized: the string COMMAND indicates that the command should be issued directly to the underlying DOS. All other host addresses are assumed to refer to a public message port. Anr ʥZ attempt to send a commmand to a non-existent message port will generate the syntax error "Host environment not found." Single commands can be sent to a specific host without disturbing the host address settings. This is done using the ADDRESS instruction,as the following example illustrates: ADDRESS MYEDIT 'jump top' This example would send the command "jump top" to an external host named "MYEDIT." It is important to note that you cannot send commands to a host application withor 9Tut knowing the name of its public message port. Writing macro programs to communicate with two or more hosts may require some clever programming to determine whether both hosts are active and what their respective host addresses are. 5-3 THE COMMAND INTERFACE ARexx implements its command interface using the message-passing facilities provided by the EXEC operating system. Each host application must provide a public message port,the name of which is referred to as the host address. r ZϸARexx programs issue commands by placing the command string in a message packet and sending the packet to the host's message port. The program "sleeps" while the host processes the command,and awakens when the message packet returns. The entire process can be regarded as a dialogue between the host application and a macro program:the host initiates the dialogue by invoking the macro,and the macro program replies with one or more command strings. The commands that can be sent are not r Wʻlimited to simple text strings,but might be address pointers or even bit-mapped images. After it finishes processing a command,the host "replies" the message packet with a return code that indicates the status of the command. This return code is placed in the ARexx special variable RC so that it can be examined by the program. A value of zero is assumed to mean that no errors occurred,while positive values usually indicate progressively more severe error conditions. The return code r_ allows the macro program to determine whether the command succeeded and to take action if it failed,so it is important for each applictions program to document the meanings of the return codes for its commands. 44 5-4 USING COMMANDS IN MACRO PROGRAMS ARexx can be used to write programs for any host application that includes a suitable command interface. Some applications programs are designed with an embedded macro language,and may include many predefined macro commands. With rM control to the label ERROR:. The condition label must of course be defined in the program;otherwise,an immediate SYNTAX error results and the program exits. In the second form of the instruction,the tokens following SIGNAL are evaluated as an expression. An immediate interrupt is generated that transfers control to the label specified by the expression result. The instruction thus acts as a "computed goto." INTERRUPTS. Whenever an interrupt occurs,all currently active control rangr es (IF,DO,SELECT,INTERPRET,or interactive TRACE) are dismantled before the transfer of control. Thus,the transfer cannot be used to jump into the range of a DO-loop or other control structure. Only the control structures in the current environment are affected by a SIGNAL condition,so it is safe to SIGNAL from within an internal function without affecting the state of the caller's environment. SPECIAL VARIABLES. The special variable SIGL is set to the current line number whenever a rR.transfer of control occurs. The program can inspect SIGL to determine which line was being executed before the transfer. If an ERROR or SYNTAX condition causes an interrupt,the special variable RC is set to the error code that triggered the interrupt. For the ERROR condition,this code is usually an error secerity level. The SYNTAX condition will always indicate an ARexx error code. Examples: signal on error /* enable interrupt */ signal off syntax /* disable SYNTAX */ signal starVzrt /* goto START */ 4-29 THEN Usage:THEN[;] [conditional statement] The THEN instruction must be the next statement following an IF or WHEN instruction,and is valid only in that context. It tests whether the preceding expression evaluated to 1(True),in which case the conditional statement following the THEN is performed. If the expression result was a 0(False),the conditional statement is skipped. 39 Example: if i=j then say 'equal' else say 'not equal' 4-30 TRACr?K'E Usage:TRACE [symbol|string|[[VALUE] expression]] The TRACE instruction is used to set the internal tracing mode. If a symbol or string is supplied,it is taken as a literal. Otherwise,the tokens following the VALUE keyword are evaluated as an expression. The VALUE keyword can be omitted if the expression doesn't start with a symbol or string token. In either case the result string is converted to uppercase and checked first for one of the "alphabetic" options. The valid alphabeticrQ options are ALL, COMMANDS,ERRORS,INTERMEDIATES,LABELS,RESULTS,and SCAN. These can be spelled out in full or shortened to the initial character,and are described in Chapter 7. If the result doesn't match any of these options,the interpreter attempts to convert it to an integer. A conversion failure here will be reported as an error. PREFIX CHARACTERS. Two special symbol characters may precede any of the alphabetic keywords. The "?" character interactive tracing,and the "!" characterrYh controls command inhibition. These characters act as "toggles" to alternatively select and de-select the respective modes. Any number of prefix characters may precede an alphabetic option. Interactive tracing and command inhibition are described in Chapter 7. NUMERIC OPTION. If the specified trace option is a negative whole number,it is accepted as a trace suppression count. The suppression count is the number of clauses(that would otherwise be traced)to be passed over before resumr$; oing the tracing display. Suppression counts are ignored execept during interactive tracing. Examples: trace ?r /* interactive RESULTS */ trace off trace -20 /* skip 20 clauses */ 4-31 UPPER Usage:UPPER variable [variable...] The values of the variables in the list are converted to uppercase. It is not an error to include an uninitialized variable in the list,but it will be trapped if the NOVALUE interrupt has been enabled. The TRANSLATE() or UPPER() Built-In functions could rTalso be used to convert variables to uppercase,but the instruction form is more concise(and faster) if several variables are being converted. 40 Example: when='Now is the time' upper when say when /* NOW IS THE TIME */ 4-32 WHEN Usage:WHEN expression [THEN [;] [conditional statement]] The WHEN instruction is similar to the IF instruction,but is valid only within a SELECT range. Each WHEN expression is evaluated in turn and must result in a boolean value. If the result isrF+ a 1,the conditional statement is executed and control passes to the END statement that terminates the SELECT. As in the case of the IF instruction,the THEN need not be part of the same clause. Example: select; when i9 */ say fuzz /* =>0 *r(N/ say from /*=> SCEIENTIFIC */ PARSING BY POSITION. If the fields in the input string have known positions, value strings can be specified by absolute or relative positions. Relative positions are indicated by a number preceded by a "+" or "-" operator. Each positional marker updates the scan position in the string. The value assigned to a variable is the string from the current position up to,but not including, the next position in the string. 34 Example: /* assume argumer)nt is "1234567890" */ parse arg 1 a 3 b +2 1 c say a b c /* ==> 12 34 1234567890 */ PARSING WITH PATTERNS. Fields in the input string separated by specific characters or strings can be parsed using a pattern,which is matched against the input string. A pattern is specified in the template as a string token,or alternatively as a symbol enclosed in parentheses. The position in the parse string matched by the pattern determines the value strings. The pattern is removed from the inr*tput string when a match is found;this is the only parsing operation that modifies the input string. Example: check = 'one,two,three' parse var check a ',' b ',' c say a b c /* ==> one two three */ 4-20 PROCEDURE Usage:PROCEDURE [EXPOSE variable [variable...]] The PROCEDURE instruction is used within an internal function to create a new symbol table. This protects the symbols defined in the caller's environment from being altered by the execution of the function. PROCEDURE is usr+Iually the first statement within the function,although it is valid anywhere withing the function body. It is an error to execute two PROCEDURE statements within the function. EXPOSING VARIABLES. The EXPOSE subkeyword provides a selective mechanism for accessing the caller's symbol table,and for passing global variables to a function. The variables following the EXPOSE keyword are taken to refer to symbols in the caller's table. Any subsequent changes made to these variables will be r,0reflected in the caller's environment. The variables in the EXPOSE list may include stems or compound symbols,in which case the ordering of the variables becomes significant. The EXPOSE list is processed from left to right,and compound symbols are expanded based on the values in effect in the new generation. For example,suppose that the value of the symbol J in the previous gneration is 123,and that J is unitialized in the new generation. Then PROCEDURE EXPOSE J A.J will expose J anr-صd A.123,whereas PROCEDURE EXPOSE A.J J will expose A. J. and J. Exposing a stem has the effect of exposing all possible compound symbols derived from that stem. Example: fact: procedure /* a recursive function */ arg i if i <=1 then return 1 else return i*fact(i-1) 35 Usage:PULL [template] [,template...] This is a shorthand form of the PARSE UPPER PULL instruction. It reads a string from the input console,translates it to uppercase,and parses it using tr(he template. Multiple strings can be ready by supplying additional templates. The instruction will read from the console even if no template is given. Templates are described briefly with the PARSE instruction and in greater depth in Chapter 8. Example: pull first last. /* read names */ 4-22 PUSH Usage: PUSH [expression] The PUSH instruction is used to prepare a stream of data to be ready by a command shell or other program. It appends a "newline" to the result of the expressior/kless than the current DIGITS setting. NUMERIC FORM SCIENTIFIC. Specifies that numbers that require exponential notation be expressed in SCIENTIFIC notation. The exponent is adjusted so that the mantissa (for non-zero) numbers) is between 1 and 10. This is the default format. 31 NUMERIC FORM ENGINEERING. Selects ENGINEERING format for numbers that require exponential notation. ENGINEERING format normalizes a number so that its exponent is a multiple of three and the mantissa(ifr0 not 0)is between 1 and 1000. The numberic options are preserved when an internal function is called. Examples: numeric digits 12 /* precision */ numeric form scientific /* format */ 4-17 OPTIONS Usage: OPTIONS [FAILAT expression] or: OPTIONS [PROMPT expression] or: OPTIONS [RESULTS] The OPTIONS instruction is used to set various internal defaults. The FAILAT expression sets the limit at or above which command return codes will be signalled as errors,and must evaluater1Bb to an integer value. The PROMPT expression provides a string to be used as the prompt with the PULL (or PARSE PULL)instruction. The RESULTS keyword indicates that the interpreter should request a result string when it issues commands to an external host. The internal options controlled by this instruction are preserved across function calls,so an OPTIONS instruction can be issued within an internal function without affecting the callers environment. If no keyword is specified with r2s" the OPTIONS instuction,all controlled options revert to their default settings. Example: options failat 10 options prompt "Yes Boss?" options results 4-18 OTHERWISE Usage: OTHERWISE [;] [conditional statement] This instruction is valid only within the range of a SELECT instruction,and must follow the "WHEN ... THEN" statements. If none of the preceding WHEN clauses have succeeded,the statement following the OTHERWISE instruction is executed. An OTHERWISE is not mandatory withinr3,c a SELECT range. However,an error will result if the OTHERWISE clause is omitted and none of the WHEN instructions succeed. Example: select when i=1 then say 'one' when i=2 then say 'two' otherwise say 'other' end 32 4-19 PARSE Usage: PARSE [UPPER] inputsorce [template] [,template...] The PARSE instruction provides a mechanism to extract one or more substrings from a string and assign them to variables. The input string can come from a variety of sources,including arr4$?gument strings,an expression,or from the console. The template provides both the variables to be given values and the way to determine the value strings. The template may be omitted if the instruction is intended only to create the input string. The different options of the instruction are described below. INPUT SOURCES The sources for the input strings are specified by the keyword symbols listed below. When multiple templates are supplied,each template receives a new input string,r5,j although for some source options the new string will be identical to the previous one. The input source string is copied before being parsed,so the original strings are never altered by the parsing process. UPPER. This optional keyword may be used with any of the input sources,and specifies that the input string is to be translated to uppercase before being parsed. It must be the first token following PARSE. ARG. This input option retrieves the argument strings supplied when the pr6GProgram was invoked. Command invocations normally have only a single argument string, but functions may have up to 15 argument strings. Multiple templates may be given to retrieve successive argument strings. EXTERNAL. The input strings is read from the console. If multiple templates are supplied,each template will read a new string. This source option is the same as PULL. NUMERIC. The current numeric options are placed in a string in the order DIGITS,FUZZ,and FORM,separated by a sir7Ingle space. PULL. Reads a string from the input console. If multiple templates are supplied,each template will read a new string. SOURCE. The "source" string for the program is retrieved. This string is formatted as "{COMMAND | FUNCTION} {0 | 1} called resolved ext host." The first token indicates whether the program was invoked as a command or as a function. The second token is a boolean flag indicating whether a result string was requested by the caller. The called token is the nr8qame used to invoke this program,while the resolved token is the final resolved name of the program. The ext token is the file extension to be used for searching(the default is "REXX"). Finally,the host token is the initial host address for commands. VALUE expression WITH. The input string is the result of the supplied expression. The WITH keyword is required to separate the expression from the template. The expression result may be parsed repeatedly by using multiple templates,but tr#vhe expression is not reevaluated. VAR variable. The value of the specified variable is used as the input string. When multiple templates are provided,each template uses the current value of the variable. 33 This value may change if the variable is included as an assignment target in any of the templates. VERSION. The current configuation of the ARexx interpreter is supplied in the form "ARexx version cpu mpu video freq". The version toekn is the release level of the interpretr:1Onywhere within a program. The evaluated expression is passed back to the caller as the function or command result. Results Processing. The processing of the EXIT result depends on whether a result string was requested by the calling program,and whether the current invocation resulted from a command or function call. If a result string was requested,the expression result is copied to a block of allocated memory and a pointer to the block is returned as the secondary result of the calr;GDl. If the caller did not request a result string,and the program was invoked as a command,then an attempt is made to convert the expression result to an integer. This value is then returned as the primary result,with 0 as the secondary result. This allows the EXIT expression to be interpreted as a "return code" by the caller. Refer to Chapter 10 for further information on the data structures used to return the result string. Examples: exit /* no result needed */ exit 12 /* an er<j݇rror return? */ 4-11 IF Usage: IF expression [THEN] [;] [conditional statement] The IF instruction is used in conjunction with THEN and ELSE instruction to conditionally execute a statement. The result of the expression must be a boolean value. If the result is 1 (True),the statement following the THEN symbol is executed;otherwise,control passes to the next statement(which might be an ELSE clause.) The THEN keyword need not immediately follow the IF expression,but may appear as a sr=#Feparate clause. The instruction 29 is actually analyzed as "IF expression; THEN; statement;." In essence,the IF statement begins a syntactic range and establishes the test condition that determines whether subsequent THEN or ELSE clauses will be performed. Any valid statement may follow the THEN symbol;in particular,a "DO; ... END;" group allows a series of statements to be performed conditionally. Examples: if result < 0 then exit /* all done? */ 4-12 INTERPRET Usage:r>DRq INTERPRET expression The expression is evaluated and the result is executed as one or more program statements. The statements are considered as a group,as though surrounded by a "DO; ...;END" combination. Any statements can be included in the INTERPRETed source,including DO or SELECT instruction. An INTERPRET instruction activates a control range when it is executed,which serves as a "fence" for LEAVE and ITERATE instructions. These instructions can therefore be used only with DO-lr?woops defined within the INTERPRET. The BREAK instuction can be used to terminate the processing of INTERPRETed statements. While it is not an error to include label clauses within the interpreted string,only those labels defined in the original source code are searched during a transfer of control. The INTERPRET instruction can be used to solve programming problems in interesting and novel ways. Programs can be constructed dynamically and then executed using this instruction,or progr@ram fragments may be passed as arguments to functions,which then INTERPRET them. Example: inst = 'say' /* an instruction */ interpret inst hello /* ..."say HELLO" */ 4-13 ITERATE Usage: ITERATE [variable] The ITERATE instruction terminates the current iteration of a DO instruction and begins the next iteration. Effectively,control passes to the END statement and then(depending on the outcome of the UNTIL expression)back to the DO statement. The instruction normally acts on the inrAEknermost iterative DO range containing the instruction. An error results if the LEAVE instruction is not contained within an iterative DO instruction. The optional variable symbol specifies which DO range is to be exited,in the event that several nested ranges exist. The variable is taken as a literal and must match the index variable of a currently active DO instruction. An error results if no such matching DO instruction is found. 30 Example: do i=1 to 3 if i=j then iterB1rate i end 4-14 LEAVE Usage:LEAVE [variable] LEAVE forces an immediate exit from the iterative DO range containing the instruction. An error results if the LEAVE instruction is not contained within an iterative DO instruction. The optional variable symbol specifies which DO range is to be exited,in the event that several nested ranges exist. The variable is taken as a literal and must match the index variable of a currently active DO instruction. An error results if no such marC%Ntching DO instruction is found. Example: do i=1 to limit if i > 5 then leave /* maximum iterations */ end 4-15 NOP Usage: NOP The NOP or "no-operation" instruction does just that:nothing. It is provided to control the binding of ELSE clauses in compound IF statements. Example: if i=j then /* first (outer) IF */ if j=k then a=o /* inner IF */ else nop /* binds to inner IF */ else a=a+1 /* binds to outer IF */ 4-16 NUMERIC Usage: NUMERIC {DIGITS | FUZZ} exr.x(Ŏpression or: NUMERIC FORM {SCIENTIFIC | ENGINEERING} This instruction sets options relating to the numeric precision and format. The valid forms of the NUMERIC instruction are: NUMERIC DIGITS expression. Specifies the number of digits of precision for arithmetic calculations. The expression must evaluate to a positive whole number. NUMERIC FUZZ expression. Specifies the number of digits to be ignored in numeric comparison operations. This must be a positive whole number that is rE\&t called function;this process is described in Chapter 6. Example: call center name,length+4,'+' 26 Usage: DO [var=exp] [To exp] [BY exp]] [FOR exp] [FOREVER] [WHILE exp | UNTIL exp] The DO instruction begins a group of instructions to be executed as a block. The range of the DO instruction includes all statements up to and including an eventual END instruction. There are two basic forms of the instruction: The DO keyword by itself defines a block of instructions to be executrFv_7ed once. If any iteration specifiers follow the DO keyword,the block of instructions is executed repeatedly until a termination condition occurs. An interative DO instruction is sometimes called a "loop",since the interpreter "loops back" to perform the instruction repeatedly. The various parts of the DO instruction are described below. Initializer expression. An initializer expression of the form "variable= expression" defines the index variable of the loop. The expression is evarG$>gluated when the DO range is first activated,and the result is assigned to the index variable. On subsequent iterations an expression of the form "variable = variable + increment" is evaluated,where the increment is the result of the BY expression. If specified, the initializer expression must precede any of the other subkeywords. BY expression. The expression following a BY symbol defines the increment to be added to the index variable in each subsequent iteration. The expression murHNjbst yield a numeric result,which may be positive or negative and need not be an integer. The default increment is 1. TO expression. The result of the TO expression specifies the upper(or lower) limit for the index variable. At each iteration the index variable is compared to the TO result. If the increment(BY result)is positive and the variable is greater than the limit,the DO instruction terminates and control passes to the statement following the END instruction. Similarly,the looprI terminates if the increment is negative and the index variable is less than the limit. FOR expression. The FOR expression must yield a positive whole number when evaluated,and specifies the maximum number of iterations to be performed. The loop terminates when this limit is reached irrespective of the value of the index variable. FOREVER. The FOREVER keyword can be used if an iterative DO instruction is required but no index variable is necessary. Presumably the loop will be termirJ8nated by a LEAVE or BREAK instruction contained within the loop body. WHILE expression. The WHILE expression is evaluated at the beginning of each iteration and must result in a boolean value. The iteration proceeds if the result is 1;otherwise,the loop terminates. 27 UNTIL expression. The UNTIL expression is evaluated at the end of each iteration and must result in a boolean value. The instruction continues with the next iteration if the result is 0,and terminates otherwise. rKnܹ The initializer,BY,TO,and FOR expressions are evaluated only when the instruction is first activated,so the increment and limits are fixed throughout the execution. Note that a limit need not be supplied;for example,the instruction "DO i=1" will simply count away forever. Note also that only one of the WHILE or UNTIL keywords can be specified. Example: do i=1 to limit for 5 while time <50 y.1=i*time end 4-6 DROP Usage: DROP variable [variable...] The specified variable symbrLh*ols are reset to their uninitialized state,in which the value of the variable is the variable name itself. It is not an error to DROP a variable that is already uninitialized. DROPping a stem symbol is equivalent to DROPping the values of all possible compound symbols derived from that stem. Example: a=123 /* assign a value */ drop a b /* drop some */ say a b /* ==>A B */ 4-7 ECHO Usage: ECHO [expression] The ECHO instruction is a synonym for the SAY instruction. It displays trM(he expression result on the console. Example: echo "You don't SAY!" 4-8 ELSE Usage: ELSE [;] [conditional statement] The ELSE instruction provides the alternative conditional branch for an IF statement. It is valid only within the range of an IF instruction,and must follow the conditional statement of the THEN branch. If the THEN branch wasn't executed,the statement following the ELSE clause is performed. Binding. ELSE clauses always bind to the nearest(preceding)IF statement. IrN5t may be necessary to provide "dummy" ELSE clauses for the inner IF ranges of a compound IF statement in order to allow alternative branches for the outer IF statements. In this case it is not sufficient to follow the else with a semicolon or a null clause. Instead,the NOP(no-operation)instruction can be used for this purpose. 28 Example: if 1 > 2 then say 'really?' else say 'I thought so' 4-9 END Usage: END [variable] The END instruction terminates the range of a Dr9]O or SELECT instruction. If the optional variable symbol is supplied,it is compared to the index variable of the DO statement(which must therefore be iterative). An error is generated if the symbols do not match,so this provides a simple mechanism for matching the DO and END statements. Example: do i=1 to 5 /* index variable is I */ say i end i /* end "I" loop */ 4-10 EXIT Usage: EXIT [expression] The EXIT instruction terminates the execution of a program,and is valid arP¬Dgram. These resources include memory space,DOS files and related structures,and the message port structures supported by ARexx. The tracking system was designed to allow a program to "bail out" at any point(perhaps due to an execution error)without leaving any hanging resources. It is possible to go outside of the interpreter's resource tracking net by making calls directly to the Amiga's operating system from within an ARexx program. In these cases it is the programer's responsibilrQT\;ity to track and return all of the allocated resources. ARexx provides a special interrupt facility so that a program can retain control after an execution error,perform the required cleanup,and then make an orderly exit. Chapter 7 has information on the ARexx interrupt system. 24 CHAPTER 4 INSTRUCTIONS Instruction clauses are identified by an initial keyword symbol that is not followed by a colon(:)or an equals(=)operator. Each instruction signifies a specific action,and rRK`may be followed by one or more subkeywords,expressions,or other instruction-specific information. Instruction keywords and subkeywords are recognized only in this specific context,and are therefore not "reserved words" in the usual sense of the term. Keywords may be used freely as variables or function names,although such usage may become confusing at times. In the descriptions that follow,keywords are shown in uppercase and optional parts of the instruction are enclosed in bracketsrSf~. Alternative selections are separated by a vertical bar(|),and required alternative are enclosed in braces ({}). 4-1 ADDRESS Usage: ADDRESS [Symbol|string|VALUE] [expression]] This instruction specifies a host address for commands issued by the interpreter. A host address is the name associated with an external program to which commands can be sent;external hosts are described in Chapter 5. ARexx maintains two host addresses:a "current" and a "previous"address is lost,and the "currT_Nrent" and a "previous" value. Whenever a new host address is supplied, the "previous" address is lost,and the "current" address becomes the "previous" one. These host addresses are part of a program's storage environment and are preserved across internal function calls. The current address can be retrieved with the Built-In function ADDRESS(). There are four distinct forms for the ADDRESS instruction: ADDRESS {string | symbol} expression. The expression is evaluated and the result irU'JZys issued to the host specified by the string or symbol,which is taken as a literal. No changes are made to the current or previous address strings. This provides a convenient way to issue a single command to an external host without disturbing the current host addresses. The return code from the command is treated as it would be from a command clause. ADDRESS {string | symbol}. The string or symbol,taken as a literal,specifies the new host address. The current host address becomes trV>"he previous address. ADDRESS [VALUE] expression. The result of the expression specifies the new host address,and the current address becomes the previous address. The VALUE keyword may be omitted if the first token of the expression is not a symbol or string. ADDRESS. This form interchanges the current and previous hosts. Repeated execution will therefore "toggle" between the two host addresses. Examples: address edit /* set an new host address */ address edit 'top' /* move rWto the top */ address VALUE edit n /* compute a new host address */ address /* swap current and previous */ 25 Usage: ARG [template] [,template...] ARG is shorthand form for the PARSE UPPER ARG instruction. It retrieves one or more of the argument strings available to the program,and assigns values to the variables in the template. The number of argument strings available depends on the whether the program was invoked as a command or a function. Command invocations normally rXȇhave only one argument string,but functions may have up to 15. The argument strings are not altered by the ARG instruction. The structure and processing of templates is described briefly with the PARSE instruction,and in greater depth in Chapter 8. Example: arg first,second /* fetch arguments */ 4-3 BREAK Usuage: BREAK The BREAK instruction is used to exit from the range of a DO instruction or from within an INTERPRETed string,and is valid only in these contexts. If used within rYNda DO statement,BREAK exits from the innermost DO statement containing the BREAK. This contrasts with the otherwise similar LEAVE instruction,which exits only from an interative DO. Example: do /* begin block */ if i>3 then break /* all done? */ a = a + 1 y.a = name end /* end block */ 4-4 CALL Usage: CALL {symbol | string} [expression] [,expression,...] The CALL instruction is used to invoke an internal or external function. The function name is specified by the syrD g\mbol or string token,which is taken as a literal. Any expressions that follow are evaluated and become the arguments to the called function. The value returned by the function is assigned to the special variable RESULT. It is not an error if a result string is not returned; in this case the variable RESULT is DROPed(becomes uninitialized.) The linkage to the function is established dynamically at the time of the call. ARexx follows a specific search order in attempting to locate ther{[yol the given name was found,say in NAME.12,and then retrieving NUMBER.12. With compound symbols,the symbol NAME could hold the name to be looked-up,and NUMBER.NAME would then expand to NUMBER.Bill(for example),which be the corresponding number. Of course,compound symbols can also be used as conventional indexed arrays,with the added convenience that only a single assignment(to the stem)is required to initialize the entire array. 3-8 THE EXECUTION ENVIRONMENT The ARexx interpreter pr|\"rovides a uniform environment by running each program as a separate task(actually,as a DOS process)in the Amiga's multitasking operating system. This allows for a flexible interface between an external host program and the interpreter,as the host can either proceed concurrently with its operations or can simply wait for the interpreted program to finish. THE EXTERNAL ENVIRONMENT The external environment of a program includes its task(process)structure, input and output streams,and r}]ncurrent directory. When each ARexx task is created,it inherits the input and output streams and current directory from its client,the external program that invoked the ARexx program. The current directory is used as the starting point in a search for a program or data file. EXTERNAL PROGRAMS. The external environment usually includes one or more external programs with which the ARexx program may communicate. Any program that supports a suitable interface can receive commands from ARr~^h?exx programs. The command interface is discussed in Chapter 5. THE INTERNAL ENVIRONMENT The internal environment of an ARexx program consists of a static global structure and one or more storage environments. The global data values are fixed at a time the program is invoked,and include the argument strings,program source code,and static data strings. The storage environment includes the symbol table used for variable values,the numeric options,trace options,and host address stringsr_M. While the global environment is unique,there may be many storage environments during the course of the program execution. Each time an internal function is called a new storage environment is activated and initialized. The initial values for most fields are inherited from the previous environment,but values may be changed afterwards without affecting the caller's environment. The new environment persists until control returns from the function. 22 ARGUMENT STRINGS. A program r`-8may receive one or more argument strings when it is first invoked. These arguments persist for the duration of the program and are never altered. The number of arguments a program receives depends in part on the mode of invocation. ARexx programs invoked as commands normally have only one argument string,although the "command tokenization" option may provide more than one. A program invoked as a function can have any number of arguments if called as an internal function,but external rafunctions are limited to a maximum of 15 arguments. The argument strings can be retrieved using either the ARG instruction or the ARG() Built-In function. ARG() can also return the total number of arguments,or the status(as "exists" or "omitted")of a particular argument. THE SYMBOL TABLE. Every storage environment includes a symbol table to store the value strings that have been assigned to variables. This symbol table is organized as a two-level stores entries for simple and stem rb: %symbols,and the secondary level is used for compound symbols. All of the compound symbols associated with a particular stem are stored in one tree,with the root of the tree held by the entry for the stem. Symbols are not entered into the table until an assignment is made to the symbol. Once created,entries at the primary level are never removed,even if the symbol subsequently becomes uninitialized. Secondary trees are released whenever an assignment is made to the stem associated wircdth the tree. For the most part ARexx programmers need not be concerned with the details of storage environments except to understand what values are saved when a function is called. Applications developers who need to manipulate environment values should refer to the structure definitions in the INCLUDE files provided on the ARexx distribution disk. INPUT AND OUTPUT Most computer programs require some means of communicating with the outside world,either to accept input data or to rdtpass along results. The REXX language includes only a minimal specification of input and output (I/O)operations, leaving the choice of additional functionality to the language implementor. This is in keeping with the design of many computer languages. For instance,the "C" language has no statements dedicated to I/O,but instead relies on a standardized set of I/O functions. ARexx extends the I/O facilities fo REXX by providing Built-In functions to manipulate external files. Files arrO%e referenced by a logical name associated with the file when it is first opened. The initial input and output streams are given the names STDIN and STDOUT. ARexx maintains a list of all of the files opened by a program and automatically closes them when the program finishes. There is no limit to the number of files that may be open simultaneously. 23 RESOURCE TRACKING ARexx provides complete tracking for all of the dynamically-allocated resources that it uses to execute a prorpftgnd is raised to the power specified by the right operand,which must be an integer. The number of decimal places for the result is the product of the exponent and the number of decimal places in the base. Examples: 2**3 ==>8 3**-1 ==>.333333333 0.5**3 ==>0.125 MULTIPLICATION(*). The product of two numbers is computed. The number of decimal places for the result is the sum of the decimal places of the operands. Examples: 12 * 3 ==>36 1.5 * 1.50 ==>2.250 DIVISION(/). TrqgW{he quotient of two numbers is computed. The number of decimal places for the result depends on the current setting of the numeric DIGITS variable;the nuber is formatted to the maximum precision required. Examples: 6 / 3 ==>2 8 / 3 ==>2.66666667 INTEGER DIVISION(%). The quotient of two numbers is computed,and the integer part of the quotient is used as the result. Examples: 5 % 3 ==>1 -8 % 3 ==>-2 REMAINDER(//). The result is the remainder after the two operands are dirrh9kvided. The remainder for "a//b" is calculated as "a-(a%b)*b." If both operands are positive integers,this operation yields the usual "modulo" result. 19 Examples: 5 // 3 ==>2 -5 // 3 ==>-2 5.1 // 0.2 ==>0.1 ADDITION(+). The sum of two numbers is computed. The number of decimal places for the result is the larger of the decimal places of the operands. Examples: 12 + 3 ==>15 3.1 + 4.05 ==>7.15 SUBTRATION(-). The difference of two numbers is computed. As in the carsi1KKse of addition,the number of decimals places for the result is the larger of the decimal places of the operands. Examples: 12 - 3 ==>9 5.55 - 1.55 ==>4.00 CONCATENATION OPERATORS ARexx defines two concatenation operators,both of which require two operands. The first,identified by the operator sequence "||",joins two strings into a single string with no intervening blank. The second concatenation operation is identified by the blank operator,and joins the two operand strings wrtj8with one intervening blank. An implicit concatenation operator is recognized when a symbol and a string are directly abutted in an expression. Concatenation by abuttal uses the "||" operator,and behaves exactly as though the operator had been provided explicitly. Examples: 'why me,' || 'Mom?' ==>why me,Mom? 'good' 'times' ==>good times one'two'three ==>ONEtwoTHREE COMPARISON OPERATORS Comparisons are performed in one of three modes,and always result in a boolean value(0 orruk 1.) Exact comparisons proceed character-by-character,including any leading blanks that may be present. String comparisons ignore leading blanks,and pad the shorter string with blanks if necessary. 20 Numeric comparisons first convert the operands to an internal numeric form using the current Numeric Digits setting,and then perform a standard arithmetic comparison. Except for the exact equality and exact inequality operators,all comparison operators dynamically determine whetrvlher a string of numeric comparison is to be performed. A numeric comparison is performed if both operands are valid numbers otherwise,the operands are compared as strings. TABLE 3.3 COMPARISON OPERATORS SEQUENCE PRIORITY OPERATION MODE == 3 Exact Equality Exact ~== 3 Exact Inequality Exact = 3 Equality String/Numeric ~= 3 Inequality String/Numeric > 3 Greater Than String/Numeric >=,~< 3 Greater Than or Equal String/Numeric < 3 Less Than String/Numeric <=,~> rwmbX 3 Less Than or Equal String/Numeric LOGICAL (BOOLEAN) OPERATORS ARexx defines the four logical operations NOT,AND,OR,and Exclusive OR,all of which require boolean operands and produce a boolean result. Boolean operands must have values of either 0(False)or 1(True.) An attempt to perform a logical operation on a non-boolean operand will generate an error. TABLE 3.4 LOGICAL OPERATORS SEQUENCE PRIORITY OPERATION ~ 8 NOT(Inversion) & 2 AND | 1 OR ^,&& 1 Exclusive Orxn]6YR 3-7 STEMS AND COMPOUND SYMBOLS Stems and compound symbols have special properties that allow for some interesting and unusual programming. A compound symbol can be regarded as having the structure stem.n1.n2.n3...nk where the leading name is a stem symbol and each node n1...nk is a fixed or simple symbol. Whenever a compound symbol appears in a program,its name is expanded by replacing each node with its current value as a (simple) symbol. The value string may consist of any charryoi$acters,including embedded blanks,and is not converted to uppercase. The result of the expansion is a new name that is used in place of the compound symbol. For example if j has the value of 3 and k has the value 7,then the compound symbol a.j.k will expand to A.3.7. Stem symbols provide a way to initialize a whole class of compound symbols. When an assignment is made to a stem symbol,it assigns that value to all possible compound symbols derived from the stem. Thus,the value of a corzZ;mpound symbol depends on the prior assignments made to itself or its associated stem. 21 Compound symbols can be regarded as a form of "associative" or "content- addressable" memory. For example,suppose that you needed to store and retrieve a set of names and telephone numbers. The conventional approach would be to set up two arrays NAME and NUMBER,each indexed by an integer running from one to the number of entries. A number would be "looked up" by scanning the name array untiHֽjr+4 AREXX Manual!++ #qHv+rrHtq}tb+ arexx.doxpuˬ{c?}* tcopy.lzhprE AREXX TABLE OF CONTENTS AREXX USER'S REFERENCE MANUAL INTRODUCTION....................................................1 1. Organization of this Document...............................1 1 Using this Manual.........................................2 2 Typographic Conventions...................................2 2. Future Directions...........................................2 CHAPTER 1. WHAT IS AREXX?.......................................3 1. Language FeatureuHOYXWVUTSRQPOdcba`_^]\[Zonmlkjihgfe~}|{rvvHv "! -,+*)('&%$#876543210/.CBA@?>=<;:9NMLKJIHGFEDrwwH%    rxxH9yxwvuts~ryyHN'&;:987654321FEDCBA@?>=<QPONMLKJIHG\[ZYXWVUTSRgfedcba`_^]rqponmlkjih}|{zrzzHb`     %$#"! 0/.-,+*)(rqre| ression can proceed,the interpreter must obtain a value for each symbol in the expression. For fixed symbols the value is just the symbol name itself,but variable symbols must be looked up in the current symbol table. In the example above,the expression after symbol resolution would be "3 'factorial is' FACT(3)," assuming that the symbol J had the value 3. Suppose that the example above had been "FACT(J) 'is' J 'factorial'." Would the second occurrence of symbol J still resolve to 3rf}c' in this case? In general, function calls may have "side effects" that include altering the values of variables,so the value of J might have been changed by the call to FACT. In order to avoid ambiguities in the values assigned to symbols during the resolution process, ARexx guarantees a strict left-to-right resolution order. Symbol resolution proceeds irrespective of operator priority or parenthetical grouping;if a function call is found,the resolution is suspended while the functiorg~ n is evaluated. Note that it is possible for the same symbol to have more than one value in an expression. ORDER OF EVALUATION After all symbol values have been resolved,the expression is evaluated based on operator priority and subexpression grouping. Operators of higher priority are evaluated first. ARexx does not guarantee an order of evaluation among operators of equal priority,and does not employ a "fast path" evaluation of boolean operators. For example,in the expression (1rh8 = 2) & (FACT(3) = 6) the call to the FACT function will be made,although it is clear that the final result will be 0,since the first term of the AND operation is 0. 16 3-5 NUMBERS AND NUMERIC PRECISION An important class of operands are those representing numbers. Numbers consist of the characters 0-9,.+-,and blanks;an e or E may follow a number to indicate exponential notation,in which case it must be followed by a (signed) integer). Both string tokens and symbol tokens mariy be used to specify numbers. Since the language is typeless,variables do not have to be declared as "numeric" before being used in an arithmetic operation. Instead,each value string is examined when it is used to verify that it represents a number. The following examples are all valid numbers: 33 " 12.3 " 0.321e12 ' + 15.' Note that leading and trailing blanks are permitted,and that blanks may be embedded between a "+" or "-" sign and the number body(but not within the bodrj>y.) BOOLEAN VALUES The numbers 0 and 1 are used to represent the boolean values False and True, respectively. The use of a value other than 0 or 1 when a boolean operand is expected will generate an error. Any number equivalent to 0 or 1,for example "0.000" or "0.1E1," is also acceptable as a boolean value. NUMERIC PRECISION ARexx allows the basic precision used for arithmetic calculations to be modified while a program is executing. The number of significant figures used in aritrkhmetic operations is determined by the Numeric Digits environment variable, and may be modified using the NUMERIC instruction. The number of decimal places used for a result depends on the operation performed and the number of decimal places in the operands. Unlike many languages,ARexx preserves trailing zeroes to indicate the precision of the result. If the total number of digits required to express a value exceeds the current Numeric Digits setting,the number is formatted in exponrl}kuential notation. Two such formats are provided: In SCIENTIFIC notation,the exponent is adjusted so that a single digit is placed to the left of the decimal point. in ENGINEERING notation,the number is scaled so that the exponent is a multiple of 3 and the digits to the left of the decimal point range from 1 to 999. The numeric precision and format can be set using the NUMERIC instruction. 17 3-6 OPERATORS Operators can be grouped into four categories: Arithmetic operators rmytrequire one or two numeric operands,and produce a numeric result. Concatenation operators join two strings into a single string. Comparison operators require two operands,and produce a boolean(0 or 1) result. Logical Operators require one or two boolean operands,and produce a boolean result. ARITHMETIC OPERATORS The aritmetic operators are listed in Table 3.2 below. Note the inclusion of the integer division(%)and remainder(//)operators,along with the usual arithmetic operations. Trn?he result of an arithmetic operation is always foratted based on the current Numeric Digits setting,and will never have leading or trailing blanks. TABLE 3.2 ARITHMETIC OPERATORS SEQUENCE PRIORITY OPERATION + 8 Prefix Conversion - 8 Prefix Negation ** 7 Exponentiation * 6 Multiplication / 6 Division % 6 Integer Division // 6 Remainder + 5 Addition - 5 Subtraction PREFIX CONVERSION(+). This unary operator converts the operand to androe internal numeric form and formats the result based on the current Numeric Digits settings. This causes any leading and trailing blanks to be removed,and may result in a loss of precision. Examples: ' 3.12 ' ==> 3.12 1.5001 ==> 1.500 /* If digits = 3 */ PREFIX NEGATION(-). This unary operator negates the operand. The result is formatted based on the current Numeric Digits setting. 18 Examples: -' 3.12 ' ==> -3.12 1.5E2 ==>-150 EXPONENTIATION(**). The left operarZ@Bunction call. 3-3 CLAUSES Tokens are grouped together to form clauses,the smallest language unit that can be executed as a statement. Every clause in ARexx can be classified as either a null,label,assignment,instruction,or command clause. The classification process is very simple,since no more than two tokens are required to classify any clause. Assignment,instruction,and command clauses are jointly termed statements. CLAUSE CONTINUATION. The end of a source line normally acts as r[9-athe implicit end of a clause. A clause can be continued on the next source line by ending the line with a comma (,). The commas is then removed,and the next line is considered as a continuation of the clause. There is no limit to the number of continuations that may occur. String and comment tokens are automatically continued if a line end before the closing delimiter has been found,and the "newline" character is not considered to be part of the token. MULTIPLE CLAUSES. Several claur\>ses can be placed on a single line by separating them with semicolons(;). NULL CLAUSES Lines consisting only of blanks or comments are called null clauses. They have no function in the execution of a program,except to aid its readability and to increment the source line count. Null clauses may appear anywhere in a program. Example: /* perform annuity calculations */ LABEL CLAUSES A symbol followed immediately by a colon defines a label clause. A label acts as a placemarker in r]Vthe program,but no action occurs with the "execution" of a label. The colon is considered as an implicit clause terminator,so each label stands as a separate clause. Label clauses may appear anywhere in a program. Examples: start: /* begin execution */ syntax: /* error processing */ ASSIGNMENT CLAUSES Assignments are identified by a variable symbol followed by an "=" operator. In this context the operator's normal definition(an equality comparison)is overridden,and it becomes r^yan assignment operator. The tokens to the right of the "=" are evaluated as an expression,and the result is assigned to(becomes the value of)the variable symbol. 14 Examples: when= 'Now is the time' answ= 3.14 * fact(5) INSTRUCTION CLAUSES Instructions begin with certain keyword symbols,each of which denotes a particular action to be performed. Instruction keywords are recognized as such only at the beginning of a clause,and may otherwise be used freely as symbols (althougr_@h such use may become confusing at times.) The ARexx instructions are described in detail in Chapter 4. Examples: drop a b c /* reset variables */ say 'please' /* a polite program */ if j > 5 then leave; /* several instructions */ COMMAND CLAUSES Commands are any ARexx expression that can't be classified as one of the preceding types of clauses. The expression is evaluated and the result is issued as a command to an external host,which might be the native operating system orr` an application program. Commands are discussed in Chapter 5,and the details of the host command interface are given in Chapter 10. Examples: 'delete' 'myfile' /* a DOS command */ 'jump' current+10 /* an editor command? */ CLAUSE CLASSIFICATION The process by which program lines are divided into clauses and then classified is important in understanding the operation of an ARexx program. The language interpreter splits the program source into groups of clauses as the program is rra_S ead,using the end of each line as a clause separator and applying the continuation rule as required. These groups of one or more clauses are then tokenized,and each clause is classified into one of the above types. Note that seemingly small syntactic differences may completely change the semantic content of a statement. For example, SAY 'Hello, Bill' is an instruction clause and will display "Hello, Bill" on the console,but ""SAY 'Hello, Bill' is a command clause,and will issurb]e "SAY Hello, Bill" as a command to an external program. The presence of the leading null string changes the classification from an instruction clause to a command clause. 15 3-4 EXPRESSIONS Expression evaluation is an important part of ARexx programs,since most statements include at least one expression. Expressions are composed of strings,symbols,operators,and parentheses. Strings are used as literals in an expression;their value in an operation is just the string itself. Firc.xed symbols are also literals(remember that symbols are always translated to uppercase,) but variable symbols may have an assigned value. Operator tokens represent the predefined operations of ARexx;each operator has an associated priority that determines the order in which operations will be performed. Parentheses may be used to alter the normal order of evaluation in the expression,or to identify function calls. A symbol or string followed immediately by an open parenthesis definesrd{9Y9, the function name,and the tokens between the opening and(final)closing parenthesis form the argument list for the function. For example,the expression "J 'fractorial is' fact(J)" is composed of a symbol J,a blank operator,the string 'factorial is',another blank,the symbol fact,an open parenthesis,the symbol J again,and a closing parenthesis. FACT is a function name and (J) is its argument list,in this case the single expression J. SYMBOL RESOLUTION Before the evaluation of an exprO{L the language are called tokens. A token may be series of characters,as in the symbol MyName,or just a single character like the "+" operator. Tokens can be categorized into comments, symbols,strings,operators,and special characters. Each of these groups are described below. COMMENT TOKENS Any group of characters beginning with the sequence "/*" and ending with "*/" defines a comment token. Comments may be placed anywhere in a program and cost little in terms of execution speed,sinrP'ce they are stripped(removed)when the program is first scanned by the interpreter. Comments may be "nested" within one another,but each "/*" must have a matching "*/" in the program. Examples: /* Your basic comment */ /* a /* nested! */ comment */ SYMBOL TOKENS Any group of the characters a-z,A-Z,0-9,and .!?$_defines a symbol token. Symbols are translated to uppercase as the program is scanned by the interpreter,so the symbol MyName is equivalent to MYNAME. Four types of rQ?symbols are recognized: Fixed symbols begin with a digit (0-9) or a period(.). Simple symbols do not begin with a digit,and do not contain any periods. Stem symbols have exactly one period at the end of the symbol name. Compound symbols include one or more periods in the interior of the name. Stems and compound symbols have special properties that make them useful for building arrays and lists. 11 SYMBOLS VALUES. The value used for a fixed symbol is always the symbol narR%rme itself(as translated to uppercase.) Simple,stem,and compound symbols are called variables and may be assigned a value;the value used for an uninitialized variable is just the variable name itself. Examples: 123.45 /*a fixed symbol */ MyName /*same as MyName */ a. /*a stem symbol */ a.1.Index /*a compound symbol */ STRING TOKENS A group of characters beginning and ending with a quote (')or double quote(") delimiter defines a string token. The delimiter character itself rS'Smay be included within the string by a double-delimiter sequence (" or ""). The number of characters in the string is called its length,and a string of length zero is called a null string. A string is treated as a literal in an expression;that is,its value is just the string itself. Strings followed immediately by an "X" or "B" character that is not part of a longer symbol are classified as hex or binary strings,respectively,and must be composed of hexadecimal digits(0-9,A-F) or binrTY\ary digits(0,1). Blanks are permitted at byte boundaries for added readability. Hex and binary strings are convenient for specifying non-ASCII characters and for machine-specific information like addresses in a program. They are converted immediately to the "packed" internal form. Examples: "Now is the time" /*a simple example */ "" /*a null string */ 'Can't you see??' /*Can't you see?? */ '4A 3B CO'X /*a hex string */ '00110111'b /*binary for '7' */ OPERATORS The characrUkters +-*/=><*| may be combined in the sequences shown in Table 3.1 to form operator tokens. Operator sequences may include leading,trailing,and embedded blanks,all of which are removed when the program is scanned. In addition to the above characters,the blank character as a concatenation operator if it follows a symbol or string and is not adjacent to an operator or special character. Each operator has an associated priority that determines the order in which operations will be perrVGsformed in an expression. Operators with higher priorities before those with lower priorities. 12 TABLE 3.1 OPERATOR SEQUENCES SEQUENCE PRIORITY OPERATOR DEFINITION 8 Logical NOT + 8 Prefix Conversion - 8 Prefix Negation ** 7 Exponentiation * 6 Multiplication / 6 Division % 6 Integer Division // 6 Remainder + 5 Addition - 5 Subtration || 4 Concatenation (blank) 4 Blank Concatenation == 3 Exact Equality ~== 3 Exact IrWGpnequality = 3 Equality ~= 3 Inequality > 3 Greater Than >=,~< 3 Greater Than or Equal To < 3 Less Than <=,~> 3 Less Than or Equal To & 2 Logical AND | 1 Logical Inclusive OR ^,&& 1 Logical Exclusive OR SPECIAL CHARACTER TOKENS The characters :():,are each treated as a separate special character token and have particular meanings within an ARexx program. Blanks adjacent to these special characters are removed,except for those preceding an open parrX6enthesis or following a close parenthesis. COLON (:). A colon,if preceded by a symbol token,defines a label within the program. Lavels are locations in the program to which control may be transferred under various conditions. OPENING AND CLOSING PARENTHESES (()). Parentheses are used in expressions to group operators and operands into subexpressions,in order to override the normal operator primorities. An open parenthesis also serves to identify a function call within an expressionrYZ;a symbol or string followed immediately by an open parenthesis defines a function name. Parentheses must always be balanced within a statement. SEMICOLON (;). The semicolon acts as a program statement terminator. Several statements may be placed on a single source line if separated by semicolons. 13 COMMA (,). A comma token acs as the continuation character for statements that must be entered on several source lines. It is also used to separate the argument expressions in a frDIis run,so the symbol say here is equivalent to SAY. Following say is an example of a string,which is a series of characters surrounded by quotes ('). Double quotes (") could also have been used to define the string. In the next program we'll display a prompt for input and then read some information from the user. /* Calculate age in days */ say 'Please enter your age' pull age say 'You are about' age*365 'days old' This program uses the pull instruction to read a line of inputrE: into a variable called age,which is then used with a say instuction. Variables are symbols that may be assigned a value. The words following say form an expression in which strings are joined and an arithmetic calculation is performed. Note that the variable age did not have to be declared as a number;instead,its value was checked when it was actually used in the expression. To see what would happen if age wasn't a number,try rerunning the program with a non-numeric entry for the arF+"ge. The resulting error message shows the line number and type of error that occurred,after which the program ends. 7 The next program introduces the do instruction,which allows program statements to be executed repeatedly. It also illustrates the exponentiation operator, which is used to raise a number to an integral power. /* Calculate some squares and cubes */ do i = 1 to 10 /* 10 interations */ say i i**2 i**3 /* calculations */ end say ' all rG6gdone ' The do instruction causes the statements between the do and end instructions to be executed 10 times. The variable i is the index variable for the loop,and is incremented by 1 for each iteration. The number following the symbol to is the limit for the do instruction,and could have been a full expression rather than just the constant 10. Note that the statements within the loop have been indented. This is not required by the language,but it makes the program more readable and rHpis therefore good programming practice. The subject of the next example is the if instruction,a often-used control statement that allows statements to be conditionally executed. The numbers from 1 to 10 are classified as even or odd by dividing them by 2 and then checking the remainder. /* Even or odd? */ do i = 1 to 10 if i//2 = 0 then type = 'even' else type = 'odd' say i 'is' type end This example intoduces the // arithmetic operator,which calculatrIes the remainder after a division operation. The if instruction tests whether the remainder is 0 and executes the then branch if it is,thereby setting the variable type to "even." If the remainder was not 0,the alternative else branch is executed and type is set to "odd." The next example introduces the concept of a function,which is a group of statements that can be executed by mentioning the function name in a suitable context. Functions are an important part of most programming lrJ$yanguages,as they allow large,complex programs to be built from smaller modules. Functions are specified in an expression as a name followed by an open parenthesis. One or more expressions called arguments may follow the parenthesis;these are used to pass information to the function for processing. 8 /* Defining and calling a function */ do i = 1 to 5 say i square(i) /* call square */ end exit /* all done */ square: /* function name rKUHX */ arg x /* get the "argument" */ return x**2 /* square it and return*/ The function square is defined in the lines followed the label square: up through the return instruction. Two new instructions are introduced here: arg retrieves the value of the argument string,and return passes the functon's result back to the point where the function was called. One final example will suffice for now. A new instruction called trace is used here to activate the tracing features ofrL,n ARexx. /* Demonstrate "results" tracing */ trace results sum=0;sumsq=0; do i = 1 to 5 sum = sum + i sumsq = sumsq + i**2 end say 'sum=' sum 'sumsq=' sumsq When this program is run,the console displays the source lines as they are excuted,and shows the final results of expressions. This makes it easy to tell what the program is really doing,and helps reduce the time required to develop and test a new program. One minor point is illustrated here: the third line showrM>w,s two distinct statements separated by a semicolon (;). The semicolon is an example of a special character,characters that have particular meanings within ARexx programs. The following chapters will present further information on the language statements illustrated here and will introduce others that have not been shown. Take heart,though;ARexx is a "small" language and there are relatively few words and rules to learn. 9 THERE WAS NO PAGE 10 ELEMENTS OF THE LANGUAGE ThisrN: chapter introduces the rules and concepts that make up the REXX language. The intent is not to present a formalized definition,but rather to convey a practical understanding of how the language elements "fit together" to form programs. 3-1 FORMAT ARexx programs are compossed of ASCII characters and may be created using any text editor. No special formatting of the program statements is required or imposed on the programmer. 3-2 TOKENS The smallest distinct entities or "words" ofr9T_Commmand Line Interface (CLI)environment on the Amiga. INSTALLATION The ARexx language system consists of a shared library,a resident program,and several command utilities. All of the required files are contained in the :c and :libs directories of the distribution disk. ARexx may be installed on any of the system disks with which it will be used,but first check the :c and :libs directores of each disk to make sure that there are no naming conflicts. The following steps will then inr:^_Rstall ARexx on the system disk,provided that two disk drives are available: 1. Activate a CLI window. 2. Copy the ARexx :libs directory to the system LIBS: directory with the command "copy df1:libs to libs:". 3. Copy the ARexx :c directory to the system C: directory with the command "copy df1:C to c:". SINGLE DRIVE SYSTEMS. Installing software in a single-drive system can be very confusing,so an installation utility has been provided with the ARexx distribution disk. It copies the r;48m^:c and :libs directories of the distribution disk into memory,and then prompts the user to insert each disk that is to receive the files. Follow these steps to run the installation utility: 5 1. Activate a CLI window. 2. Insert the distribution disk into drive 0 and type "df0:rxinstall". 3. At the program prompt,insert the system disk on which ARexx is to be installed into drive 0. 4. Repeat step 3 as required. STARTING THE RESIDENT PROCESS ARexx programs are launched by a bar<4 nckground program called the resident process. It can be started by issuing the command rexxmast and must be active before any ARexx programs can be run. The rexxmast program briefly displays a small window to announce itself,and then disappears into the background to await your next request. If you will be using ARexx frequently,you can place the rexxmast command in the "startup-sequence" file that resides in the system S: directory. This will start the resident process automaticallyr=<' when you reboot the computer. After the resident process has been loaded,ARexx programs can be run from the CLI by typing the command rx followed by the program name and any arguments. For example,the sample program calc.rexx,which evaluates an expression,could be run by typeing "rx :rexx/calc 1+1." You may not need to start up the resident process if you are using a software package that starts it automatically. Applications that use ARexx can test whether the resident process isr>1HJ active by checking for a public message port named "REXX." If the port hasn't been opened,the program can issue the rexxmast command directly. The resident process can be closed using the command rxc;it will then exit as soon as the last ARexx program finishes execution. Unless you are very short on memory space,there is usually no reason to close ARexx,as it simply waits in the background for the next program to run. NAMING CONVENTIONS ARexx programs can be named anything,but adr?JBopting a simple naming convention will make managing the programs much easier. Programs to be run from the CLI are usually given the file extention .rexx to distinguish them from programs written in other languages. Programs written as "macros" or "scripts" for a particular applications program should be given a file extension specific to that program. For example,a macro written for a communications program called "MyComm" might be named "download.myc". ARexx uses this file extentior@QaCn when it searches for a program file to be executed. THE REXX: DIRECTORY You can designate one directory as the system-wide source for ARexx programs by defining a REXX: "device" with the assign command. This directory should reside on a volume that is usually mounted,such as SYS: or a hard disk. For example, the command "assign rexx: sys:rexx" defines the REXX: device as the :rexx directory on the system disk. Once defined,the REXX: device is searched after the current directoryrAV` when looking for an ARexx program. 6 2-2 PROGRAM EXAMPLES Before introducing the structure and syntax of the language,let's look at a few examples of ARexx programs. Readers familiar with other high-level programming languages should find many points of similarity between ARexx and other languages. In the examples that follow,new terms are highlighted in the text as they are introduced,and will be convered in depth in the next few chapters. These short programs can be createrB}Md using any text editor and then run from the Command Line Interface (CLI),or may simply be read as samples of the language. If the examples are to be run,first complete the installation procedures outlined in the previous section,and then start the ARexx resident process. Example programs can then be run by entering,for example,"rx age" at the CLI prompt. We'll begin with a "Hello,World" program that simply displays a message on the console screen. /* A simple program */ say 'HerCfllo,World' This program consists of a comment line that describes the program and an instruction that displays text on the console. For historical reasons, ARexx programs begin with a comment line;the initial "/*" says "I'm an ARexx program" to the interpreter when it searches for a program. Instructions are language statements that denote a certain action to be performed,and always start with a symbol,in this case the word say. Symbols are translated to uppercase when the program r.[hat you think would be of interest to a more general audience,please send it to the author for consideration. Programs should be of interest either in terms of their specific funtionality or as an example of programming technique. Each program submitted should include an author credit and a few lines of commentary on its intended fuction. 2 ARexx is a high-level language useful for prototyping,software integration,and general programming tasks. It is an implementation of the REr/Z-XX language described by M.F. Cowlishaw in The REXX Language:A Practical Approach to Programming(Prentice-Hall,1985),and follow the language definition closely. ARexx is particularly well suited as a command language. Command programs, sometimes called "scripts" or "macros",are widely used to extend the predefined commands of an operating system or to customize an applications program. As a programming language,ARexx can be useful to a wide cross section of users. For the novice pror0^!ugrammer,ARexx is an easy-to-learn yet powerful language that serves as a good introduction to programming techniques. Its source-level debugging facilities will help take some of the mystery out of how programs work(or don't work,as is more frequently the case.) For the more sophisticated user,ARexx provides the means to build fully integrated software packages,combining different applications programs into an environment tailored to their needs. A common command language among applr1Eications that support ARexx will bring uniformity to procedural interfaces, much as the Amiga's Intuition provides uniformity in the graphical interface. Finally,for the software developer,ARexx offers a straightforward way to build fully programmable applications programs. Developers can concentrate their efforts on making the basic operations of their programs fast and efficient,and let the end user add the frills and custom features. 1-1 LANGUAGE FEATURES Some of the important r2%features of the language are: TYPELESS DATA. Data are treated as typeless character strings. Variables do not have to be declared before being used,and all operations dynamically check the validity of the operands. COMMAND INTERFACE. ARexx programs can issue commands to external programs that provide a suitable command interface. Any software package that implements the command interface is then fully programmable using ARexx,and can be extended and customized by the end user. TRAr3.HCING AND DEBUGGING. ARexx includes source-level debugging facilities that allow the programmer to see the step-by-step actions of a program as it runs, thereby reducing the time required to develop and test programs. An internal interrupt system permits special handling of errors that would otherwise cause the program to terminate. 3 INTERPRETED EXECUTION. ARexx programs are run by an interpreter,so separate compilation and linking steps are not required. This makes it especialr4ly useful for prototyping and as a learning tool. FUNCTION LIBRARIES. External function libraries can be used to extend the capabilities of the language or as bridges to other programs. Libraries also allow ARexx programs to be used as "test drivers" for software development and testing. AUTOMATIC RESOURCE MANAGEMENT. Internal memory allocation related to the creation and destruction of strings and other data structures is handled automatically. 1-2 AREXX ON THE AMIGA ARexx was dr5}UDesigned to run on the Amiga,and makes use of many of the features of its multitasking operating system. ARexx programs run as separate tasks and may communicate with each other or with external programs. The interpreter follows the design guidelines expected of well-behaved programs in a multitasking environment: specifcally,it uses as little memory as possible and is careful to reutrn resources to the operating system when they are no longer needed. Memory requirements were minimizer6Fd by implementing the entire ARexx system as a shared library,so that only one copy of the program code must be loaded. 1-3 FURTHER INFORMATION The aforementioned book by M.F. Cowlishaw is highly recommended to those interested in further information about REXX. It presents an interesting discussion of the design and development of the language. 4 CHAPTER 2 GETTING ACQUAINTED This chapter explains how to install ARexx on your Amiga computer and shows some example programsr7bZ,. 2-1 INSTALLING AREXX ARexx requires an Amiga computer with at least 256k of memory,and will operate under V1.1 or V1.2 of the operating system. It uses the double-precision math library called "mathieeedoubbas.library" that is supplied with the Amiga WorkBench disk,so make sure that this file is present in your LIBS: directory. The distribution disk includes the language system,some example programs,and a set of the INCLUDE files required for integrating ARexx with other softwarer8 packages. The distribution files are listed in Appendix E. AREXX AND WORKBENCH ARexx can be installed and loaded from within the icon-based environment provided by the Amiga WorkBench. However,it is a primarily a text-oriented language system and requires a good text editor and file management environment to be most effective. Unless you purchased ARexx as part of an applications package that includes an integrated editor,you'll probably find it useful to become familiar with the r#wH....................129 10 STATEF()................................................130 11 WAITPKT()...............................................130 APPENDIX E. DISTRIBUTION FILES................................131 1 Directories................................................131 1 The :C Directory.........................................131 2 The :INCLUDE Directory...................................131 3 The :LIBS Directory......................................132 r$Ƽ 4 The :REXX Directory......................................132 5 The :TOOLS Directory.....................................132 6 Miscellaneous Files......................................132 2 Listings of Header Files...................................133 1 storage.h................................................133 2 rxslib.h.................................................139 3 rexxio.h.................................................142 4 errors.h...............r%V2..................................144 GLOSSARY......................................................147 INDEX.........................................................151 vi INTRODUCTION Welcome to ARexx,an implementation of the REXX language for the Amiga computer. ARexx is a powerful programming took,but one which by virtue of its clean syntax and sparse vocabulary is also easy to learn and easy to use. 1 ORGANIZATION OF THIS DOCUMENT This document will attempt to filr&85?l the roles of User's Manual,Language Reference,and Programmer's Guide. The chapters that follow have been organized to provide a gently introduction to the language. Chapter 1,What is ARexx?,gives an overview of the ARexx language and its implementation of the Amiga. Chapter 2,Getting Acquainted,tells how to install ARexx on your Amiga and presents several example programs to illustrate the features of the language. Chapter 3,Elements of the Language,introduces the language strucr'U2ture and syntax. Chapter 4,Instructions,describes the action statements of ARexx. Chapter 5,Commands,describes the program statements used to communicate with external programs. Chapter 6,Functions,explains how functions are called and documents the Built- In Function library. Chapter 7,Tracing and Interrupts,describes the source level debugging features useful for developing and testing programs. Chapter 8,Parsing and Templates,describes the instructions used to extract words or(?}r fields from strings. Chapter 9,The Resident Process,describes the capabilities of the global communications and resources manager. Chapter 10,Interfacing to ARexx,describes how to design and implement an interface between ARexx and an external program. Appendix A,Error Messages,lists the error messages issued by the interpreter. Appendix B,Limits and Compatibility,discusses the compatibility of ARexx with the language standard. Appendix C,The ARexx Systems Library,documents thr)?N~e functions of ARexx systems library. Appendix D,The Support Library,documents the library of Amiga specific functions. Appendix E,Distribution Files,lists the files on the distribution disk. Finally,a Glossary and an Index are provided. 1 USING THIS MANUAL If you are new to the REXX language,or perhaps to programming itself,you should review chapters 1 through 4 and then play with ARexx by running some of the sample programs given in chapter 2. Further examples are availabr*Yle in the :rexx directory of the distribution disk. If you are already familiar with REXX you may wish to skip directly to chapter 5,which begins to present some of the system-dependent features of this implementation. A summary of the compatibility of ARexx with the language definition is contained in Appendix B. TYPOGRAPHIC CONVENTIONS Describing a language is sometimes difficult because of the multiple and changing contexts involved. To help clarify the presentation here,a simpr+#vʇj>QuHAZ̑4_9TCW#؝2LFÊ8p6c͍wMIѭ\xҼAy8V1R%&<~:#83*_C: 3 *zb=> M%3}c`mte@Foj /Z{jp6]>2a F`Deyk"G4\,BVd,!2"3 byCV ,;Dnp[g J(JsXwv{Ӽ&٩pz՞Mx.n;9q^3B MQJ\WՈL_::`|]/\tOkסNH!~1kE?Υ$DetI"@vuw"|IL\{йB-E#iwOe RH;9lIxMx^K2~,?;kT ?kXv.h@*xU3WuJohR Or mUs]tU WnipѨ;_>LXGK2.jB$BB%y+BQ$s94ZdpSS虤,3otB)(A9'&q6>,4cQ5hZhWl UVW'S@@%O5P0h: gۈخ?:0x/w^5wKDO^j_%P"!&jݠ8} Nf? >4}+3ZhSĄ&o~dj19'&#n*΅O$ZD<4*~{حA@f&;-(@Qcfk.,Ho_%8hGAv2,O$BJ6:%gF }O~s|L: wy uDx|!uSS0zL! 7Fu!Ɨo}g?bgm@[].N1R\}=`3vH"~H B y.mb<9;/o4 ΀QW;0$]꠯Ő\2ՆԽL==9eBsS<|<`^Xk۠Zދv&5~]M һjFK`׫_Pa{$볡X[oY#^}yr'7ጕO@eW  'b%i}" sErL@x}}L.I۬0F~O{iyovy'VH x]CH+}hcuBrԗP!ԃ[ON "!6b~RLbwg$"+}`ZV tr 9iΐ=׈0 ڍDr>"az1"q[ghrT5s:C[jih4^b\patool-1.4/tests/data/t.ape.foo000066400000000000000000000050701221117163600164450ustar00rootroot00000000000000MAC 4, k:g͑ D|RIFFWAVEfmt DXdata)n:[Lvʇj>QuHAZ̑4_9TCW#؝2LFÊ8p6c͍wMIѭ\xҼAy8V1R%&<~:#83*_C: 3 *zb=> M%3}c`mte@Foj /Z{jp6]>2a F`Deyk"G4\,BVd,!2"3 byCV ,;Dnp[g J(JsXwv{Ӽ&٩pz՞Mx.n;9q^3B MQJ\WՈL_::`|]/\tOkסNH!~1kE?Υ$DetI"@vuw"|IL\{йB-E#iwOe RH;9lIxMx^K2~,?;kT ?kXv.h@*xU3WuJohR Or mUs]tU WnipѨ;_>LXGK2.jB$BB%y+BQ$s94ZdpSS虤,3otB)(A9'&q6>,4cQ5hZhWl UVW'S@@%O5P0h: gۈخ?:0x/w^5wKDO^j_%P"!&jݠ8} Nf? >4}+3ZhSĄ&o~dj19'&#n*΅O$ZD<4*~{حA@f&;-(@Qcfk.,Ho_%8hGAv2,O$BJ6:%gF }O~s|L: wy uDx|!uSS0zL! 7Fu!Ɨo}g?bgm@[].N1R\}=`3vH"~H B y.mb<9;/o4 ΀QW;0$]꠯Ő\2ՆԽL==9eBsS<|<`^Xk۠Zދv&5~]M һjFK`׫_Pa{$볡X[oY#^}yr'7ጕO@eW  'b%i}" sErL@x}}L.I۬0F~O{iyovy'VH x]CH+}hcuBrԗP!ԃ[ON "!6b~RLbwg$"+}`ZV tr 9iΐ=׈0 ڍDr>"az1"q[ghrT5s:C[jih4^b\patool-1.4/tests/data/t.arc000066400000000000000000000001001221117163600156500ustar00rootroot00000000000000t.txtX@VBv42t2.txtX@VBv42patool-1.4/tests/data/t.arc.foo000066400000000000000000000001001221117163600164320ustar00rootroot00000000000000t.txtX@VBv42t2.txtX@VBv42patool-1.4/tests/data/t.arj000066400000000000000000000001721221117163600156700ustar00rootroot00000000000000`)" OOt.arjD`7. Z4~K$2O핾Ot/t.txt"42`patool-1.4/tests/data/t.arj.foo000066400000000000000000000001721221117163600164520ustar00rootroot00000000000000`)" OOt.arjD`7. Z4~K$2O핾Ot/t.txt"42`patool-1.4/tests/data/t.cab000066400000000000000000000001161221117163600156370ustar00rootroot00000000000000MSCFN,DS<> t\t.txt0442patool-1.4/tests/data/t.cab.foo000066400000000000000000000001161221117163600164210ustar00rootroot00000000000000MSCFN,DS<> t\t.txt0442patool-1.4/tests/data/t.chm000066400000000000000000000323021221117163600156630ustar00rootroot00000000000000ITSF`,=C |{ "|{ "`xT4ITSPT  j].!"TPMGL //#IDXHDR(/#ITBITS/#IVB0$ /#STRINGS-/#SYSTEM/#TOPICS(P/#URLSTR/#URLTBLx /#WINDOWSdL /$FIftiMains5 /$OBJINSTX/$WWAssociativeLinks//$WWAssociativeLinks/PropertyT/$WWKeywordLinks//$WWKeywordLinks/BTreeL/$WWKeywordLinks/DataiA/$WWKeywordLinks/Map* /$WWKeywordLinks/Property4 /back.gifSR /contents.gif d /cshelp.txtTI/doc.hhc0./doc.hhk^+/doc.htmYs /doc1.htmL. /doc2.htmz2 /doc3.htm,8 /doc4.htmdE /doc5.htm) /forward.gif%?/up.gifmf::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content(,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableF0 q:' Uncompressed MSCompressed{7FC28940-9D31-11D0iLZXC %\9 HHA Version 4.74.8702$ `doc.htm Help DemodocdocHelpQ&  T#SM  !ew5_vT'?vS1Ɲ,ٽw7sr92zj! II()T($R83}ߛU.$>6srVsỴܛ[כmrέ3 xi%#XIjri'{ -3[rX `Q0Ma4'u^@ YN&gg". SҮem#,~Z\>6 )LpWօ;U%,LRN:R} Ɣn)*lw[Ya Q[a\_FT q(A8lUG'5j7I..in _rUyA\m'mJ )o ̨Σ?|c^>{.- ЌRnig9rlh:)6+7qq9j˜Gmcw7ʫ9a>6yɥmv  _}M^W>i&S'6wj #ԩcd񴹩Y5BdpU`ܹ允j2V*4*ܹk\9b\fˠy?k)0}^5MyСU&gӠEA+uc1tvKi 宋ROۑl1äLOJUP'Fb5 YвlW>6CYKM,MqgQNQhw89c;:\k)E1.!EHW sNY&pc* ۜST (#MUs}6&0zQx*/->L_Pof\Eb);sas\8TP΁%~2b GSSb( fN$tľۚ[X5K#O^m!vSo {A2hȁmv{!; 9fذ%m疙C*< pW٢?>< z<ݎkDơG*ߓBޏp-А5VڢWu-gCA4ssz'[pIyv#(m?nh65?oNw[6zWv[sR&c2DߊZ.VGP>,;AW!OIm֓Iq'3O$mؿIqIu^m(S&EMTM*G/{|Y޿G1:z[)|f\qv@D(T/IK$S90ICOTtr'Mˆw"ι]$ [FrO }B Ȗ@ ;ĈbNC{fI<Cz [Ujpou1 հ=o]^ ( K4=ڪ=TR֯:"jkZv5J;Ik~oqERo~%O_uߛu7I7A7CXbUT !m:Kq;3l.9-ˊ{S{-Uz.<Ǔ5e7n](ޯRi(1Ŷ/OQOmcWn&X-F5ɯl]BuXeGn`  5k|{AnpR^* x $h|]IԯI`OJ"`I36F4Q#x-!X-%4 N?ΥޜogZk@G V?J= W;_P]x;5Zmbei.S& duu')F=*G}QLN* TT$$Z܎ 70NZ\9[n\sUU+'gD g&Z_&w!$V{\+\8rI7qM}b/]JïĭW6U,a;ó,!'V;}a"+;8vwr7_lQY"l,4T8".hY٬3g ³g7Z魰Mj8G!1aK]II%i[m>TFn57qbk[sU7DݴFGq`+s ]M~KD^UGO$K׭/p <KPx{{]NgPO| !5BK'&ЃipʔfzAb2m7qW^a/j]^hN9lkR5;9K0 }=3j QߴfPL235']HȀ fi EYW!_Ws)c =pڅ YjA!h&vVPCygFlfxz?7D7u A[ ĚAxgUYTT: M)5p1&u#z"/)וCRA ?)_ɋU? 5q3nbS$Zj2dI {!֮f+15Hf 4:BIBD{ ~o" pA{<њ>-Q~VejU+G8l~hnzL\kϾ?ƿS}_=x?<H33.ʱPfrj@@ @@ ((ipatool-1.4/tests/data/t.chm.foo000066400000000000000000000323021221117163600164450ustar00rootroot00000000000000ITSF`,=C |{ "|{ "`xT4ITSPT  j].!"TPMGL //#IDXHDR(/#ITBITS/#IVB0$ /#STRINGS-/#SYSTEM/#TOPICS(P/#URLSTR/#URLTBLx /#WINDOWSdL /$FIftiMains5 /$OBJINSTX/$WWAssociativeLinks//$WWAssociativeLinks/PropertyT/$WWKeywordLinks//$WWKeywordLinks/BTreeL/$WWKeywordLinks/DataiA/$WWKeywordLinks/Map* /$WWKeywordLinks/Property4 /back.gifSR /contents.gif d /cshelp.txtTI/doc.hhc0./doc.hhk^+/doc.htmYs /doc1.htmL. /doc2.htmz2 /doc3.htm,8 /doc4.htmdE /doc5.htm) /forward.gif%?/up.gifmf::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content(,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableF0 q:' Uncompressed MSCompressed{7FC28940-9D31-11D0iLZXC %\9 HHA Version 4.74.8702$ `doc.htm Help DemodocdocHelpQ&  T#SM  !ew5_vT'?vS1Ɲ,ٽw7sr92zj! II()T($R83}ߛU.$>6srVsỴܛ[כmrέ3 xi%#XIjri'{ -3[rX `Q0Ma4'u^@ YN&gg". SҮem#,~Z\>6 )LpWօ;U%,LRN:R} Ɣn)*lw[Ya Q[a\_FT q(A8lUG'5j7I..in _rUyA\m'mJ )o ̨Σ?|c^>{.- ЌRnig9rlh:)6+7qq9j˜Gmcw7ʫ9a>6yɥmv  _}M^W>i&S'6wj #ԩcd񴹩Y5BdpU`ܹ允j2V*4*ܹk\9b\fˠy?k)0}^5MyСU&gӠEA+uc1tvKi 宋ROۑl1äLOJUP'Fb5 YвlW>6CYKM,MqgQNQhw89c;:\k)E1.!EHW sNY&pc* ۜST (#MUs}6&0zQx*/->L_Pof\Eb);sas\8TP΁%~2b GSSb( fN$tľۚ[X5K#O^m!vSo {A2hȁmv{!; 9fذ%m疙C*< pW٢?>< z<ݎkDơG*ߓBޏp-А5VڢWu-gCA4ssz'[pIyv#(m?nh65?oNw[6zWv[sR&c2DߊZ.VGP>,;AW!OIm֓Iq'3O$mؿIqIu^m(S&EMTM*G/{|Y޿G1:z[)|f\qv@D(T/IK$S90ICOTtr'Mˆw"ι]$ [FrO }B Ȗ@ ;ĈbNC{fI<Cz [Ujpou1 հ=o]^ ( K4=ڪ=TR֯:"jkZv5J;Ik~oqERo~%O_uߛu7I7A7CXbUT !m:Kq;3l.9-ˊ{S{-Uz.<Ǔ5e7n](ޯRi(1Ŷ/OQOmcWn&X-F5ɯl]BuXeGn`  5k|{AnpR^* x $h|]IԯI`OJ"`I36F4Q#x-!X-%4 N?ΥޜogZk@G V?J= W;_P]x;5Zmbei.S& duu')F=*G}QLN* TT$$Z܎ 70NZ\9[n\sUU+'gD g&Z_&w!$V{\+\8rI7qM}b/]JïĭW6U,a;ó,!'V;}a"+;8vwr7_lQY"l,4T8".hY٬3g ³g7Z魰Mj8G!1aK]II%i[m>TFn57qbk[sU7DݴFGq`+s ]M~KD^UGO$K׭/p <KPx{{]NgPO| !5BK'&ЃipʔfzAb2m7qW^a/j]^hN9lkR5;9K0 }=3j QߴfPL235']HȀ fi EYW!_Ws)c =pڅ YjA!h&vVPCygFlfxz?7D7u A[ ĚAxgUYTT: M)5p1&u#z"/)וCRA ?)_ɋU? 5q3nbS$Zj2dI {!֮f+15Hf 4:BIBD{ ~o" pA{<њ>-Q~VejU+G8l~hnzL\kϾ?ƿS}_=x?<H33.ʱPfrj@@ @@ ((ipatool-1.4/tests/data/t.cpio000066400000000000000000000010001221117163600160350ustar00rootroot00000000000000q `A~K4tq ~KZ4t/t.txt42q TRAILER!!!patool-1.4/tests/data/t.cpio.foo000066400000000000000000000010001221117163600166170ustar00rootroot00000000000000q `A~K4tq ~KZ4t/t.txt42q TRAILER!!!patool-1.4/tests/data/t.deb000066400000000000000000000037241221117163600156540ustar00rootroot00000000000000! debian-binary 1239254283 0 0 100644 4 ` 2.0 control.tar.gz 1239254283 0 0 100644 478 ` ͊0`sk{#ٲ mi=,,Zdiؒ髤@ڞKa>0IxT<uSB"7 3'Q,xTM5/|\\h2tׯMuU(yɫNȚڴؘ`zzw[?,#~&4Em+MZ&5V4Ney?j ~xdKQQ?{j8ʚ%41ֻ \H*؇{Q%5Z;e]L ܩ=1Xx3u˷w֥O> hV[#%K>̗^mZ봃voO!5yftE1}8WsB!B!B!Bt(data.tar.gz 1239254283 0 0 100644 1333 ` Y[oJk+FJVI& :ii'kxUEkR̚;!y"{vۙfo`^\(j5DYL-˪Rh^/V"`Op=IQU;O-9[5k]^_*C}=T+C ^C˥J:_| S JQb@P}ߩc+\&OJ`D.qEH#@1% "bA".Q$ Q\Ð#  }i|B&XVh <˷?F.`6no1s#:_ /6_We+z=]w!9,ǚ $tM)Ă|,&1J Hl_C&1@g>zRSx =G=qTu#E)F7>wkEK(/{˧[DC*H7Q7`A %Ck G8>>9G`7|Y@B$y ٹ@6ZUϱ3?bA$T1>N/KCٹ ٹ:k i:F nn[73M[TIitqg~J.p'C; 7ip<=0xHtAU$:y+58,^-P0}h_>jYH6`R R1Fɢ{jFͬ#CGrgܴxB[e30.P*p|\r(cKm\ mfxZlqM6d2# bC%l6{G>@udL^ t8!\+ka1߁Jr2ޣj\v7udk_+a2eQ=<Jiet$~H%O"!kѴtBsKvY4\wMvO2n kJң9 !%bƱM&.i#-L#TgpQ}+C{xMJXe]K6We_ŔTRI%ߔaJ( patool-1.4/tests/data/t.deb.foo000066400000000000000000000037241221117163600164360ustar00rootroot00000000000000! debian-binary 1239254283 0 0 100644 4 ` 2.0 control.tar.gz 1239254283 0 0 100644 478 ` ͊0`sk{#ٲ mi=,,Zdiؒ髤@ڞKa>0IxT<uSB"7 3'Q,xTM5/|\\h2tׯMuU(yɫNȚڴؘ`zzw[?,#~&4Em+MZ&5V4Ney?j ~xdKQQ?{j8ʚ%41ֻ \H*؇{Q%5Z;e]L ܩ=1Xx3u˷w֥O> hV[#%K>̗^mZ봃voO!5yftE1}8WsB!B!B!Bt(data.tar.gz 1239254283 0 0 100644 1333 ` Y[oJk+FJVI& :ii'kxUEkR̚;!y"{vۙfo`^\(j5DYL-˪Rh^/V"`Op=IQU;O-9[5k]^_*C}=T+C ^C˥J:_| S JQb@P}ߩc+\&OJ`D.qEH#@1% "bA".Q$ Q\Ð#  }i|B&XVh <˷?F.`6no1s#:_ /6_We+z=]w!9,ǚ $tM)Ă|,&1J Hl_C&1@g>zRSx =G=qTu#E)F7>wkEK(/{˧[DC*H7Q7`A %Ck G8>>9G`7|Y@B$y ٹ@6ZUϱ3?bA$T1>N/KCٹ ٹ:k i:F nn[73M[TIitqg~J.p'C; 7ip<=0xHtAU$:y+58,^-P0}h_>jYH6`R R1Fɢ{jFͬ#CGrgܴxB[e30.P*p|\r(cKm\ mfxZlqM6d2# bC%l6{G>@udL^ t8!\+ka1߁Jr2ޣj\v7udk_+a2eQ=<Jiet$~H%O"!kѴtBsKvY4\wMvO2n kJң9 !%bƱM&.i#-L#TgpQ}+C{xMJXe]K6We_ŔTRI%ߔaJ( patool-1.4/tests/data/t.dms000066400000000000000000030244131221117163600157060ustar00rootroot00000000000000DMS! PRO=)O " ''2oTR'(t,$Zc:BB!(B J!JR!)JP!)BBR!)JR! BP!B B!(B!)B!BsB%)JR! JP!(BP! BR%(BP!)J!(B JR!BP! BP!B B!BB9bj^|3!rYZM [؄~&W]nt`_P /sݩbDwPaT Koj*q1}v/G1|nȍ4 M(q1}wM,m oDv5o׺R3XJE|V}7Vqz!~+9HΔ\MeWv)8h.o}-4ägRRQd^_65,~-tWF\GV==:@&Ȉ[/ű&FXݓ'.olH1Gk/B5m@}脞q6t$IBRURz$|j@~IA;n/pX~B$ebp:<6Y{\Pdӭnh6IFG"Dq=Ϋ!Zz3'I]e8 x@y~Z4K%("P6kqݴI.,^!E @!K ^CP-ZuE!P<~zm;o6GJgiuZn%oY+"<)*_}Hck 6>(ݵڑl|S3zvղk-HO&DAgRqG#88G!sRQ bԖhV1ƚ>s/)<x[*ߛ !gyfeFR #1? yYI y\Tv'~6Vw$wYʖ W7x&wuV3FeCxbrFcV⬍!S3tO}eW ۪j _"NĪ}&G/f"Q rLI˝'Ig(\=V\vyVS]uF*:)UZ.-k8\mXuD5 \㠴pQo Ωv=7ш$ix c7sq]!UD=NB] dx}ǩxϬ\v)8 \'%nV%8PkaZY?uYX>9xyas} :8LE8)v_8%4Q 2JQx;F!D&^MrN0zu$gk߄4C,6껿,ټxתVP:#ϝ7^o11GzffW_BB$b>|w%z-.NOPNcdE M:wDvQuol|Ovs7sO|t[R0٥1ΉD@%NwyxAG4Da%8D^ [7Iyz=fb]xxG{ rPa7ė"?$3$t#p DX#x*YH *1p GKO!Dӯ(nXߋj{QVTDt;y퐄awyYq9Ԉ92?c6hbo!9)Kp _Hb:Ν:Ttz9w9"B-}>n#c-}Dg#scU XJ?؈Ջ8L#w>W?~Eg|j"5!֏]axwHFxJ1^oEupYJaK wt6) z9}?׼fxg`E>8lH-G&v7ԣzrzi5W[˥wɕÃY,kK)K7D^}U@DFiS_W8 F TJK̝|qijt`|Q|Y_Ri $S"E=3v7K*oǔ8]`IJ3W ^9wf }<$Eٙ-yVN>m T2d=%6g+l 9 Q4W:LXleh>EN](ICߏQĒC58msmt>0Ld 7#ַ@iE^<1Ke&)ȦywOBh. b#"#|oΉ1Q%*2[^9k'N-:n[NȈO8ჶȴTvqg_~E 4 *`ذ"/li+KC[kU"?o?ʴ >v*="#"LVk{[:)퀄U, ;bȈY@}hՠCX5Ξ fO ̋Aȭob#ci(rz8&%xT!7|Oaˋ%8:F' 4Os6 [q/q͗ĩcT Az+D_v^9/v=I;<=u㖎֥@F푶b)}~|fήpۓ" j}!KIm{W}%C>y;Cn` MiG` mF/EX^'m=4?G \3]+ ΫZ3w\ED8y͔$#yNl DOƽ|q[_(8&\{1n=n\ޣ!,j*m$sı8k.sWA! BJfnx> 9m@b0 L︲`ģޫ8v\<(ӳnVV۫UҴ#$DnLDJ)FlUҜ9(LKA N-Dv4L-%8'$3iuάL$grޢqiY\o):NPqpЙS &v^^M <\sN48?!Pj[ZE ޵ ƴ; C4{MD:O »1T 8:7i|x3_QK`)ڌ7y؈9=hD&"$%9*NF ?w\}Bఊ>O69A4G$H(#T(;G=Ce<\" b0o<sV oryZAB%͏RD;8& ' 6,)*|oI5brUH8=6,#E|S<hQ'gDY׽J*dA _t$,Mvtu˶,_YEI:_?7[ev4;7@W-xw3@(0Ƒ+=$q仜t%+~|܃FK')HK%cXt_  7Qk'}D׿k Ϯpo y=i8T2=4^]3.X}NxSJyN$]EK"!>B4e%PM;3`Sca_}#ӷf{Qn}_ S޶ V<X48 -n ѭ $H^P`TB SS9K?T#z.,؈~ۺY'6 BUmN7Sj0 Ǟd!(9=y [IiFrAJ,p;Yq"#֔B,Q yo5"7X˸Ȼ9DG$y}Z+,⟯? oLǦøu1p=j]-&ٿ -пw? K)5TMĮ%rhAo,@[\?<|4'r>,T2Q39|FXbi:R/ƣMSu{jvm/ io꧃%t 2zy6?8B1-TNIP3's}w@ lRu9Y=H+q7>*yv*lyC n]VI/%{Ǩ67?2-\EfFagg:#?'!_F8|qtYbw\9j@u<{?[*1U'5Ez;&p(y.FRND'o\ 9;Wp""A8L:o9\VLҭ9RfAR{#k"#7nV/ >?5nzsmN)}""P_Z}hNe=pdR$ 2mglΈ!}$ _(&=is5wgTK<w4&GhMu,[ˀ+@XWԀ9ˉlß99% x< 6S8nGB@_TbN*V1҃2]CP+Oٯ֬IϿ7vK2 nVn~Q(_;*CCJS|Fgb^*+1yz?SRvVWm3җ# |& ,Z; J ]ّm^dQ'?jpDWrO I3''B1HBzD>k5_يX~EFr{ͫ= q.d u&n$eU-j @Df~U735~HK֘HkZ>=G$z'H"׿Dϱ\6J5>i~se@۽?55IݲsT;u~Ck&ͻl}Ajys2UŭJ.~/b vc3vO(1I`GB8"mS`u}_e?4Q(pX'|'YŁ |38>IkS_~:j Ĥ1(Z6ݞkN}1R5۝4OS(P̫[ V%7~x:8"V(9^j/nlH_fTM#Z3%R1zXd"bۍEST M声 M.M㽵J PLvvt|e:BS~<D|4(~꧳9*מ/2-8[JQc4fM))?FM~;m|RM> Svp)^ǚ#:rc+q" ]](ҬuĶA{`l%N']vgϽ5儕,`S|f9{43?ؚu;OͻкM(s9ȈB( E5'mDZ Fɠ.,ӱ L~N5mu{-:oA]!r*!ZQrV%|I8O!ExR#} PIbnvFGQۛ2">^zDp̛W||/K^#m8# AqB*!"75LTU۪R7ߎ%> P{:eR΀1 BM(im"+'"/ o& q4]P2l6y٠.9 Ŧ$mg.fYQ"+%QS|lxnu-}!'E}@ A$:wX )'Aw jӘ]z5nl<=m(ɺrc1nYfl``/-.>wt侒OЭcD"9NxM8Gk$^pPZ)lY-hD&;F@k犹|Y_iF|+ۅVo:W| T%u -r'Ήן<0V^pgB:B{aO"sĂH1GAbBRYO᪶9}XC$=b W1ɣ r(**{99VDAMRJhX&c8^apziV"B ")9G]^tlsG@<9v:$5oWK1ȈJ+KG T R<DwPmLT5[#3'h+1XA?9N7bB<#wޠ7&Lj7nV Otͳ@VvJDy-/s:˟33 .u=»icxNH\jQK%־7s6j>gW$șb5@MTQE8*\Ap?b#v{``)='͕X~]nَq<"FHbh)"Q H}6S}6I>dAkT1TttDm6gM^b[E7Cf9Poapؗz}rQJ"%W-csd@Z0+| mL7fNZ^RMKⳢHVRrSYs^>xς.0r濌URэ#+|r'OVOAP -8{lq(ִ(f}[5&2;{[ $yIlYTR[>nDѯ9MDmϬƇ3N #nw#k=1|A,}AB!" Kbk-pnAk'U}m7*!j{~$d1ԇA^l#pz&]A y݀$M]}5x}Yσs:M3DsL@޻m'g|FU~^awr9~NqP5~Н1h"u&(m.S;QmH:FoXS\N[W)ɛ!yXrNsQ[})#63N}Z:u}4kWRyQ-tl";S3 8҆.ǼA4fEy?Dq q 9){??Nu?nKB;aHpi [-:zXariif(8NrOK@mDFREJb5b :<:W5ƌG*_l8Xgn[ 컑1.lhQ]7]^,aٛn͛`x^]&2;(uhү&-k{OerLw|xbv\D7/Xf"lJP5V2712{bW2 :"[&=ty m|শ) `Ȑl%YE]HK_ oa])n,jZE"g{HM#;YӾӗ 5DGhGŐXTR)+,Y1 U7^7fitraG5_FÖ>Whڔ:̜|1܆8MF5w9=$LȈV_=+BnhVr7QޤQ,|5R%F^a\r?-[ -F3)LNYi8ԃٵd uW~ >kIT}R1n\n,7J*(~H㗡°bfJ$uv_PGGbjy֭8"@mKAOo my@>^xݳc=]ѢۂaF˨gPrg5Ll);8ʟW{4>Ȉ9W埖^a~~d始- zCoFC~+aB<%>i/3^%=H-zF˃鬥a˅+lߪ#:K4ڰF>q=xW`H~]>no0Px,۞PVX`QAw @`^~}S0ETlGT\t su M԰h#Laߍ3[' xӧHggų>Vq1JU"#ŸڵJNJ~&k7$?}zGNV Y-oӋ "[? ]b^tYY5 Z2\yL*[_ǥʌɘ`RPFp  [] CC0Tp\~ mQZ@C>ͲN|c~oã/]CʆjK"g|X>n5\D;,k3|}]w37GOz\6UUC&V ~Aw]g\եXlsNE?-//|@ԧ?ҿET]zDɃ%?[Ir1~{eV/T+l_7rۨbg ubP DkAZ7"!_$7 w_ J27xۭ#,ڊ7&֛as|>$"uGJق'ò҇S՜&0k(5t4ybɚ3h@R3,Q^?Kz찗}ˆCJ#7Rmc7/ec /%DMmHLu7DMDoتLyK"vo۽_o؈"(xuky>UfCf%Y}֭. &*CQ?4SSЌ~XG: ߲2غ ;Ɖ>5@!Wq.'iw uNF͡!@k+yxݷwIVD6q?L)J/j٫s7)S.ׅ<ֆq-NtQߝ*G*ε1vfFKzJ`V/ aW[Yߍ!|y05JXO60ZWPTlEqU> pxXɨp?< FR> Țo?N945T8Z6u< 6@_ψK8[a9(_^y_ΡYa'Sܺ,/,7vfDӴK{(jy) VH^{X|PAӬӡڥM]\8Lۘp:1o~gMّwKy:P^栚/64 }I^Cm~=tB/a"v_ukc\[X*.de  Sw̰ yȐ;ƄԳ'^fpэcwF'"m,$m4ЅnKL몤>n{^ap[6-?,ci:} cmZ_}nC)3?qhNs%iL3{Eθ[( qŐJBV*b1(8n'!Ou$#ubv)jb YߪyO|scJzVBfK5OsW+.H+L8]'Z1gjOܿۮW|6 ٔ$u~5\B k.u:LdĮ!n,SWkb{<.-sO _y# y_GUJu[/إBg9ZT<پ}b_KLڮ6k,2=VO 0R'9cr|1,2j{oW >N/+^,f/[<_`BY{IY7F;ob$FJzJ>H)bFygHu.^>h2>ZxIZgJLS'a9RxJt@D`6|΃4ޫNe2MϹ. [j= 0$7CQ~f gꜥ|㪕-U$PN5zl]NZ.n9!~|}bY>ф6_x{FE'zgu^+WS*0qk9f/+]ny9&aHBȖY-)FUqsr;7"Gc.;aB~6҈GRb!t=?`[VYpT|:owAeC2%^Suqcx`,!g$sXR|,#l9Ofs[F׽ YPs)opMSmo&lN8s~(O+W8v՘=[ݡsmŕ'hJ7KwoʌdoxLmle)#|B՛%2ZDL'Pf{H_C hRh}Qh)5n7 [{kVf7dYNC!@~9pjlH"gn,O&;4Q77G/F 7٭BlroT&gq Dٙ0xzﳿꦈj1&ěpkE?rWg<Ͼ!8!ViLe˾l77̥pԞs0PNAm0h{z,)_E5?,bg{pۊIRTǯ'&7[1ۢr鯈G BMRF5^pvTx~} n+@FBEb{pbrf89ӽE;|``s{_eqҘ.^SfG_C~z0j61?=[0fN# ]Y#6r[+fp=9G2%v ,Is)pG8z Hd)>/>rp:TL+KC_Ch8TɔCN5(x_Rp}aNDˣ3ӡ_Iho<5t7r}cC 2߄F'r.L@ypPW}g(m}z/&h좳=.^>E.EIDHoѝTW=Z̸'ӎ)v"Pw{I3@I'w dr[5AjM%с5'l`GyX#R 97띱'UX$}] n1]C ; ^/ޱ9ݹ`v/7k'BN,4f|SO6}hhT"DZVbvzǯ_I,]q(ժxRJ*R"9hNuG㕛lX1s(Ժ˞HW&n7X >z0N/~/sŏIRG,bjszTߵߤ;H5Զ~b.gf[? X24\٥gCX%0Vw!=w]*ׯّ.Lm;Cns:e^=嚟q:y0gl.aWň~>'}Et7-Զ?p[$g+ufVοYУ7l)ZGt܊+=0pN"(~DD}Ug7JsfK ucRKj&!jѪlS?9y\x5x!;?G7Vˡe3Tk;>aAۨKrr%˘Lsw%xs-aȈBt8e [lWQ(NRdZ =|a3~2%m j\ܙ u/%Vd9IoGlԯ3BԧϽl|O}Yʯ%-ZI;h~oP}6=:*<)&vE@vt".s'b7oaČQr3}t%˖7an$.-΢rOY„uǦxֻPtEq4c&GbDn;9VORᎯQ߅$) w?ѩ$f \U5))HdS꾈_e_sJWHE֪? ^hQ@tAeo2H\M )IW˙]֭Pntx߲M"٧"|qp. #+!GMkN orV {\5}BZ=y@l)ޠ$V|q+52g_W1x۴у#(?1Po0d?vPjo۶@##IMޭb+}\ vwVCqx('"1 wcb{@cJvS ͷY;WSy!16;ezp(mW^n7mr}\ 9w`%Ѭ~~@Iq Cm]nHqnǔEuW'wbSYgc%" &pxS6}pnq" YW<ǧ5{K$(pȅsZF#qLK'ue7~$WIzv,<99p:W^CQW$1EU y^-h~y$>Ic]ђhv)G؂K)#'_cO\i%%J8ܡM־*m_C̺|U{]deY(hǓ7-/;oyZᅡ6m80ׁ=ɽrrbZ7O3RlnI-3g-<2[1xCY;yduyl6h[ef.5'#!O_1w66w#{O⿊+p{|o3j H2y[5:XM=p);ߝ$oM%#wſa (6M_jwba"sE ׄy8uE1wPC*^Z] nFR毜gd<΄7/_g<=%z_ ~!yoT@如uϟ3B"aq\|r"9"tN4ID$C2Cdn֧)rK(5ưlWXe$nt';]YxZf_%(h)SӓXt]z_˰X{5ऎGr}sy4Esk CelJv>}/y<>=WֆTPUs@K)''7 xuR@a8(Rqq:CzXQ3ľfQHqޔ1sEv]yl>z0)&lG|w OղHOVӴFtCWot lf]A͝|77ssdIqiE!7v #/*X xm%aXD ch }wOqt _)DdzRk_CCg /"!Y1dDI\&q G~ =yxxU:|")5|GG2(8ϡ賐`qɞNnU+Xluΐ)w@ʐMT²kֿ!lh,lc@tecw(iNOD l'&{jm9&n6 S3ӭmx>$t/)Rׅa_ꂐݬ_uᖏOٸ5V=nкt"NU:*2}#xչX&wP8)c^\u$%d$+ytݯ1Z:&[Jɹ#-X>XZ%q%EOZ \@UeVhe<`e]Z+f,oSf?کǚ:j.հPq˿asl/+˱afv< qW;PdmHq%`nmHi2jۉ+qg&=yYbm.,@ʚV-Rg&]@^9qԒpFy{QKr7ڌ޲W透w bK務 f!WPSIKîj9f`D^2R/RX1 IJyQ]B|VۉLh9!i ]ǣvk_\xN @tiMY츫Ig0mܾ#ƕG׌*y,vlIٰ%rd9D(uZe,wl73>@AIV ?k>7C-lL1E4Є29g@pTy&.'>N_G颮y_Γaտm$@[&mԋ=hL*:` n׋b_az<((ʫhfR@nFmu7$xAՑGIS.IKt P[%WFA?52齷$3@`zDm ߚ.G ɱ:$s3H|`2tֺ̠ܴ] X$!rY9FKqD%9pސǢ!.UiTl'߫/A#v dHJnu.d⪌!_u9zҮW*l5P^\48w7J=wOS2D,u[vѩޙ]zsf9xu!At4 غBMB!͗ZKϏّAPNY4.(<[Xp+vfm$@+tyʸQ eK//{m4ݼ\@4Q96 Wf׽ u٤,<'_|cM|[f'%;??3w+s>3bb0[7L Ap1^O Yb[\ˈ\?DL V@4 P>UKo|dAU>O i=XU WOȆrK:Y 1h|T9C޾Y pر?NyNmت`?Gl>9+hUIr>Vz$T"3Fa*25DA'?wjD@TR*C,,sM^B#6IPυ>N=pލɴhqj65C6L6{/6^3ZZsFw@zxmFxY/~Ó`xä3o ה ♶OPo\Q?X%ѩثa Ǡ>sigZ*f-sh2咡0Rsikn3ǻKbn"w%f) ?דii9?o;Gj?Y3~pF HޅIܐ'`a76e h/}.&α_)JaU"mװ{lh k m'VIiP%PL/GpgkgR]ѱ6_FϩIỷ<G[OcemZL%!#={C#ro8LH7S:P>-1O۱uMJ->v$ln@?ʢ$rBO8_ TJ --9tٴR<<۫.8'VUILWc+%AZ8s'~lwS$&8z#*?LALe8[ziXFEEgreV1v).N CC<6iۋ;)Z7Ҝ` 1j}_,zO=^k)/d\ 񽴹;h7{Z)V\B*)3\0,;ckt卉o7ǃfÉu#I"y=7;Њ })wpS88fJT{XXK'Vu.hTj׾erWʇn99c5X>04ǀ#AH^A5dwqnN6hC`7^@Byxk]3ti:_hSvzO I{Ϧ,3?sUGuk_Ca?f J0RYaJ-tBŶl)|뱲A (؉=&DtrʈaS]%F:ӔĐo1iWiπz|5bd0$>x\#5Ϲaeh&0_\FJwu q+iTU=Xak{<~$OGS035F|2@ڮ4_5#I/Ld5Hjp v*UJ +Mg .W{FW_DߐI1d+8j3TA"j{D76fiԇ&>J]v\%Kט|uK,lҫ?$Qo?b-N,Ȑ,۽K:}Q߶Noo2Vߋ i_W$Rg&o5̧m\>> P" .>?uU`vѪ^g$z; \a?{AW~u÷fϹ1ڐ ^";`4aW L_C!٘_B~}f'9-hQ+сc\caS+Eʛ 1HTG;$xi{rG553C_[ΚZ#N犗YYCl3~c wx}o8+db4T1ީWoἒU䅈$օ*;ѭwNY㫕ӄbV4|&n'b}چ{]҈|}g96[,ʖO"tG;ݪ%0 H$VvYw/C`mza gbgƼ$u}zlhO;:O,>? +9UWw X"*#w,D}!/d80vڙ뤜LޢzXLh m$=c;Q yvPn6Hfw8\ѾvB9 b'k֨RP)xF#g[wJ˼}W`U)$6c8/ L:ۆs~UVq8g9y sVZNqI胳L981~]F|\TGb%<Js E[ }1) H#49e9BK᭝5"nꘋML' δ/FP(fGRIv>}2:=hk@NH^z-Fp'x\gOЭ&II9!rݳ*kd2[M}/ K7یbZ @+T1&@"vZ}_̚>wJ3T#ߪl2nɌM-!>lwF;gE'_qTOB|(q HУBbYChWB*;F˰c3@Ae[VK2G;Z1_ #dFsޤ.E(mdsg@߱vnxT,3ieEE\εA a4ueZ՛)ڡz]VۻUq|;ͧC>2Q F9}IPrY{{".SR$AHϳ^\C}敛Z3ж>|| z{׏}dJvSV<ۨU.^ n_!=իY3YQR,"NrL4#w^vIҁ}icli;=o, "`Q"Op> `ݶ}*ʟZ٘) w6Wz8u5+}Ա`&OYcUd9O}eUJJV!C>'DvވC &+ aRL?wg>[s}6a橕(  :pY`ZG+W쿬`AmX % * *9/[MGI"* +o]Z7V9JFwK|A$6 uL7KDQ{C}`!Lu-mozhH[@2|5~0ig\ e!F-4"s'Uv࿇@ǂyMxΜx~uXQ Ζh5rj3hoMSc&,LKgaƙ9Z ðBﮂHy-(1ڎ,};ђ0pKo f6܀is;G&SM. @ A38f6&{]ig3ƽ۲*f]ImY?o |*3Y_/x]uy 0Qz_j3y3M ^>T)xG2-EǨ{Ѯ &T☳<4Z2ߪ{#4q7xlpyȥ%L_6ÏDӥ`WoWwY)Ysݨу󨚾2&zT O<)+C|^:JbxԼA#c jHe˓j-ge{ۏveAb5$#[ШgT oD.ˮެ g2nMGKʪft+}c0 ( ּo@BS?Sƭ7.^o֏D7,wZ_bU'c4~uլ; /jR :Gixq DJ t< ̝k͈ "+ZڡֹcMxig|O+a.zVY6=zjz Ad_A| <佪K~Ϫ8fyrnCw`Ug, o3'ŋc:W5 5kE0Tv9V<hf6/b_(UAͧ}0g_֚4n!(3|V,*n^M!ߚl Em [}FT"`%0QRJ7szkj?7ް7b9G<"d`UK;V5tWߕ$uR7MpMZ0h;&;yFd*@5&Vkc<#0tyXފAI;-94 ??z?\_@56FGaI|d3{]exW (gAɩ\`v{ЪۨRo_7p2Aq6G6d{@O6ujh{!7QW4#r7Jau D.ۀ9yO 4gSUN1 f5~E@ ,,?0xu Y1^Zd5AKeDCgɃձdSQnRS~?rog;6[щZv0>D_u}BOU@%i!KʝO`b`e]T('OkD$ n&|Mg, 2JJ mį毱x GG uCfݍGvͰ :(& W f e`pW]/N .(c'xz%V,ȞoUr9_',ֈ3_`-mOAղ ѷ:ܵ% JPT-ˑA#=̀@ΡSJP3%Q>T/r0z~0|3x î*ej&_FG>k:BA$ự(XIZAObة0~kdb$ԏa@zmpS.`PpFWK};l9&a pc~7[?{IXØ̚^;+pOF3p]1 y'c|<(Dߑ2nXf?w?[$&9 [h;sv0m+ /}j  <㫵PxhJSZR0}sj`X3mi{֥h눣_}ڗR_ǿF{, wW$jZ:ߏO1a`:U bTp1!b(vg{ܞoC<^ ˩ag7[e[ȭYl)kFφ1$qNےϰ/R)]lFh@?1QG :mqaa^t:] Cgin̪ - {E@^WwvoևOhnᕔ'%b?_9I^Gw &lco挆ugl /f֨z.DGRS`nndԍWH+O1_]G>E[xYv.-􈣧σaet9-{(nd(ރKiYRS':\O6"!)Bn YG&Z\(9W'%E89zFM4$o7ˣ8Ui1cWH֗+/aaOPάt,txRJeTX<{-upy_.|_SQ?ُE݋Iq]M [*rK(-?*3lل߽LL#,44`0AF4M"AIK:):+d̨ƒՃɎG80k0ք3,ACj[wboS\mߔY}6.;݊òs 8][%,p3z/GEчثȚ)~'=+bX{FU~yսRwV荐 9uCNrlF | km;HyGl5n#9{YǝF& D;[RK>Bwo4mӞYcyÅ]Wsk1*b1uƒH/ѣMewV%__ -agO&cT2v/X  tgrjt@w3w>b_aqȂt46́?yrKu3OWw %%3 + `+%ثKձz "skד4CK5y=m>++ F3CGmB֕d@U7rt5CL1I}зA3/n \˚a~:{ eRKZ/ZA)Xe ~@@qmZafL<=32f#e`_gr' l}KD}Nu5#?\"d{|e Հn\ֱ5v\%tqrVɘZrI4]HG4]m;!u+/ϥ^3J{ʖ^xfm7Ŗ!l m- {﵄~Ƚ{ LY_Ji3-WC2]vk6O*cWy{d̝bԯ4:XļFMï[ )tp hrc. :}{4BuYSlC:.`CDU/]:~ *X]?2E/lCT^_`?ס7lvuW##~hpzsO5軛T9^sgPDb 0;ph_:eXZm9m~;>RA`h C^80fNz"dphQxl7vf~?j;ծ#?'9#b?%_Ә=U`d(ܠII`,LA^jaT'\À?v,sL?bcm~O#:' "ҌGIp݂OҳZFH5ǘ .99<ѿobWgEϖhzJ&BTOu )Lhjb%JQM+3mín5@y "`sXr"e `y-y]R #a/w-~RG^\l"3$G:a` A_ >ˆ q,5X:UMh"5VgZ]TMcz2QMPGep_FgA2ǜC.-rmT=)2yY\֨|7v) D3ag}X=MEmL~9/~|fAːB=]TV套b^&@)Gg#tWs`A`f*eUFs!&Q=dޫxC'S_8{UdKjZYhB37`dv`kfdz\6e0_juSr]` tv)xz + Q4oRJC Ѣ 7uHinvϏj;}ׇm.Lѷc)>ͰTn ѭh;([|~|ߩXOy|:CI&ףw󚹯4n}eZBr5%$Mm_<l-V_XE|3z +rH~+;}); 9p~?HV#1$:pp @Bs;ƴ.{߇y|/WgѫNh}{-#Ұj*ݷ;epK)>3b1h/9@yUq:z3J)8t#bأV=-G4+Q4?dĞ{# 8}YB>*|~l.ԚD=/Qś&Bsi0pG<\A,yk^ mupvz;VAsB 3WE}dg(iRմa.lHA؋Jq@0Ž'J;I4uFo08{ʹ+}N/l`xYkQ^3K)\;. ׶/KgTR*,,rYT;+A+q<3h:<ۜůύ+$QĻ2Q"28K hVk7െ49LvfD7KuAҹt<(*nFA(t*&WohLvn; r8!Jj.4?Cz385\dhoxr:3!=:ap0l!He-qYK%UXj/U\#SYơPawrV庴&m+jG$6ZRĨ(X/'>!ջ}NJȋJ74k d*N`;OC jH//Lo'5}17Q76ޫc:yZ̫~mlwwW [\x0&#wѪ}/؛+r'(\Ïv>SJPEQfy؉χ2X [9}p}Y2|}um[}¦Fh}SxL)~lZNwOrBɀ4Ux32-(Pql6Jn}[anZ`+pWD,ӕ ~W71\Ŋִpei 2ou::Ozev>,gLst[۬oն*mdȄ}%u߶@t3?* JCDAMG]U9 ഍OK`̛f\?KnIo>]bl׫GF_Ft+h]gI 󓐃,M?S԰LYz2Xwln ї^&\Od*( `^JL:Ilw+݆xoyzn2G0ߺ2h&9C3 POaA$'| \HG50B~`upsܮf1!) qh^ #*/z,e~H["OTl"Q!V7-ׂ巢|҆ʩkkVͣ75lkPҺ tu BM{ u7;qmuޱ$iN-3>k=u VUb{ F;bzD{ZV`Y2ce=_){* _iF+7IUze*eъ9!ݒwHhb2!jLfĖyjwZf??lUrU(lqL1oFtU ӏ5AqQ|.l3 jh>gD/ $ +oKޟơ6SB0 z-+J*MD3EJƍGQf15pk].HߴJ{wu(s/{:'+C%>̋)n\4d8!TpFQՀv1 -q:as>O(>6urw~75R@N D?d5֪޳ЬM10}ջK^ $.2ݍJ /=y]xf9)Whҟ _$J.4_{sͮO,-b|906`lJ@d͙_1^;SNW~YagkbA(lJ'qTGԪBKiĩ0z Dqj508N5ջTaMW眺Λj1ާQ,?v㬪(Vɖ_ /u \@Ҭ軮4JqքX#']uE:)J w?Ёk[h>uc{St8wJsjVā#+B"<#g6c݂4f31 žBax'{u0Xi WSFQ{Rkg߳{>"KZ[}}?kּ`5KmPMR>K=uOڹޠ$v1!3 L%DcSKAۨ^*H*{+H:? bO h0w!.$ m&UNlCTP +קO6BDOg"r$F53ީBz ٹSk^"M"0;9JOt#u[OpP|Dt:}y0`ZDMN^NcvmlЌ^ad6kj$ pV4d|: Zx .Ш>@[+"⼥0O}';j?Ì>gB+kH#}r5 ,}l&֥E"no7v&yV`ElU0 3&}$ɘaybU3#UqtwGE"z;}%p2=zA9 ~#X0/CW,ܹD$&J3 pA1&5^/S]O~Txc/Iv9~>;eK>+DMچ'22m޸<,Oa,AtJF@cקUmc{Rg>YhQV+OC-~( If#:0_,"l9N|3hp- s6c!be ьb!bWD[9߸9˔ca=biip*䶶/]1?؄)/WMc:oc0G`96`*`'V t.OkcZ(OGr}7٣[~ ۩]A#rzr2-bsS@ ?C*4ۮP(B?`IiIKQgXcC+42$"碤rx@= >Z']b\#m@*nxqn\8Tuw8_ۜ3UaTm<KΞ(`.c j^ޏ 6yJmkh1U%e`p&3̘v nCe?` Rp{uf?6^O"~g7w-=PFO ݱö7g+H=RbLw!z/UA~Ԏ@::.Yeǘ5qX{ÿhFVPWF56 @"oHh#@Vd a%1+C>n6{4?x4ta!;,|1Ĕ~.R"kK*8hf%h-I{LJ/.M7'0TIWy- A`8~ $7\8(o ;ґ;+Ϯ\ ݐbCxE_6g٭v1*r?1FL4VήkEK1k zl7M +Ý#GL'SL[tmnCЏ z5\Dl+&}2w-[C Likc(x>dV;54ՐBPPĽR皏't+T"A$v1ߎ% Ȭ R+ 0ꏘ REw (,DA%n ~T {m#1vrf mEB)_#Qq@爱;dHap1IG S?Կ7@E.͒Tѳ% Hg6DvB&]P>XEZAM=1UPmX7]ּFi%⺭l1r2LQ(A[H:?_A+/Vg*&Q1ثɐ, {.p^q@նD#GRsAssz891oG:9pI憆?fVFbyʉoi,[>Y92_wہ@ b@&ۮ/GW{V^@SM&\EO7jWF+`o[rWSw:72V٘ F8uߢfT'-f۾]קn _@9Nu*h}3 uLh+f2C+K5 bY +떅}+;@lyA`.K Noa&ۂcg5{h/2Au7T@t wXUuQld9j/v8ƪdc.ntp/TuWC3Hh2eh,9\ h^2?**#6;ti('(" U!:ƞ:Բd0Us{7[{Er˰3xyɅna<հ]sQNuu f㑻B}p@,:ZmJ#47#\ Y -R]֨Pkg#?ҩא-\|p#A *ُ r/e3u2Rzpa8tb]cİ4-]t=(v+J܌ғy];<&yz,k5œp{=I׹׷]ECU[gA^#]rU2.4V0¹Kxpɓ-6U P(pB4ԠUuW ıA]!~_"ˁWCղb{py:+jNOZ+-eT vRW@@ղܛ#Xb˴?v1W.$򣓒QoQ '!oeAgg L͞TI@Ԉ88] WڎpvԮ6, s/r54%O[1`sGICJ1ToncF^K]{0G1xpMq®>#bU/:=mW+@<p4OG o`>p,Qw|6e.#cbo2U%`YOzo^V03ˣȫCįD$pT״*FƸawo;ڇAj |ԉpx_~i!6%BkCޘH{:Ʋ߉2f൴9.F]L|)ߢ W׿%&vAl݇]s2oH^ LN.=m΁r疷!Zhm3jkݯQ4&܈ HvB/h߷o|' dq8vM _d$fWw-XAyq|a|W%iVL @5<6!vXjbd"dpw_vR/*,96s D-j"`5X UCV3'}!8:̄Or u")ox>a6܉To?#'/G6^U57__nti45;0}Ny$+$p`ЄG&F$pmX/Ip٠ta9qu \aMiߑV G)F~Mw;|*8k.և[e)ΫdTAhdoʱg6S°:p{"Uڄ5 Sԍ=iZOE42qD[3R |X|d=  '.E47Iҿ#_ɊOK9rx󞑠MXx#F&?3~vsx"r6jU;ĝ9_V'gW~LCeſzl[3HvQrR'QعC=c/iCٻmQ/ (Cb͐|m-ߖ+zHۯC8:0L" GyX7AyK^ }s āԱ >Ф3oZa((>ޗ7y6Ü߭'ydNXW! #j91Ha׏߻:Z!Tֵۧ+*e;xoed/ruo7c9 r咽tӯ'lZT=ROnkZBWŹr>E/<$oHr jS:bHs9]-7MlKG\g$wtШ1EM/Q3(|qkV mo;@ 6S7v27Hޗ~^nF8fW1Gs QƏpzAHHjO(qӎyē8\ϲmf7r$6H>6顦;M. TR* ,,S:f{?l$\\Y*9rsK8uRZaw⋗Уۆu0ji_SU>AL-0!!-`j-`.lW]3@]R= $*ٻF˭%Qҙcxi5qz5aLZTp(ZH{ɾvxG"=rG:Z:.peN`[y/G=65Pwti'YlvvsMLa-J]9e[h&Wj' 픲;MFddЛ۲0R+vn=zMm,9̴}}u_sҟe4kݱtAe?Wp"Nl=Q'f]y{tQ廮\݉QI:Qq&ksowx\9IE:F/7r[s5UT]펳sX O7ItR'n\ h=( doUu{3XȢ|Wb'==CsulȤyf[φq}אBinn' 4etmc"C5eWu{ݾ%eň VWϚ}RxNhUj ә P~NEࡔ~iJgnGB )b@( h&^@wj!7fMmH=`4ЯѨ9m KFT{[HHl]_A)co+hbuͥ_]94q(|3^f0 o.W|Z\ z]j\TchMT7+!D}36>דV_ho IKD?[ 5;A_~w(rGcɫy|/_3Co2)QZ?qOqw35el e_[zy;1 cy7e46BjW,_ex f>,!-,8 Y88)Զi}{Lv"9-P'S=c S561t?\9ªжOOWNh QҤeР{AH"yc[~.@mγTl*ڢ*aP9ukoitMgЭr /1¡yX8tQoz\M =]EM&3H&x*kAL e.vZmC䬣N }j1 | +--hCfalSk'E'Ø ˉ=|TjO܆!D`GZng 0f"u1vX4: 7ç^Q{yD@ª;5}`Oq23 Cypae\cAK1 _d?;nWG?ӹ_CI~'}juBtFsU:~b~ıxN2=yW<5BR&aiDB^[HY5*m'=) 2 Ol2C-g $=8$"?O=(?4$Bz0\>0B2`lۙ ?Z)àcjUd^qڠЉ^FbX>XUt $0jvBi^p#\~ .Mg/TnI X!8^ʈ{m^3j;K)Om k^o?O;O-5seL $;r=:B,F^:fv[:+ 9.| dd!PoIB[بgX?.+{oDЎ {@LABǬX,7jIȓXhyjE.h?~{ͳ4Vu~Xmj֯[^S'F''':"fk.4v3<9.Kg 5 &{W)KTN}KipZ6-,z!v| Nlp*< DIw<+gAK4Qb\J|ϰ&$ ӈDɯ]ej/P;Fhp%ں<Ҵ+Teڌ9~;NT?;0rΑEml>zz[1\]nX^P ݰOj$B[Ifaʑǒ饔3[NLɘNa(gJ9; ]\*4Óu ="Tl>oj?䃕3&>dW9]Jhj+f\\[ǒqkah}pՙ!$W"^~`ne |^'G2 hh@Ixl +pV^4؟Ys͠k9 0mL,& 3Y njah_>2OF(LǢZCw694^%­R[X>pf*8M6xM4$èk} Rvz&̃hd6[?@Yv~ ENElF>3N6sk {7]*iIlU8d5 zPnokao5s$& ?``f7vkoBvy;D9ǴY6M I#13Qں"`=3z=؇Z DvQqefomyW״I}tӤ>KZсk UkmV^z7cmӠ_x/X#FTG}Ǟ5:c$!4p6q gA.\8璦5\|g^\YX?6.h365<;g\d5`ɬ 쐉wk{bޮ#'mq]"ѥikCmz?h̰Ts;,X%{Lnc6sРȔ|$ dK$,:c+|inlW(^g TwӤuGOsTղ r-~hh\+ .ÁIlT2al,0"br/n"QlpIq:dmbʺx>jq=oS[h>t[^W$̗fd0shgaiIe*Tp;nːzonx} L Zӡr|<~Ufg >t:ɋKYu3U)W Axw]d/Ob]g7UH7jNdUf81ț䢜ŕcQD_ԸA`uAId/65_6eNs.ܼ+`҂`gVՓ!83<}Qٮs7r"3H?ZEV@ A<l$}y c8xy``hAՄo4j/C-ET]Zw^lߓޭQ*)~8RYzE\aXVh <*$I<Xl4b?o3irv7]OeeQbZxM{Fomm/1/H67bE]sqde}Hoޝ4FǧcQ@J3qT' 98R[qFcy4! Kw4$XSAdwla(Bx߾-@^14h#;]/K<7FGnwDr9cX/yê]rJξ*$;]+ mwW?˲G5hX:P~[/IMZe4K> *5 vo{Jkcc:-Ӫ b)~&vpve}I(PU<@Mk W Ags/ʐuLj~.b_Sϴ ~| yyXky\l\p_h]m)ЯUtu ,; E$둏֤pb2]1Z't6_F_Y V,,~tz &l8dE{/F[A" jgk~Zwz#=ng3lh㫆ֻXTb ]fn\R'&b2} cl,[Ab)+Ϩe/H -/|mN8>ۉ:;L@V, 8n>]lȽ&Oܔ"i!Ftί~B㍀2Ч Z1Ăﵕ0-I's 0*yMuUeӢv ;r D];$dBN FXM5dݕ#ǫe-=e?Ȳ* G4@b3:-tv"?fOSJ,Y_^4Q]Wנ\lf⯵iV/%ߟѣgѾ5 J 0?FͪϑB{dJѕ*eŅL+50{'?'H=Ff҆5fVm_a0`&Q6WKKXm.xZ1]jyY?P˷8uTR=O@TbZēNFA ؟Q3;\3S/x0[Rasoג |eL>D$".(W]>ivSWp<FA5N֓B` y歫^=:ɏkaKIGǕBrӠΉtf10aٳEꀽ P[t7Dh`ijƬ.W|<\ }|~t)oeH%~dܕ rLdÄlzXXPMP͔%Ĉ9Iqn̛&(>5[ ӷ&U]!1aLfo]&ǣw\x> {kwo7l dKb_D6c;&*`,QkC>䝁&!7xN6/Ah۠c5|hl$*{706Sdd5 E d'Нm{kMA私eI7[ꥄc5w + l t ίS6r>?VF\,HP1/NacNX2ՋjdnvgAvw4ұ bq lU?Sj w*_TB +%eWUt~uQ/}'xFb+ d$,?SPxhHz_NFKrn?(9 R֍EsR0 iʓ_LB!Y+c:ŴVFu+&o +Gix.W 0-!TA¹55SY)!ep/>Z&R,._og&yxi5q?z儒 2(N#c A5)ː9b;Zo"<% zkmdžy777گTx!0WCP<=Q\(5Li0ׁCG Hf,[U|{FU`zNzޥ =4*;=B~c@eeMjڰ7܈ ĆS?Ҙ> }e\<-/ÊS?_МaQ ~MM@L>eLMg8#2I)u]E wZ?r.UWNwf |Z6c^4nH)M5)p~DAo*U4Gו,VPHogbO?mpLeeHį%4ǭbc?؟OҰ wkQȉRkTqh5oz.T`Ŀ,ф@r6FQG u/s-yA9N+eeHl} 7N =+ ^<0P@!{WSڴ5A_ckZf۲/>S d$ A8_HBuNĀM^F8r A?!jri&j5Zv@A7M>׆+Py XfI&3,4wYڤ @dsCHX-"}k'[(}τM N[r?f1$_X9~Z)X+|9;\Rv١fKjdoQO2&N2!y1ݭ aDH]R9frx#32o㳕A0@@;7;W} w!;"<gTeA4~ۗ%&߫PؐЕk ζ}Wnʼ|qș y{Rl>؅@sF"Xn,7E-Ap 1]flo؉L|r%Zt#R} ?0Ք:0ZL9B %q`?ظR0L; -CH5!#}u0rK}#2K75a '>2C̿sr #q[$3Q@ #uU*mORgȢ EoVag0vEc龇 0y_mSnE%rԓ! o0-x"{AsƉ}`DtpvaV$S<%)0bWPss3AjrJ!^#1YyCzf sD)GuU'b0/~57A2bAuZv Ğ.hGzƟ )^V\/Dw7Xo |@mgtK7CQ|9N ,Tx#5IX7$PS<תĚtI;, 8[,y{U\^ckA{֯Qˆ1s- c42FC_Nɺ#}J$dpøfXnTR*j+S,U219ЄBB!JJJR!)JP!)JB!JR!(B!(B!(J!(BP!)JP!BsB!)J!)J)JR!J!BP!)J%BJ!J! JP!(B B!BB9rm@) #T2rmag]ws= Hq%:;IjMdIFt=J/:G*; oKvU.# (+ji0|Sthn 6}Tss|,-nc@|9.}v #(ryK0v'f1.L1k? OQ\13p5 @L,~Α)u ageJALiLC7 1vdvh\7/X@]hGJbk3Ϡ;j\x4KjI3byEsCuh[9\?x;GkKgp?z%/s e9oR@c\\'[(H'\L 䥺?qh_)-4 4ջ6]5?p!ڰ~!WŪ YSrFot'lExng2"k+Ezn _9i{poAƝ8Dagיah| atH0,Q7t+yWV{w&34uvw?{02g /fҝ_3Ik`$f06'^Mds粒1nZݿn5hGx@ HfkYs/ד? ߾O$ gCuy) &$#:vtN]14?ho1s .<W?y NPg!fY.^OH#Z=`c]2<Q&||WY8q | ~7wW)1vq\WcR^3SܑH>˹5GP)SoZT k)hh`+!RdSOhFq\kcCXfCg↬5̆n8 qΖaLltsVVB4fΞc= #g',}Ax>6=+׺mשkw̩yQJ+P'vQ/U1ؠ`@AƮgqMy?{ZTE0K]~>ɛ<L1 F<> 9$}>*U Hz dLvJia{Pd<. UЩƼ%-fd*QjS9ڬ14__1]Y#ܾ֩27x^7=p9נΎgZuCmz]2 _g׭9%Ă"ئP D%+)TGH%&0?>}?.~e.FGIEzNLfr 3{Ьmˈ޽I`3Qo:%AHih8݀&ڗ)mwS]90W3s9ُ*屋v8d08 l(%-W)M{;j^>A%`4Iuwno_g@zaNQuGzՆ6Di˸,O/M\uY~79[h/%K!@ٕVi3o\vIRXe˄^ضi5[vcXd‹|LU,~)@TCr#Z {9y}\']=LxE-Ǎl%Jᇝ+VVT 4&WיxϿ8&lC͇kZn.+0MҿFBҸ y7a,f e = l/ih^lPT5i؂۴v\ ƒ+0 LA7˰l0cR{hy3Cp/^`cFDB>R6%h+Uc t6x 7= LP@挙UFnjMsm1m~Sm!DmhMlt6Mal4m6e;o6 slmCs6;#lF #s6 &md 8m6śbM ͱ&؃l9 m6`?$&s:eYB}MGmfbQSlFMwrB'c_2͆r߉{& _?pD4>EeA>bIT~2,U92\\`\AT[-^ ޡ~`-ֈµhm$2;&zqғ`]o 4 -"JS(&??_Zδ/(Vo륀YZa;7>㢚{oyIߏoIl[Mh屝|Z#_8}n+C,ɗ > [cb&!xٖ#Ϻހ˿xŠ\fYJ}fRXy} 'nȝܘ^%i8h[VOc?([SàX _&Al~w,rZ&Qb3$ %'<*l&/HN?1-辒4P #nJ`rEE,\-YăY3 fv:QZ~3HCq WP!j~%|ٿ6ޅ]3t@ak?OGpФ^1yM;ON~sjIg?DAh;t.s!//KQ8홐JƉ^8PC7`=\>gWD+ׁTh)s=+y{}_ 0I 0 '1n5Ę$(aAj%`Ȋos!ɲ>X͉.T‚^[:?,Z=_)XTEt*BK @GG&<.GHdNh y_ kנipؠB\j%jb?!sI@5*542yTn<ĥ#xH!tɕTvHCylN8wnX{xsxaVe܁$=͵g׃ۣǚ1D1psB1~ja,sQ-j2J tRزIs.P(Eg_*T&urs58-ˈ9BCb RR7AdLq#S27\X'nɣ}&Qd:o6ҸDjWDDBV{ w} swYƂRA5p&zg{oU^漉1v]M܎}[YEe|L 6=?'/XM5h~b8u,,\+FK*u}l__: T5ցKGAveo?mB6i$(C:{a6*}MXxQq9\Vd{ 0~b $M(|U$4\-U^# ~= =`ځpD37Pj0ʼB*$Ts\^~|Ni'w]`k?Jl$Ԩ.i`/Pb]ef{DZqL4STpVEvar b~R᳖3|'pƶWMljniC4+f칊-ȳCxyu[X :w̠:xظ>^Z̔$/[rNFPz`/>^l*<u4QFQC^Z;Fi!3u4t?"5cgmqԸf9;2k|wnvbG+Ğ.6,v)楅-1l_ AO%U:QlzEr6tv 4NOW롰pDX{>@3.J!IG'2SBc .׻?=bW>k8# 'VK#G*[ܪGY=$gҋ,\~";s1YԼ[A˿qsX| ,޾ Sd X|,!?3=#7>՟g)?h1 SrȓLfSO0QuGˏM ӝ#vQ_\0 U çtxk9Qc+UhKg;V}g&a> Y=txآ&&=7m %7$%HJ'8ʲa4'WχdIqv8K-%,6bhqmAPpÝ]xgЏGmk ; SdE eҩ}lm/pPG ANHy[lqQ}Hpa! ~V6,&!WC&"USiV L7S(d0r3Qow$ֹbL(u4DZ]-ʝZ MjyŜ*\*oT$lJB2(ttTofrLwD  Lv0VGv3tDf5~|(a@}^ҮB@޿sێ M.w1=0bU T246ߦ] `@ ǂq`̍"w.@t!3( ~/u YQYYK<|6D,#Yb)H:([~Ki30y!aDc]mVJ ->}zW:^E b5+5c,AΘB*ajr:|T'Ų NS)zOh@s) ᓜ~)C%^`ȣh;Sǎ2 gd,Y.IH&i-P&iȿ_RhÐ_43`?eWL󔭅/l ^ _7^q)b1w˒@+: \/#f0Dc8y̲T1;"3/!x0(,=j &΃B)1!V0c QVijh?LvOu`)\ VJ ݗʹLfK.)T9&D$6olTPLc>@ E~ʝ{Jr5>sq&`OKiD6÷~Z\F-R(`kwzjÒ,!'[ϥtK m`*?hke6D4Z 1'{e. 'BdJ4d_L#lA/ rnu̡e|lz@`hk͚j}إpmFE+\}"{{rU 1 W-oׂ S]'fJ.?U?Ly0 >Fǚ ~;suĘP+7#Hkۜ!;8u2%KdYދe>lp,5/t}rixd=tOŴn,S,:$v@UԀ~k+}IUB )X]. L 8!{50a7 bίF0?K!bYX}55%Zcɠ e86GK+2bAoT-YӬc:1SlT˝kyɃZYHBR7w"tMr[lz9dݲY/P@В\'Lꅢ_fn\B5AhWZ%sC;"MsE QnCۦ}@޼$76t{s*V>Y$&~]NS^k%({MՐLM'iۅHTt!IYK/Lr05 1IvU)7UƒVʝ7+J`ׁ0ѿfigO0pE‹lc7t`$Zv.5tϭ&j|>釦ӜuqGN;)i#q$t>b ̶I2ϛ8Bј^ϻy~ɩ$;v'vFt@*ER񗛞ŒDC`*v_1:~ezķ踧,DkfYղꙙ`0=e .ͼ$ElQhRxC>bo>yފ/yo$+M h=Fi{*"4}Gh>0'z y i_ upѭ=&d[oIl1|8}ĺo4j*a9w>&KŰJA<>LWNڊ]!>WJ}zX=L 6]y423 GmVhˁ:Рf-aӾ=:#I> ϽyDDu6X!R^B~WXx}",\? A7!bEq}0KpK~0^DMca٫Š6oWs0s٦@#^w Ma{9==*m$f+~yܢļIཀྵ |:[FSsU`<ԟ هhDU,y!Ib&hqԦz~5j l_m0 *G&^'˟gQҸ 4Ab2L|\v0`5ü18#5W^ Z@qr{ չ,Q,OrvKsnx<+49_ Gv{Z@<;Nk^)OA}v~eAd9fsF瀕Z1Lmrhel m>)IM_ -Zosة],ǧz4PIBX>fSz.1EV8 $tLʁbg+IA<}@r#?$"="%1f sYߠYgGF5 [Jͥur; (q{԰llT)꾡brDe'MB{&B1g .{|1HsB)Xcskqe~*,e:!EPyU)BǞ *o?5\^*n Ee, O4uuf5z^>3W0ɯ_Nx!]XPŊ[XC&F6ޚï.=_7uL$!4r]ߣ;IIzEh]Na97$r.A FG|ngŋ?d"g;?F F o;~8ւv $(DŽҵx%V[|`= q.cϋsQ#$j_mc#_8!Pt~o6fd 倵n LTR*U,,zRC #oG89(Q_C_ hzc?E{sQ$*bA&~ P.Ohc#U[d#l~?.%PMzS"/!@41w|_)Xa?To<K=] xsl=y?)~g"Q^کd:|"ĦVqy2\t&x^KC81|h<mȣ*'ho[B w@عՏ飠皎n! % P2L X>2>$WՁYiy z]%uh1`F+q4+c}-ϊcU?a28TSmR~ x5hexO3swǶ$W9i@s\NFkLY, ˥G{kHNw>;`Z1up5SCcu-N^@ ]k|t[`|-vGkq60y;ݐw&5J%|DUujStڟ}]e.24BOT^B@6F͏O7L[~@.?X\ "W7s}@UaAs2(Z(gaT^aT.ncs v]:-p Owcu(鍩xi I]eka[(o5X^th~6KfUn#]$rN iUs|ߣ'-Pomr(Ɋ@ iC`ƾEՆtRwb Jaf,?Yb_X>A|_;۟ԧ]An!̥bŠ]If/I) 98@@ɻ:#L4i@4N 1ж]/3ܡ+WMZNdh/\IZYcAߛӊ :s.<-DuA>Lf Ɯ>U(TJr댾161!cFޗ](sp7#PiB~d "ڵNULI>S7eEgL֯㣻0C:`LUu){ &%(Ni }g0ȿ 璂 ^&scOT72C}^Bw>n}pnj!EE"ӱ):%i/ iͦs9}d8rSJCC.x< 6eԋlf F z#SВZq82um,_oΙ!v`{`b` Ź῎ ]%\\;y7rMe5A]:2n7X]l&^FMtM1il hN$vHU>EOc=#dw(=dj'|ɺL4ek i5y6o?0՛qHdc6aUw#~· {at݊bD2ۈx/XR]~^M4p?-ÀrtX!;_=ˠܺYK'^$ X!! /ɒ54~],s,M}k7x8d좾xWP7 x}q@$,ᳲcCmu#=4Kj=\b VƪOO}y\@mX-ŀz~Q1/_o2_|1; ?3@:c3S}gk1r!]]%Y-,{󥞿6f]a@lbϏ[9% G"%گFw,cbx Ěwg0wǢ$0fRvo9Θ%AfbzM9@64;(.F~ht|P;\X3To؅rf Dgۍmݻ!8`( 2 '7&Mptp*IJSF^ccpVT$*r!# /s=*o/*}~ 1xc|>ﰵF%ЈV%Gz,V gՋ뺛}7eʢ.URuAqlQWЁ$iAL7!TCk{tқ8F^BvED$ꃧq&|UpӤtksyS<=}@G)tW*0~@: dLbdeeD̻Π +V$=WJo bieŊ+rWSr gevlF<)"jP<:ɓ7CWoGhG &ä#0/G/EWuoǔ$Uk/)^d^I_)R,$}D9)4h "(71%Ğ\'XgŽ+ gKe{GVR t1cLM̧\r S22$XM) NS["/i7,*+{YLAf<./h{iMnd_qv3hK'RWMsj3kIld#?:w'x"I]Bdxj?4}uS _nѪL>x1@uWaOvL;0{? #O=HٗrC/SOU`U!Y_Ĝ3ߖ5[drFK3\)FSotf"NuGでw<@c׭OZH'a)L\\21((g{, GiZZ2R+ #o`]ڗ+\>vLCf_]$scax@13mkבxjK d m擐n?>n&}tusOtʝ=7_/;Ux*Gm|Fgy0ߴO3 C\@D}YNP@D.1(P3ÞFAo)Y om7 K TMK{NW4Kڦѹd|?o%MG4sc!Ls)fUs3|2NK87%D˜v[/z:ߟdD &݈ E~8\[c:޳_"$| ~Há/tJio$'Ǡּ[Ycт8Ê]%?2ML'֍GTD~LGWfuA2@G4?p+Vv$j&_MP2ávoc]q!5YjWϩOp6 .hsTm\K8fߢn܇=A!8R_Fz< }A,8!1B~~觸Q Uai8ݒP|!^4>݈0Xͻ _qr8|vʎ_\dmJ1dDz CqH$HOs@d9?%|Htmua#r^@P$o(1mSRk-7[)0^,Y&5L0n.;;1~g-p=pEW (@N]˞9iod ofx5w kC,$9JOsm[/5鏄w{f86]57Lu~*D2\bTHS̔ ~,JTčK[ۄxwʂL._+G<~do/'7H1B}0 ? 2\I1,߼mBP@,jc曑EV]ZȀ ໭g`OruPL__>'/Ux?<g6)׮q5z+HKcm4u= ^tƽS_pEsM`́1u-4XoyC!B7H>^٢X t}ל><˺,S4xZOsjÿo >^""u ѬX̯_,A E^{%"3L;Azy u QV)azD_Jj(<-ܗPy6m]_a>X9ՄFyb <#~σo`ts_8<>0 dږl KpWv,;8w%3EZ~go|"z > ErҠ[)$|ZNk;,~>/q -{?i5k: h72y5;l)S>d1xH|W -t" Fd4GSRbH94!>/IX9z:՟w2t=5tww ͟R8d|?Mu/$I 0.mMz\5X C1(NFL (s{$dbc05jgYDVAMt- W;н1~DeiX$ǚr)@xWkxSԌd+ Gr 1cg:@-X6%a[ɮ \bt+2 %Poݯ"Te֜ܬ2?ϥ]V̝54¾2H/[|gc4)W+aY{h*?v-~?klkiamA4jk\zknBDPVYd 2jimހYS%gRDx @@4թe ~IU$D,'p9ϢH]?04WDXJm{">6GX(^lm#??ϋ=%ČdJEC!38^K얢x CH Pcm׉],pDH L2zD2iv)Amٷ]UK+1SV~dSJJq~͏zN5{:FQ&rBy4[ 3:W &B ߔ9 &߇ވ=yl@Q7+sd>ޑA!wXт5uoN (ࠨZ ~|\Sg3§KIJ+8'7p] Pux.ĺ` q I྽꼱΂}#;S|Q4;eBefo~Wޙ#կmșFbO'8ܗ$>e!|gb׈b)X,7FQnX"4UЕ1dg?ǘ?qm42Jc-I9kY>"ՃkK,$=pSOu%_Fsg#g\ [&ZZ^HY(Oy;=iNweM3BdJ-47Z"ߌ2O@pfW­IEp]1pMW5!"A#Hܳ<_.r&M+L6`y4`w~ hKv{ dOST@ LfzܥbUU@ca홹#xWmҞ\ hhqC"Еi=:Ej7iF9x{^ekۑ;{twbYtʂ$L2@'^8q _gBC51>E;Ms;⓵ Dw.)g\*LB sks:NY[xS=%ɉ1,<_68J֦k7hZKgE9(OLP.Ѐ " NGIA9μze b%&A$aMӓVlYs<3LR~ˎ9c&vL_l05 ϔ ,D-vWbCRwIx[ހc (S~l*ސ5ņ?WMsLtCEPV[U%}GdQdtc c5LgFb]4yYQ\FC2ΜXC/.渑@ùq+!X'PC@2"ۺ|C/n5d#_ͦGX:|lrc^zLIB=dQ _/mMht Dڪ+t  bӏYؕU7:#ev=~zuozBBΞ{zLH.O}=ODY "τt9T)v0`:˺磲9eq/bp6G,%N?yJ$Jl`{lF0vJ#ao /vj Ӎw%+tp%@i @!C]yd@ HδLy]w?~Og:Vۇ?dX-xZǭG=zP$U{`g"t#n F/O&@K;^{W-xAM ΖfK|{·KN踎 Ybΰ)<=5C~Hnw@C\VYwR ۇw19.wɕk*kOC{z`Wal'Cami2(d}I>wo1N?S\8$Lޟ##?*^&%Ԛ V9(>>vְĻpmAs)W]4t&n5Pϗj` (4ӗ& la/ #y~iAQjphp6Keea@ky-^''x:EՍbe20+&dM^NMI$\!f?\c%6=4n;VG_i2](H^{%yf?S ]) Q:z-!ccy&jh8å\'SO AnbW{VOʖUy|N ǣ!BN,2f"FLd#iHv2f&H=Ngkf5 'P/gG JW:|q"BL$7v:Aj}3}er%4#ؑƁcL(P[#m$Nkt&yYByv_J(U1w:CT|W\FT]|Kv ?nIքY"p֬rCi̍;!W)CVgց}: v+Ni_`1["nP؀   ~Xypl3@cpdK^3􈔨H47']G*_[wsr /XolpMp{ |%MԻx.@4%E@oMy'?y1"uqQ|ǟrod'F45 y\5s[Mr^ ;8T8z>w էҺ:i}TT V>\Tg^hq-j˓f%up/.ؗ<.Jz )php\L .h[cn9 }Ed-MLTR*0,,> wV,tx/;lʓMew4(!j~Bt._i<}ןHVVlL_J~ͣPFf8O @:hf+҆6La) uo'l(qy.3.u6. G˸̜y)z?9D49gԮ !&I?ɫ.?}g4)՘_@M'*_n6s&ܿ^V.0Gjs8Ez5KyY& ]#~XQ^@l8Vz KS9q 悴%&iYMLGA1@bk)Ǥ0ic<7=ֆcqI|Bl$4KZd =m2Fo{Crt'S{?KX `6RK_qv+v+˥r??ϩyN>Ib Hrx^VAhr|V :%/C_?cZ{)Kwr<u,sAQiA~/gb&GDћb,bA L(]t2Z# f49Pp~ڷ\#{|a5Rw3ܜStOF="":#K!i-+T3hbrhOHUTzQ0 (r=r 5\r}m\W`Ʈװkd>dL+#t4Ie˧ awˤ4D7:kVam?9oD%+/2ai(T"NQBVńIP=oj^v_}Us"7r@*X5=,9V"Qt_lӞ~L9F_[bg@a\j2L]hDl䍭Ey--(< m?P3rn76.TkۆzCS*:<'[hV2 *S`mHu\ բ1_ϖ+.s/>:ue\:I"Kا/wdKr2%{y<3ZI.*|_N\|ʎRi{y]3i>޷WsΧ˦mi=h+Zt\/epDwSAGBl~]1\.kIb޲h}lUMA&[a"nu8^dڧyJ+Iob3Kr7nE_G{"ؼgz :> _wzYJAAeUҷ (q/ y/fz8T/=՟HRurbl< f`nG#+gkVQe9R C,Nwt)}UGqh7n7`ƗCsrF6cBL"dƚN\DFҢШ F+Mnt}ʟ0>`/mP Ĉ0%}*vH`^prW̹T5^USx֑5!6A_fvĺM(-oWеRDMt]i)R_&])_^?s]e~g^kXw-K_^^4@-׹:V+Oِ`mzE we )G>{eVY 8NQo\dzSS: ۜ!k_{$)n{x$a=\%~<"Fkq)S_n5PagŽHV[LjMLM}<]Ow> aBvG&XJ{i)kI)w.ݠ{ =+4%LsɅdcs=+ AtoƀׁCī*.dJo#O&܋P0ε7J=Pacn[,;f676򛼧! EUkTfeCSTPx[3~f>hsV(U}WOiJLOۦ,[ȃŃ }j7cϋF =凫dh H qF \$o_kM c5\sFJ,Ihju^Ȍ[ =^i :–෗g7(G1,L}(Q8Zr.#3V /:l ]\ EuҮSy0cFoξל=9{c{o^$YE{iIR&9:ik1Bīi̲x 'u$6-aow{+}GRC'*d ^^Z: gztjy톒] ?ܙ)GYb*CNF@C}ȗ'53H<MƻYV&[oynA&l)UZx2+cI6(Aœ&5MJ&R~3sS\ ^Yg)*hYxH ?%qz0L5)?p5j5|@ǫ3=+Z4@>X.YEW!b 2? _22Lo~Up9l32. f>>bABr<Ӗ3 Z1$jr58?c~֩G x# !WȰKq4 ^,~PTA1BeA~e=;Nn˻тvu*@?(Rcܣ ʆ*J'(?`\MDv3lz,&*VX41Wg[e Q2kBu Z :\Ab iBܡ iNt}A/HÛj?׆d Rl1\6~m*2W=O hf2321rA[zLظ).E p:9[=b5{<|,WiW1p0Qrp:?;&F}T'dwaDބ&f}U 9}-&0I?^2xy5WG|OȊ Ņͽ Qwyr-am"k+|L_z^ - Lu^rg75JRZ|PCv }!Jۢ/߶sL\-V'gDFҚqu;V,LP`\%{y"j5Lh"gu7l~g?wgǐ酪(%;0nH~ߗcҧVϓ_hT6gD ;F0 ~7 PM{X[S{<*hS1֚.00S4$'rcB!ff.ջaw#n3l[:Ij@BLP 9t1y YtZɍc=C|,դ@&]L &ӌ_}jIz,^mh6/ 5STKVӢ1 ˺ D.˱ |#ޮ.\Zg3(ʏs<'#8 CLt~F*QJ3}IjthPEŞI+{`1A_7cXеv|, c_~d7CuЉ3vPUdNR >aqOK0tRgɑZ dh 3_!v:k'pו*@|7WX.@#XzWq+ɟU}j+^JS=@qDEu/͵O s [ɾ9Lﻇ [Ul6]NqZ+Y(1aշZ1\+bEx.y(rSy-6_Jz &{oσċ_kd!/}wzW>{C=%띒 3@qJ˨dH:,w=ӊmc01RG3mN4Ii!#'/:b%q|Z:-n*K.wăͳQehL0RA hjӢLB[n" 줃xKyQWA?߅3?T:rO t .1F+f_Z&8#7sknN<*G0%@AttNϑoV ۜ ta1l1 d~}xjq0h X11îtAض *3Z%7[$fxN@[Lv[lxr>ǃu+E"w:*UH14RpH~އNqo*`S#B{X$]8kJ8`B*ex!`g:E=\zMT5d^5׻_rL_*|,ŗg(,@P~gso]N'|4$iO{ ը8`QPu< Ռ*#VK5z~ˈml 1bME?5 h+ !G:S| 7awջ}xě/^Kі)vTZk uqhqdpu9t0d"CIli{ilO7(i#cP8wW,sĜ0 3M{_w7430ab=>k8>ϱ1![c}kLѬ5r4aR~ͲD? O΍+h{r$|H ~}@O=7L?O-?ʎ>. ~Ci3N 9>E|L\rz%yTGmr>5? jJZ9hAy'ܰsFfJjU,~d"<}?Vn^[=8GV{u }S66 Y^)6mJ~;9!qlbTEjER/bI =~~‗B GI%k$J 099sql*oѭrF $ݮE=W*(K[#f`I蠻}#Di7tcT5B*%2Gs#/Cc5V{?,@&^\7 }N8Y"ր0V[MCj?ލ6Ӭ*MU}.oODsf ";n/gWr^:;~h+&f+~.&'KvbaR! uKXwr%g7ZGj507 cYrnyTCoѮ4. Drմ/-4,NJއĆ0me<=5\x-ޏ + ߿k'O)H轭2Y]SDw4Gá|@95|&T}xs{j ʻ#3c_2#Wك)Q;)j__1PYc(Biar< ѐaDOaLYBO`.l㜎/gnH/:\٢φ(tMV%Ni$f?Z$ fBbM 3?`صWxEho?^v 4#21xJ 4{l&^٢}5(Jlbk)FR1h=0kX31g& ZD!Hc~ ,ᤚ1{S\O1cNA/ʪ9uאFu4R\A.: (52oĮ2*t4fnK"àɓڍm,)|hT inTR'+k,qMHrm>#]nUcC&,`5LtG(X9{ GXFY{'BХb~<#]%0&<7d=T"lȮ9Zt% y&DWA :3B,W3Nyژ\ ^d'*'@=Ak̊~WY1_9 l:(f2W9ͳ#PŒh 9wJ:0+?ڂqM*V MqyEsGh˼iQ~݇k#,ȗ!}zYװ^ gK,,j9;4J>y5>,YJQO^xv:ʪ'zR x8p􊣛*?y9r;Y~Uin-GYڿZU>o^L}xac{]Z\lg<4cfJSsPlIja|+)lO{gy:͟w?ˋFU΢l Ƨ-B5A*zIȂN0~o`#`gܑgc%[0ѪCZs@-V~l:(8O%i\x^Hɒ&?`!y k^4wv!ۻlXU)y`M>z:$!X9 L7ޖmhqA8rL.u Pӛb`y {Uj\2 q}̊_R4[hZ_0hΙ栐$['/Yg&RnJ@k6Srޞ f 78o./=@SPR@+sTUS]&u L!qJ! _N.]P<1 x?fO2c1)˙炓{p "mK& .o) }cLmWJn}9>L& ,BhYڡwlp)33KB(u?鱩ГBH9Yss:7LQS0??HԘ5#ۿ" n_p~MI4pSÚٺj5B B^d!dQr}"QO`RN n6ܪٚ~bL3 ޳TogRS#vvMןaF#݈}mH-asid%|ք@ULcrR%[Hd)gۊ~UЪ*')=;U ")Qƒ4߀$97tpb^3疏ٺ'\9_jnIf?OI'Ǎn_F~s,`Jzg?uvr;@Qo?r@CGkБ*!hk.6Ȏnۜ3~['A,j(&fTIX8:N_|lqL$f6hjہ[m<5fwm(8nqȅ5SSnA}hE^^:W;)%2hbh? <fnUVNћ@h%NhQ6=yh}آNP-o`9KX\ ͙-!gz%'ۍu]=: V^rD-0._~΅V\֕)4U ,_i^24[`r\Eܝ >9MWLqۜfrެ(P,KIG= 54 3 ;M1 1\1Ljݖw&V*]ვ>Կ0#A!I;SpFŒTXE1XDSƦ)z8(KZ¥!4dTŸ Ua&0l9X _v&j٦QaHMQNN9C. f^/ &?EuŌhG(bY +;6L2h.,2W&FWo&*0ƼV*SL%1& !4н0"A)ʊ' Bf|Ek|NؚO׀#.Xw]QUSs7V_'QrgeX[v48\Yq=7E{WKb=TnInn}^ *:P GDr#S`[dւ էk:yvta2m*lP8xZ! v<_y!2J_؂HHK:DH#]gApDKb`qNar&$kF'! |#ɴzM4b.SwYL*w܆6?sFɴp۶m66v cnPۦm*m6t nixN79Fܓoncn)ۆm6p mzm6Ϳoc]+nss6mM3o6~oFmqY&~ana"4ZAmP=[( >(B " |3_2yEyhh+j|Up<|N0K4(dTD` xD8=RM=cPU!N9NL&젅1sRϽ]'n;||:qőS "9J!wB`ӵX.&P̛VcLe$ U?\Px08tC?e_Fup0h\!v됺5IM`4f-em/&_Ex|x|;@bᄒv&z2J[N-|SLOE3tp9Lk+۩mR2{(7bq킧ڞM1G4A1d2 od6PSaEXR [E?Fg^r-@R2ae$\xDJhH"عv(7Cq\%Lzef:h("8B2qPq9w0!Em*a6r)V.uV|{ak',Q#l6PӈG=D:6b21Ts_WJ?S47"3Gu3 uiDD˨k.Abp9gr"Z Sm0᥏mA <,2 M0"*[.ue0\Q$?'4j`G/ɲFlVkUɟC]";tԵml<&.0D23e7 bA/־t՟uf:v{\:խFpЫ\Ҁݴx]VOyμpB: U7w݇o9o?$Ǥ tNzWU  #td0m$YD1__q_GO#v@p;Np=]ڋOt]+# $\69t/IARzX^`4,'vuዡoD;b-5#)fvr̾ll+3jؽzB6%[y+2b;7xh aIOi=+r!|EqՍ WTz\*|/gy$H %ɞ 5F:0#M}iD 5CT`W6\_e_c^g`y]CD{$PjnJϨQ63>)xnX(j_aX0kQhV-A<_ $?:n4j>n 9'ߒ^^ʜQ6~#&$2w_ 6Xɔwt״;JB[ksN~gH`/v¹؆2 >L9oळ#D{:8iEMzh. mtCH0kH.gu[̤^ٹe6C}:JK7j׿/;~&)TL@c/@pǓ}[E 3Խcji-Y:p$ŠS؈oj@!t3Z dPV^uK/[JZ BBL-(e a%O(C n9 :hC_*3NV=HFM#s/Ot?Oo"`2f`h\_!MJ ߛ6H8;6A(=Ixr/Ab"rzXP_ms11 |>~V"'> Qa*/壙%{s=}F=夕2XxwAhG^Kz^Urw=Aӈ! ◸GLl)KbTG1rX6^.K8Z(NG 'Lɿ9.+! R_?IF!c5 &{>i lt,O02qgw vrfi4\1pJhm"H q W?)zyQL(673P2NɟfAP8t Q|:1_@g$b{mx s>Mj;4sxv9bηq{i :_RyQ!uN0,-z.jt> X:B$;qxF,(1<6.k# Ϧ%b>;Nsvmt-(I5ΒD";Fhd?0;q ORDp"\ H;#:S>Gitds )6G"Bo= rJ*B1If+{0=J-2s&K U"E~X`?fANu#@ʑpaBI;BK"}J'<!e1eC{c !D ۵Ov3EifCg#ɢhn.HލvWx'QV b( ?ܥwY8J?lׯ+p 0NО7NU,?r bírD =Lh 5hicYp3Mo\xX#M2\Ss]Nm9g0`iE ewҭi Q>EdT܎47#IOE&Fzg"'? ҁFG/-9I* ¢PU삱5,^$Q?R1/@Eа08skt9@A[bjkd}"(5&koغt]D ;R rb@3W͔hsg|]e| iHjNjQt*fp$EIQŏ2sRaRnδ'xs)k@?@T\ek&Puy_[ſ4Oioއs%RC-\QHl]/>s6˟Ҕ${{86?Vg{Xg~}!ֈZeVVk?y!̥ tF  +'.>qȑ8=[:*<~9*ylJ"\Ոnk0aF⣷=o&SrmI :̾ЕptT ONoIBC7Mk3,hzȆu= }/3iAߢԈh%O8-zLKK@'֜K2Y!"zr$ǐ뎽JX$oBz" R!3JʐT"97X0N$(qY}z"+A6'z ^ج5ǫmP0ahцN;Y ;EK~}}wxr6dYe9ߙhsOlr)Ǿsi/J׉&+Hd.8rFtOajӡx?"2u݇M5/я~wJ{Qt^+UAI0 T /Ya]̑5sRS}{C*HY70~ +FbY휪rk~+g;!A !<\l|m"?6sfu<SXAzm:hQxxގ0VN(H,vA>j} ;n x Y!:g{oe)%]#i62qNw|kŃӌ+T1c\5:3R7Z%\Vt' ZTf&DB%:Mwȣc醲HA&<,}%DTʓA'\dɒe_(_O9e6q/>W9mmr[mf+ G[zMhie;0D{d7O }M;/YI1NgKF_?EM.%u*įoÔr 5C$V`Gg)1c>,gckz|çz5бzlU^Bg"߇\ЦݞJ?-J w`Kba(pP?+'څ+dj'XŚUx^7]R9a*;ШFTwWNNC^ל(9}#!&NXBR_>Ћ+7MFh(gG =Xaq7,+-ny^ΰpl-69yn$3jM,8/ovN<Ռ7lw3=}!&W F]G)e:ہOԏJM6ُas-9LFlg3Wy5D2?×y~a_+5r>E}g?;#EVr e(gwENlPU<@oZ_kqVbfKFdCF&8WIE}A(_ƇEC)̬q4j=~=Qb4Lj~^6*7$ްIv]p&#CҨ+ )TSt%UeJ_}U@]ugS+-O x:wEj^[~)/@WCwF8 \x®fq)Y?9Ab5(O\nTW̃}@h‘5-jaYB*E$/O gB&C9/v:L EQGSӓl3|"kM-G#l&SW)8Pho;>Tw-Gcf9:xc=XKf)ZyAl37TcrmIC:8C'_Lְ@6z6~Jfjn)NIϕx\{<ƴ}<7{Ҟ{1g;l أhIdj󜪏|:j($C٭G)}19q”CT6:|~VhR)0}ыb4:<ēKڔfW}`'g:tʸ8o;YIR*qMͶ|XI&=zG>65XAWμ{ݐ˹1[<͎r)_>R=C1cia&p>F̙"'0rMz ^O_vM5JeEɰp}&~LShO]CoΩ{LaarxŮ`"`twQO//Os\[Uw; d4~L9bv}=yNƾO.grwAuHBFW j?&}u'1CToڢNs쵮W DL=Q癙k$[ t"Yt{_a= IYjm~ix0*4QKGr ~[s@uQ> (rX̍1]ab++: J"2 |`qN.3E?#C2Vج _A{tO)~ 7~dOβ$ќP|ft9Oѯ YBm {U5[^Vi7֔m_0s؜4]%6;4=ދbx3WJň&nu8w]75.yJ[unc]ڷZ.JU}#Q=E50,A uT'x24QoG;`b^A%|=j/6}u-777CoIVr<.D/ϭƻ jB~Et_y8v2KGZgE7-FvrSVDZg E~:v bLܴe/`rg?fqg IC?$Nz|i6sDzGd d5u֟ ޴镉D "G026c,S5//ȼ3^`d՗U+c'j.O )#\1JMP? mtM@O_!aT '*""$3 4ùxcWPư%ǫA+r~uC3c[g ̈.58$<湗\[vJK:ڛkk: B:1 ͫ )wW]餦yt9gB n˙<&tt'NJZVn r!-#0z{CoZJDrٔ.tN06΄ZewS)dW \wA;O9$YS^g]yZ}SaZX-٫2n0 =b̒sZI{JnMUa` ggX%?Kp@`KxeIOei3YƳ{ufTd 8Lt3GW8%FS\+"sݹ3±{u`cl\8; u߷}=g_&LSEB*A\]3)Xyȓ?#? 2ӓTkŘtGs_D`~ ]C;ʚ-Mj1~~SMf$~-_xT]U}-- mu_9擌Zv{Q(\ dBB (<G)VdP1g]ߺ[!pTF9o[jGU5&PweINՠ>atp"{὘2ɏ"+m"8Vrbhɧ~uA Ϊl|Xݤ &W 15SI4nD87٭`3ϣQÔL^oᇀb׎a$b`;"^W(hyF15N ==\2ء<1r}1k<^a Tиg.{ TG'WA-9&pw3%>߁׫8;NFI~6"3"1ƣLRc.xX ewn-shv%gbkn/MX7 [piEß[cs_͡sb`.-(SwIA;;pCM nތ%<ԇGe}N}RL|"6>/ÞyiwO J 3FMogoDqPWR-umw077rSa88B/&<~C? a܋*spp'.py8SC%z4ğ B ~-5n9QfHd}g+6!;Y / \yޥV/xb)'nʹ{ju%Ú:R!FWʬ81T8_裌S%)a <AsC/kDooB-!=-r7fw8'-⧵SvP͜l(qݭ-u0G1˭h#{;p5`@[[H %\0/R8崘i2د>Y!!?  >:A~//u֙1=jT~pʨ$'Zs8j5CIJ̠%UJ:~Upm4M'SxGgvccCvhd{Ce̮zp1e[p{Gu ̌}Ssr 9Z/^ rLkђ;'W&N@$ᓻ2} uxE3ش-D΋ug膥9 RbPBbýJ+7ĦuN}iTrS"F•Nߪy:,:lnlPst0Z#3:7Ue<1 <9#K=t+)p|[/jJhx$Q-=Z,lS} WkyDlhaN!pFƇϣqh5R*)gqDP?C$|ǧ9"&y1j.znU51̄Bn1Z&i(uD'FLwwM:,SMjUOGmQ/zO~g=3ZK=(C4;Z:Wl nʸ9 uGw!{q`DS"몾G/1yxؕzJ4sRI:77y9qfDÆ LOZ" Zc(gr O]SH2%uEFX#P#PJc":㶾gRg*+G'$k.hx}7UҲP#gP c,(|wsDzk5['w 3:2?)w %o)>?sbӝQNdz39IG7f^OQ| Kc(R֣*t@pc y GIJh@nCsw5Zo KIDELV&a)4&w2Fa>tJ΅+&3@̘.lyʲIy 3OT+avSzm| B9N1/vBr )09/_EzGgB`>Ea(*C=1<|tkw=;n~A@ iRKM_jj?.sEL 29>7y&eAiB>9>}zL?ocӲʜ Vx]5~8)y@iO7!)&xj0K 4AP<ܜ`Mbߢ֜T gg|:QލڬIso)mCGeỹ{"4tIltNm2C( 3W9],3S2W>k^1K$~q({{ZPHIg#VP}ަW<@vړ<{EPLՙ~k&CDg 8̭#|f_I" #IrܲYp6 VHOPq R9Mƃ<[,ad U Nm7&_NH_ChiW?Q3(py)/ $gGaUD=mD53.*X31d 53b{!ycK%S?|B%o~Ċ0/ 㺝 =4;$*j M ΑE]fu !"R <[Nf1ܓٵUp"i4[:EyY5֊ȌA/Ux3tKDґN.R[{27]7s}tQ23*Ipp1wS\ϙߍ~`_9gtERHҮ@1ℝ엟& O36~iAE8Uo#>^CZ}k.kBF$eg X^T(P|M;0t/-EL"bP:E"W9LƯ%pR@ZI D鬜E&_s8|C =}|xbOOXgxl-ui(*&u$y魂9cf(/uWe=dyPPoKgcY/pu S?80cҗb9sJ F5Q:MQ\(_EG?M|~lDMtȡ mLb :aZ AeA.+%LǥZjV}G?:v& ̘Jy9sjGmM$:\b8ɗ[[\7*r''PE! niHxp4-\i:ܐrU{XBQ ]\}Z&lRp^ !]w{ ԌtS= Ƣi>FԎI+5 OYk%0&Hǐq554Pmr'#RnwĩEf,Yt~ZT"2̗u:QF*Fݴ>GECڝR+n?rQ#]{3\[ߗO 5Ob7*[⻊dQ0kDRх'w=徳`C22hB 2ܗ-SX~rzKYwp&)ȋf+Z ~7#~0%~v숓"7&%"<2+3Jiv > ObZO!d*^ׄ-KcBAPtB473&7CHƱ$e|'Lז?!"e*7'yv8xvWj@:k֍tgKh ^b'O7V~yvLYՕ=;8,˵HHfͻϨZ$rP(:#31%B 4:t-K/13FкENr{MN:Mj ָ{Ja1Oa,ר_%{@7@9߽5$|#ݳ> CaUixQCQ#C͓o2nGKS[kB ߟ  )(A֠DLwdrANELj`5E<7\Wd1?V5(. hԲmn[̱諆:X4ځ+G>#a'c/w>v'Ѳz:'{&BOf<HocЎc_Dw`LCصT|Z @jτ2:דPu=f^+n:]wXo II4dȆ֨I!79J*fjo~?OǿRZ*GsOzTFHp֝DKE'{_Mv'XiwI{QYkBD%}']1Bo*KG8_DU# 7,\pAՑba/hۿ̅PR"itE6uL)UODC/$Sy<}$"kcw6\$'[do?_oV+g{#axC|TR +O,,z_9sBB!BBJ!B!(BB!J!J!(BB!B!(BP! BB!J! JP)JR!B)JR!)JR!(J B!)B!(J%)B! B!(B!B!Bs Rƥ>=Q HxC^p/I{ |VJ笓 zʔ)\m݉"zE 5D@&ؔ7G!scHmT2">0e PNbS$,PdƜckYRSd#$Ir FpԖz~*L145a(-!Z)&R5`eY8mD7n|Y| ayJ tiJ~Y6`CwI8:[-lY M= CEÝgq`s!a?G%*F4{%-Ix~`[Je*h4PӋ '; ;v~l?(h /<ef o`;xlI@B-$,0 TsЮ!s ;.؁,þ2ofZ`BJ~MȵH9\~HIQwd{\-k#tdCQ j\5 ώ|:3/67O3+c<)IV) FJt,NVu*R| _c\:G-94YͷE:4C~i8%#XZVϘm Tlr窔w8+xZJq .Ű(>/P\4;(AFϴ@pbk/aj05024֓6&HƈtU{.DlesE/!.ߠ"Gpm@*SQ:%G ,bc}Ρs|vzX<??`Ƚi[w|(싸3>+[>2"O&/BJ5]BoHY[)'e4W qIlsznC1;ӹ#p~d"%)m2=M|lpMis+";rkv2Ot ʌ7KgξO^!sx_/e8vcB-ܕՎUh6{dgo|.pږ&ȉXR<I]%elR{_$X0v5cc\Yhܜ'>vA{cW'nnFE&*yʆHp(^w4N[9zFϱMK\O7fJA!٬^x ƶ1ĢŖ}=w,+^Nie. r0; YwZ׻DiXcH#q9①1/YklL2#|wr-Y }_t'/YSxvWȽ/EܷXDϴs*TSz'*_3oXklDbqdo!F :r\885,wИB.SO;{ sB[lJR[trKn RS*WW rI>4QL!25Cw$dŮSCPS*ObKRgV[OJK)n:٣uykSnWN61I[i~g]\ OnKU-ɇFE8\}o{%J3?w/Ӌ`*v$v&2vM1PIj~&Ńlf}YTGV6_qd|Wœw=,k&{_0|G DF_i pZt98gDЍPw+0!>f @bag2h^k=ۧc̜XR!N|,+y?`1\2n#V#+sOt_ Ҝ40*k 7.W+E!j_;,DNîb|ŮQ/]41(:xFmgJ.yS$Ї _g1H~}Tg hd ]IySu$crʙUZ@}Y􍭰[6عvwՒ,R,`}sthf>R>X6LcMw U0픡$-QhȔZ p@~6(c)xzY݇?QNA?ӷ0x{ߎqL%0YA#/cব,8\1- 2T ;Vlu$B)UwlyXS>8݇͗xtE"Or/ڡαw[=yBRnpSLj-bLODLq$n`(`FFudʒ[gC8C!GصKxԗjS%E,ݧ]e$DZ\֠ $8BzakU>SU3&UP"d\ g=R/|JtGGZZsHHV%kqݻ~t+[k _.sd}`,.УC韯 O)NܻtŘH>Ґ@2ʧ`nxm ȧ>yqwG.ȮΡ*h9lM) q\N}\aÒ%Y-*Q|"v6 P}N.ǿWoP. =_|fmzR]2Q[tjeWIe$rE !S~ ^ \lۧCQR3L?O0via; ۯA_08}5o{6ങ[&~\ | >*`=h6ps/ #3}ȨNGj&hu 샴Pg+rL][c|G8鿙PbZ'Ҽ rn(a`>Ala4rWdzA 6m7=<`uJ烞 nmg{)5fr;CV\&+S61h[`Xj E7+ZW$-+O>$ IBE7Ț}xL%N(:]g6p \E^ܫ[p { H@T/ZNyx?{2=8]Nk&24Pգ}e+cNLk7LB0s:0Y!r +KoPTiMmm8Ilᛟ֐ۈFvaәfMo7G3~҃Q”3S2ȅN6ڷ>_gluDMfk.P"lo7@a`YrM _@a3⣃QZw =#=X4]j 9*|j&HRk:?HFtm>l TPS,R~δېPpWLfibeXuk'W>O! J4o9"gV>Ί~#{1ȁFfP2-7j7Z N$ם扦qOרanDw˖kw2Z R~%YcQ4$vSJk«6|UMc١R~U0򍵩́Ta͗;4|5^l7)v&t ϱAz釨ج_ٰvh\cK>gxr?WRϴ@E჏>nm;&z"0j*DR byiovKbB{=q&(P֚01[S*=5{&?yYs-[qH«z׵?E0ݩU9^㰍L G['s+i`)M"hc'9gE&XŇi6݊߿F#KƱ|TW@'~FU &ow5L"|@ pf*EZ9KY,v?P7N h@`5 vvW*Cލ"<*`_e,Öa/ڪ<'`^0}izӔHЃd|ndhAKa+Oc0._T_>ٚutS_fc9 cgNm,9.o/XZlbfYlRYpcV?s]כ󄜻i^EI-ID}%O×%qj ܣ)_'8oȽnvv|ŐOys?6ME_lbGh{m*z8ᎺQE# dĽ*88M hf}H-5ɸ4kBK3@|lCih7_^Q|r]mS ծ@%XzF AsQ)ho ,~04reb^Dx:^@tx/iO\{<o>G]PLs1luA'ƪ\LPS#aFa}Z[h"7י0UUf7[ל7t߹gC86@g"Ƚvũd`uV>ib"1?EI(3Pn\V@wg 8N}^+'SOwl0XiA,ZS1GC;)?g)#}^1wjO?#s+P=wKaAQ}~#d×縂a^hf& {<{[:.zg`9gџ}z`JDU1׏.gu.\e WC'%SO(/Y˂Ӄhi,L+<}s>܅NΓ y_W+d;3z5<`5|ܥϕI鲮T91Tf[>E6M ;wx+ܜX7q"0vTݮ:G .?uMl>SK]t ,O8Mn^^' Qۘ8 jC9b߈Kcٳ&JlT~1W^@r,|~»Dwx0c.iNo,UPߗZ&6o+hs\zNl'Px2}$c979fI#PR J0f.+cƂѷ`-e̤ӠޒA<d6c4x5sٯ8S0+qc y)/0&wχjgGL|Թ?w.YQNzal@!Fd9ф|2W+(@GlC NJ-[QY|>rOݠ$ z iJT2Г༔ע.=uVYqnaO:n\?KvrzfF#SEMFR*#?HOpqvs'S&nzZL`QkwwςkSD?Py>Zezݤ`ྟ؟&Y L"C5Y=<4=Ꮜj2SS1z3_9TOC!?_^ Nl88H|nhHpyfy_UWsEC^0*}pXy}y:),{g9۫\u"IHWa>1Tn7a%K+W_<9L$|̜ yTލgz!ktid.'[\BoX^j&Mڄo7OP^itSO64~7.7 97$gYd8gj%%wU.,Ԇ?ó.~F.v.:B+= pVX G!8- f̀c)HW NfzKG=ăC a)6I͎6}4f^h<|R0Yu!@مbV5ڥepJ~/qQTEz^dґ@?9O:s8qq['saPDuJ(]Yiq/wPyGLmI@ lUE:A| d~e ";8zdc/sgL ĸ{ $|?Yxʪ;l#=O "ͺۨ_ըQ%=~Oͅ Sk[)$͑eCTX^Cg+ +sbs$zN)jZ'ob(#'I t+T}x4ѱƱd+6t*=RrzRYgQ6bpBr!:<^gR@@Hyfz߭t Eg~9,'!;*2Ud>+J ]PyX?:烾8;:94yw;poYt}o hVՂLrU2_J-K%%(y6*[$. uHN+r22h9>9آ Ťϋ/]9#+`3`•ʫJxn곏ي]wh8Yz/B~D[;puYJ*4?V9znl WtWnd~4 \ifO4ZlD1{lZm[yH{ cU|/ s*|<+lFZVds+Y΋nu$9T]kmc1apüRudvOO~SS?U_Ddӿ`$ SG0 K;g}(.Ȓ#"( ޢ5R?,Ï[XdQP}[LSبl{-gF͞?g RX6;t^2r8@䛐 *; ͍E;-("͠l\Jy-|fM/l7WKbOqR~!v!1RR*ίpqq1[j97,IoAsZ@k@W ooaneO_TR )+H,1A\[}ǩyo:1~# ίL7?v,bP< O/|8NOЩ|zkN}ѡH#^x![DhϿt[`\rg9ѝ?~G*ps'O%:W45X`%i6GE)r=-{B kkfzf$T#26櫒vL<]i{ 4M…%Djd;ͅ\o_\%&'@a>R( $ MӲlѹZBqwKnGS:̕1wLu0khQO6j?dF`pHUB Ť4v|K-rd"F_ަyg~_\Jgl-5 Ooz GԽj. :Do:nvm[i9ehV+pg?8eǘn&a o6)ɺ@\y@1zgbI(Õ7.ʟV2y]ڿQAihLGe\ʯ}3{y;wU8" (Rj#ͣA &PvbzJ(U~oK[*_$-WQC _VUӚ)QJ2x@fɧ B>n89L Иtx]V.}>8 h^J}sl"Q^+3̷ɭi*R:f\{dTJ1߃2\eK\߭-@xA_Fʦ'c'aƒ!}l3SF|x6bz>쟰DED!<ν48Ld>*Z2ڭӓZ-G+lb/ltQաh ,n9htrU*2J頰u 2-'5}.o=\Nrt8?HZ΁MS(83Ϫ0kx"ɎU=ḥoG0#Rt`Xݵτ"݄5ڥ Uw>8?̣t/Al-D֌B{20FԔy`>5]zxOCKm@%ţVu'}<3vo_Q) K(m ֗ ⻃2iӥQE#GTبhppB+I-}/ӅOFX( 5B1$#dZG9?BCAe47h=& =Kqms8Γ6޿ )^`[>FиEe_J/$XQ)yp} JO4jwf5qfk`Y.'[1Hce ҭjDJ9'f:<֧75\w|zG\V7aښY3Q6T1곽v~&6h@(k)כOg*kۆ%…GvlGG|`łhr'6 cnlK3N/= DX of1؛b_΄/ܻ'*Gs*⨞1|hX}⟮Mt?zsD_9vOT/higob1qm5MO L#i'g).H}o9xnӡx8L-$MsJ⃢)D^C:gQY̶eqpuT|!N P$'xmM^z}n)_)&KSl>uSHkLhOUrH/lr:< 8 KxGU婁x 1zbpl7GlBёr@M #V;-?̑a^I)dZf3lP Sn3u-#,sa!鶙o_%y ] x8DrsY~#'|^$ESzqXȀ6>~kK<%u{V=L+áK6%ҋ f$(ى$0񆒒P+9-avCyYdO+\@D`ٮ1ȥ`+T9%5^qo8,p6[5l_ uo@+aÚ [۞X GH*95ʥ$۝NBǵ풤SR& |Eglf+§ayz"3S"jTvs%bUN_ "alH,rK[J0m ցigd"#^]KY[^g!x9Y&w9ڣfJD/Gb0rMu-eF+|$f^KYY`MzJ 0 TN8ô * bV_{eS@rsW 6_Yp͂1y=E„9\aXTӤHxic3ÎD+FgM)}s`E\)=Ӹ5aY*uz9Er{:Aw#.pK NM-rYM2]hD,<<0]Iǔ;\V ІBٛ5vh\Ab邖xr GK^OҌzČf-2Q1fx0<kHxYq&ҁC΄;΀%֣9=P{dDDQ_4R[ ^pS _m{C3&of<_LF{vls ٗL ,4n~SI DRRxaoХ_O>.'A NfY>EP H  t^zz2u[Y&vq`a\Z㭶'ӡCt rU& DrwӍ%`mQvHqt(F'hGNVh.O #<d|ˀ|"Ip+KfӚU85}cz!`x~6~{x\y啯/JSKRl|i}8/&`%L 2zQ'.0VM>+te$ۙ KъW%b[욬+"U Rtq+a7ra` OD<:x~^ŲgZ*^XԿL>dj>wk1Uv~!^@ `}rdjW(GMs'uhg5ZiMf^^!4c{xAjF~GRgaLCQ2KlItc3X0Ȭbb=h0s^Yk7R }'CaO\q w"AUp-r< 6bo^8ec㮒9/>p2EAɯqpAǔ#9jq+Uxa/CEva4;;xP{V?Խ$Kkf=[ak/WUjhU|oÿvHO\+<[\Ok]pArD@2^uNfǁ'5Off*G)OBD^a1 hASz }ՠN`Tsx꺭?Ȉঋd!F쉅QRQOm k*JQ"ݱRs/cיqbsӼUէ!|TQTm4;.ۤ M2o v X4(I3QnZ~٩]P秬`ٽ:yC,(YS-;k@} ol+T~eN|>6lLyr ?Og۵DE}Ut9Efᬛ}F,LƟJblTw$&y&~YkauRt?ّ -[3MIsnX>6 !l&${~u:&yaL1=ȴoT@aƍ:Zq1z9z^ 㿒K J#ám{iog,";v'[_ijk˷r \esc=؟/ua`9Da bg.1T)J4Y*VkյhW7C $NR)рW"yqe8\֏2Pl\TM>87F⻮!U1u{`6_OJXIvQV)y*AQ}^KNBsOF3ߓ:o< 3us!1cЪdL{2o0w*6` cx+nm:p>7aYӆ#j$͘f.|҇6i|6BC1 t' oȉ3jYXZKVX[Kָv\tіӦE>o݁_i h5i_{ى?ݰjn JABd߉NߥMNl/]2+ r{/>60)ѫ NG 8ۃ&Cje\~ek5cr$JS\5`a]EInAqo]7B3a{YT95P3F"\ǟ(޵_C‹n-dBgrG4bzƗC j3Foi5L>R{Ak/ вxR 8m=ᔤگ K~bf, /%R%\Kg P]U{|{;Ipp7-c}о%~S@ﲕ8_ GϪVwƾ1Cbݽþ`k.~<c6_0j^񸽄hZV+x9Z2ڡ{aʐorsu` f f.#{'jt \C s%BuZe{B0's2[ d}Ѫ~IQw~J/t)F`)owĦ?0YB[qD<=Oh \N<(_>ԙ En9Ԅ$KƗeir0׮^k6M Q!-w$ WEjr85@q'Ou̸u36P`&{8o!L0Å~>_2ʈt Cc vKBi8v#) /ҟ7k.X.4*7|1]P l ve~*" *[].d,qE?lKGo)ƚ0vr~*t+ĨJ]7B"\ǰACNuk ^^H•|ޗ[E&m:U} π`1㊤h W/>=LrG\9j>, ЁB"ٸHlkJ]n>`w:&K>g:Obl A r~,;AJ Ҕڇ@ O ՏE#D❙Ԧf%resg}샥&ωVC3.@PycZƗm!@f @@@[}s V> @H{)Oz\H8Mk8mqN>gd﹠OέKW+h ȧvh9c:=6;-m:a#+?|,O/Pa߷O7uyp<<}*bZ~ppnB-+n6&m4DŽX.^1)wQJ'*1C }>ʶ03[Y%OjV?Js뎠>48sT{okc"_BzGR@.w,.4yzF^tm~ @s|ker03m/\N׌cw\`cW/H %>7ےw?0|/1OlrA)k 40 @1Py@:0AN)>`Q e ЁF ' Bp7M&{ Bo7pOBn70HOh IwHMݣ7xIn7ڋu>*ԖT_YCVkA5&W Bj500M&C ń7LtF&$ >0ǭvq-vb ]d^퍍RnTE`X JZ `/3&1z%>r_<4mtq>1F>s'ɷ`dQUuWZܥ)r$0NNM|֯BOj0fC@*eN"`p YvnYZ{\%{R␢'9wőAu9bLJM{(S2^E/amk1sKMt޻0ixݾIw<.I5 s7RE~ 0;#mFIu \m/{h/D&Y0>?a/) hQ}B;h'J%- z l&1tMX xvT;Nc]Uxp &kF]G֮[4k_Fg'A:Ď8PHc{fqjR\ك@x*zo˜(8IONcSnƻ|ROjFg겣a]c&M|<]-Zt?)gP}$:ꓑj~~*duKE0w:{ 2f >pzڴ\)dC*9-{Fثvt|/ =.~(@T>P F><ȓ90G~;E!CXdDo 6V<`N`GJӍ\8]:=?U^='j(ɤF7dod#ސׁd)! >Av?uQli 6^ycZ+j2s_0)hP)V{ v;]=ſ3Y*]G3 d$na;#&GD?V⑵/UA'@2bjSbZ=$^R#H1.=qE_sbKvSh%U !dUi{H NݜFHߩ|RIH:1WK2Bw_Aq^ҙd.Kq=T{g%d IoK by1F.?NWkg@J5B: 8W9ǫ?BpKC,:5SÓ|M yꊖݹJ];D.wY-mctk먲r>4-rաN%er ˦e0fӼ' Nڻ%?as{}n>܋t:kAX1 Kta-S!ukq z䷢4qgBM']#)`ؖ>{bhm2M  5zp>0Bl֓o[n66tAf--:B;~j'-k6B'䆆r\ tE8).jԄњ詭 ͫ]'NY!ϑ]BxZ`Y9_k({E.%^~FXv` yɐ$WrѭP1 ITXH2WH{KFAwMlr?i85|Mp)"5"yf.n#_Ku$ϪSsi[՚>HgIv8?2 DK(!>4TE4Jr?p#,t@Nx7ރ1MTR *,,C< k|]BpgYd/>`,a͒({KG g/{qߡhؼ,o37snר*z5v!\TIM>.O%N~ m`<zt`n%>*;{q~#sGs+>\! fWM߳MdD5ιO;#+N]6~kb\NS&2[iO <-ɵ2I=# hl6DBd[dNrySby6Yˆ*QL??'Cyt*e Nۉ2d{@`OK74O#ۆ(5B*Ii8?Ш2hpfğ "6x;#YeHI?t6G?8\?(y˥So:Rk:!}$ NŎ'|72I&̇1Xغ1F ^t)+SjN9B8O1Wȫ(l%Ì Hig+02 |3DߍdGR'at Dprd n5iOK-c  5gWTL7GC I.oC5^ xP%P<>h;;(.H_t8vHw#ȺK5f~%TJ[CE^e9 #:dV7࿛ѷlBuB{ jlL_D^2l ,\9x%ĢwMar}ʃ3d[XNr$(m HTdq wPz)v>Gvo] O<*Es͗ ;$plqM3AIH*CұJ Cj˚lK>] &RR6UCSy ƢώØMϢ;Bza?2em{>B֛#y<IH&l(1_Qo4 M@1$3DP\5I.%-S'ڗedme!CUI.c3W2D!C`E#^ڟé;Ҕn\1CNPXPB]R(%tC %pyL|UzA_o3Lœ yV:hb܊oR? G =w"[DEԪft1מDK%V7al 58IJ&7q% "ȫe7(9ˀ4k ·wjWGvoFMn2'$7Q.Wh4=&72&M&Hx"Ϯq`Gr`R˯<1Jgg@<s^bw WͤP#x~&T SQ]b@14 wJҐ C "_oa{6āPj7 A/FT:t@4wQк{q?-ȎHuy(oM0l؋:5drl3rtw!aA3 nH|-@=-dʵ-A9:[} pGL@ҭ\.T{npØbv3wʺ"RtUІdr-;Vvzs紘p Rpݭsٷc5*%n@-һȄuWeȧ"pC 2Dz>!&|^Em>D2qg̤x%6xC™} }㕸#9>aY:LʠY u ڗ$=ҍ٬;0*OâB0Y z&ntic9T3˻w%Q(9م{m \D-,2J#i'v0e0 Q}7$KLEz<2#SH/sNi{/ -1yBGXؿ*a!_U8r,o*Y"?}d3L2p:Gd]͙`kW8jU|QIc:a8gaA<[,+Γh.Rm rl2LK'e%|W|@U'M1 "=M@@+p)pޟ}nV׌'p"|UɎ^(,sT+4dyV])x~'`ihA0QY2]P1':b8qҲMu> DFTR[G 8@Up=7&-ռQ<)G& ; z81 2:V3$Әb욚W9d\>QT@j:*@;A 4aZU/Kzz| Ƒ{I"Z<>hl_!Tfgx&"ӊWe=f8O-Xk7{m\9ߎw$na_삪it88blHaLA\|pt8fWgwwOa/d.+R]2IHMЪlʼn_HKQ1ʦj"ێ:6'<!ofQGw-ᅣrHݥf*D1&~͠Ó}Q Jކ ˼~8,]=,яxQIQ tJ)T0;&]cc3Uٴ;?ԬM&ш񳒙E oprN88Ɲ^NDľ܃xp|QYJ? q 8i?"dWWCX4 :#( /$Q4so3Eҥ30 5 %ȁOE,|؃`/77V!ƺ2T V6qâ1[H \.;,`PWt.f3!sI:6FQ[ET2|&g1tqO|[<í1,md3vm|a<;N1A=uÙuPPfs8POK$9CT7Z |;(jz:ZVƞNWWvYpe<>K~ZaåӔs*G%9 ɛ#$+~kf8v([ yǼEy=ߚőJDt$XdW3f&+cvZA3Ό{,q~}JsUASE0z6]ZH3WO M> +^i?ƥFZ%\~(h !F+wW>1:*/sdx $`|}|`Wj8o ղ߾ˆ2/A,ЉlÉG|7TnE܊k L_~?hG  O^2BC#NNOhhif VqO% Gu ~PjspϤ%"o^hJ2`/dGsx^3fٕ\Pyfi7tgu-NE脙3/`BUsLlsohAkÞ"-t trʛލSR9W%5g<)c[~ A8̀'O3K%t5\,3A5aQ$}-VB0ߥ7u{g!09#g$O%޼g J g=ߓ1"t"hbFy'(1L[Ϸ_Q3&'ƛQFs [Q ci kmMIR5"9NaikF  GԎ &#U:[-,7 E Ro(a_vK [VxWag&.cF 2NgcWN&dxq1g3՝NY"AIdMO.5 A6gDjlj֌BP3f+`'Ww[o7[7-*O@q;=kbxd&]q^8d)&P:2`- a* r/Ѝd"6I4@8 Q#wi@U~N©3 l Ü+)<6o_C+P`Kx`0Z%l3" "`@JLȠC.zs֊*UlH'{;7M8odI^&MțfW ?l?!1R*I*ڈ #CsS䄙9P *HnD*0fgÌ $qS_#y(U ™f 6@::ѻa`IQ"a"'ThgajR9q4!_WRD! rCw6'&rOM(i0e]S%PʪAGdZ&gTcTf~4%atdу8fgDOHQLMW AvCW''&N$ 7,ɐ'ȯ84T?iP4Dbvas dXu  YԀ f+e}@ sKghy5֘s3,$D6h]5@옚5 ~Ϻo&RH^ !B\O1 Yɮ'.D*Zik[ϘH49Pa8P5Y20+r1zxEW#><7ID 9Z-$OhǪaʕW$|H5mSh]F;-8EH*U)*9q7m!CU == TS_O!&Y8T>Wub{9?=A{) a~)͜p7#kwtɣ\ VNw"w)]QYX)w8bp)jȯMQ&Mqd6fANs>}&ly:9rc!k?w ߘ]ѫű uisℏ"hS#j gʏpCG3#4-4rmDg6 (g caHaRY]ɫK6_ {t @_PYe:IkvWNU> -%k,ઞQy}]z4V3rƘĪ'oTkTm4sHf$,iKUC?35T.rM,Hw<Qz1} !*,Q> o M_7<U,&P;ׂ. NAekN+jB |?pET 7Q* QD@KaԂ 2<>᫯wj{|Otjݣ4ZvUoN'𪙂> ݆t*e k?<+{9u*\uΠ0zcgW?з^ֵč9U$N*&'^lgL)~!MhR1i :*;(2Xf >e^I1MDf&,' 4 }*^]9>J ؕC>@Tl][2wrzjCR4K&vx$8rmgжJDN~R9M@ASҲI&E*]DQ=m`wdѥ ~&PϥǓ\!蛗Y~D.H=&)Г\.-;"pU/M pzd*"s0UN?0J*鎙t23ʁT6G(}4]Tn7mP`ªTnT"se&fPCéT"k7+]c#p=$æng\+qtKʗ=Ӱ%:SwQ0J9璿[/ot kYb3 *9.`Jzi'=)#7)BB(֙xQ[f<0br93(ߐ,1!%Ž#aSbгe8gf!NHisyrR `SD+3RZ'Y&WWܞ2m`oп7͂9B??? r04o!4Ei`:B䜚K OQgԅZxYf d=/D|TdHT/^ LqL6Ǝjs6+F|ܒIwͦJFM2 h"bjTZ-AIMD@3,wxS(L6$F.Zѹq=QU0rEO[o,$`<F5G|p. %0v[h=0 S{UiS\i4NھI;gB\u*|`>|!|q¿9:t+'5"}@w;8;YC(("0: pCո01koq4gTz~auUi7_ް%E &hnGaHՋ`1 ͚4`dÌ؅1b4,ciL9$hT`A&ǪwCu艠gd1/hW$#;vW#Z~o7exO5 ؇e+VC14BCdD51HDP/n_7FHt0ʊ{ mXjS wq\L=(^%cό$rRԿ+s_6B %fLЄv' -&:kW7|VtKҲٷs05 7Yku@qh8l4fՊbJ0ZG*|&uBb XM_Z6},h z3&Ln7bzkkόT~FJaOwNa_wo $ӗM:)eKRsՔϐEE(|?}{9m[ȷSxzjZg$PR~nβS ]rx6Dsleܒ/==z;Ik  @Iq.ASٵJJN9x&Cz"b2r"4DdKn.;iE(%R{~ ٩=naDGH:A-և?^y[ӋZEEfjAl~A.Ŵ̟T8yT{LܲKH x=ipp\JԼH=@yAL {%37$<Dz#ys3i*F' I{f`yФ字X0]k::mm~$JjWs9߄o^VAL}_/[1sEųyAtf麰0x^d= :ݞG:\F۱)_h得mXur T6Jb-SRH#>\fb}m$Ljlj_2:pHjWs|N‹8m#HX(7Eρ+P|a98;r9mϺVټjYkۓF>*1vk!e~{p7`ԧr-Ygnק\ooO:?m=Ju:l}gr$Z 44KZNU`U4p iLf2˪ @Zanʫz٣6c3#)lI7 6CKdG+ NQ## vQsLF[{+=NO׵SSkҏ$NB(2I5X2Xdo6u> sYQ!xci_Vc;1^nagДmh@IHe4q>n[rqՠ^A#b@d;p4r)=k'ꜛ;Y 0څK U[ otX}YX=Gw}^+fmy {m6X @I/B`l8H|\?H?:hgpg8TR "+,|VZ n`\mٜaChwZ +wG*yj -;|[JPǸsr_r%aLaM `U[ᚘ:.Þ߯/N94xTo!FiV(QJt5]NεSvD.KG֫m-ˇ/ㆤs0"ut7(KFx+o O+W]=_ݍwGjT5 =$v&pe-h mF$Jv^ a$Ԛ]OrYsRܼM ?eL28G/;o] xkwgbn Lfi^bдwfٺ9V 0j/xGxS< }Ahjw i;˃wH_b̡; gJ}HwSuȦSmhUT.:iR_iTYKkY-IQB+Gjֳ9jSdȁXsbA]a+ ߏ_Y݆~!F*vC@nQJnyK;\i 0R^"ط< g W ) g n ,^; f|ow'@Snլ>B \n]aq=-kpb:,fQH~%<[_EEKFv"qB SŘoIqDkf;?R2 Tj£MN26R!D$al$2Nqhݱr$!M 7RC9IT~j'b]v8w* wsp{϶Sp7x3yvsG] б+[-a}WaVZ=}w~S|di~nF' چ#q}I1ܰhEũS;A<FT YH30G^' *j*@O#w+#Bpc=qDX pWRRU /(,Tp$)(x8X^# 6<8%`Yd /`(LSl-0ۤR+L!Nd&L/r{VـJS2ݧ@ҡ)*W S@M c|@W3H~PY6`CMPjH uPs j%"0Ȁws1=jbw0!t\e gu"M#M iz*'WMY<,M;$%L+L:oUp=x;p6`c;v'u+bo afu1,`dqL!]*T6M D3^T Ct0iHh/Z 6b?LK1;6i.4^0,daV~M| &B 3LڧrkݢMVg␇w‚!?EƧcƒvħhP8M;\fr̤ao-Ϧ2=N1Vt.{YgDͿg@p@9Q4d `;O<1 ?;r3c`R35@T)0$bSfD` MKYC1A٪ q鲙} S|u[uGwvR 5 ZQcƃ&&~7-uI4 ңHG"Ú_CHh|H0'Jfh} D<*?TK0j9V@a>x'_3v A$p^vJ3ƚIb4,3z ϘQ:j$зIcsG|cQ_v {!e90{w 'hjn?_OD'X?GԸeFzoS8MY5*0WJoGjVn_Ampm;P&ݼ?dq$ \ yS#7K .5ZР!8&r4 [7z2Fl.WktzWwmUo!]\bD09LXau;NWM +_?։L?s6h[I]44b̂ w :^zp\-w׮i_H\X]` Oޓ,/ Ɯ d(bo 0f ‹NX'F IQ  [gtB0OGB0Zc :rw_ַ(]c{#H,l.,*[/ ܠQwo ].*y3P!wOQ3x~^$;ǘ)&,t[);\!F/ҿOX'i yo4_拺ȹO/sҒJO広,uL1&*@f}P Hu7Y4fjj wM3tؿJS.0gR UǾ!U1"u!&nBLy _rC SgA$1҂CE<.?CBymOM ݽOu $d@{= NƒF6vs !YnSt8]`lU?{7Y[z6N6BIc>t H0?"LzH`]3= n2?wSPH2Y[P(.I|ab "e6Kh`~-[ 0R &L,e17T ka5e$_W%~Ŋ"ɑ (|0H᎚ DhRzLV"$*\rZ=2l9@! HYi4WN֖@Xhwgw6OMC- cj5 / !5FT&ݪퟺw'A$)__jrA\hpAPP;'hDL:V?%-\ 4#g4*ܬQO$/(}ҟ_ 37TI"A޹poBAV`rB{$$ppTl KnE;088;@Wc&`ZdSnaa'ƕ0[ f4Jy7fBo7>'d$ P-10 <*XJ9[9ȓB!ƒ#=T rXUv- bC;uO%qiZ+>$@ &Mq_yj@oS AP- +ͿwM@&l'ROr8^`HZY#'v%;R@MLLfaRٚ1I!!NV91 *rR H~p븹!o|E+ݰ@̄-iY"¸$ ptZUۥwpSp*Ԉ]R 0ruA@^!p)uaF pM)A-35/oK0<~^=5I@X=v>}-0.c… 6@pqK-Syw􃑅h%~g=SA %¦Ǡwq/@~0F>c~0gvڗuʩl}ĩӟNKkFv]XY#迕t=Y]#K/aRRv;>f#4_E3ɰByeanf r󅁤'cebQ}!g@5lVű!Oi+u/4r0Ǯ}'EVHo]B֧bd_ k4/.?loٵ~yP'Dc?J)QڴċxqBG֢tC%S};oj$_ _HS, lce{!7i>Y[ Qal/&L8WF!('@\JUOpVTf|krn 0ſx5:w-m,̯a{vu;%_#ɍHqGm9r1#,.}/V\swcް@n8eVӹ~Rg2͂^&% *ȸ{/ϑ`i#& ;N=h֗D dOl;e0*TƘxBK3ޱtdX+P6͏fCɬ?WjtH?[%əjif5O2gE T—Z\YB Y-X1&p۵uz;63w62iJhJ'52}̈ 7A4TqqX|RLHjR?m?*8yTɈ\[YobQ rg=$8"\rꅘ{~ IJnC6oSe plK:"@84MtދGo8w^'Ge!lѤ$1?;26?u .[|R]z|ŹJ>\&NOθӆUOs˚kRw[7mR 'aųGlrspTFvq^HYx;TjY0c ]x. Q}RLHKPu'@za:r}`[;2vQ/wHF%Ϩ!" s^w%P/r9^*õp" QY}2ѿ>O6"+*nsS%j=.@17<y=#+wl_nBf2)Zk}Z%3֮{Θ6I$.6Kk.Aѥn,ܵqqM~}Ww)~TnΔI08=2@ӽC:GJ$׈5?7/ΰP8mĿ 0e*lX:.*Ng9vrbd凉 '+`6`7I֚B9*8WΌdV.2$Ftc6׏&;:6h\Ė ׵.1S{(Nl4H{IP %Bkkv80>:c@pw5 B|ș )J@޵8+YH&K=aNiH~ L\޵2Rv"x,!P+kV_7Z\6Nee7Ŷ]_tn)ym*-Zvw6D[>3:ճ+<#t\S,ͩ׆z1>ijׅ43UWM XD*Y-&,pO= C #<lsO2A r@s:ٓğKDR1;y jEh-j@`S-"%$C 8Trϼ<_~In}I)+ ۋlLWo9eS=~7oJrhAG/K@u>ho9070=P #svl6\e,p60#g6%Hi ,O~ ?k{DK4=YqyTD~#! m_>wjzn9'q4&0 Á"~PA9V_i^GǢL3Uq2=/GTa9- hgQ찶V&%7,1'؇*Ά& q ve dʎh6V0a["<[_?q.Ȱ{{&|=og ? eb/i}ThHh]X{~Do[?RNsAŲL/(:5骽-m065Jh(E=Rq̠8+:Ȁh-aBe츊[Dq0Z:}=pyA%cS`N6l PuP0|DgqVNtO&_#wz^) I.3d^Pԝ~d(@ Q^jQß +}\7Mȉ{yY?Eq[[D_UH1yEꅫaM{5ZRH^BU'\駍7 L3ʛ/݊u8_jǭqGa\z ɞBO#T{ƬLX63e=#L׌1.p #ؗD/3}|r$8A @ؘ !}N%QCxtI?ȫ 6)i 7l*0wgHZն<吖N(!Z3V3Ml=@^ex 055FSibN9m? ,JnU=uC]"6Mtwnnhiy9ɛ|ru/#tJ'"Pvv?~LӝD^W(s^T [M%v{b@pdY}]#Va>"9?Ĭo.VPσڻ\knmH|% zg¢0 P~>-&>G*?Z7 |8w k< OD%ғF;曎߫˧kn٢+qk|kP=s@܂j6np,)3oWi% ooxמ&ؙJP}.DƑU,1yMw4rYsA`"kORK.6B<{4Ew-{xݶ~׸y)s5i{/ZLëMqr>@tG?.r VQNcڸPhKgt>`zXVש|҆T#?7 gzZ<@Hsj8nѷ,ttKQOehkvםϾq7:2ƾizg=^]EP#'cjpR-D>UǟRޒŐ&rx^>/?Q"V`2kXE>%>2wc Tpٸ|wPK`9d~חg ւ󸀓6 "~!DbD ǝ& n} /7鵔,]Ks ~ %\\XYv}ůTxm>M8TOz?U:M;g+ 2Re(b}2P~ z, ˫MoΎy˄o?C?bQ>023'Dlhjq1+*+0ov ed+fTh}VԶrV0{Go0)- ގQ8E~.Fpt-y  Z õ}v^~^h cc 6$ e RV]_}0 zum]gzjv00e>=Ƞr:nG89qubc=;ك} (e< k_%#l2G9}+m7P]hAy/V3;ZEs=*O6_;gHH 8^x81oZ)󱅦 zG*CgAGTn'̘0`*`!ץpYӞS۸aEZ I ~qHoL1{>QbORy-?vr1TY8У_*4p x;H( aWu7/^.cӜ4D>h%;mS)=DƮ5/\[\t/ #&lPr ivR96~)-`)I۷jT$^~.j~eh%aHm- !do¡I܅5v 42&Jw#*WX2ٖm;]_!%>J9;|E"hIu EhdH!0pdО`ȧ#^r|z;y*I~zyP!cVPaPv{uBTCzhj0;&72t5Bz QfRqvc>XSsyl|r %.j+?O]8.N#Y*zJ ~nkljV}\rj<n  ᭶k7D>Io{ki%ŧ^u`vث}Q>)gbpXz JPi3@((Ll'ќaLP фqz#o;N XO;xۙ-? B8\ C=)_-Wr ib)(rdp&ovG btqS͢LbzAmzܨ7GƬs;[/?ѐ&o<-m 4Yq9ofSm;#7' lmAV,}[_3LRYFhvȩiP2OcjmYLN@[on`XM1 ?:UD3ki) 8a$I.Bߓhtu7}I^U)¾t-ɮvk9tHv@93*GH8f&/יlp:66ʎ~~}4v<\=hhtۜ2Y[;܎.5QCC J 8%!>!T%g6**}ҦӁ5_4ƚXE˷a{!"$O?3Pҳ=4oMMb0Ե;}@@ojmj !/ѰwǬۍYqrK K 5 8B5VMf4KK! -;(zK&$YN9SmSFE3`ڱ׌j.nY - o>;Z[Z/z. c6߅g6{T86 obiyq=[y'v*AjS1ÑGtƴB |N R;J.9;̇ǜTaY;:{qBNjxRKgY6[Q:&S7H=wglN__W他_6'ўY^ +6P짚SÑysQK:vĿX5b_M]< ^CR9\"/]gbs}YJhj\]3Va~} v6μ81d )$t~kɝq/4:q;WA-@6eм9r]mm<VYtAķHl-3Н\щX;(]l9 {.Tc=: W76#G  ]ORxߓ#x#Lyr#hCrlw{6iZ(~m'8C A^wo`0ED޷zm/:^V!h@JUҟ\'{܌Rnv%Iɀnf'gH5r_;?޷e/ _ه ;J)Zүl)y~E6K53H@"A\r~ĮB<4=/k /%r#ؤtx `袛D}m9E{ N Ǖf H%݇–=*9z9|/e`3gum oZ d}Ā"[һPw $Y5Ha%Y{Y@?N^Y¸aD)^ߘrՠ0N p~@/9kN v|@}:#_:ω< mpc(`qk62#~f9srz{nv[J[! )C5sQn_Piv|8(Ɓ3M镦)Ia;l}y6@)ėh~2^\Y01|o'#!V8Z; \_pF:dKpvA??oSBYΑ4!(M@-4֩6ZG/KȻ~OƼ~jպ+yp+kXg=2 .UH:T _.H?E^ ؏om8sϒL}[- 2Kn-_Ƹ˔.׵Aj`Z>L{o\Qs/u?պ{qjX&/y|Tn<=ڳH/>F%)Ʃ}"׃NPn͎ &deBQmͷ5B ޤ08cjwq"Jӹ[ T^"+-u|n-"d9Ţ&kX`g/vGb|tnu`׏vY;(jdCtCIMix 2ua5CÚb.ڗCZժ̈́bZByc>wZ>3C槄>0u<$ב~YDE,e*ޫ鋩[^$d|%gLzY8Ɓ|n9p^SS% Vbi5h0C&0WmBSKBLYFaqŠڝFĭ)߲1JL>|mO͑Հ3%W$fB@ T fgVkJ! g*m,h}~S5\| ~nkTCݴJFz:e.x{{c&+;z?bV[/ m+JRVCߒ`gedr t*Jta+5牿\p瑏pI1gâ(qX-Yu6W_K ̧~-pihʲLآ3+k۪HQ YʸYy_+vH % Jx;~F;}BاЬ "9Y,2԰O@rOߦ1+IquCM" pk;v3s%n^C:3s<гJ6 ؒ!'P_hp|h?0z@F|{b79<<$nHh~ 7OOmŮJ6ϲ s1[](WŐtd{o%~XFO$mx*I; R9%e_9NBM}8#L{$5A 8`xs͘p%0?^߮mF?ֹq ų%1$]ɑ6BR1ؗi6E/>:Z?H5->qlkSξ/0¥6az=Z͟1>BM&¾B?9WYq`e>"X>뭲Fܙrh[-75DL!:]Ofm˿l/a{F V: Fy\B1 eC&u&qrĎ0]C/+}!M"Y7=w39^z/L5ĸ/#K;jV'('犫5R>j%I9tX??q3JP2yݑ ~j?qb;ϩ >uXSp>EOSi9)w{H.u}3&B6:ʔ5d>\#7ׯ]p>niߡ6Ӟq q8%cPu CVAO؞x, uizߥOI/ħo6^"_OXI~}4%k}"1!tSa C.|fj;xf?N%=V ǒ@$'nJ򅗂Z%eNrޟևT{ wHu A1b}7Oxs-Ll(ـƪz۔գ^6G!#T^H>2JlV {$}ʆM/g|oSC=P!kgҭ< L|q%tJ_6ҫޏש3i0XG;%m. H إ2<;y\?D֕zMrG{:;L$}`D.) ña,|@&{_u%nI!Ez|qhv Mja9l%PHy/k{6ղ#{T^ԬjOi7ӈDS܄6H&j6\VdTGpi•+ʬ;V;͛A6 {ОoM>Ny[ZP҆5J'o\]]g- C;ZY˷|~amj })S. }pFuNG _zn y){U uߙܬ)"tנD?NFi]pf닞i'8Lt ޒD4ywMwf5Yړ lv$[|!8Ys.^5^ ]o{,Kw U^xEtB9Nw;?NWO,,/={roCEUt@EVn0w)?Ӄ(ZkM薄ugivYN:Js{08$@vbbOI8@My~;w*{S SVƷºf55ڒ! gnz'Y?u8dPcm4t:"FU#|dC`ms@gTHZloCBygCϒ]g& *ȄHVc#k_un+rZxTB@α?{Xl=@Jg~~A{%zm5=k|>>ij\l7ru|#^#ѦvhlIPg' wpl D9dC/&Kw/^M9o#>Iz GY'MV0.m~+r,)1 1sO q8W2dd8L;]N p+_Ρ`咆ލG@ }9o7gc$rgܙqu~13;JazjKdX6[M ;eg. /; (V9.4wxӏ(]~=R6 P%6]Cme?&Gl\raAe\g1A-) j7Zs70nsb?9ee&yC=}#tgޡ;pO9m{t8HkrDc_/{fm8hr'lCf٘ E@l/4j =6Sv]ZȵG~}HSӜ,z}`/E Aqc>5R-}r!CRoΘQLoa+fP㏇]ƋZCn2+]][xw4R!k^Ooj&B@.eacf$v-;h|-a:sdXtuov}\.۵"#D6 TR*+,\;9΄BB!BB!B!B(BB!B!BB! B(J!)J! BB!B!J! JRBJP!)BP!)JB! J!)JP! BB!(B!B!As!oz@)gev#T2 ,j!Uc5FwT͇)K_@ k~/_qo20bi H@ZCo5 v +:GB(0~qzjް-P삍+!]8(P@m lh?_sYX, ^ΉuuWR^hh_T93(s3z x|s:~u~.}ۛa1(MLd\:m Fp[q2Ԍr %ijm%8;\h݉-7d_ y!jsQb̆pql1 '؈U|ԭϿ88 _>9 1"Wߑ2Qx_#̀պ#{֐yO^/J1ןd&?nj9Zg%K)CD)>.tPQ2%X`VaLP|ZW7Lw>ɻL^}ozD#sV4Ķ;wyͅqg '/f_V ѿi)J-< BG6k,?'9q"VvƘ m8#w#XUW0&֛c쌓t _9W;$*t#.I*:8{Ш4bVm?IH3g;86S0ZXF nDu2۠fN#A0A>Xm&ztThh'/K:п!Y̨[ ,hSHb}Qw"Dx(G诙 5*9:SLLp$`iTZ"]fJeFͧqH~G>FM0`sv?2IU1nKEc<3^k`35Q~t B'u݉ !z H'3$h@}H$%v6K0!Łp(Zé9捔|wXn_bܣc}pԘƢX %v[Y@ [!`n7}KĂZ%-4cwh l ;{TVAI^SijhzSǛOEMLVUV fC%9 S4#tbXޒ>Knr9ŗ/A{\nA$!d'+-0?D`>Jp?&,'Uge<벾2-u:EȿdSdхc{eUNWLsy$*JH`'HBs\<!o\R _hJ0@sE& XT d8;;qQix@]1& ;?Y,װrh53^X1TZ̰8_( (lUL'/,ʴ h>Тdl@JT ДG$¾g#Չ1F;7 HMm1jEh@>8b ~=h/v^l`xs\q=?0&9[>XDXN9QɉgG Z*+.Ëbnۮw7PRQ0F ѭR82Mm6m,O$o&Ng8!J.)2MVU <ʈِ7}'vU;~x.AL&2 ̹;Yu8q L>9hc,@9 Z#.emKii >^ii:1q~.@fثh>vf1ǩ︨+2C~/[>~)d/~>65ȩ;)4$xw%${/ռ"ddpUg\<}$O<1*oV#|O5M}g;AЅ,䫰H>u^~zj0#&=-d\1ߣ--kRpMkV~-Y;PHm!mmybcṂ\=u5cS;&5OORkQ#'lk.NԔ?㴍S‹P& OR4N yQU7f m2 ' CB!_&oaħ+: Gy:5a~{da| pm<4zߤ{'RǨSgʰY /DEa?DhN\׽ιUEa4z8S HQxDRʽ91<5!]n4@^'o3溑f]h팗23< [u+n!`; 3vԐ7';pdfZ=z:SvoO@ Oo5`g0fϧ@g~rUxOV!b65!wMFGǚ%iĉr] + 4T ##6,$n&7tBGlN{PԓUbOVSJAy@{[oτIfzz4FOT%qDt.Kdy[96>hk ڶy AT ]w7 +1 TlO>G#*֞`nKUP}#9KhvjFHxw(CtpOF04Y8KG?5F Oj%~g5xeLd;yCLaD?d:IN;m9D.?i;%v$&ʶ Zh'ݭ`d+HكU92=*M1h9gix $h x>yZ3\[Cvʍ+w;4'' kp89*ekщ֯$Zno@.7y*t@e f%95 eTLPЎM_NBS!`I'Md*=UD1^2hvU*-IFIt^#'jj|74 ??'yY}F'(]$fwǭ^bSo Lo`uV4qhxkpn,ec@7'Ơ';}L/v9Uͻ Ņh4ʷٶ p_ O+XVmj`U[ Q@8n-S!#!TdE^-& a]¦6YR= (VcXWԷ^D{ڮzM0=L]TuPi>w7kKDYL/@oR{:dP%p +XWpG@㈝U<;Z?VfqH#%ثx{BStS(Ly y2..QȐEp:,lCBgcc[oS$dem=K6Л{:fD_S<ʶϫ .h}T r]y54̺|Lj02p]܆Μ T?&-N2춏DKk \̻@N|rPULހՖXL &=\>u?PK-l/j,WL/_ld8̢S)1䒌SBJ5sVD߯̀%"9>d_{>D X"A-9XƯ"CEon#Ʈ 5if ǥj0YY//ͭ0g9e '"[x1GehahWF>ʕ.|%C?"\͋,^h?b\  p@{˂#l1Yƞ߬_%!f2)jNb|ёxw;& V% -q- 9'Z&d3ӹ: \dI0evCԒ'GNg`pw"v npGtGG0mkBz=8et/3F:E|x7kE\nH GzH6FtmcBDyh`8 h P!wLWs g1QRaI,éoM Mz# ^.E E A5OA5@A5ZD,yՖA5Sz >&vP3G/h}wPN"hAGp3x|NbHq<-HwƶbԪmnhQ&v<ؘ9f:EѷYzxw  @Rחìn-<4 y 57hNIMm \Ym{sgT~N9ӿ:餱XV\\0[WgN| Ჸb`) -Zu9rE iC{olms5%I`n5Fa`bmjPtd^޲uK@{[܍m$[z[`_tz;b~yBTBF3EMзSzRA& Ni0a8S&ݦD qЌ2GjrHQ8 O^O|N^Ś&a@3<hkB}(?~Ȏ4\6);01QWt*0к {BdYJzGVtJz!s $N4D{34&} Es`(GOJId &"_?*%DVb!r5egD(C XhP5{d0E=eUF Ѩ[{+s-vfi'@ t]gO4~;33>+9~ &3&zj N:<Pf,wkЏ |`]!:3(fV9c-RRuc @^ȪNWkZmZyl+]&BE@"uKvTWt4ho#p:EԄ-~B{s8RIqh]̭S&lc]Lk6!6z!cФL"8>(aI|EF&$f&p) G=oaH̼"Z*YO䬄`|&ێaUfL{)wh`>$)؍ioj%~A,hM(sfoOX [ﱁ"32aŲinjt؟ C\ ~-SZYL7kZoxr׿c~Xk"_@-G_>H욠M71'.~c&枿 B/ P||`tKhˠ & pD>H|KQQ:!A'K l`1[r+w v{bc˵{ֱL7 wJ "2飠^ @ ,spplS`Uh7@ Ag?Q4ֱK)<#o?ű&j^.GDg87N{oI?? ڃ[(YH?h!N&tG B"ũY籛v;y'h<ϋ[QekF%VGf{ @x$,#5'*؇U2Zz9O&~0Hi` PgP%8(V̌r B*Gqj&*I|O8-{m[!:Gc?~2[qT@a%Bp# a\ 0TΊ\ʠܝ"''n7vXxl]<z[k Wt=MF9 -لdgyM` h7_ފ393}|$v6]4XHc M*R#tW>s*cŌ*F!wɐ=pΆ9-J芒Vx{/P"6+Ewr++8ܳ & ;pWŃCu1?{.wL_e4oѸ!@Ly?o~7H> ^cLtqIC/Q4(yl vxU/}m佂: UX[Xss炙2C4t^?2MBmsLȗ!.6>g"Vh|q|ª> }* JLCbtL_t#~F t;=V r6$Oμ_v(> p,GWCjxo^p.CN9sK@rfDG(vR[n 5lq|1Dhw&@b =_oN/F*I"'#+s ?֓д2?nF#D:.ǂOjc9 9.x=W2X5 ~1Wv.(J椝7ҟ;%%WD/ݩ0t{.3|,J8Z?n4h1$.WK9B.6̇p>PGӅQ@-P xpx6Pwy4 5pzrBTm*YTzf\6s-g`3bO=Lcaު0uM=xtUY#$JV -U6ła zn,( .p?m<_/TKwXߜDS{}uQY6_CiCBNEbqЪk /^4vQS~ɻ#/}2c:3Y xͰ6-EO3@Z˃o Ev hg/N,S]؀r˜o$B{yO&j+ 2КzT}yV̸Θ:c\p0|V=¿ouOg 7Ӱ[3n 9mB q|);y ŹM!)cF;sծy1!CDwFОeIrq0dS~бICRwx=ɟ'}1pÔ_/D^״Ӱ +F^τw Sn$w]'` l5/ :1dnd+S-s8$fx;gf˶`0h=T>COjKmTg#mFj}68+Fw=u}5=w&%YSxp7<E@l^N{FڸK2Bq=w"וJҩ q| Ù/?t1D=Coc=2Gߗ\ 6 (oVyX\?m?ɁPUB#m(ԋs[,oaTj,k 0}r:)fѱݑ~6𹨕onl/uvx1i2/ L#!VJ5i8@Wm4 ]Yу Gjp9m̉{t)DͭD'~J=% 4 'B<$z%t)I8fq{&*߶#/d9E9 (}#B:+2z& 2$1cS$/ּe!v{,MOvHEDMx.^/~\0TR(@+,6Ñř/tUDNU8-,Kӗϔ4<d&7c2#kEi;^:;,A>y>"&A`*Џ=wpQ3NB oSs(y LrF1t| c尮)vJxsxmJ u3ox}UjGh3w"xǀL08H@} XfqB w(bEWIG+5 ʮz ?gvt&}<\ROhzZ{ C6$t+]dMuEt$_P8^٢?-gєl3x ЂG48%%nFAdIE9p%{yd͠cVGw)7s{[nZލ[kv`V|1ܟ tFj!{n,fƓAG8/u@Y^/*my sD(_FFy+PLD};PWLvm!/ٴNЦUUo?]%a+9/]}Z rXZg!H~qVC@#uen~{?MPw5;^1 KAAG+ NJZrhyP/Tmtu5S)_S'Հ@u/,ߡXR^# ,Zk\ /-l]HZW=i͠eҋYBi_vTtk W52~?ݯX"x] g8'젻RMxRSgZ<D莔?.8ufK5AXK$sqʆ TNH #ugX5#c9w2Ax}Z% E>gk'{w\ -]UÎ3?[l><@@S1`QAO}6Ρ0_lol;AYtm狒ռT!+H%Z}ok^]2^`&d7uz Oe>#ti㿣W5eTfŠhͯ%Y6%$CRz,e(1p. ϹpTP}+i3\:E!5[G HDO+}5s~]@J38_PeL("DwץݝR/P77[{08l^ QJ8ڧjN؞=zUitub]AzywpmQ+)];:o%:9O$o9y<= IQ9ruGf9uQƾmiE# `=E^W^6]AQ}bw Ƙ_*Gsp*5[`8.1;JDP@:3_]b1=8V8@1ZA$|!;{f9J8!^>FA!dwX٭=4Tq@Rrw3f;j̅`Oo ;t$kFmd~l1Z_G8R9s[^K޻rm g,Z%1A؇K%HWq  ly6(ǜL47Ŗ|+ܖ!o9PXhooy}]_s)C“u0[$Oxju"œ.=of %_Rhy%چ-dpYoz6fMM˩gz9svޗHTJ囹bEM0qW<=#P%;BLƒ Onm_]ӅH@y;3fXfX2AOy.x\ggy?G,Jql[AJyػ{^| j1`qP1}mW٭UCW1췍fo7Ub×B2)qP`h+UB8aPcuAP zvG[zWەȺ k.À$qȲ8@ ,<֣bE?#l?ǜ~Os$GY؁m[Nf,bLf…V|f@j@Lj# s8ϤsY12wkN9!v奘'g5L iO8ʹLB7|i1UKm>&t1Ow#nyƭǬ~'52+}iEr}u! ّ>x1X",VN^&?+v6fRx/FR GR ~H-:|ݸ?7W7(q-\-քBC*k*7;ݏwQ 䴿U Gk[(GT9OjeMx\OnA 7w7q]*lzqDHC5 WfLHc3h!ϫb:]^*"2 2=E }!\TfNRV"g?י/}ױl^ol6 @v@)1[ \ڰ{AwCe$B ^KLX q`lioA<;WVלQ%܏myP\uℭyBkW|x{* 5[+۰Qb{l/{/ر}b|}d0A%aq8;2 q6@GƹN!oy \mOA>ɗ gUV#tvkgɑiWSړ =wF$>OMnSykNJnȟ-sP". TO=X.kEzw,H6~/bh6 *̚.UD{BP~OCh 4_!\vK>I]K)ԓ巰˝Ӱty9CAJY Uw9V=|U0wl-k$/ +?~5P^1jY>ˀDZ]H[1 6Bo͗{Owj*@=yrJ-y;! ~hjŅAgW%}(]-PFp8dE['.xn8tPL̻ ¸C{½ڧo6f1ho?ck+YN%Z$#1'$ ^UW@kCz:uey+[pDVʇ#ghx]ۘfJ;+}f$&O)̨)oޝ<9kq R@69e~?EjW9d"߾0KIs2 P (2ϟS!wz&>D2r1( ՚KMGӧϋ-Eà,:9EJi 1AV4A4v*#Gi?5x^-BycKR:~7eBvS!2~;M`[{ZV/WçWʁC4i>GU, vy" A%a$_eK~D́FUB Kkv>\or~,f\\'#=o_(/U` Oyu#`x4t\hcZ0g/MKVS{T&ڷ~ Ņ;ި4W*?xglB2Nyu="Di&arT.70-SԦ! k`ot?9~gl.gs\e^ :Cx"p?(}"&|+}lܠփ?愃 G[?=K8Oz=aS~vO%;x?SR+e^O[j\D:YԦEz~~1.<+t #R c]ilh/fI 5t)iz܁ܢ=d_~9ކ\\My{ߣϋX2 w+Sǣ~%=g"V0;p}gam%Xf׮ ٌ0TDw17.Ϣt)CμAt}w#?YAw*V(=Z.qvnBv%1zJ2_$sx|>t{ܴ4-<+˟$7h)'dQ~BXc ,%ZٟTC~DHÎLL'oa/Iyc⫫G9N_I>gCj0 ) pὺggZ1M9WGԗ7Dծdtҋ"%{@X:t\&pr Pn{h Aˋ#1-D8+&:V5IՀ KJ|Edq_]=֌w;w}?jH;audTw;3.)$:8*3g0+Yc*'x#j9SF,d3Y gs0Cˍc>8P$= RG7xl67{/8mSP!u80o wnsr]at|@<1Iv1&CEYKfl6 ,s f#U܆%k%ˇiRJіa1aF4~>=D ݯo a}gpux^.Ô_a%W@x]uU&2+T.J}0>Y Cўc{?C,um0 &dRlM߭V/ʊPZhzhq}R49z`JEhm`J@KQ~2ҹI>lrfme;Xfhu~'D{`=7cm_A/H@--u[ͮI\B ?;vD #VQ2uMB@&bV67Մ[YVd @ ,nX0%۹pDɗ<9D4U/v|p}U~`"=Uq\UB|<7/ͅ Ipl]*v Sb3 C>S7f(('7y+#;sVø&,k~y]}@\o9׼_C6<z3*_,B}QӑEbu}Wcհ-Y7mα3K< FmQ(_t:Mz!_ڢYXcSOEOh/Obylnv'lXgj@J.5QzDtlYo=<&}TKZTZ%n3S&Llt$̲3an-z@?LOڬ$T[QR/p~t-ozRJ?&ʍT`OBd j%|W s}6HȣB4vTBj] "r-\a %P >sp-+!qc~zWLN+k̘{&rCHzih /^?,"ZR &NZ` al>Wxx2$N"f[*;1ta`ńB55vuq)ẅ́0 ~haDld0_~2wcX<>?\COooNWұ Ta ]Xm$õ^ ]76O1ff8m-֝7a_:ӍyV   ܋6!qh!QWeKYxK=: d҈)8v_@5J*aqc[-HУe'WEΩEcnG M˅ ϪwDO#vIF~loُPbzz8{rZitXK%k1̌>?\OT_7ŭG@K2 {6^ yO@Xfe 9Z$O]\f>'tݳ{lۺ/KTlK]ǻYa^'I`,,;mנ~켷u_]e\|\}UHOU~f;kjGa֪Nm]dYJCÀj - 0#"Ơ=4TN\ X™VZB: -1*“ a'Ru>APCKKK@{r84V3s@LS5d+2Ky eV*=Rcv~C縌N܂ҩ[U*зa\pɫ!*OuvLJZ Z@D$Qrd Hb@W2s"X# L#D$qH]f|4ָ* YOTm t" 8~0T4vتs "4h^Wz75-qC'"(o(zՆQ/a!X.`(Fޑb{~9$'cZ c$uI\$Mdj9ʗ ~Kj78]v1gOdoJor ԛeIxyn%ΏxF-EX~ CLk8yOn{w +!#dC}Pn +?@ⴸ#hcfWt9q\Eg2.ൠn6$)9LTR*d,,~gJvp *zNr\8K>Of{i(Hn^O5=D/L6CՄ6;Xf0eijTo>x1Z \R Ta}Oy0  |E|]n)R>5gy|I-w2% MQ$WGUɉ"|k#Gjgz sDћZm"ױ 'H&C63ܥ\8M٭ t wfȱY2}YEfp\cp;DW ZpGE8'o(⿀gdLL@24%%_"8z䈄ÿ_▌FD!MuA al2^4+?}tm~J#>OEjm#VaUeMGb W0Q.1\<ĦuN"6"ZWmvɕ6nEj-+01ڕ6y<wr~s.Տ&$TExMc"PCH#t݅!ݎU\:-uMU`5q|&;{ ̢.*ٌNJi#z^L i9A[ O1] ~pl5,x6kXK&یlڛRV[Z+c| 8-KkuAzdg)5(|o׎Ɵwy 0} 8WyCG2O3q`fdKOiSW/m$L1fcDv ի\vZ//C xBKC%Kzx?Gacc+X_=q*R+HS>w_MMcZ2:Y)GU&rY&'TU!Kq)EI(MՐ6ؿ)k 8sQ Sԏ2g,m4 ?Fk3T`.tN{]= {$u hQ1=t|PaRuMWI0迖rcqtەn2loI/A kd8=!ka$X0U/۞DDR3Ǔsf}}Cuk̊ [- =竽ꤰ9KҀ,0Z,Op(ƝF͓܋CcO U_7bcF2"Y,2Z70C12?-i`P^6H*yAQy5?5%LC9`=VǸ2PH@-T ͞30=בȄ96nŽJ=󛘑LCwQG@]ƓZrrPl +.`~6ޭB=.wO- e#=r/Kn@_ie 'rۘM:^2'5C2CmsQ"1bUڽ++Iֿۍ5zviVe"qWA']׿>و@A{̺7ȟkT8K񹺦z [0)X>/7nu_X@SGʆ_=I܊KRfM P&B_r쭏>wxhj,ΫKAxJralK6}UQG8zNl[}bdV|cq13%'Gɵ EXgѬ (%V?}X_v(|grZ17 Wue2&.b#BɂpKs n嚛>9̙\W,g:>"q􀳮īkNvm.5랚5`͍C.xK'\\OAJ!| .zzuC%CjAYЙ k}ej FH?¢=HJ=;fD IyKPw$ߧ"RZÚ4K&w2,2:lW7]dP f覾}$mQW[6lWW~a<$jgwOvLowɢxF 1Fs"xL'vѽٛ:Y u!#‰%F3Ɨk@>^u84P Ze~&8jUO.(q2Hʢ,$5bͣ0z.nuo? Pna͵޾`)BmC,|ܟdXjs0?]`Rav;!L-Fno7>k6 9YTkO1MyŤ`Jy"i^g+ |es%> fy;c2* plgp8ms*\ LE#* s~A_ClSr*;lj$dJ|mncgk-mhYU/, }d8 o,w"-6ޜ >[$qr7ap V ts.4  luԉrɗVOcw۫>leSΑ[+ML#^*1F(=>*F(}4\im@n<ם.>O061\՛ly_?75e=R}K0J9u34%=,ufGt}p>EOǎdo.hmiM7@ #|džnM"ٽ;;z sK3Cw MxWl V4tȜ>'ƚjfK\;OoAd@9蛲n#Mn8+\31JGhTc?ۋ 4k*ڲc9TVĝwӉղw8L.C7gNP%sx fVnC|r"4}7#3瑆\Go8z@y'xJfLo ^kRMvCs;J:]70^O{]oY!WwUX2tcrCu=+;twgZF;t1=Xpr=6h#KKa`uT/Rt | AO]r) S-EH[0H! Lu9`0\::HpAe|**{pRbʧr >1i2#?0pjQ`ݸUpV5 |Gc-5-VE9qT.,Hl5l8+A&6b1` `-$th#i 85#y4ۥ"_kO5iҩyGG ~R@mX~I]AY*~|zj4؝R&7/^+z]_.sIX׺USaJ`T\s+z,MFv'MDShΑr-y#" 2Zh5wwE>vyb$\aK lwy$`p0^S M}m᪭-&䄞xiAh&j4J֦BLwlzd3΅96-N8[WAa>ʸ&0㷒I ŝ檖k`?pn5zz|:ޏș'&OT˓eNQWG n7A>ՂKWjߜV0:#FҰϊ"_&:7qOyQҜF,ץ"<=3G`y/.JpCîӜߖeZ%1YePSᆿ 9wB   2_,Kٚv6RGET> )JOan)8_:D`0E> kFM>v-IRB{ 4(9`Ҁ>9hz _i%_D'jk}@-R\AV޶i`ޅk,^qcH}M6NZu@T'<($_nW\;+νxo3Ϯ9:#r*jFfB3^&9ڥV-$ l=SjXLI q!@y䋭J=%[qR'5UftB14~1V@χwTU B>]bXnpto8RxoUm2)D)"@6aVm}F)j1.:A.>ozA BJy:ng|BcQ Qtv-NWb QN+CSΣc#μ^8i;ݴ Bo[Fm[&}BݥT&/մ"a@VJ1Zʁ7N+?g˚tG{z'|h~2mh8-'&$HhR pg !SZ. cEVK2iw^RP5l&T_+eU̞V#;F'jocr]G"8?@ZG1?uocwoH~RTxNP@=:ӧa',<` @Km샡Z- /C\.0 MvíW_iQṼυSv{o!4HxQ_z9eZ.'ATALq?z2ppVKOFսHtd12k!͈5燈2~Ϻ7AԦ0O/"WuQv: x\u+m=eŵl">!4 cnII;eKV|%*k>}i3b+J>)siaөPR3qc;c):0[5BI]uoKsd"Q-dpǎ{vpƪ8)Թ O&~YގJȎW58ezCnZ(s+{68$Q}$tD b-/Xv}0Tq '9o5H^/RX7 ^{xtrH@҆)! 7U"gT.4'\򪠷KچZl tZ>-,jJHCY´=7j\LvnV5+&Zowu=% 5B8#?J~.ل!g!;n5,ӈ0&rz<(+'H b{夙#&V]yw$q?AnNQj!bK'JcaH84 T(i`UҦwԾB]op qfxXY3<ԟ:2 {ȓR#sr jŀ,)Ԁ3us  nZ1Ӡ8(l[HK9H .lQxzgWFt^}M{=8A՘[5uɨݏϖpMa\۫?\SHz?6GTI"_ 0_Y}pt7 ~Cw:! /yΑP{ e+Wp]Z=gj֦[1X#A:cT>O>Qr檏.Wo瞣 {L"K'x6H+w|B@*2k$gN`@]Bևp3y/@FM1rdC̐*5XMc08M/m^dF`GAKEo`\M86mXbIeENG)yԞA<lbh4)$jь@ձQQu_wdx(0cX qzF\s9M:-?E2ӒiS;(>rcc-2tD0kd 5'_JXW‹EF[-@йu.Fsf&#LIvp˄Zw:i+"NFH!3D||ӛ D$r=mи@qd 'ۉ cQ>DIy1S>koRſs@^yljC3P7G~zn.u,ҷ9y4Ξa:loCf%L"s:x}(2hcn4|fg0"~h  \|̍%VqU z|BEoL|s+rl'BgA0=-D@{z]Uy^ri>~ϳ[nםs.z9ҜΜD0$\uV6*+m<2F+Fw?}翕?l1* ըk+L&sÁ3b2ZT|U([cM_!+A㤅Ny|D07U9ݶN{8<  Jf.+p֗*rWԌBotPڈ\e6uwtp[hg$'HŅCB%c:#g ._ghPD=`qxWI {y>4E8U5J]Ej&jh> 4-K7omI{@%>oSןi~w-i#yvqθݷ&tEQȫ>DQ'ш?T{:η\Ca,.]Jb K/r3 XFNg^`gTpP.>Q|=6#9s1~BN#{Wl˷d<|Ht _=\ЍKw^r{Δ>c=Ȣ@}ιX/SP *Pr]рt 5)s#/M!ޥ{idL2y ʖ3u gQDQD9z U۪P~0Vx9ߑ9Q^γP6HSf̐ipI' )teR^/3}|8}еv?FD]7>pͽUS}w mWpA).0ZTPye8| : {BrΒ`wG"nFW{7^yTU7'֨UN`_lz@Ȋ VpTjA_7 g1~e (Sl%dGj}L kTC<.aЭgUyb0}coNr=WdTtvnN|umdgʐwne"ˎɴ-Aovw lN0j(foOn{7|pׅ{ ̙Mu=`ES0+*Mwoy ^/ E ׃`?}=v/&" w!>kZ}=B[ιHТP41~Y\lE/-OaðfJyIW{ 3ԷQ-+2ˇ,@rĦ@R EiV\/S&w9y"|<".^hf\CM(9X{wKH-cZvHFG:kbjǮT5<2FSCqsk)M!]nYKOA.x>vI^›ۙa&}t2?,n5` IjXWģV]nrF/$un~h(K|bũ=Cȴ7 G"vJox~W#/Kՠ>ZNjF N&kY`1V4Z.}JMO"IJ {F+r_!Fo&B:;N]]I@(x 1?2 G0j?ȆF k׭8}?Ҽɺ-CxSBVՏ&>RhVlS"z`bwiꏨ9Vat>R8>wKg> ӯXžHO֞J X 7X/s߾K;YtXv7tEbO0F$p4v54AWjm# cU86a@c{ HLTR*p,,]hOu׮8?vJuS;׿<~2d"C]??=/n=>0Wk6q3bod|gm|7mз^-4,A;OKx 4j0huTW/D8`OҦB>LXux+p'+[fj8#6'ݲkb/LgI(bNb|y%yxzU;#$':V61;ԥ8H/@ gY#B0ʔ&naWV7稜i P*rz (+GP`!B^Jw6[sgہP[ڎI[tXs0UNpL?`uqַӕ~?7o^rn`3&1ɵ#*c";VXtfF@;#`?_x0AymãP*̚ AxDf']crǍ郅xmfN@7PGgc* bt nutx3~;^UfFބtoi]Pvt3>_-ۋ$BL{Um?[8l]f~De3-Pupgw ?82lbRmԴ>e#07s,ز)?"B}"^zsB~3~kwV1pKwގ!zx(opI= T8AiE?YH$)w+68 ЬJ̡p"#$\(Mܱ͡W`5. /V=U{rVߊ{HRzLThy۬*S ]/qtWZ,t2d50-42@ W'-Ox;J$|گ0<.[LW4p}2~_^AI[6dP~zp:l>C¦Ƨt(j1გ ILcɵ )mO8 %iݎ\.G*GLĊ UYoUz aW?̠J|)*[{h]D_/{ܔ(ĀϠ 'z34Lr$ؙ$oNZ.f=W\LνF/?<6ݰT&6 Uޯ5KXv< х㫛ݜk 4:j(T4ak$* $ܰ81!f<]$͎HgD[baXZV8/Fc0: ~Mݟdq(i9|~q>Ga4uQlj~ŪҲ4v~;oz}{ ހvt@#l|ˊpk4dE}8Wd%,zaхk^sjդځ89hgr/6ca3>*ӢFLziskZm%!~H;֧{׿Z{>, %bB _l,f %4IRvET~լM .:7^ÂRt#)ܧvSPXÅ*g>*$艁P:b\b䈩:.zrebG 7=S#>d}^P1klv"?WL-?9x;kq`vo[_w~73Q an]+jE}E";t^ܹq_ ^S to)Va2DtmR "۷sbsI8*"ҽ.hwF?,{%O-'㿡S`iǤghhs@g8:֍h͊H2ОqmZɨYw&\$gV-Ub03ZoUx2ќ+Q|Yf:tcf5 AŽ}:LirN2F>% BsQ)WhA}}YZ2Ȧñœ*G+F"rThq5r[aML)(@ɝۏ)/m{97]ε~EeCRnUurStvɪ>ůUKQ,JAO@8Y_GJo3gL(q].uhy~cѶlFX,9D2)q.M9Fz?)g7A?4'AK(ĹTKP8QU:.LM;M%3|0-Z3ǷfE~lytnk{[ޔt^\I ZG垙Tт%|WDzg[!m2GșmK҃g w:/rf VpDVӇ9܈ 8@>ߏꟌﶤŸÖt< su[gɋHIi}HErKPG`sa'\|pyƯO7Nӫ88tqTvYWLfc *>>ָ0CQG$6Gx6 'Qz LK)Wuݰ-ۯNҁG#q= YX\?S rDu0pO?8Vӵ#tdTuoB9{H(~DL$C# v/ StsrI>&oh#*ZdFl 9]$IM蘳.=\ط<23 Wwn[^b W٣IU;Dbu_= 뉻U\dƛrسviӝK~tTc:>F4po#fYu:~q5?0G .hlX䛁-$mYI Odk.Qp""V2Ձs~pяeGuZgRM;vAuڀj^ŒcWbw׈+E sUޗ_$|ٴU*!s:hJP}"rR,O k{Nq^B0⃟SNOstt 'M#蝈GwLOBVd9]+l nl x#=Y'DLWt$N*uw=Qji5ADj%{?Zsƚ*^]?|&Ω+HĮ\G &8|E&ӸHSRb0{ Xؿ k FX/1r#Ϩټ} p 52u[E`i{^F">\fۀ ': ёN='}2T>@{!$O*f Ւ;f2@b7m/Zu4k:("A/R1?, "+ɍƐ+FSmth#To߀zUvF%f)۽Xuս)*Ũt6# ] JljSy3LSZ$hR5c]1 `גU!#d#C4+6Q݋kia ؗ²u&$Jg{Ģ{h2D=tr&N>*n򭓒_?=_3ԅقZI=#S<,\k.ccZT4Xf/!(l`dJsPj*o?zgރ Ë/[vp ۳|q~ J/;ˠUoQx8vݲ052&n5ۉ2]dW>?z `E|Ax;a:y5O##2#!۰qgym %W.NNaVp +RF@G+~9v,wK7 Jck;Z :k-_7]Y7<|Պ"55bi~ ʉτ@^}.cQko-H:`ߙzk L20?o/ϟx8Īڀ6Bz#Y&< Puc_%*{(,HbLG "`Z' .ɝevJLӐ^8.oɻ Y re8(MO*KKȁCFi8EY#~(KUSYvn p I-4?910ͽǟ :DJ[}^wRɄPSy<2;]%*CKL=@k6ẢlN9A{0zƚq$[ߧ!Ӡ*tJ9_'9 \~ p:pB_שfZtGj/M`98}lQX{1>7IG[* W4sE͋/<^xtՓD|'gZm'dtEqdˎIE3iT<<;Rq?™oϱIГWJSMԁU"-f&tSMUNoʜafEvHh"jn@EZ-MךjܢFa/Ԏ  G{׏ro9jڅgn쪄Fo0c~3}My<< aosִv <n@rXTdA-:ƛ>NOѠQdz8iو?^d7)Է3V`t"} ml8kCŢ)^%JuOƕ$9h^e՜ j~pFv2ӶL8"D,K6fr}uQW 藥F uœ<17A]{̀7B_Af`_;@f c՗ Zrs?s L$󠪼ivo[LթUloi&S_Yd!-ꆞJnpu_9}_Sdy:/ema2J z(ױ/S?o7$X؉Wm4$y=/D kmKȉGHf~-/@=1-=ȑxL!HOlxs+ ݘ1/ }d}9b4\UBޕi`*bS=i5CAT ;Ӱ)->8 !"toHqE>bɬPO`L< |_eӀ y f<y&X&ZaB[K#nM5'ep< kA]3IZK|"70B`#t+n3hp.H [r.Dw%+F(߻tx%GvehKIsije_:gP;O٠ qA?Z£FzKஔ#rg!̒ $\P3dՓNMtrD="Vy{7=&bFh?$[fz6՗= TzT7XF\Ur)xt@| Xe ;)rGHer5\o<"fvMDttyYׇjuns+F! ֌p8JYXma:ݻ0x*f")_e!8Gc,#X0HɜHCCDhRGH?^Qb塏!gxLU[NfB,{5@Eace0=gD?Z0NJx8w@n`?hnwd;jvT~C(s m+NI0.!wK>*hk"Du76|zzi\ ;\fhF8Y#5v Hnj?/D^E8P`ăs{[ed硓Y]/?}mW}t:ݾޖs×KFWI#ͳOzs3`h& =zݐ :>rqm A뒧Ƶhȇ LHc-5mOإzOq׮w 2z0Lz{ϲVȟ7]6P}gm%n_3ŸÎ )ǃf*D ò-ٟ5[(c+ɀT# #Zаw{.\g.eCSsO Nď 7:öCΩDE7[$sӂpd2<2timR,A(gc\C#eq_jMOŧ# 4P-6IMaGR|S%Ssľ RLzpfu o,?h_3,Ξ.hu|^[gG }{5>IH+S^~皧E.I5usZz)n_ٗwޑ~ F'::DIxߑsF N_0Kl@j?ܼzD{EUkPIDb5aXqҒ%֊f~1Ý'9.6 PZ~o~%?A|.suΣ0v¦eƃ4,*C{xұ<4~PQtF$9^ABrm7P0i:㦇gBPd>>g{c1j.\|ϚC`}kkhQFFد Wt=RHsJolG}/^o3y!E]U̽2([X6E0`,>-g- ^Æqhb#6|i o4Ocƚum` ϐ\J07*MEɤ> :,t4NcOנFv8=BsufM-۫ nR!eXUx7#I{(OG=0t$xoTi'y6\V?I4μ;MsV2x CXRIxAv:_7Ɂ~&tl|`ыmexfmϪ߶İy2 p2Ita`D|qxߴWk( ?.w81XygKCIVA@@E~T..O?Ɂz( j5=pOO~jkQݽ@64:˸*_I\}]e0[G'6T2Xq~>UazZwR*XSJjx;j3ftN` _ן`1br>z1ZPǀ Į" ʑq`o'z?.ߏYqM-|ı$% +{[6_)-׾'7M'ldQeե4<<ܧݲiKz%#<]y9k.SoɰI q<ɞcȤrW1!^N_mHsl y I @"bHyrθѱ(ƇIt~'j4w#{/UoXWq`/rzix3Q?8~:Ej>0+yNt{8gK\o"N@(b\TtVI}/EXAxFw~bRA/IbE/EL ?GFW/E~ZB5gRjL 'Aa--tX"*1|7 )aF6f;#v GLFlS._3kٔ{׊|:tMA+~ NJ?`u%/ݕ:@ʧOnF-ej5,gI)'q*s!] ] ZIx$eJvwIw,IE@с= <1#XڏEk<_ F)J+E:|;BQO*3EHaEF^"8JlH<+XE[3'iB~Ö?,KN"X7ЛPm|T3HqJ^}:ͧ Jn'n&BQ|@*o30ȪiOGhI\#oު ?-g2ɀz Zas AWkrͥ?ϾǠtCʽ9ɡC0}:º}9!]j?:67P|.DSN>ep`tܠr=Ȩ>:s\AW?FkCҵns!r fh?z@= Js2 HeXVzrl| R@Dr[n$_(AxfwCPx62 ßE$-V)N'd P泳J]+TÅ W^c>w3Șbxh7*'ؗ1CDŽ3HעO/1 T s0[ULEEZ_jK fT Dscf~œ8n=i8ɯEكB1O{;P@Uҏt♆[=5\*ݙR8cnT[Lgy]e]yt*-I.kj WAJm'x߾nW@w -z5a>0(Gcv6~'"L= [ #ͻy[ϰ_ wʗ՝X 2hjWG|;L2)FTVQ\4gmEN?\!LSE-8Y!`#M`eK8x7'`k@Cxr3r 42YCb_WG+. D`G.VS=ҜVws8KÎD.b幮ՌiC{JӧDc.ߺs(uY2UM#9'"τ 2_|ݗ= Ԗmⲉ鉰;:+b#3xG%$3w"LAp10Uz4\;ʽ.خ}O2vB4Ax)8:%׭o&3#:zܱzW~Lydhyi%Or}|'kMw` hVކv5Gீ-ԉ~ٔ[ŮMIIطFobDQœ?*Rތ\nф7\;KFf͕ ȑ(\Dcʜ:^m)TǣY7BS8[vD '%U 1$@e @$Cb3} #~Oܭ;,*?5ΣgpkP 1_I"y)Xw;Ǯe6*%`>G[}_Dl=]muk$ t(<:1l;ͽTH^S&mwZ]ƖǮ+ͫ = rNcSv@fgX@g Y*3َ;1V.j#z@3T>>pM{$~N!m^0ڈ1~6w轺2Rxv|B_`VK3c1\(o+ÉgJ1'HGW{߾}fXM\K>zYY>bUK)sLvq8 r@/T%3v a2- k<<@;g.Ů%ZƄ [q3:b-[ְryz[BYC,gغm7mD0:Azu2+ڼ#7d^y_ |>zcxfWV%ssʵTl9%ҭJW oA}B8'qV:_d|9(Y8T@C1zU0D #22] 2Ey0+, {ٹD-&QpSrX1_to%X-YF}ozزx*nCg1"mV~>q&;?ϧ &wɲs$Ave_lgLߞXcXyEC2 wNKuTtƓ7>UI}$ H|BJOZ>\bxįם'x߭;L֤-YEFct~S&.1;p^>{:IO)B:V tGI9MgmX&O'13d)HR|;rpJff,-M` lc3z(DAu ގCľ@{=RITI9 &Ɩ}|0i&頨+٤<< ߨL6{KD)T ovw~LF1X䢃SnBBYoal,aTťMk@u#@ #3"vj1b"tr?1CÌim{ aSMݐ2z4~Oڦѳ<:wz{Ëc l' ojbj 6 fxyK;hQ >)D>p~<;LwN" W[wt A0˗UƲlIC}n-ۭuCxn< A@~ ;E`Q^15\ kdC$H$GXfZEdiUUkQathAԅiW8Gn0J$;:w%-SfܾKW;1ID,h[ך0:Z^{VE+RUc9*=)  #cLGi%\*&`pug[~mkEŒⴘV 5$kSMr\A͝(8f} B 7RY t@@h ˈH3);={}߫h*,y@j4܈7 H Ycv{MCxP{͆ 7x@eΝD8[mjuOjHhߊV7Cjn/3 ӳ螩5GEr_@1JrIy 93Pޜ1i⇊t&qֵsx9DL> pwxPo]g\x:@m "lM~.vM.6ux]* u @tx(W&d"1U)kOMȓDV՚+)()2X,,gzXie4 ~yX#}Ż>q\'|`ϔۃ}u+;lxɬcczۛ6\WcGD]#$!S،?r 'm ͬBaY2⼯ݝgoLr2M$W?pAf/1֣a s,dT-M 㽼$2IVx{Y2gʜ9T^qe Gcj0DLz jEuM×;Vu.'o÷m?=Jglo< [{W ǬdscWI_ln/rZFkw@0AL5%h 5,넷4 nYBX DMAO 4)l.C޷wѠ lr(0P5t~7ʼnHS>xevgtxW N;/oEϣ8Jow̵stFF{(4V9)׉}1j ֆyi|Y)0@삪vr m|Q wJa(r% )P;(k3k_$N04W=d8C>GWh$iuT= ]|M 4Gzì6\.."xmH%t4@r;%եU`nՊ68%'gSQ%!#wP& i$cEAC*viر$R֞o*e9Ң읧y|"mg17V)(5JC*b5\F4CsE1˳0+ch,-.4@Y:#VizV~Їi sLg6ܩ$Ԗk;bPb?Մ zTkWOho/<η @{W\\9T69$ P[-ReJgCt&z#2tZCM2N{9w˕b~sEe{=2Syj$z/B79 ;rN[y=OxÔ11`en39wAہd j:9 T#pKy!&Y fgu25ce҂gf[V9qxS,!kKxt?G% 2M\oB 05,SX 5'vTDYetMF}Kf;*KLs_<@ F `j gCX@nKr[;d:'볫gP^/<(TSרΌ|ݖJ{J P6'g=WТΤV1r+YI35i=d8"j1șwAqF ߃d[qȒ%d/D$. ;L3w 9Q5<8lA+úڪ/T)RM8eDNԳ 6dv,' ޕ'˟v)\?F g_Åá?Ũm%пt?>]!"Ф\5O#$Cp" #>Ć'kNy\ ) w}%U4nkN'? qyP,3,RD kt̀t}xS6uzA?^|H%;aD2m"^EQPKIPZ }'*gxQ Dϫ\j{0ڒ⇑-r'j:h!v| "[IbA!Ǽ]#}dL:LN&x|ަ~ig YHuM6HTZCQgJ7  ObXԑfY)gi+o=>O@Yь'MM+y5]|Az!A,:bMBPiǟzUo GdQ<14ڜ[չ6qDk p;9E_l7NLznv;}rHaUQj PtJ\ތu``7t #UG&CvHk5 o _G7_xfNʰT,xkBE]=J}EKMxcJA0SB//AE1J9^jDTx?,.(M͕SKH,΍qc !>4jN-GW1~-E3Ng!?&6Ӯ)= 6R85@|/Um@shrUk_uUU(v*nSJ?WsvIX/~5îL`UxC΂B85(1m6zyJI3S)&]诈I֖P`wŌKfl;iуy\7LګR l))u ;4a/l]Ki焏P@4.E /{F|w\|EXm!KobR:m5[o.L;SwH%WZ:n:i6k}}='[D1^<\o2m%{`v _`WԫEX7IKe 1,&T\4$xWlꚓbWnEE,k%)OhUzo+1Cɜ ]<}1V8o3ސB ۻ2gmVPCDA,4ex)y>!GC%&׀j3 d䁉p*`?2u9'|MyeZ,x"?9"W<&'z HqFFTH5$X _VURRY΅Y<20C*aDC 03B|F=>|{L&8͟aoO95O?'cpc;4߼CWk[Z?TW,g[b1L7yvp>w(1y.k*aV,YEc(0rJK8n=O6JC_s,*B@.kRLq4j[8qowLqb=g\W9b2-[eS—WJjfgTTѶ-7$tdZ5|3jl][i~R bt.F'%U$V.@Ց=5Ǘ.&=sHAcqlMx]R&[|Yt}na ڕa1 Z3Jfpg5ҝQSXРӗ_2Ի~,lo^_lb$w[eޜ[hXN59vV|Zw"- %_ ~9{'d bΚ [L(ʁG#zZ!bR- \anUKU*rEZYpw"ҿw !|. 9_6iA9sAG7},ύ[{C6`"-{r7BH ,>qIebjOD%Ʈ&mIwo:SY # v@HJTl81\ܾ&LµRCǣ^t|ߖpJ4hjՋ`qҾ>4d_氋t ))ICWprWF. G; IT!-ΝqGMYX` Mnt~vyE+SE-ծzN,LܬFUY"y'횔Nw8ݤ8 l?S_fp=S\ B,Iagk}W6U{:M5\mVhxGIʼnBR3bOD!YIԕp<_>TLx1ktWL<|9ҡO /6^ktݾSgO߁yoN?OCIN,-͖a7}3|¡gӭ\׷:q`ykLjGaфkic.. ՞vϒIs^fM[.n>YC@My) = /'0F%$iT;)yh0'-]ө1FEGۊCzg2m/э  䮰6*vT4z,ae]%.\xP@(QyI?֝M!I C3sR%uzH^/>R 3XZ;^JXI ``Cr,N9Qtc>-;<]` Ͼ%9oqgnDV97!+b\y7a.D ၚ APiccbbf1t1p1l3DT1P0bbf1D3@ }0,60ϐg20/pg23d zC+=p0epg3 T?/QTOM:T[=DtTa|)%|}0Dv DBoWIm2(Ht0j^ YAQkԪ)5<c\DOU~ڦ~A 9t6~xs)r]T8y4PN<^i4E4.gi)S;}! M[l9S_u\ -ctPg`P*E'pAh2dK#!C C_?Ҿ5`c.[tV&t<ГN3b$ GUv72Q\il<}QPd~;dI.6FjI+7'豼"EV6"/7eZ BؑtˮfqX$6?tf_gʮRׅ`X#qf=bWo}feʚq.3#+6ҵ|6i ;so)<^Fq L H \YxƶEaRa9AM5G.+5]ϴW8GPgTҾ)i a[T|NW:hWfva˙Ohjո^6XťʷFSr?w~F!:32*jgζR"X&-FUçЬbvuf]N3" ) "\z/ Ԫ$ awb1U?i(ZBf e=T]2KOh|&;&;+Sxd/n·}|m*\g󗺌qIG E+sYlqm؜Kx~ݽ=7`R9[hdĺa޴MEqI4 /H\{.F\JΈ#ӎl' Dr6\Y˪)l&U{*7';:+iE?TWFhu~?RZX0WFfbm1.l!q6I|XZ*H.:ۋnrѿۥ8+'_݉Oxk1Hs}7'2Mx-C] 6>Ftn'l[TvtڂگUY쿧pٶm.:Up(0;]+!VKFBXF!8┲_v6b)%>`BYp.%lp,C WW;d?snLX J(}ұTZ] #:eVX3] ~Qܚ# >>ўc9+vvѺ!.= ם<B,|R}:dz*WCH~vuLǵ[eJ~ڗjUev&,UGC%#s7j8$rT%t7\.W&XJI^`l92yy }sށQ/^r Yzn_񶭅פstjm?US! Ng~4\qY:Q)2Ou+ 5 mt d^'Qsڔ*bGjÝ6_uMw1Ҹ><%:\w`',.5I6sm@._`a:^o!7TIcEo–`Xd\X܈E\.ؼ28vRG$*DNǷF` SvҿdG։ {CK* qRfSp5\ChM_XdO{#tU.}S'sWtlw Vm-w4AZZY>'7C~[E~']F]mfUl\ }ܓR]PI ?4m%<-磕K#ƔjSjx^i9zt Qe-O#]fl0vH^,WONcgjl,(Τ'NsHgQyZ.>]7jR0XgQ<*6 x{";#uz6HFam-!Fe \4wFXOg`]f]_fgأ^b6;Vzy;d (fLJ4B$zM3܅8AԷnH-GV> I{pqf爱r0͔Ռx0=6(B2ϞE^cGNe[0~Y[mh=ʴܫn@Lg ̹jY1H^ *RG1Γy%)1. z;**JmIۤ#zY%3Qk3#U^<0J6cԳR{kOpjPQۓpɏR,/x\& o\oÁ܀[8إLb}kO]!s+NѤO~F\::j<ۜgܳBKx. V=,G͉MvzyoNL>6Ӄ<$8\ξ_5Z}WCQ=){opEӍ!!2I#_Dh۴%,9'HI*Gw\kHB[#W{Dl&m-cLuw?QɡŸIuh\Y$^ѕ *?E%bR}e`omn.\T<1zTe)We#q`vx .)moіˁ'OntDTH'RGNH!YK_Sh`Fo4ǝ/QCQ\z^.Ipx]V,*KVq)M0>^il!cЧ趮QڣE窯4Qi>c1&6Kl蘱FhPk]wu7J4NE׬yh/w'aKFy L)I&̧)\!`=6TD(㆝zG-K.(SalLyq>]iܽG&X he0wnK`t+L< *sP64;@JA3ώ3yl ~%:"rprMtxGPvX)Z1Izͭx=DHHƺ[z=׊W ^z"Hc&M«۪FϼGJN̈́07`==?CגХt?^yMIn%0CG:v*@ikbufHpxw5X՞i / eWׁ0bѥHW7^z)lQD`8rZGT~OC5n%D,j`9>  T36 5t~cu2XYTQ.!H4"7XkR3i ppMs}ۛX#n,$FO~8~ϲr¬VS}'šY/8$_bmyB;#%uLv"Wt~.+ ?x{uΞrRV Vgs)1jdHNK6yA=X` 2AӦDĩ>bSTN`[.y~Cb|\=;y^7?~fg3QO)oSZN_nG2{m:+ pW"܋0d!1.DBKD'^~zC{e@ Z~1cv-<:3 *H: Z{]`ڟYMEprlkIXƬY,3\CzG8&d :QyEpz ]iIN;.ȉ]VL}N) Yǿr*CW:cTpX6UMP誢SH{BS1ğH_H:zٻ~_IќshfI\vlyu*)%(TRudr)[(mxܪ7Aw*zHf)M}>GWN\,G^^q>mܥ76оQt:@{w/*oef7WFG%`7U]4l83'vld֥UQ(skw?ctq?`nk/180{4{9y .&@ynRNjusܢIPl,(F:ѨD/; RLQ1vS%^ӹU.сrUNV:,Ԅu㗷y5?k`Wrr6D!Q&m6d9<:E#/=!m-z5z*Tkj2ra8Pf}|LΊiwtkVĒ0Ě>0,sΕX'>4tesNr#O!^* 1if@ PQxtM7惯QNQxԞ[= eygXCn'L؛~JFC38N>Q?Er;nOM탴6yN, (v>$MnYL:z_(N?8J:$CW^l&{6>qx yDms'BZJddgʼ[ Psybu=_fE#姰x 1xq0>uaW3_Ρ*B2a+W5lAwb(M )ug_BVEmHZPMk> 9 pLI5@$%~$EC\x+$ \mI f{ 3# ["4aC~TXg=fg*]anɟuVO۽tvGˤfϩ~Gyk+5M ";λ=r+KQ7RW839nٸe:zd#A\$ɞ!W=m8zPC})C-\L^`t5(58(cnK^\lInIkc1 Wp^Mknz|ؑ>N5Z߿1v(}iDWM9HQ3.U,$tQw]JBrx r# gOmَшȜ1:KBoSyY-͉{Ry@˫'d@1uF"t,˷TŸ6T`h2k9]5m{I.:/̎F:-u~C1s軋*q.4n6/0y-z_x[ragTEn/N &bus\0lOOdSgbO9~H3w'Pt8@c'NgZ$U֪>aX@f|γ~D^.5WO[zm1 v!:Wok"#|c;ac0-퓛TR))*,zCHg,-կ?+&p 렛sJ@/X !;fm;mJ#M^)rɜCqEs67R-bitD=ژN:8L;(q8d=?~ԗD6BY$_Sl3sG $.OtrZdsul>oe5Z;%w3_D}͖Y;@Q~x['GEz7J7WpT6cK9TkB‡Z6WgEINGѧƌ{wGB&QVL:^'t *W}V9T5)w\Z;~j=L}u.H_|"/Pq^׋ZZ<ޘ،9඗ؖL7^%`r۷4q{HgK9mdWz;g sjܛEԎd lf{U8 ?IX "uMjD=LǢާI˘TR yYI gE|gtU򍔎{\N2V>yrGކ:8E_kL.NjT:ξ-899Zsm:Fh Z}EHD;]!YX;iNUo.I1g`^oW>i a.>eUjv+|_ sÏ-騩<~Jj:ө%˔%a]< }_#bEkRR"uqax49z=\MJ~G"mWN:==swNwtO`ֈ.zFFtiyCw9ȱBsyCYEr՝ m:lDkrź{xK$ 6\^VpnYցƛTMPpWL8GI,鶎@IYKʗhΈ5kJ"Ѐ;6NvXڄG5~[:+}ҟ"Aw+?WJXe񲝈P" pi`7ƾ-U/_\V~CijY]xS\]G˳"ShH{[jKs{jЙ5>ݜ<ژ|JI1q=\Cf6:{v)EkYHt7xa2]zz۳݋2[Cvh?ә%9nmYAa3^/3{OqfX|zi]dp_(fUOk`\y -"3Xb$׻mH29.VNU/R'EbUtޫV{'?pp -t]:xP3sR0?-c\"CCwwi5ͥ3fu4~,in?Q-}jW\,-O\[RSuv <5fESgO`IfE:r&s V&~Y7]TNf'%|X ViuYK1;[B%أPhw$gѸHG{讀p[^ilTog][߆G$yn[5I:!5T_-H%{ N6"N%IEWG/^vK]޽!F!W P 'x?Y@@f$`E:nfw~qaZT"Ӿe&$ssˁm? 6>NY?am,>xVj9ٻRr^Vlǧ趹5ȔTy/Y z\8Qs%m"mG:{<-QI w.S c*0~x"Y&&Os̶t3ƪP7Xa֒xC8_/>v i錌p[ + nl4lӈ<us緊M. 3˳'CLCy,4*\7 o:vT f\(p3!vcONS`IdNq4)3C;,<9:u%Фi%o=.WKPdGT{Ǽ1m)2m.ua(=u]P[uVs}ޤ'b6"K;`:=%l}O dUHhN"2Wi!DoeZ0OuvL=3c͉S닏3A(N zux )=S*/r|WoWM 悕 Ğ*B꯳uq\=l_z#t'ZmϪC_%"(^UBߏ]joC&;_Ozδfq K҄ɒ['8-/缿^6N!pvS cC$}Wf #~ށh:ƜBXNd$L =*0^F̀K_qZ%'w-}2=b7_{nR? fb0.WL(PKPLL'vTUF\d2 ` ]ƸchU~Pc%w%M`\w&Y;CWۜREDRl'?_wQקa,[+S.y9LDD#3<{]w:ԦII0 5CKqq;"x+l IBu?$%M`gJpʫ9OAକ&ǎE\~eA@Ed2w=CcEF (~m‚`aQmžCie9,X&buW5ΎV0Z8䥠y@Migjyw`7I"!{8I<⮒c=$aéQÄ5#-Yb@ o377>sg}BC?W8˧\ui~0vx^>Aզ =,mSBt06<=ߚ<з60}k%kfJ(} =Tk1zQivEդP|D\;S ڹWHMZ-X8""vb\-1S?hD1cds G7- ȖXz" f99^2Zsl{HL >W o>Xϭ5mD59Q~7#v-n($d<7y]*;gs8/f0]ި:4'91 oo#ŽHcNҥNrO#T{FӈLJш79IzTe2G"k/>\E gjZmq!HS5 ٺ$NseE~ty{kߠd":Gr,2Ex]==GILL[3ˁMٷ!ćG` QCv6xzN~ 2 EouM6J䃝i?* (!f@ydxI ̀U4>5~M e,;QYCR{Ӝ΄WPO? -3.|_zAy?r!tp$ہM4c\\ߠ7.8E=&ARM~Htw=8^S6ͼqLtSk1t$W)zӉw`ȏJ0|0V^d}?$:cjPG6֟?^LE|&@INʼnPMe.9ͻx>iV=Z.Hݺ&_},SO!nw=&]eӑH2 ZoXlLoѸƝ~ ~_4v]4bx_kp2O"?q^:>g ojiJ>ۃVI"Ҙ}ob=U4/@i8 =.L~m$~+:˹(r fT#)V M1iOKoORFI Ȕ't}jS lu)Dً֒S S61+|C2$ۃqVX0ӆ=ud!ZsP(izqy{sC6,ʥw1tY_ϻu%HK\Lkoyk"v[jn)&Q0qSX׭-;SZPm懍Nˁ'١֍<  n,n, dk>Z҂=;`e|<ϮlDρ/ҜٯV۟ss{X@&MLJ[/Ɓhբ'k56]Dιk OT?#/(qgOU<]\?GE~r5ap=gdE=pWuwBN2b!~;,ض BW(5 G|S`.(kbl5%.ն.QGnű˹X>.\<?3g}A{VlJioȸA鯻=k\6il.?2'xg:7<8N_$~%^=B-!|yTmGq?bТJcnhO^Q˺L;:2'j;){-ن]*EXl-oߧʒ)_Vb.emѶώO.R:no5CR rT{-%HZZLC2C&KzFcst?VeLq69t@.g_^7䰩"[JdX zb q3qUAѹo*\_͔պ{?S.'qďаo9RuJ{VHEn75"23 $uW$ϑ!&,\^Y߀QXqb6z !ňP x;|]sW 6;Dbt#=J+%O۽y˅ܸo)Gg)0yؽ֞N! M!K $Ȍ[oj27Mϔ }&GЭ* _}qfw1?t䨔. MtU:ː;0Fͱŵ6ck.KF_:wn-ЮT'Ɨ Y2ο5-ߨe.鐧вj‹mxMJj]gJ);Yf_<%e8b8_C; ]OۯyE؟jmPڬi" .$1nz/ۺS?䇴a?nos5czt|Z f Vu{m6P%Z *MU5#S! ؙ s__KYsаhrz%F j+ P wU^.OpEW4 _|]LYNZ{:{/k2^\|GE~#ϲ(8B}/A15' Osmig04Jpy 0ӌ[Ys)ڗעco t]{{T&mp#bڍ(*oa3ũ}/D,f̜EenzVSA%v[ECvICjW+ϯBK[e9K&dv*DfOOoK4U BfrD|MHK"[8OΗJ] ĩN:&WP x_un }xIi~j־"_Ϻ>+?MZj[8D^_͋T5ZjgȘ$2ks`aODtaÚ2 $6[͗聼U8Z܁is*4V\OFxV#3?KG_,+ rպTTkwvTl;=r\1gqQg4Jn&PM{Ϛ}ngOk3M߆'i9]CbP!4&[t7=:t:(( $^ ~Ϊ$(ŢUWE7MWMYYvW(RW&ޞ е{xZ-͹F^9sn &qE~eQE}'s&CWUigUS%TK?J(Ǒ53SpB޲Хcc%y,%Z 7r?.?S?#\O  +m9l0}L.WKB'f-O;L;]~ &_:=Qݯ z~*JX8)aTkF:A-1SՋ~Q)~.Fj8S{8L Nm~6>=$ThN't.ll)Nsq񤼃oM:&wƾ% nTFe9,\VtE%zm2"T*0_"5y=5Q{,/y3'`y dyckw\wJ=߄]i=g,0L8Qee%+B(/+Y4ŗۙoëMLk,slNG6W~볳o_:d%rQ}eZE"(xf*ᴮ^LbtrF&dhZ IK"}f%g%vh< %ZT"<Ǝ臧s K0:`[' Y6E#f_$~WNt漸]T, s\RYt^+۝gl Ҝuj\ھa 1Or}^aNt#g]7ic?ځoq( L龕Ovdf!W7s?Ԝң~Q)}Ok8FRY{Κ3 {k~ºg[T,}>;!j~ |mƋuXU7 zqn 겝cRZfQSh#-T_M+ U4B|.26F?;z hӁ8,?k˅7椨iU(߭zQ>^meY<^¿^Kehn7o#=ѷ~OcɀdBG#i]"#ty6lS1[EIU Ͼ$UYÆŭŮ !nt+Q mt%I<4'#9+t=WuImǤtYqpjB=;G[DQÔSMy]Y7"W+(%jhqR q TVʹݎkmFG~} *+N x(I\[ZtPq+3veژBl(.mMdHաbM69;k'b~N$Ko|  K럷mVއih(45л:<#?pk7*ܭ`qUFW$=w %J.o {rHDҴ//L=yKOG7\#& DM= 5Z%xF֦ A5i4mz>T$oϚfFʭ/Ǝm 򸇊NJ+R L Em+ Ts BCDG^h6)zq Uk \u> n K rQ+X?Al=np0~Rvfv[,sjR/ڴIu)Qe:eTr@<Αeet? 7:]rzzҺOX)MCRk9Sy/5ÑWJvD7 |d|mlvREm+'80 R ]>t;5av@$!LT=rJ ע<me2<H?SZcn|Lqtٯ&y"IĞfQZDnG@ѧ+r7V䟇8" bb,uk-zBZvSK+|S^^_cTJr3 \vr?DZW-ՌFeT;FmS-k!w:]sGG-}m6+HSoX4'fĕ%] ?T2W@aalWcJI.5`X88z^ؖb!]''E PÇf꽭^h`7~vFӦpQpSl7Ηii^/gs!>Z hE(xtsP)r(N]Ըp>(i(ɾ}.-à+K?E$*#+D3 G[&~D4LvGqqy> "6Iɗ^뛑f"g>Q.kS5kkf:gMVP%>{N\PGsYzf$NkPLHCɟM&&K޶JFpg9}. 3pBb1։ZButC6fK؀䃼v#[h;yE/$sH"Ȅ}s:( U2/hWr3jܥZ('_e2֘]JA^$PK6{dDr-I`=*z՝o*bc\#WMBZ`Kph;U@"\BMZ]]]*lK X7DO|BImGjȪ8N=W3~$aT]}$I/c{z=FgY+C޸BG_EzҦzGI\+YD?VVAQ~.z=ЉQ6k|.i1"^~0jߺ"̦ hoqȀ-VLԶ'(_ō-Tm4ΗHqΙ嵃{jo܎ }@ gzұ O~vv5dr|5J|\oWv.f$/%>l|/mfhBWPRCG:XlO++!iqqÎJP0 qH!R`*2*!N!XIZM/cd*'S^)^\NآĸF, UFGzGkM3ґ+5dbZ-T㷆D.[BdC^!7ƺGZʯGM4N̂36S3 07W'rzlqS=ZNhq\dXG({mVP*׏ߑoqv˹8Kр$7i'\]HT[W07GjI0FB5AX1Dŗaq^=7^(b97ܺhwǑDJ y}a'*hy6tgL7Kf |bcei1|Sc.o=U#BQ2ʝ847 eM,xuZԄgyCP,b1YS j ml;KDib-جk!HC ] U"L) 9WdC\q@"hJ23c}rzL1Z;aD9|f^jrE`8ro\/=1F^aZCE:~,B)!B"d.e+ Zrس)j 2p~'1S9sr ЖX3)TpA1uIz}I7t_YOaGg²Ѫn}~qPGK[.b#ΙYթѡui~W>XںeDZNǻaI10d"ZUGqޯ&g*u9STᛒ֝Μ|~Q{`Vv% D0l, ^uK~q4N_z#9Qzh|?8KH_`f4W(,sVe~Rj)Eё݉.r;qtH:jK3 Iw4/ހd 6#nuΜ+@tz[2_#/ SckX'qn^8 !B@꾢~% gl* LX"@Q,'3(izSK1>R!d]Ams.zڠg4_*ڄ1J$BCp5RR}'+, ¥ՔC-Zlwl(1m lX Jڹ|Vؒg&kG3;J Gm AVpG^ I~XfDNjvn(+,+$`1Ŭ"|2v Yk@U[dV+A9pm+p\=+yc8m_ fL>Jl8%1}\An<5a&3ȒG4x6ށ_^N<x|B ~Hcc@Z@2o͹o 䤛.(R5&Xg=._LiuU3A8UܙYnfrɦʡ83SHƼQiLQ\QPɢFD it5my@`!3A pC@ |AG PD>p UoUV,7\`(G1e8a|$Eys@~ m@I"7=2U[FquL0%X@?J [oކzWXy | geyv r P M J AG tYr aO ̜t"LɵsPBd[7Al,>yW f;G TE٫9;6^ux 6c+(2rD=a$:4qA*JX >PR\P{JA3{:=v?κ`ᒫq2MybQ#2 hjJ-B4i-ke |(U|ÝNgx3Tu)(tK(= ^"?|KH-֌! Ņ0{{HAZWF-wxzD\iTt:r.4_ j]]X$,ghlT5Y@Ҋw8^£^ ^+X6]<گܨ҄m̸`Y`,:/MJ/AdpMUmh(D8|(,Th Q 4ȇKg"t} UV !D.vA#1g '^ݙXڏ74V@ԕsEu)BP"eMùQ;+Yͪ /E7g"a Y^ }i…K$hBᣢad 6.(a`26H,RSv2VȮiGOB6~E_\ ʾ50lH 0NA! %ƓY 5,j!قRk Br}CRRa0^J m۵1;n|jnf@݃sw&Fr_K[J. Z %F?7`n(_E1 (6k %Ф  \Hq8`z(i;؜V!fl*Yqt4! =Y݉3kBJ p֕t cb˸c! 7).YlBi+`zm8(=kzv'Šp:PvDsC< 3\6Љ:mgˆw^Wn E1kWMoGT| ; Aj/yB8XQʠ +X{i],{n 'XUcGGIG/@A@rpo5&LfHr}TMt}c(,GeK/栧TP$%A$Q7iA&F#00 0CEA2PetK1BfR(?@ DC*#XAMEމ$Ɇ)2>*AiSSi6o* (r:LY}< V)+<UZkq -@O@OXT ;6A5e` g\J?cIb]GܦJpJXlAVvTnQl~ r1ՎZ_WЂ0/ Q>>*H" v8Pya9x ]ZXcv iLqb|!օDGa8!'O%޺gV '5-q6VZ6(Ujxz,hTR,,q?+[gq dt )SahLAC[ippBμ"f~_6/5*:J`NՃF/ap }Pc_D@'P۽Y4>t`}XAfSh@vm梀yu0Y`S꫗Cm}wzdV ^SݱVʐlђSa<ܞHA)|v Ff/\0do| 2҃JoҧRyYՒ*0hxJi81H,⋀)F_;;uBJ t_ЮRs V0|xQdvGci &8fv~$/ב8 Td" siFNΙ<,¿|$DA,a}X@j%PhCv0 G}DB,ȱ3hv@4"T+!@yG ^ %WkfЕҫ@ءFu[d1lFPNU X{wb:!aGAcFm91`=Nn?$Xx@$D/]$W@~6gIJ,>\EVl#Pdc?p Al!Bv}NJ *^TCw"p2e?WB΀3&RsR,$}}c~=P1,5YMt sw@$ Q0į?Cq7%7_kXH,%f\\!Y.CkΨmDzj0J)31 nVSu2IDAI[Q-#CIH7WVQh@ dP{г3kzT.5i]ʹi; r#m]<&St7eD; -P"+FDG˄v$I 8P@*e3$e}hsPP~M[A;(9kg@ͶЄʄ#}:,)VvQJd;U ">) E"d)9m~Mw$ŸxC[bœ%]A>4<-vY B!< sNM`C 'CUlj @Amͩr%QNpYiM kBbЬqD i;EH n_7g8 P'Vr@0;xn?^!4VL=_9IAVå=Br&A܃]ULb;uq$?y}$G TLSF_n~MpB7\\ǙvyERf2kK*UaG+A/_C ǰ!𤢵44xO.T5u- ( ]z j(`9lHrŢzZ em& sʮ6 [#3k]dlpv\+ɳs("9Ra:aXѐc(?hJh4pcWB8E\P|?Ua-;}6`JXkdl6/:CX\ ^2k4C?W^\#tA?9$&7? Ǜl=IDSSXP뒃]oB^$@ğoTW_0J;W%m@R-$=8Yk8h/*g N>РS@2-|P{tᡓV@+Տ8W~xpZrg§eB3lä+ʪAv#Qbʄ?÷)t x+U>Vx‡J&aٿPoY(8r9B:5$|0#AR[u!52.?#W(K,5rߊpW&P%v 9EA7@C!&S&Q.;eI?PwڇqClKQ _FZw Xy.0.b5 E%-5𦛝] ԯb=(fpAͯWqZoY|mUCkFUqڿah˄ NwpD 6A_G};JqNAO$[CG ]A*QpJk/@Nl=抧|"H#[0WO 50 2u%:36Jnl}A԰M9æ(VP =;5]@O7|2`[[S+Mm qXϮ7J 'C@X|h7դm$!O̡!e@5^zlcZҭ1gJlp(QkXd H֭%k$ʶEY0XH @0 Il .XwB $ Nr1ݕ=z5Z :TI" s?BtV 8rUj/@ S a(ιƮlH2Tɻ 8PjaG9:못-GLgLPpAz['EA~9 ƷjܥFBk@#;7 D&Bm\s%"V!S*sP1 &\گ (G9! -FV@w!֯7Qa TsTw~J"7Ho*UrvQ F=, !1U^X/Lㅍ[i]Y 46YUr̓K`YBˏFW0?nP5ՁFo=3崹9u)2Ś0z z <.SMMֿ= Q~2T-D P;~2^# \ q-{'5Y? ЧBܰU6j}Ue Q\fs[2C@|@+Z!S꣛A<̈́ "Pv\HQp\PﮰccUۀMd:`15k4 똚2]+3wl.\u[$,v]VW@DDһC%<0w5O452UfqWl*4pd4!?KY*L3ÍXΦK}g-!ưU)s!TGhW }'#5 fG `}n֖e4=yI+D뉑$tZx#[OMqp wp\bUćwйhH^$}'`Ҡxغֻ]+xՆ^E+Y[Tkuq0u(ENw)w?ZU~\ 3l287T Ct/U߀&Ԥ^;k b5.2*)5)耑 "N8I[Ʌ <æG<|p3T7YPUI΄mo0 ˏy`& ^J-^.У΀~Km|@Y@zvم 59T\hS}*xT  BϪ ]0w&[ `vM7͔#6Rq T39^ 7 35l(JJP OY~/'@ CDRvy aϰ@WDy2m${>NϣRnoĠ? Ymg~qigz&j!CdX(5G!#lKnXRYPV!𨇤y$ QU ks#E(V[drXV ifc,/~Z<aWևC`FR< a,޷+t]@YhCecD& »${m O̢fxW7c4_6г])APS$_T?/:$h#oaj76{G ۡ0EH1~^@NvՁ J1m4a ;n J!m]~jAt(s]x 7*DJ`T dqY%:ȠOеn#؛YtE퍥n|>N@]\?Ӟ!0Kic_J 8টءg4|#SCCڤiء DjJ!"(]mzI\^m䚫{]/*{? `GKlύR[mYˁ!]sШ ^2ȊϡiFjo_5D8t5\`6`iGPޯzZm2&/64F~ >LEs9K^HUJAL&ϫ]oF%s Rt^՛iG&tF"cXI!:dzM MnO5SQ%)[.ʒ]nqmK6hLM);ө8K%p >Z=akV!ﲡN*Wb{s< dS;-{ #>ȇ7JXHg5͎y:!:L t;x |3)THyvhձEQdV.)ߘBp:>j=}hk%/׽aOdzncLpEΈ有oO15ۓD9RѴ3h"b` +'n__?|?4k\:ᶽեr0b@cVb ݖK9(3 C8 X%{a '{;it[yWLcԧ(+(++TӘ#d3싯y/ N$A"0l# i׿Ŭt&s\tJf?/ߥ17fISIR3X`퉫O`Z6f{ T #VFue;?aAުҬWxHV\awP7%)Ltֺ 2|R Jb\Ktw) 2?W36z|#H]lYl@i)QdQ)8`2@G]4>+bD ~֙ɭiuhEjo"kWFGLLhtΟy e􌡿msyc)IVzִ?\7Љ&0#fA` FچBn60̙%]H1 +' 7LpP3n}ϋ!"BZС8Y9 @XYAC+@Xx@'I&r9G4*M=a0Pw2L]YN-μ1D h& X$⃭`Z:4_>xж=2Y; 8XKE68=Z2HnՅFOI\B([a YdsSGF'*[Zk֔lKj!kZVwKЉhn_(OCTR%*,;+"'Wp]ۋ)oU݋3tX_xx\6;J(ҝ3;nݽȶCn UVc*Er&va!%hbl!)\ЬCXj3 ш}" p-d˳~Me<̙8ߺ=oinN:k?<R.MH*<?Ys/ݱEP;o澗rG"2pSq˝ uquJ`9)hHs {~gu&ENߪvAmqC(U'ֶD||0|Wyvg74/Sb}]Oq_.'uu\kuзԭצ4XlDNd^oKI3cHyqJ("||-(04UK`@ڟDB(\8>ԟBgD/Z؊:FDnwNqF(G.N WVB9ڧ1n,msgKCxgp}W_XYgӰtxcEc_Bt H8[nos  ]K9Q7UNҖBE3*ˢ8=31YM0϶s-|omZێR#r6nJvGlEwZPL*s'{ׯ6|䦦6݇~r \mC2AFԊBYt%* |U`I~ 9< c!ȳMϸ+;oyгFf%NhNj\Ծ1+s@{@pW.X=fT.Ͻw1fwl;Į@~یuZF.C}_B$q߿ν7˳ESuKEiVNh޿#xgM/o8+mj`•)Hnյd#ݻ؋+#{E 83ٗ&vkҺ&7r`#Qݝ/s-jƖBv)>#Sn#\ J:4kxx9#d;%ºYėυ9"9C:erhX]ls&׹1(ss[֬]9q uw$1~z&s_ʅafe[;nԬ*s]vGJSN~o? ڮWT>dq%#ƫr ܴorH8U 唕6rMwVpԾCqq/wb%pP'UܠVNYO KjDk8T,).{H*aD%[{3.8 a:q\*K'*~]uV ue7raR`(>@6чLנ.q>0Qup]|"0U u3̅d! >ÕkeBtj%ZRO6l8f~sL!z$pu<PP$P{ ; :7KA1+= :m',ņԧ_GL(>g`D J@ 6LB` V}MF ͸m3iƢ#ڲ{S(롃A9DGl I_qPiltsa֔2JB˃P̒]_ŵ)q5uC|8]@BP4O/X"+5?)Й@hW*qD݇vM:g_F]U4i=H:]θsN6A` e23 L})ax)e`)M%F`NdtRl7ožPAM9{. L};W?{NV}3O[7Ic}w(EH%G(=!'"oަ+9qaz1s3bȔ#V7i PgZRp[j^,!4c(_VPG*#$} @|K ]n ?} Ub=$nI`-a[ù pN+8T">:A5ח!A$x( &2O5ID:hglȤ ywpV__h;idN>B V6p\ 69 L))VCM497dlPq8g(D2U!xw"2f킼@)ׇzeYCogXO7kXHs3W ok-&c# Rp0Y 2*Eu v"&Ueu&t z{(|No{%yw{x8^GXX8U@r A^B SwQ{zTDh{y{(+ŀm;D? C׼_Z}0 ^xpŤc욂&7 c?䞍K[dn]ݷB86Pp]cDzݬÔ{ݔAb /o0pۨ`8½,h1 d; uݽ= w5p`0f怜d M Ӭ6tyYealQp\HG =e Ai3hk#bQdlp+|(gFC `$)DM45!0* T mUy|;z/_ ^ZNbOf>2>@qq13 b"aJFBSyA۶qτ kPnUV}P Zna\ `Jt̫?ApXrF "\ι"0Gʐ­m`[㏬n}1UFm %SV`aF-?^Deŷ4j2X]6Agao#{ɁcӫێSMOp*BD/ԎOVs*pj8 _?zTޕbnh/v.pawe223)[jF`yB)Ș )CtrQ]?r٘Mo3}So_!/Q#ԏRZ-SK-y<B9Wc|P9n uf}maFpXQ1?U-F槼)Nr,Mڱ.'Cj}eN^WQ9J"m!;t ݡG'-p^ƫ=t2ʩvhwg>ČT`]6 -?ϳ.^Eak^&c ~(x 8 ''.VAr8-wVQaK[-!DN bՐg5#8:q5>$g;1.:%*K~* I!ƽ_ ~rF{;YSMu,~/:44 X[qwS} +3e 'tAYqg2? 6S˷F+GR'<ڊ `j JN[) (?jR9aKa`Ҹ;X7 {&s\i;4TL}jӣ}P:=*ƭqK/wgH)8h[8(վc~Bd ' i*ɨr\".+̂(VRάB)N.Bl'v*ɰ\ Z>ih=bi9#ԭԟ{qڧo. 9ڊHGaG[U-`T; | _\ZEC GU\2-F=dgM}1akѕQ-P wH꩘tohȁBqr78MccjQ\mݵM"pUz:-foZgrܽ<[1x}CZ doԣ} *j}zO:7:(xH-=VCsb8DSqIa}FO᛻qjm3 dXSB_Y~;y'-;-ݞ>n626+R<njW͸w{wc-&jXC-mLAFWDmaj?(2\ :ǝʊ>FsYHЩe^*vW>'K͎.,6oCaA_#29]I[OZz+ڒN<3IoOҊ~YotE9D?>CPG:4Ɣ\u^Om 񙴪RF+Bֳr7&F-3x}Y\ c&YϼW_v]SoS&mk ݫb|^k7j[Pwn]v?Z Nnt[]+>G #B- 8tL~e?LkF|yc֨=AES"g)[E~8{< V30iWP2ХK2ԇy1|G9; } [ }9ܔ*Ǖ-W5?BtoϨ=c,:5$|q([.1ꖕD- F<Ht-7}9U(ERT50QZ\P{"ȳ,inx~ [cdjHN<ɨ '**7xshGWv%]U{Ovu*?Р1Bޏւ}Fn9߄Ej;0qb|QaKg1/w1Q`J_&/"d/y0/b;w?X\}!O~&DZ .3?QVo# }+ogfޕ@qK=1Qzw[MST'эVt=RPж`(-8y{ SVDYoyN٣H_~ ${m^Zv' r1r.꺦5F> }J5׷RbQ@ݎdIQv_K ϫTKޗ wc Tu.:*i]Po KĻڣ*BR%NjK;^!LGuAe1.Q9:CQZyh?"KcN LZS55gy3#d~j / =_E)DJTB T`h4: =7F1"73ĶBGI?>[B(p\Kr|\:d/jX9{{٨S|./]ǮѪ 1OVKP+'l:`TY>`류in[ ao/!uq.۸u3~f9NHz=c; `qC V{_Hqq5[qoG>Ji޴Dl|gX'G.8"觟њNUS0g^C}qfM$VW6O`W=lv{- !揓G`q{8/wcvk.3t][:-#gCWbʳn꬧Oj{O3Ыlpe#`~G'OIk,5˄VǒXY E)xN<~_^}A`~.,-z<ǀ:V+MLm{NDXAM)}ѡPyn ;e>=7MNݪ=O/Fgsa;z'L "##DbWE'Rghpx*~Dʛ>Sgx=0_,z}\B̞TGH!na-] kq:yCx+[/Z?|IWcVГj69ܔnjfHSmc5jMrC-6-sڗ9p[oibf/8ۖ-UhQu.FĽ'Wv u`pW-i;%/<>e{.FQL1y%lF໤SV `zsqrRX--p bֶ;QqI:zH Cim`6p?f9ToTi[Hh@nܸVtXlKx!kA~PfEQ "ucxI:{ISMSn=9~[V~O۬m7iL$%%Y/kS'zArPU7" bO`eI1>뚓΍M+مˀhor6~b$V'ZG)7큌.#/9)G)쩶TKbk9^Tm<DVïˡljq"јύjS]$U vV1=]ur:Ud#L!H}E4E={;4,zl]UIK`砫:=GxnԎSvԇ_lӭ7Bƨ rq\ojԷTxżcQɧ]zu"V3?DyeMxmq:W~z\*p^-m@DayW-C1?cvTR)p*,094$tu.;ޥ݁Җ ^0TtZ2,hZ\ˬo4Zm$^>߾RJ E=p14|r=.R^b5>bL{cI9 Hx) IO=kWz}Ptp~U7}N?yd;ŋ깆Yz*mi4ݯ~L>FݩEɀq»9fg%[Zp5FkhSq܆ibPgef>r9s~Xr^y ?f/OkGɞ´)o}gǵ$qe3DdftZa:Q^Mz4>|fS0߿U)VJwNwqD(x]n=K5b{<55U7cck⚃mo=%־"ley[~ѫ>G~z#U}9Gg{q!S7\iٚ0o*p\ɮ˃ %:Ņ9?<ֹI+R Tc}-v.v7^#^0h4:3b5h;tQAVF}./y5 v՟t3}e͂w?V2=# #ѲׅSj\<_eI[iz5,_~[㝪AAo&M.Nz[eS8zaǷ{1՝oicJHQVv';[6o~TMk^{o͞_5ʊ>H7:hTܜ=M[Ԡmq.^-̔m5O%^Oz]Nd#njyv3-313 ۭJM_]џw|iԷC.}mʏJ 3$y&B9Oe5';8"i~k9R)oɜUg+?.}1OK!>0Cיn/yy kԎ{BNjb|Qo8V *ȽaO2<D*B7a󡞯ZL/aWxI~k{3^I/Qw:oJݬ7؎alS!|-QdJd֥ݎ_'2[srxbwshrQu)ܪY1p1?Gg'go2y)([T?Ѯ\x7lhnpc/_ 쵟@RA$m7$]z|-gou+D)uz5c /H t[8{6vg.GuoGè螼;} =һlү{%%N'DKcEy{bhgT}г!%(Fm,jN7g#w}7ԎEW9myE{HOu+ ߴj٘{jEgm9Rئr텞~QZNPbvHK7oIiR} 2vYW7U]!9z uw8INL}gE-CPEAw, !-o:.?}Rm'Jy4+kViv6xb;5ÏA;Y: *-T1 $$ny,yC/ {7LlJ]7펀rΪ`q& =sv4k/d{9zz.ajHU_iыQ8ދh`&Pѫ51:dM0wAE1fR(F 5_mJa1}OҚZ =0Q[t*uTbVemQ}9,ua:~?&^Xۡl:Κy\ktRZ~d\s(nV5Do5嵷Qpf$;::A WD\FF^.|cE"' K&0=|z̯sVm#=? Y/N8#DhH*v}jγKOO-? u*O}ɖ%[ffٗlh07"gKS/h'Z'}sƝqՃa:"F6u7E7}[^`9nKz o\xw oK9VI3OܖdY_'QH=q8ㄿ6-s vң#}aQw=)@$kpKCC0ޕ)nSkp; ҄zJqzrk "7 02>}f3 /!"kިue#-Y=SEpp\=vT>e?=[\_ C:Om7.z&iCd9YV u-|ߎQ ź2*Tά1E ɳ-]-R\ .u#B1j诏X4kd:c:h/Ǟiؓ/ s]Cˤ^3 [1\ ڷ/Isem:dQgo%p8 !Iړ^%*jҝR^CrxpVk![=SNd6*BrMTe+olVE}L =ϪR/pY^3_?Mm򢝑*-q^y60aǏoII)a~up"vGxhQ|'⻁'mvZTZ({dd[8SX ]\m@;ߍ,<~V/I3[?lX*ٮ)9r(Gs-4o+F_ڡT?W]uYN4*x3Md&h' }#O0~!a(>KU-;´ʯKY_rO}p~oIG/dn/ CàVZ%}yR*&Eܼz~{]{>."pQ>uM 3ad. Ij"out6,Ԗ̓p ~@opɹcAeo.7G:9(pj>r?2)(X""ڹ&kPmEz{jMi85E&UryNzES` 剃8jsZ kx;v95 &b"*+ƶj? 4C@V~2gӴuX%8;JXwOoEҍmDgZmx7SJx?CehCcҩ*b*{l9E:{ړ/}$d^yIۍ{]ݾzl Z􋼴U.\. FP,L 3XaqTMZ.弧#{ov.$^Ft,!z|xx4}U\$l^MUGyb~?O!goK-Kxc_𺊭}/Y秌T=[DPӺDNGs?}K, 6Gz'b>e0aF.hEq4Q4D ڗ᭑![9ɷn^R;8C{xD y_cSWxעp.%Y=غ?&C*M<ۦRҐ.vYw,ՖF-4NURzP{jv Si#!YuŊnF>ft®4~TiX[hGqI췚qAd=rjEp?A!1,%/LTI+;[G5JҾϤkӦP>p뤚ts8߶F[1#m IgFm#XmV%Og=Ŧ392XTW,'̀l{h|Q ?Oc8.]1Ac?50TI[p9/A$i=wU7 zylh2q\ê{gZmC@w~C>/莞)Yqss9KŘΑCpPZi#g'^c!J|Ą^t ղ_~rA-ƗA|$ 7dCG:)̻zF}B><-qY7kw6 9RؽF B'K)$TR.#7C?xm_Qy$_/@4AcƸH~-F]p]#ZH|j2 7 {fNm`6úcxSEW⌮j}ԡCn0pxMbʷ^]Af RFWe5r&N@_-ogÐf[5}uPSh?}(e1%?qW5ǝ517ƛcU7~He%.]|, yIMp!YTu 2~^\_V[0hG8d<8f1?J*OZyϛzG[Bpkx?ǣSި<%"y!o}h~ҖSCc?Ό|:.i텤+^jb>y~0^ )Gs֊ï0U =FkhOoV^UhÊ+%"2 WRuԨ~ xXW(=o?]7bJF8/plNz؞&VB*S F6JR-Lm|F .#>p8~O)+ ?5dX9oxQ_Q33̢2xy7<a#GUz>wWzĖBnV(RxZ͌t▻H^B׌[Ex0▋jO֡oQƗG4hc{0U1R;ϤuO]n oÃchoŐ]m LNe̡28gM.}-*6'v51Dät ::ikDƉ:d^(X^FBL[&ҜX`xů=q8r;+|_DqpEʢ[<$o}DS/\B#eR"xcwPb 8ˉ4&HvW>t8# w2GK \=jщ(Lz+u Jly RpПҍ!/,6_@ JZ?ηW_7)g]ȑO6^J>N?q/[->̂}ݐ䡃9,[1b6i{uUD/xβWC4k#+dəP(clj9U^G/8=[tMvF۹3v⣳G:i{yU%į{7Ajӱ#1hh'V㝶A!Hk,[7ֿq gyC' puΪNuOMoKW1A#H u~`L緘D-yQr걓[;-jX@y .\ .̼!<Mf8ٽ 1c)ɁKrDxliaoN;^j=XrvS^,drf)DO$~WBrO~D;#W޻pqȵ[>ZimSUΖoMݼdjr!:}wP/EHvDa4{M}7ˉ5(#;kOnOtm$y!ܞ1Dq39[eBc/}$"#/9ZHvX6Yn_)R'X- s11FN17pmNɣAp&Q? _cBv>q:}m⛃_&=. Å$cbҭOkz+礣1:WöeWvggR/VJ'p;ojRDSD{nNJ{X}M/l qȔ}'P I _&6F VJ( 2 .gV44IL˵pJ cj*d屆)1η<]U`q$~bz_Aeǹt݋|W7g4ʝӮ[c;xFBS8;n{<SԳRVc'T'C~.5uϲ;#Qk %H=*2;r\t BYn$6 &K/twxQ.1${/LZkes+YOڦ7 : 2݃_n/zǀQ <-}'Hz5uV}5! ?-۶|IK u{J?bB]E e-p׺pvٕm1Zc$dC\f E; FV13x7NKs_X^r'OSS=̞;c:}S^g7{Kוg C '||1Z|KOCHJgrc&,涁"OscБGkytvf jE޳ qflF- r6<F?ȅ V|tt>xg^0nmF4`W@D'^WڭV 'V _ŝ٧p;ۢ9#Cڲ&qE!9ɾ-88җP_GESյ&'M pg ,4L p K*hc<4t5[2}F$3bw$_Ω/v]A?4aPȸMl;@] m51rp9*Oab"j ?95[g϶Ff?HXIp]gJ=qAMd8[EeF {cǸa؝Y׾P -vXlB*|II3]Ͻ}BFt2SVo8͑|5+k~­vʻ()a`stv7Kj Rw3e71|5]#3zM:Z|X_"_ˑͤ%:<2yGE?sgX ݛN"ݘᯝa3'!?,HpONx:\D2#1r6WsK^+K]֓6 f R^ vZD#6>Z3*G0]PҥȀQ}{P ׇǮ-a`cPcHc@c8aᅃ5h &^-OBTR);+, /9BAЄ!JBJR! JR)JBJRJ)JR!JR)JR! JR!)BB!J!J)JRJ(JR!)JRIJPB!)JR!)JR)JRB!)JRBAsj^%wvv3C2"}7Emm^+u08UqC&8#*TDN;2/~7~Tx YBduMA͚= x+lƈK=6tFЩ+#G>ȳoվ汶ӪmYŢGLעb{NU_:o^թ< 'cxjBW&A֩%nAsde֜]~.HHcpt,gӺ 5hE'}OImgj)sJ>%hL5WMh5ڑf[`O}f8-o乐D5{)77@Nqv#T;xĀE\ b(F֞ ˜#)V}.3Y8",(Vܦlaɝw'Xg$]P4E L9P9|.c~y$Xfxȵz&cWPzpwRiDns=3hm:>XAAOs/;lg>wެ5g~tvVy:ktkRY`sߞ[Fw-3$ڹ Ŭw$?6@v߂3D(9;ͤSgN0L8xE :A-^K;Q^'pd}9#'*BaҒ\~Zxn->yj6}IǓ;W~xf􇿊]y/^<Y78xi) &ff65{JbGF&.U'KzкQCvzXct'C{ev[1h X#L8 |ұ:V'ܼl۴Ȝq;m=MeU"AWπܫ'E&@?Qђmَ #5u4mk^&4u)Py:-fknN*'{RC]΁8&jmN[lpRzlj 7-J*y>=C^N5QY3nTn^˽O.9dg3,O,˾u}d:,?W&&t DE7hŋ.׿mLFF^7V=,q\GځCY}?,Ap*XY_!r2b83n0~^ l͡t/esERΫ\IPѻt8=H$N6n#:Fq+`x3P%Oȿķ@Wug_ Bz?c(.`V%(ƒg6Z߸m@Alwh9<-B,0VBՖt1mFA9\{ oXݼy%qV8E?UT>2oo; pX^ 4uXGKe=#yAykTgJdbȇc1 Xv^UO# 695BOtվRQT#Wf 2;܇iYΛnƦ8ݺ5Ksܚsxn0IC0g%W>\vs%f9LliŘ=K+yklCځ9't f=*Ps؁\Uk ;p!\#]Σs09gh/io"$k~sY!|zN-+9>;fX}B.D/d5i?ۏ'|L@eX;ZQ&w8LWTX\wDj;YL:Hn-5lTIp޿sc![UoW.rs`JIVjy\rmLƏO̕l `7p ;ss2/1,O ϯ!(#*ʞGm'@M]=%a삧8muz{ӞN%Qr  S+S I_qΟK YH*!zٜJ/P68".Ƞ_ @ǴJ3>CFK<кLL4"U^q㧿:wY؝W}Y=Um>PϿ6ÛRLӻ1BJ 4{$~m[Ϗ*b xTĄRfm<: a4S zN~C ҟ{: tǃ|)Χo !Sp/Ƒ7adS}u!3؃| 4"S) ce0׈D@Hae5%`Uo%Mj /iq\.R>Sof~Dt6z-r%~8V;0>nfă5cmRr-̩ڮ_JFsX6irFñ ^֭q><}m˯ݵvfؼz/਼qN ׎ԗ5:ɽt{f:^;=K 2}f$tl>Rߗ_o(5fmoT-6E2%,PwEN^z?!( 6<@wW+ۥʟNZlK7j2= -w9=$r\9TOקoB'$Ǒ9?E]pliV^)1Q[_7T _= 7cbJg pAR57m1š[v>qZ:/iB֌׉10(cͯqh(mO[-kao- tSS[oA% Zcu @ BVyvS ٽZ( W u7Km!AZe8}5sg9qu> s.V%թ|X> |wVS@ S?;QveIhzY^ .8w'c<im$ &׶?MqsoaSw{W<w\C|VJs}-,]b{I97G1C݅9T`N'A }(^R3I'lxdOQ\oc9WuY[%uR7eg)o0j|#Qy;Cb"ݩK&ΰ 3+'Ȓ4->&(lN\IٺzQx]y~,WB?\ѫ]uTH}mzc9~zu/ovmO&W;-Ȍ¸hH_-//(͕q?')<WЄDFٿS'r [JPfaТ{izthejβ6+L _G2$F։k7i\^qFN'$➊SeF뎏9|6SrJ%PE(]ObA~B?;9B'/v2nυ?Q5袓.-6Aj {^2 nS0? G- 6KP}ų w!'qa:8,v8 gx9K0} JujBR/3,޽܍T }WT,Oӻ.axaߢd7?p(qOỄ w$z]%7|1z͜VyL_[a~ohw˚ q;VN2"p4$M U;}@S}?AJ'W6D1Uu-C@|)>TBX>:}L엩wMfjjmm no:ҨМ7޺v ۙ.\G2WO?QK0v'q+q$I tT5%1}\.7 +VBev\osRFߨ 1cŹ>9{Sjcd+|'~~P;lj1ۊb\m${ꃎ.63xO{;Xv ^Z_c.qb4]jef3v4~&edY2@*!7y\N-$iM.3G i~\E_,;Izz elXsu[IZ(k6s"+}dRTП QՀlMҹ*FI~ҍzIC{t2suw;G Zو薶s';-]/AV[yX')o_H x6 =0wum%]U; Q6S/ne JWGomfsRroVCѰ۩TrƤzPxP$BJE^iR]7_{Eޞ!s`,`a+–K{*m9%_ ®1 U=S?~CEVʺd>N֦tBfׂIO.Yva3m-L;9]'.hn=/MNoд/-$^U<6ՎCuL;_>jd(2zgSjQd~6>d;]!AJͻǢ8I wqZBCS޹w4ۍf(HB;^J{|죴4,;`U8/7ltK*)㍯)٪cvj)TskeH;zrf3u41Ê~0**o_ ZʦlL}B3FNЄ~3ߋ_}FKIm[Ҽ}rdGjuj:׻촿qvK.J (-!$(aK6퀃t, AV+ŠS׆+8*ɕd²]Y,VJ+$ՈU+$*dz߫#z+7jҲ1YVnUfYVmUEdJf+6*͂^VC!EfYVkfYԫ5 %d NV+j:+.Z_c  Ϙ;=Uȝ2? ?Z4?q$Min#?̀.њ@7bUYŬGh%e?f[[ G@Խ(EX5} D-Ɓ(s# ]=Qx.(AP|W*:DF!,K P4 =C;:fT }hp(%a.U|zJNqQjt% <{3m!ޗվ4G|!JG=i?U}ll\KebL&n^ZSigDKS5'rW{G&b mq2vq@Y,/_&0Jϒ:$ ü9f-f/ueoCNI0ׯiG>P ԍ\ifkVv:k $|aѣ8H,HI2y^Dzt4yo+ulKqkt_U":L`4C*Kϯ'K'XPTJDq$AT 7:a h5v  0D&ǘj0N9Z(3gMzxrPoQτlj>`φ 4}qr^t`͛qqd^)cA!w'Bɺ N*Rboc֗|kH#6RUe9DO9NMDAaT֞C[o+r)e*H1Q1}MaTp&)Ù XbP!@K1 o Mc .;r;@r0#& @|*h uG:UZc8xp71[A06b@|B]?hÚM:׌-aY(0``:@D&I6Aja<#kP]a4ROmM+G`QPT Jfg'ac)N9d7zנZp`y'*l;"6,N]fG}JBEU:{&h\Ў):~-NE}}]?@w0`s2o@j\ucP.%Wb IK 6W΀"::HwE/E(;R4/O 5c6E(=F@*\J@TR)G,,Z)Jz"?<29[Q h' qX#D+;#aZH:זRxoֿǰ^fs"44(a[;1W'G)M"P8<Ï+p{AAup%X@Sl&a-w8 W3~*"@gmL9hءK"qCwTcUN$<8P MnXv5HPI}F!ˋ%! >8Ź@^#J(OqQc#M<4Ҥb֟eI\9!X#E:!!Hie J1|_ywg[^p +\ʾo A3z-欞Ĭ 蜁U'8(rufYxvBiPͻ!kn da, Գgف5k^Y"Ma0@3~Ƿ9&Sl`-(5 S/,:}VI,AA@4lG٣>2;& :@ K@WQbY=p:wָ:?F̫(7݃HwUXaϧG]r-9 ,Yt+8'9}P~ 0S֯7:wEwK" tGu ==Hbk 4:2V"³_uy@fכ'QX¼KWqD|sEOEk-禆j/4q;} %|BvoHPnEGL O(6[}% )pT!}.d|uI 2[Xyqpc%w> _$؂de51^MQ`.cHjx XcI7B̎<啿=!d#r FjJ崪 >)<4bl2>OZY;73AgWT8l.~B ן~s +vsXБ# [ PMow]8؜І{ͷ9vfghTJVԌ;oh7"#`iuH-fXdC<0 ueeǭ4݂쐫 K ZB¤ݎG\(Q!́Mbr  Tqf+~2ZsQ#ϲ.ۛ幣믰K133cqCsq`,N]9*W55L@θeGѾpćf_/k-M,⒀< pUgH ^vxG=7V&*Ʋ+V` `J7ZZ[??RN!Ră5b*y{IO@hvֱ;[wsBgh10n_Ŵ}oz2lŨmxL=4R" ӟB>Y s >j'qs&E\Aܟsis# #K:wm'o+ݑOo_|OƢIq)ܝHlzcj1FveX%p܊  V`sɣ^Ɯa4V}0ӯ+L6Ef dris/~7Cg.Fv}yӺ¸->~U@/N&|,lۺP RVD[[l";;!@iݣY'm.K2~^4zulI-Q?zr e4򚥨 r-3q>ȹhjY̊b/vþAF?n˜{O݅Uܠ=N !pȱ l:ie&߈F/4 vLe*" e s:I]@ɷl7nsH9^ 䧧"<ۿxInh{dH\usDI"] ^h&wBuu` hই ڟ@VYSVe V [An+|4E\,FB=m;\\lfG.6M1@Uᝫ >gB3ݚFsHVQۊȄ}'^R0/#]'~bUܵfv#Hb:cX)t:Lo1L9efmL`t?GtStGBTQ-K,SG l Els%crۮHu6yqg*Nz*6P;^EL)'t~Pi(b?ݖk,3#mjR C{΋;za)McexL@'4 8x nQ<$^+NcWŦKoܼQ6}MhޜȥI"jhF:a/0SΔ չIϗAé fz4E4@#0CB m63旮#2_=f<3ŪacNǮHk^L(%R'̙ck{xdZ 5mһ+.Q(M!(#s2p}{C67"']fnf^4fP ֞Ҕt̔S9H;y1Eqg2WgB! #H(A#~sl1C5*h f*§ D9$H4s!й0RĘm8SWyݎ9q[R-FʰZ( . =wD[eݺWʓU1Hk:H9v No aǵk\ =0K}hMZ^7f2qq83+=} 2ư?dlce擀W8xSN_`Dy mV~3ͮO4iY)MzO=h ]w({4׻ s$d`mhpMa.Ylre+.JiGt"|1)"~ ;ʂv,6̴WY芻&}qcL_\.jp-ŋ(CZ64j/QS4͕hk|)4N()]ABrJԭEE>s8Λ*gJ0 ^ScLG^3%]+MmΚgntg ҫMPp-ʨ- q9h& SJV,P%渋nF8tvDﯽwm?9\sa*2qU]}"_sN Q( <;1+0LAy:3U!V ."@9ܨ>$)4a L O ;j'.WTcfucÿ􄰴䥖udZGo]3UMRmŚ|Sm mCy{f4i\H ( 8tl`@|TKnyVf >]yޜ9DIlG+VA"ii%uC.%}iC\Cj/"Z4WڿvD=y]ay"(C1sޟDD{z:ktRh36(/2fTL>؊زR\( Ar앇hAaDW sW$QP*^5G25o=iu(U*g^;kH|UHҼtO=b҆uQFhZQb :i@rvfȟ2 50RjAJWHiF|dnK֌N&VqJ2WSf %D)/DC^l{tUp#v]XGeDa^*R-tY b+}⮛9Ll\w>pe&R9$Gb P!#u3CDLaZ!Tm{Ӧ0Puy$D ٸ@q H~a{WmP;c[f ^ɚ33";M-kkp|QS&"XB>IJΘ}9Jѭ.D0I0z TLcX4ퟗq|,nޤ~ !p5lJ=V6Sͯ9"Gw+B*G00 wyj%7;*|Yeq7L4OQ4XP{'/熡T,],Z`Hf#͂kt~3v4e*x vC=$6tks< zהWo ɋ\wggH=(mcc ^'Y& t-c MPToӨzEÁ䫙 MrnV iNzgBΥ+l[oagi`)J@I874[Be nR|qhJKGm|X@E[n6H,&*}u͌E\,'Tv3c^WkUA2R)$f>DEb|}|Dn{)0%YN,;W,W' e l2٢}X2h[ vF.l<$8yeJuc~7kFP[>^. 8:.Y+I6\Yt39?S_݌S^~>{< U߿+bD*M*~ġYV]u5C^ʗhu _^0uW$W JMa!Na0ڠ<2v;0beb C2U-g3mqbj>^)\1WDcu5iɛ( ]}7 |Á%Pcd!ᚘ h&Gȋ{bMo @15y}duuP\ӼL´t8xzء=1(` Hk0']l >F17V3Yc7U!BMϽR]@oO縊ւR|b ze9$jRqonj#ݍYfM9Rpr`4(P$zlN a&sQU9x۔%<O\ugU `tZ䶨zDFv4Sbɧg!:dT ^ ;5 `>7$`ql(a6CJJMsVRZqD I߿s-qS!s-Γ6sI,:+;7Ug6] R*k(h5WZޢcGT覧k.AZ닐 eь,wpkqn' nqFpīqz2wVrhȄbCPmF[|j#+axE3xi^i0&B܏-&凉Z7WtY>%nfўٵoaݙ~ˍ5HjZ{D٬%^XZ+Jix2e浆W u[V?)&ƻФ?К@l[qgyGo/ n^|jN# :``"Mx8-jߍ8^|\Pb",0l'o 5Y1ljRt|B; 0ԀjXh.lPሉʠ]7@; G> WxTkÝ^Ł,ͩ'if["?oԈYr?7o(2} X.XlscY?<]|k# Ip#jx$jTƠy.d`K$%|pH!1ɟZW1=8[ϋ_`bIn=J>?F;t0ݦAxG ?(V.TԱ) Ėv |9|ڢ-]\hcy*>{;}1ėV<Yx_|<<TZy72)f=t{Xm¡j!Gcp &.X3ЈqQCI-u a:*=\DOCaT^eyrK=)lM=ņ4%STWpǃv %L'kIENѳ}#fQ|]>~$YsXh17wh5D*1PEQ+O~M7a\>9aVeiUYUJg76}*eDd&Bs4+\WV`Fr; \1s}պAU#Q [}?VV $y^y}lT鮯1?MWyt.Ok0!q4zQva!.Cbf;kifeY N. Hτ\؟*cMk ei7'cPimZxafu5ZMr}H4{+j07$+Zq[r,Kj 4~hF Ԥ1Qycv+źI@G w )U\.3vߖQb*{͏!791(lͽ Xܞvo,@L*!sXhO%0i')XօbY<l+)93o<"MnMo_*+w&tM6J@AWtYa<&|?3&6R[_eĊ^ySH4_L.)H_ mL7g4W1U8P@TR),,$]6M=i=좽+K”RD[ΞIJ#T/_Hb xOƔap鋼Xd-J#v=WdCovu\,&1.RaM*y]196Koаdw)GjF !HL]5ί^̓R+*Z*o2ί73y x"5|zjyKެX՜ϫ/.7^q宩N:XZp "ʬH=@/^"EbۏI-B6ࠡʪx39g%]ZHu #UBJ ,ËK:qmON?L_Ѥ_2{},8 I%Rp +Z{l)4m O&`yz*#@A~%D V)n F从_T'ْ@uWe uqӻ1_MUؑ:u3gȒm=goW22NT⤟ШGwHRbH·2" ?Pf YHt0!1dMljM/;$x4eHy6xCk,%5P͛HQLi]I7g}yMݥv6*^ga[}ʹh^Yk#PL*XF5QbN` .:G.ZЌgv nTY,JZ/^swd;NbĂWzqBuVC{(>j ˆЍgi`bxtbG OLQFKhl T-)bֱ*&{-ofAWc&ߛiBP MP6Mh w5=5>԰>UDȥQ<>zí&.ބġVb1wb%ONaAunhhJ&ffKCeS6i[5 7.8W\:FyWQS$$CQW/8v[ ly8WFPr(1Y-G `CTQxRdE:bW=面NbB9bL. Gs|vs9uX20ϕ?]O@֘WcY]'ޝ,ȦRN?_H DTͣ*=Z I٪ b:#S|P65aof,Cdqr|߰Y3{e\O)@4\awg0BO^AMDM^PB ]kA` 5IR| )oD@T58uv2C?bX rw&tqEwGoQw3ϵ{6h:6߰4TK@+J)`:Q\6 ~.ie8-߸ Z&e+-ä 2Ol;2]3?~6Fw=%y )b3xXpJ Sʺҗb6~ҨO=~*A DeV&Du0v,}>9-o6/mrFGsH!lʎrPQr Tu:,cC?)9Y_tDsC_[+>-]oXXݭAMqh _ 8gPRpl(|FYB-Nc!77 ,M zlڣԭG FbC-GM߸ 7\}<5ʹo~B}^pkeۯU߭Ks_ox n#0i (\RS:FI R#{A:+(snr2{@ $tB&P};2/](" Tr=Js_}[/QoU[௤DP,Eè9BaI@#)!o$H{EYi|H7,W/‘tq<1ϛM2xzVh6z+N-hi7^B03`*nQb)eXKEO2IpAyQ'ṕ񂯄I|z9mI/%k &='|2%l'B!:bieV߭Ʈd*s]`ʓR=rv=)#/ҭ,J~))ޗUbU3y 3_ӌJ2oad FDl},O]ŸEpP 2}4~VTx_STFAv%W9KiFlvɶhқr!ƨ ύN`GlG/g} nk %pL$[}Њ^ןy$ZÝ/W@Q18 o“,"R陱yafgj!?\@)>T&@")p_.)*[aw)&'[` 70EgHJ tɮw`)P=|9gj65#($P64l%z!+hkaj>}Z ; b:)DaE ?(*$Tpl&J0b"`͗͝*I'FOOX~8 ח9D|uuKs9Fhf4y5ea83g$60gš5mwFl:ڀfћ[,(!w>'B(gZ3 j(1Q) 12vmcs=ҶEs#8s sljŝuFH g7KźtyK#{hAhy`Ǎ)Fd:7}4a^9V~~i"31߯a;>OVFa4wj%Q[3[1ؑ洃o%YJkPP=pX0$w-]~E$,XDd hLJdp9 &[%bx.'U+3"7-ϙi~T m%[pT67Ixy_ʕ9U*gsƀ'cڿ+:A*~2ƞQjbX[5cO>^)0WU'/dYrsH2Qvgi۝o$5FHo׉UH‘?7~-<%ݗ G>+|DyЬ_J\tSd#2<9!|g^3F} B,>}_[FSƐM_YQ(Pĥc]y=c_mSf Ώ'12Qm`?Fg"wOMRb9l.2~Pt0o.҆.3]W9l# hs^_۠sHv ݉fܯ GœU݋өyp|-,L8BCD菒 ڂ{. Vހv]r I!Cw|G&jlErUtËd]y|ZLl|~/IM?SC7p)oV97*˫}i3#wW4iCF:+DQKAFnɉ=i:@nΌm}2l .h;*N1ͺ=vK7dL.iœgF;Ȫ6$B߲0tcvRl4eu[7y5Q=%a\Fau5nK|Aϵ+0W#6\N }6`\q}S'gX?3 o+ו) &Y^|_7 "+_`i6jA-AFENKm(6VcÅг[KտG%(Fx]Wq_]f3>u˫Aw杔NoɩlhakH})\2֛Gط\!n6/9I&hEM"-/rTc+ Hda^x(^{ǏK6NWcTpTQE3]3aAŸ:UW~xq P%&h/[xuWZNKФ-"Q^x|.g-Jjv$V;72cN ó_[g#UU?fTH G<P:82ק0 0ȓ $$L"({>d#&sm1i D]JRw/a+4*LD0:zwA#8w+V׸QPR|o.1Zd:{pƞU,h{4x @W{3jilW]Nn3{I|SK `ʖŷ9@!)0`I,@'!qrׇ΀@QA i-~eYx+h93[H;p(bj[ kv2v˶}=x}3chYM2Au1 ֣]\ޠVJ`MV^N;9x?龥t! /W Ӈtd+U" AKvՓSc`|l:O\翵ߒr5^8Fh:+rg':εκQmBHt lx(70QVdv6Mئg\cm~暆gIG k!u"g혾-Uen%ɪ7ʒ[pU9yjvj2'ᨶ_ ^߳O?O*LArg怗WXR/ WBpY9R[⭔;S5{aKp&CnH 2O*?;vo[oq 뜼2c`2TwL6ok4^ ꢀD,Rx "@NӎPr$a-HeIRjAUAW^ED$B٠4Xx 7 ʌ]_sM ,KS7Zf-ݒq)-k?9Gu=,f3S|[/6F3u$ihx/:BJ@ [mC8sT6OJT\\n᳏?"Q ta1ub|2+5PG9 ~2?ٟU")/u6(Ms n@^2b ׹} ʴ⢆k)0i_A<+j]>3 tz)a2-北*:CRt ɏҹS } ʮ͖ ,k8a \x\E :rۿvh욪^EHtp%c(a`@*oY?3 8=T5ʃ io-) ́kw"FQ'Fi8]{m5bkQ8&Vt;ЂpBu*!Ŏ:wiGk= wæYÒ"3rDcWv|,U;%h52!"n\?eH*pD&vq y떲umD^ :$94\A;F¶$ WU0g6 v2_ oz-˷i99;ay\=jw Ŀ^G.aw\YT'ܗQcm")yi>'-rׅd0ߧf:;@zM}IoGER"0Xdb5 Ơhe3/,1OV؂l6=onki/Eu ߡBn>G3SɊ#Т!i{zP/WWҼzk%M|cs&!oVw8 ?s-nrt|T$8a5-Y/-:o}b { K L&e*) s'O$O #ۏ~@up ȬsphkPԫsU?wo8o( yVCk7zHg,0RULR$Kor' :9t : bnL>P,`umZңeNDu[ڊ\/ݏ{xIHhn7+;~٣M C5mŽz^a !? ʛ5֦`lQ4^@@Z*Zk#*%Z?ʹyl\Z00D[{D.+ tqcBhl2>HvwlPp7r@(+Mb7]{YVTY`8y/Tίߑ*@SK|f,twzW3MZq'?J􍰚Xzep'jV:}<ܦz^m)E  벬tk iNj]3<·XoowJ>t/sl.۷])Qs cY8 NF[l[lmI =oh$IE( ȱH E&-_ĿK-hH] K u򬆛↽~KG{z/VRPܵ~ ÇRRVቚxWb5gѼР6 "CZ}d{YeVȻ/kFA;'w d.nA':?[RIB9I=\Orf]$ұ&-iHl3~h. e|m?{o6WK1yhP_O+UᲽQsm-RGX}|&eM("kn.h]s=\2Ȓ[N]+7RUv@oI ;aO8otO#s y>D;^<5eN+M:h#RGбo֠~|Z0oqst|4n$t:!|/fA3:HAi$$wyh̓ۺ7!4â`l.g o4ېt 7a)pFde=(Y4A=i7)G J~œOg46ŗʠjm ՗7n~'Qw,K{'k n]f֭"ca=$`yZVj>jly]Ҥ{YTfӑ˘1{xŷ@3%4Agb:@VW_F5on*YeQ ]}Ifno y0)\Î3aP 6#ʯ,tJ,ڮV lg!Mv>쌸$ @qPʷzF٭:*RV8[CH.Ƨ"HX*,b^a)cd"Px.le}$\-1ƿ>ݧG/ZQIN&g)qqR9j'mk\̯\nN(_;-H\nϗ Yc3lZt6r͘_n7)(ȫu~ i;!$ EZ+ oS5߻U*jN H {>} c~5"i#stlQq bs?J'V wnsGE>~A$I>8p R6P˳Wº-&:9q0{զpb@u8d::=;¹\vxDjqPV99/fYTa&Kp/ K83od~I P|z+0eOCh=O#H$ 72}|-)9:jpo$mUo8Me׏]z#FwbﻇDqpP]+.Edle5ןx=JRPL+Z (~K3Du!\%BKsNdЧzaCCl96scC*9´Ĺ꿹cy*c}+:R>1_gS3搒"u7C;/%⥀TR(3*X,$b _172uy_}Y=uI  =C^dL{JSl{7$B)Z܄l"EiMj.) Ӱ%E 7NCl:! ΔS/gso,uPUWS2vןn~O4pZ*ܬAWЊ n[Jilc)IM*Nϔ#Z͑"8C&6f ˃"aɭpܐg 5g@5i3;osjyAo:EBMtg}Ʉ֩ ns bWJ:)IX+%"#Um?.d^hfӱ9W~Fo9WV`jԇnZtژ2)Lb/8))gm@2ͩ:t1umܿͥ_m©"֯#!KBfKߏ.7mjg@rW~57eU6?切iPQxԳ-cQLxSiXqjR3ٮ G,rA͏msNjpUfxopʇV: ;#AbHIhNxykNxjr7M?g\OY:pSm]Q{[ՆMghjL}`N®XnƓBfmYyRCAu6Cc|qo]vxv(e~ܲF$w1NE/47peվѫ6}k ZejVKg4,.kV{#sū}>!Tԙ{G~еz6jojb?eU4h;/nQwYpSHsLP4UN:gy8w,p!H*ķwݹɢzv{" KlW p't.QzjO<Э1_q`&-d)a:^$d`W*|b?l>>*6?'&}yX""VӬ*!>U_}uߪѢ3\+mC!qSjYAvPw,ҌjKRx}󠰈(2WIAz[ HźlWGf˱@juTDN zP `!Ub E9_JeЎ?#q7T?9+ Z=퀲] n'!i-?Opz K*wEG+Wa&;Y\Ww tVɴ Qg6 `l`8(#*uM2q\.P\wiё*|~;6> + ]3!`qi }S'm y pWkm0xR1afF|\7TaمO!HD#ls?1aOxP'EA% I'xnRDDo^Bl-ͻHɴ4HqY(Q{>>L'Uކբ~ݢWђ?-?(ea:Zƹ3Ö|?ݛ t)pni:@@oI?^J婹ϦֆtFҳd=PE&f'{uπe{ kxm!.+Ԭ8{## >Z""K WBpiu$>3R:[_x/Y㲿Sͱ/*مyټ AFЙ]hւ-DlQ__^(Q0Qd rEgq .T-R܊H`Osi M%4?LyW~.8‰5&%zPdoCd[rmTqTkzj9QvOݫߌc|U@Ѿx-nay{A%}#LL?a3낍ϻq9m~[½AӮ@o[niTe]r$tfd5ѹI(uW/#$o'X]ef_ neR-Wjf8X9%W\N ٰ/:]7oc|bՃիqi j6X? w_B=ZHM0-JVWsA֪F+> y*3 "%RZCo H~ÌFNUr0c2y6 8R;="|^Ku! ϬxIh]8suvz6YG:tw",MNvs_i:{(Syk1h$TgM򮠀$ EA9*?xz&]-HKag:>K+F˸() ~9Z%yD1/;VLޅN{Fp?!8folpl周>x7tig@6J>~׮j5_$kp (xtraa&t[OD^!װv8yO$A$ ӱxau%ez@' @&wJ.]*"gU HW/()Ppi$;9Ep btڿM_j##^tQ3/4T잠hh05rZm+Z#Ll$%aYטkg;dcKy5ڕSY5X32G%8)Ɇ<Mb4|exW]-E<Z0ImHR$ QH5 wV-]glekU,]P2)D* [iBzMXNC}x)/-fL 9fZ+P>gk|Ew]6f߰<,$-, r?,EgcTa 忚d~!!`2A*zȑE+A($3{KOft/#4gdJ|bLW @Djoj絎6.p;u_C;1ӾD Qh s {Ӡi(4}d+:֠ZZM +Y􋹨c/8 DZ8f+Zm*弲j8ZFй.8'{Eh!qP<&1C5aLr@^2Wc`ztxһeJ5m߰:C{oXuD%)(ɴ#lw"^h{62 u_姨wejc?'U|瀌<0e{̖CB,S@@HZ%hwJ!p-q0 .f:?i+sm7Х~=W5s*σX99UYz8YQI6p|8W;>}e%Vbfum_( a(2@% ގķ,2$юJk }4'RdznWA7Tut1UY+{lM'̃W?/ٗl KM _m S١dP:s>n *0i(%lʳ$dDpYryN6G6O0R ^ K$%OSk)[l`b.`a<" P Mڧ%yW8x)>?;HY._ʗm7`u;YC'ʮC 5"CjGqXHb1@`uhxwm=|.>i\ `/L qTD6|Ă!T85)-^0,Pa v[4Vqa>`wrUnP6'FcoO*u< )p`rȥg.1w>7jY/*ޮD(Yqm aB#st³pw%r92,`Mgɡ^Db&VI7쭇dBYks}> @|=xm:)쨸7$x)x4qʢ/l.-8iR>v!i/oϢ tƉ72M,0o#4돊q]I9d4^v?r<l];}:IV:nͩ/rK5Csa;{>O:#%`1f982h['F/WUO'rQ֍[ 3/:_/(Ż/Ny9Vp1x󀻲ay'KԪeX·9к2=Ln:$NQ6OgjhyJzöVOo_WF}%XMg]_mor>1ܤ^v~NRӀWYQ:$l03/%Ů͠w5NX;w%fTuSHh|?cAQ(2Ԏÿ6[v߀"v]tڽ uh Ƿ3S[[UT[-6OA*UyEIV#IW/sGMzғ71R=>o=Ӡ<)9kyGn*j96tbSܘE;D2 ($D+2d8S@(Rѣ_􋘮a\pz,z>PɷID1 꿣]/1S|8YocZXcbppZtjg1%5?)v4;@_If?#uuhc@Wbmdd͜7k׮C8~Wg߯${:(5xsW>#jxwQQH'bFvĺHcR֔C=~(8ϝn@]u zN~hbj~ٹ+Xʿ4vWAO5fCyL^RRϓ>ZHF*!5>~eWof0xF-Mug30VȪrG]k *1*zje1%7O4^ژ=j},0HvVe,L_ijra@sϰVZ;lPhHa+Sz9h&tuqӮIkǭdr54UO({%?jFN:0H+K  @1Ǭk WKWY)CJ8 F ` +\:sUM"%DźJrRdZrc#sj'}i\%Ah%Gy$& t^C:d*K{s~bDnH8U8ȋ)Ŀ:clҗCVD8dFjM _EGM֤ƜWm;fR85S1?N`"v۲hv! ) q}d;$ú>ۯ]rHt\!;C[wRW.N#Rs4{eӥ"&O2 )ǚxq|$0݉PFտqyUlhVz GA1N/0ul=gZk^bM&{Rc$di4'o"4YF'ы1Y<6uQY}< A85?Q떿 ,8~ F%_ٷk=1Jԯ Q( >ozߚ/2$f.(FXvzGM]9.{Ն@V 7pߛp״8I#~}vmly#lg\MNv8dX8wldW;нc{HߡBa4kp,/W KɁPlZYT^+k+ [ڴ|e'Q=ݣIny5T8#-`E!~ p߇EO?[P[/`E^GJ߸K0FhbVHӍߓy9>) jS jGJi;[X7H;]i e%>7z#a7fI<6/xVCgc;`#L͹A@qI*McF{PtweSKOJ| ͠.ӈ~q0Mw<&<fdZ̫Vb)ye>$.xӴ3CLד+Awr,+1CM~9{/Ȣhk ǒ/#|@LU kj֌00{a + #OxhEؔh٩!^]*&vre\42 5Y"*aAX4ti)Yn2[ 0?Z?ctS L?!c)'f2Y!.3qJP/y/:ږ[R!Fhu6RzIi((jYYb Pz)õK d=,?$2 $(*d=+YPޱ `2J'g\kgBǣd4l(zJ2-b rVcozW}7#c](eNTrW^?$iAD5hfH#X0EJVtSbo32M?Zpr.{}.`jIZ>wصr#\N_ƭ \4q&͙?_t#,΁@_om %@I@7q12q?|UA:CV-'`*Y2>NxBq ׃nuĔHb=y6g_ T$@CAq{ZJe*Pe KV=l}na &]U_&=[P 6Dk .I0.^)wiƽ<<*Z '0|tNiԤ$ !x[~C>egS|Rb +l rgq5ڟux5^X -u{ x$CsJtY{ĝtza}TR(+~,D(6=n74HvG Bd-vkHf⵷;0>B̓6I߻d9fV(bu}E;q<B# r5 %V\.Ŀmq2:eYO)288~n>VJ5cVzY..A22  Zm =V!f%} 1NVk7$-9n DmJ0Z4JN.C1b^+XG̼BM`ZD_ϔ4rsL:ߦ#$sv*suWeHh壧uI?7t5]8֢v񔾛rdK0^W75NαNn?uxBnm/>QZƅ0g5g5}d|( }nB ~dLK$4 wW쎾G3JWrUn;px1OH ~M?TY~|@Vy[j5Ȳi)$lq9hQ#`ė}0_ :Tu5]ND!ܔTW gkm= !]$'@qv/v#}:AɴA> t׈{{;9h*չNDX~6U6|X7kJ#\nf~a >kVBtBË+j8Bon% =gfN&u 8" zzo"3pgHy.4g{^U7n6ߩuj]lsL?iˀ\|G+u<>yOZt҆'E{N .e:1p\0D'|Z:<~EZ!d#34e2d6#vWDR=A+o\C6dBREYP۝hH?W"e(7yEw; (ω'h'r(w. 8/Ĉ"NG:I.[fIRĉqa#kl.; 9|8;0p;u r9hRJM_HyqA* Z- w htC?̫37D M/|V~o}_=n-m"#xZ!S6[.s'@6ݏ2i<%dL|$ܢWo`;}FR ^N.צ$ T pB@@jfWi{M !!wU-Jau߹{Fle͕KJ*kLWf]+H~w9*\D&bY  Ԯ*?`9Y<4.(>*~%4X>7x*6}/=DٖfOp];{nh2c}CTOZf_.使ʳIV6*#ս{ƘwҌRc9|<;nK 68#iF\I%@U*VW'n.t$/  CNJdʃ9h0ňPoZ3q],i<'&ǧ)SR`@h, Uoӑ:D *Yl>Ϛ> zܬ=ZԬ-UBά+<"ƬVY+u#3EchZ AN.S 7ߺB( 'Q Vc"΁ʩuhQJC@aᣙW6~Ȕ o}<++k(X'T 6SEQ4]\g1ksϋ!qtw#ʼns$J `xOr!9ϦԴd>n_|d FdMA2 ZC[8Ly<%0G>/XJ z>E˪6%N` rI@۵eI`\KDp iLm2_zB?"G W \@)frIU:+,qh9L9`H![WڙRʶ(6CʦQP@r Vso: a/]P u ӗ@v;&$Q쟾sntY`w(LVӠh${gN뭷F UEQxFrqN_^2մGP4C?|>LzCo?<Yn>I DSd;]oQS@M7jPjW Df*Ӗ׾_9z <'oz<:.:\ !~HmbM(J?u~_ zopE3zOM@g;w7iJ?y {'F/4L8rF@0[ò&,@$̰"rŢ:,̏鲤I*}=8#^;W1eȣTBZp$;K:g&5;F@ѡ'5>Ֆ5ɖسmVެL^B;UVKDC8P F TrXņ9 n㪭uՓp3A{;C)Ld-Dž=UwI򏺢Uy6@I;T3~>oT~xa-XKGӴCuR,"  b&$KGR5Tsb@zA(ȔhC ʀáu\RL]S>s;liie, xXҲ?50A~L3o4ӛ_ Z^k;@qgO3oMj1H7B/z WHP %3=:ifgvq=) LWa\[HٰTA&VMЧ3@9+ss+kyw|ic2ol^[֌ _9k1ʛLhEbLA8236B@W&,q>"0.+%GTƒ/ۤr##g'hX;l{ouLov5U]1RAՏ˪+h/V>-Z!Şwc0L>; s:sc@lFJ>bt;"O-9vfp "dT|fI5gM/ /V: TLʗGL#@! I~09 ]WNaRZVL!n;mq{@WV'dco 8x}LipN&Y){3O+-"#L[ccij*亍scgFn3c׋Z2K"5$pD־įTU<v۔}6tsJPC9]gZZI5$^ۂ;AzdP\7{ FAoI#p-7F+?)j൑t ct,n;@^顧stՊCqg_mNe ]}F }?auksDz]S n@kǹ;$@\ukKaP8P_qҗaGݒaWcwT={S CpHj#2gZxw~M0Q,Kj:Þc yrp : @o^κXА~4bmO;L3&YuY 4J<)T3?d$$ &.xW@*kN:9s])tN^GOT.Cjc)NCocTzH͏e?8N#qP#c =967plG ]z0-曀lg<qM0w`+d+hOڄH$@vaEQf\*լ41&{%z/YeNJC1!oC .θdքMsCS+نfu9Rjn>L _tf 9 8fYE]e ]{ƶ r0Fi7nֹ @$qhH饶)TOOrosͤ2!D5Bc.|cy4/οQ=WGewG짩9@=h6Cs(eQ=2OGRIvSrxi@l\UŦ-X ;4MOv͋]YL5@퐆}Ɗ Ae?pE-9)%}`94D0B\+Pt⁰}#9:>r rg?y"9*H)%:+$RIʋOb͆ -?ժg?l}Js[jz/t.n ǏEN/xv4Ԏ`#`h))\΀hQ]<Ĥ\I;涟9ެ  `Ile pP ޭ=rq'K]֩}RfETH@J]]: ɇ q!Q`<>M3.QJ8. @tR3 +D~ez3s7U? Ɣİso-w&6s21t R|Qњsp59P"g^aH U:eg*ɩj@켶-sfW͜h5qp){g 4-̄_MǍ}~u:!XEs(;3"/E`~Yɕ3#D5?Ћ^^.D>pQ7ﮂ5ӳRݛ@ zMϩ[#R6U]+;oJI$3"hFj:\-C٩vrDƓk??ak-<+.$nQæyZ;Tikoc|?Rtqv_%e l" Opk]߽DV| )^e_<;IALlCم֒\|1w,H@EYn v.0 gRDZ098/}|z8Ksʜy.fRBt=G(x :߾%; 4(~ RTm)"*y' Ld# #åSg*[W$+KN5ko9_ٛ lVxWϖu()W~ f_)Q f{5_!GIzc+qzu(owO&b7΁ 74^ hnVRz(m[ʃ"I&Z:9Rc~ r~Kq‹sIPsqgTQ7%oN/S愨y%Q)Wl^ Q/=2 0(~kw6I @,C&?p%^`mC~w^,Uyϗ6W3mŊ|bϚWRvΨ&3D`E5Sb,(+^b=;W 5XA'vbv2o38 vH@EESχ@:mƚ*kp(|pȭRږ_O,Y{@"t8Q8,A-. $([K6ۑ$S%;ka=uڨ'max!g+S{F[.Cysx{>Pl\Rч{vW@4pW"@5&@Z4bt]^ikiSe>(<:; /:zʜ3@S  ^u5N 7Dn@j=&=:>)_`xwXkF#B P6.PÀxjy'b}+*\{xtx Fy@4ҳqe;ldk⻺=VMHCXPx:_%1: l]BCd@ceU=kx@'2*:(`h/G˷_|Vw`E#d=`w@m[Q[#`'>+࣊R=\7l|NPZeiE gRJJL0'UkKV~`R3xYY*($#j>¹ik51"5x) Ly[SjF tTE )1+5hm8ZOfsR5֑^C*t9 S'N7:XiGuϽn.H•w*Nߨ:p-G$fG4 \Nԡp{oD<&/wS/e >*Mܷ6aӱֈV&LS\\mtTvj5x%]%w)=p p0*Rӷ U`:-GxQ6<&"TxJ^W%O݃شvǐɕb]KI͠Ѩkj~X|;? Vw󊞸̮B`~K$;mw\+P^i+NԊ^R`ɬpMbOqI&ѐSnGpgr#!đ"ly}/#KP; N]L7G]n&͎,9bOW]a_ˬ3Wht@ \CEeX;6RaDj{DO'yQ15 dbΒ={#]̟Zp13P̩4c#?%[Ikr+{Xá?:;up>cM6tƲ2^:t.M!~XCXYg=FѬ+>k;&*MsIsMtRmuU-S6y,bTO[G+rݱrV$.+:W}8i3R)L/ XPHu/UX 58rz{lJoտ^٦!~[\ /GSVW uBI<er;pXZVW"N] *z\W #_$b;l5 9Gыy$ eϨD2q(\R p" myw}R)@,h}O"k^Ql[*n> 67c9ϢEy\ Brf_CrU&HWJX-_*of#\_ey,SzX> `CQYξHm2yYPFʸR[޿8 zX.m O~W6 ɤWc֬(U}OVxIv MqAJϢ}`(߄ndRwq djFIG+HtmI}ugKGQUVKЫ\y˞[VL` ?%GB?I7ȺA]1L__^p1;V`&!sCð Dbh)~ zP JoR:lW{ Wl+$BLdf,m-h4T37xNV.+X/w>O l:s𡋖tX6G5m,*f!rl[[ a~b8J [+Jڗo9򸓥bL/]D6QS66)y^F ̭W]?S{_ܕrgT O7rl8^k_yNAy6l-- djû}#@@,ozu5q]{*9ȊQlۭi`@*w zۍig)ڿjR;3,6j]~8׹o@N@21ΩL<_8xr JV3[~qw[MXZ+lVW=V"^g>Ofb6Mk2:/˪/EZ '+"+L.Pm]d791#h~gS^*׻C[@jqyf}ewjH 2Ǟ [Ԯ$k҈(Ho߽تh9|p7ՈewRO,vg;Ig&kQ;HZph#^Cp~H'!I^-~XscS)f68'OoҔ]lH1c+,΍&Z)lMƕu9W7#?^yQWӫ<b>.O ͻ`S<<[/jw q_//ØB #tE;$pyKkS5g%l|}fWT^ ҇;[y+#H\5Nd~D q1* }P@wT=K Xc :ag]wL~,|d4k jki($a͍jJJ3tCTCAyp5@dj۸]k2rȺY#W8PhPab'd'YEVʹVR= 6ɬ_EJֈLm_/Ó7E]16õ/֒PR[JK+߫@Z'7>Vk艐he(Tecђu?(|7|e"h( zVVQz9-3z/'4F[d2T- d- 9TfކN \q&y7x;i3mxϾ)tL^% :Fl줨tgDʱkPZ%f: z `md@5: l@5adSˬ"=09>F;6I惺Z0Wɯ+"E4g W7[k)񋥣ZW' *Ƙ׫ȵP:T!{Y\:YRT|kdaV`7JSx2EUtuq ϴ߀7W,wٍKc p>_eߗ'RR /xE@34p^_J6(pU) j6 P$xH0‹VˡA'HRC  ?C* '=G'ˁSHh2S"S)C"oz_+:aUwW"ID U]3q(N[QDq-b]lݢ _4> \Ėw2CI/kjJQ4WhIVʗo3rk%@$i!wwHctJ47~G48k^(q5iV _)OZ}˗Z=_ >ANfR0JڕroM>#LQkFڭSc5FhbYy"`̀i\Gfp#NrU|>N{a.zxħ7yV|F+9_1ԨeEicL8 iq6%PIKͯ5Yk3 A*PP?Ef%|ˊ+ݩ9dcNo(Ԑc7!|}}oUOϠI| .e^8:LfX}\'$E&.'whWh.9ufiTlR9fC7 e)!-aŞFHA&L7+_7ǘ>tRe's1q~6.'S8k Ft12@ T"k{s2emꋗn6~ i?f`HڛO:83R9J#%N0G˼>fn7Ѧ[}2XӒ0)6~E7 k೾L(C ЄeST] Kdn/a IK>7v~S] {9~<=$d!U.1֑'$^^èʵЃA-U $TN<6n"c@+t/熛oo #D˜ԯ tV[YɼX;HzoAbPIisʳ{gcᴁ;꿓bEI$jU `>^XInS|&@#7QC-`}"\{{ZL&IaEٞUGJtto|h9Z;_ĺRfW 緢('|Z gzLJ_h:|/̫zuᕢ-CJP,݆ Gw[0a5Q!!\cD=!wwLix</+ nۂ.Ҩw1.s+䞷[ 4=syo"]DLVQ #I' -焅lSyK\ehH&uok8 5,^NFظ담frzbM*"c SiwSdZ9]=ݞ%zR}FfOPknۓ\זV8o4 sfJ"O/ {!W/.mת 󿜼vH[/q8ϕbc2zF 5shko,yMc&pp|{h!R4L~otjOșjg@.gQSHCC..M". l}1#?a{#c 'ͷ+R;ݺP禸>8^ 0H qJZߏO P ѱKҟ.Ǻ_"yvoV|'Czh]zhFPt|ސ ("gu)Cqx`ůJϲbT)5P" ӃܰNKU')d^0$ KNlx;RI-TXː|נ8]sk4C"Dy65^-t!";7IsWЁsAJ{"I4NM-T'\"Hh9aKO{;m/DtD]W@%?\vDalp>?kG СCr1a2Yozs'׺ѐ/T:Wr̞{ -zQu[~4"5 d04Οh?eF`>\{Ix3 nك=32 Fc|?ndم&o^տd g=`7xJWN(>&d.α!ڊ&3+K5\ }p~}<Iͥ.,i%:^<&Rqql]<cY )6%\x)/(;l\^5?Պg*l>A{oi?Hc3r1++>,ұ%^ߵK; e;U ԉE7zjn^ch ݵ|VV US.ۅiʴV!<dF*dt_ :/8TF5a)}jtD5k5MEʮQ7 ⳧.oZ {1r@‘g.#({ۓc\]rbn biEaP`b~q}5;F<_N|U?҂>i.Ao?}Nfq t66p]iT!Jk5JC4@g( 'ӀQhي"b=l%' ]Mbc|1t> -z,V2_@lV==EݝB~0aT}LCō^f5΃jON6 @whWV%?ʣ2ZH:,~TA`es3|,AȤڭRe|>`qa tDZROrIF b_\ph8Ag NC蛰ug@5ՔXдnux䵏8X9 9K@ڿU^\ v?fCoYF@}4crj",g}(FCch7Qt޻<x 8C䭿q="Lb$$y_\P۲Q!+hڅ(00u|}O~ I" &y4bF>M A&oCV೟~"k]sV)yx%s~} w7/] T+ ԀZ`xu:CR?7r Ͽ C^zq|Rҏ9^#ˮ=IO`O dL1o2 l4G:i}I}Z:*Fq[-s}CoS,*Sê~u["1B4磽~4m>-7k&sA8D\̍cK%2'ޒÛ"ڃcF.=PerRl?9UCα+t 42bAzdo~*Ƹ5͎I }`f%Y1r8q\_|ƛfm^"gi0 j_1w,bwj=,(WF.Ý:#sf`\X&%I$KҞM+:kc.j.l9 Ϋobwt7 ׏,Ȯ7=.pu6u0k̐nHH rv6n3kΧ'9\1~hrBQB78fw{~㣊τ?˞ŻCwnN{Bq Ɖ^>caxh $ ;!^ZLGőYlW7)Qu66h՝ r+b ϰs@@P0QW} bH>^P k<*/dv(ܺN}|uMdp.oxEH[/5wD\K^uD>*SD`'plY"sTB$CY8=FRYQ*QPLJ_@OVDpe~f&XU*1oU%cmֽ{vزr_h$}cMv@Ps5:E[drYkx!h*aƘ`Nb]ppiOAJ'd` )[HS:$8N`p˽85=;7^ hT (!&JF}tvY4])qc?_Fq7؋,$a>a`g- .^11Bh<IO\h$*iӌęG+kTHD㐕Ԃ^-o 0w8.F8FEJhd$x~tȎ8pq yrl6ɱ98{ؙ}e~ I<Wj}__rhXa(ϟ|.W7".%pFQ(s#M}I$C*03 +pnDt8P|u BtPibGH#bߋgxΙފDzbCaqؘcR(z(Tr0cmxg@1f~g,g UO&m̋ 9O1V M,M'H@SW1_G: mz{ DTY~Aݵ`]jެq]2- t8q =(}TRjzr#FI׻X *0>78lZ٥@i[f1(aا'TJG+=4@1έ{,\|g*r6i"xt%>xUlŮ3AFg8u4cA֊`YXH,FW9) CZŐ䜹Qj x'e^xf{-\*h\tc5˳I$Ef5~08|O\Ѻ]uE$wGʟ7&F;plypPrۍ9y/Gg@p\jk) n}>Eӧe GޏG3%\2%QϑJArvIvx oU}<<:HQ-a\+Nn|9b>a9,C芺Dαytk<єHhF ;|;Qs=|ES0VTyVB@Zlo0EW{Y <^wN,{f99B- *i4ޞlۂ_v$")Rʬ/[ovl~IVۭw/k`'Wu>"HЙ r @L jqsUW)Zl/rMџ#BDE>#. 3I}9&.iYay=mVEuf%`[ƂdTsQ%eMg~[i4xUܭr0,94FjQ@C'BH/ .K|i3߅W"֋zt뫬.xDYs4{%?j#8̣Y~,`>t"^ ~F_r3W&n97㞦u`_ +lh˃!=Q-ur|}3uUi{S~ǙN U+fZMzÓaCD%A딗53"$L?Ӄ1n ^OB^;r?tX.ݺ wնDPOkbͳ%%vB yFl+?lSJtk I85WeAM qw(6@ګC9{4C+|@FpkNaS-@CZxL"gWa}\Vs *}*lqD)atΐHTouXr0冰x?Hpؑg??֢jR]D~ÖH`Y$^= 7ױg Ϯ(bɹe`4Ǵ'XSlG !>/o'飑6$0ēsv۞usvo(9=g.WJilhMn]߼ūvꗓxnmх9M,FуÓ.w9h/w B{v$J2 qҹ>մ/=2:aQEֻ4-"HC["ED cNFl+JR\Nm\r2@b;qhvRT ?rɘ2!ygT ~Ժ I6Xt-lSaB ` RL:/A2$"@/kb΂&I[^maQ=m8u]_=j/w ً@eҧQbk1?9+-=l6E|0]a t-cbr.CU&ţR^,4< G^,AӰJgKa\|&31O=F)TR )q,,$0<#^E8˞[b9+JW:0@RҹkzIx0 P'NQ{!xsA.ِaW*l(%;%;4P#j 0;yI nqzu$}l`{bL®:rytNe f*`ˎ9Bzq -v YvdDY#PhgOQ oP[>c`l]8r`U_p8Ur$ܖ ڏqU}kr}-R?W5o61VYb: 2_ Hugrk[~b ʹgA-{BNM~peS^Nbvr?Hf3ւEo^+"ǫ^{')=86f!]n{}hp9QLk3 ^馆c2淜/8#} ]]QK<+zLM FwpN|mS{~yUr~ ̆h[M JB<];JH#$aFx)+H7|3<ęYҞb2A57,?[r^mohTtI딧ܝ[6)sP^$R Xl=d 288uty| TzV FCuSA "WT7qpA`1˰D߇eWKŇw+!-t"™]&~Hw>(Fhqb%@Qg DT (D\lf8:BoQ&BMniS ;$# ơwR c&n*}|'@@1X{@BڋK|eZ /ioJr?ۣCnЋ!ZrEyȯj0JN{DX?p< D)KqKa7!=)c+x) IoAtD\8zSq?T3:sa{\X{2S!V*v|- p]a@%?'%ᒥ* *DkGyEo4oE%Zd;pFSup =ߛ"߮[{C{ۇZ0*3]'Euu%m<͠3<=!n70.{`[WFZJ46-Լ 36Y %7^elx!qft S`\8ԋ39Cӯ~+¶U'lS~Μ;S;E?}|+Yr=K먖`Tt!#{_5_2!DI6'n$Jiԡ`y1(څ~ˢג)2{l1{,o1Rh 3Z!XEJ*S9+E۫CoYMg31S2(!K۝ɢWtq^W.6]U0-'CcJA]ˁux(Hӭ (+ߜ&sPM PGз][B![d)mp=HrCD{mz+qbz/Eq @hghd2 G3LXcȯg3 C ]i<8D$_p@_y$OuB( 0ogf煁)S+q{@>]m*b"L=qw~KVH̗eۀN J,.H_3r?)TZwtXz(0'%0Ic"b4wr _Z!>I>S`b/+ܞSǙ&.+Q}TE~Gs#v$7C6uz.7PoH&/&TkJ$dV@P$O^; h !EOPS%)8+@4)uBg >Iea6͑ ߛ0){]'kC#ɿoC_ݨgZvf)O|N-ӣ͉cRl=}jQΞD")pl% |R .-] bjT;-)X>'5`t>b=ْ*YDXǧ_`'^OwK:c]dڲM ?+*=O% ?Wg!%#tM.8?ֶi^F9hKL6ܥ9.qgQUlk*f@WsB_mzQk)݆8 ;C>UC_vlYsз $BYNg)~BdoV-F<_Tv7qYY{4sIL0Zc W':! wߡrTx{e%pzl la ueeVAƳ*lE(:4?m+քq H;=>ZY>%11lmԽqn"/ 5AEuFsll/rhdHk,RX)i`X-䍯wUܱ젱oYHfrmŲ}ɿAoA9HH3铈[|.U38'\qRˎ[}lcաRל4mB2!GN%<]nr}m7 PBK$l؃"&l\4\8yBbܚDeU[FY,9;+Zcw~Sǹ &&/=p]vGo#۠-.Vl?!~)'b!IĬ% {#KAݐ]P6_BD O{WGyp x?w[U_rZzvۄ7,SLϿ fB@NeQ>u5J"Q :%z*eɄ4)zG*ǐކyfhz~6 "{CF(F@ tF3X\e^6]SӾs[eNx?~?T~HX;^'FDt2n)=݀eȂtF#߮yNUפC{8(CDHn*'ˊ? Adis':S?P˫߬nc^,#f`;Spv4\~߱!t#<3$'(!=pRKN."DG(udA$Q! E9Wz N"]E0\^>(=؂lI$RbneO[t+$+=!/ŵQN+گ?;"1;J+0u/k8?V¹&[C; m Z!c/Ġr%+GZkn XV82job."ϞVrljqDP+A)ض<@ȍ>WF1*`vN,(_0ݬ>cVC{4mÄ&9w$C)bsg]fV'=DKqg~)/NV_^oǰd `%0ȇll?OvS;?{="WAH`C>5d Y >@>zўTT 5YIqUN}S9zPo7hs4=eH>*%(}'Qpڥˆ. +{Du>\0T0 hID@9ͷ[56{Fۈ"udU1wq 8n F̓j$8`/7|ٟhx|LǛ㨊WOƙf𡀽'^:ۣ@{@FhbHWsjq* AJr$(n,8u:+xOlB:#!T3Ƥ?iY'7GѨu~)t)VEcoƽpL;X˃ &XCB5qcÚ(XL4,WKPBHʰPhhN[v]iSy/98a vUN`(jU8[Ngї=q csk;ݏ?voP(],$Dw: Zt`vBk쵚:3rFn!* )`@IlfƳM%0H:n ֜Ҝh(7Xdc a:t]XXY:x=Z0+i};*/-c.a-lN"x_16iE4qYQ:+YӻY"N?K~Gn6_;,xwze;p` %͍FXs]Jky㬲-yƏo(̆Bǒ/8' ۞Uxظ)Yw6r]X (D({ESБpꭽ YI eN xd:Q4X!^:j] !ՐL+h-eE׭ެGeEW?i. hT}ǻrYHdeͷڗmzl \ԫ˸(EI>~.Au%p8#*C@\"sFanxFZ;N9(U 끝BS\:sXdžCk oN![*AH.Q5V r @^-UBf!įBx/V r6YI9"ceFu(B-U,ӥAE.]iϘ4ҪÓM,{N[Шu/+hݱMucrƄ|ǫMUx|8Sx[H45̊,&Y$RCMѲY΅~wc>o3J$"m.HC q+;XأL^W5h٫0yg.!&&,1#CK`Sa(4*k[ Q1UooxiIXXh|n,BZ5T)- \Ejd th~,6r1 \;E JgVu/G>1yB)Q4N\\ǽ)ӊC-Ь7b&4&{mZo˱"ײ͒DqiMBTi@}BxS ^ a@:j\>ԅte91}w-Dop^ sNl)=gb>ܢYY;""+A!xQF 9nHWs e /^KON#is"Xht qZkE₺Q;c%l 4\NP@=]Cbt\9}N&fЀIưbu$ a`:_CL+gYK=0Ui 33^.@13;Ia*fh qQtaYJ&bM_D@"Ʈ"4h^VHW='8Hx;W"nQ-s){Mo`\s^8AW5{Tz ,S:A@ǣP0-,H¯/ Q='QRi}d6h8Ϟ0 _S-nð!" x+I<*v bդT^X%̇+5J!}N|WEY!JǢvO\yH$ˀ!RnkχܽFs4P8ϙ(z"ŁU%)@f Pt`77}~ac~QXO=G@o9Sh܍~a!7tq.Eep´i "&nsf k2n*(&_ wwZWaq+e{G iBk:̰q9ofH=.d6.ZI / ؁~tG'8 'rX1 FqwV )5Pף>ɞNu\=MbKm _ nVP|ds$/avtaE)HQ[$WuڎI"Ip = Ng/!lQ6@V2M'-^u@mCV`o_`V}Zs:ڧv!K _׃covrAtkvŝ.y #}G6pBL:+zR>p[nN2fAyC)OJ^]w'cI_~ͽx J֬? &w8^4fV79 0jo=дQQ>yu 1;*02rD~r^T=1w٣+|u?[_4e?^KWCɯl^\~H*FTR!'E*U,h#mH3W/Uw:ZwmPi*6UˠJaֆ¡ 4kH W0fhiqHr n4 MRcUw7Z/qX~fm}![דUqeb ߲lGpE '6]֯&Ytk: dI@dۙjĚIjr6[/#1tqcSk.Q}Um:v{hdž?\V]\p3ɘ9E}te %FGO$X& : '0$F7)HHu@)4YJYf>ϼq(uBrU ?aڋ­h(obk/b& S;aP2~\)n3kFYpQmzxEF>n3dmaX 2MR%iNA2 X!y5RZsL+| n~\NqCsF+J(LZi<{߮Ua]6ͱ\oւ D'ZtB%_xu24Xiu ﲵѭMPk%mĩ\`/zPIc&,,Ŕ.~7ەDiDzj&,~W}'=+*? 6BJ&֕CPf'b-r;TT拷 '滀< vchʗH3'cq!"ȪL.Dɽ|QؘR|J$1]u^lcZFD{J![3MnN\q75yb~Gkֺ 5qX4NƬ2 ,;OFeTG̰~saq*<,{|U0bT0՗ںp欄󾎉XK+AI8.fW5{.5*1^8Đ!S\:R8 < ]8&i8gT :L\_]#!ŧH5mP`ܑg{:uGϝ?w(yaF[!^ vJ,Y,g&R(c{AU\G(3_߸j-v t> !K05I'u,O'_g,khHt`Ewz AQ6`E/펃閔)#&BͅQjׅC'.F.Z V LRr|6(8[ߕ]4-BNvԄ#,}XZYG:Btv nl5"PV6 |`1A!ڬ*iݪ2{(Mx>}ݢF5E?m'!va2yXg$A`{⫝̸:oy#K>} W珈6@VkbN-lƻa[YId@,mcu1-u-8j߁ de͝cb` 83R}S>̩B=kHq|S>9jpO]L $"NbH Y@9{.W{w,3#P^FsLaqv{F4>sjEYGżf]FSK.@ŕZu/mH.@$La\v?-5``ա]~\VRKˑhV^g@qR*3ŭcya|~W-i M#EÈkN ga#gzoh L&\3Ĭ0s)8H㰞b~;xݳY4ՀA, YcgO sHG=_dU%&;T a Xh{6Ϡ P>(W^fZ`+VNe+kRGSn'[0NBUnb(iy b 7EdNA~(Bm0N׸@4(#G/ $ HUzc+hayb,9 }]9ȷ k.Ɖe؂]@x?{%'.6)σvUSbu9QD԰,~s*Ev EA}) V . ΩY]F2eItW>\ʵ͜ Cx( 9à[0ћD 2@VZ)mމѶ^D?f݆oD\wN#@%_P3{cuNǠIɌfQ`3ȍ/JEAnU1+os|T%~wKg3` S9[.)1ET{̡o© C\h?3c{OvXFރ tfyjj&OaT5bVk= uk]1MCv_VoK,&O8 )0HLv/A8/yrm_治|M)5E*Tbr,d{*9u;b-‘/g@K?v19=.5m`ީ <0 .ags~&5uK+דkDǃo#t)N簔.J3cr,*X*~[ß[L,>Rdmלjt"zFO"9y~Xl.p)6(=p52Q*ҫ廙ؼDN FZs#\ e0r*捁i w"PREG'˾a+AMsd"0A=y~_팩 C @#EzGZUT+e>B$,⻶o7>B> boJ,NH&BYt[vU'LL _iaFҒSOH'.LZ+&(# ;Ooo_pbvO\_iYU1㊡HJb:o.2M%oaJ!٘rm\p1mMzNV$T9M,)lYBUYZ4۞7 0Q-hwYk%z(ݟDk^:98Ī&-eq> bVoH^ӝk, zP݂q*4)Y dhpX=8LCXB[?c33"5 6Vmmwb;7⢊?cJ7(9"c5/E:eFP˳Xѻ0PU]m^ɨ'{P'[Y%=ÖsQzBi2.;pV-sPGK G| k/Hrl|@Kv ;mjЮmcN)zyr]2eܶV֯Y:e v _"skN g{bpG4AWD˨qo4s04E&Oc Lr ,Vl34M7^(džj& \q t lD2)qN٬p8dc`˔سl%VLtoΎ&1PK&r9\lP=B 榆8N6\J3oٮzUV8-Y6H )$8c;!{yXaysq yʋ4 ]U/M 'jʗF1x58Ʌ|Gbb4~tV`#?ef&: /`G(m QC,UlG⊢-iVAMp LjBs讌˙'ĵ|{^jmrU1 ӡ(9TOB !Qh>P :P[FM$O(rAїh,R`2PQ}'*k1p¶/rWn+M4j'P^kqHVv$0;pmQ~g6[zi88h\=C!* ,o Q[Ub 8 _vd_Xi5: (s_f@U{7/'Xf'z ZFA)`0<!B[ X!~pS;\kFyFafvܱq lKkk `8C5PVsԈ))5~K[l EVe|$?r=L"$p*1V$J7=]Ćg) c>bfe$[wFy<-2@8n<4q(l(lR׳@ Q"ȭ߭Ѯ'aew]R=C,v 2c0N; {D5+/K,ph [@oYpp2nZ[qa5F6[͕x4(#؄VBx=nkx1rqٜTݛgn JJ9t 5cH5`*9='Fl'(eJbWj6@m=o2,aN4yX;HpFC r2y%[D9a0fbلgc<5-/)XxlwAUɚ"-J 9\p !GUa\e{+WڤYBIQph  sYPT7+eD>a+d^ $@9|M8igWZ9WB!"UV⋅<(ZS%Ж9P3͕/l>(\p:ۑ]ˡ݀F|kֵ_!3d g|ޝ6Ā  f-{i{+ 7nJ2Lw S- G\AC,E1(um 5Kmpw\%̻ a|_%a(063z]:GA{eSjGmD`Z20:=%YTinTr4FH_]LqtjzQ{C@aoP?ƈcESiz-nVR hleN_rg_bRjsљlH,T P榎sL  ǻ۟||{#8GUxPZG+f/; /r_J0\9"jl$)+qxZdꛩ'[TwF*/[c4Hم+nU1KGy56Kw_==Z]K~_X+:1p]wznJ}>]8 ,=<Öܢh3Uz s":1 -=DA^lX9'@Z0 ZuX  巅y6j5[U.B~%yT.Hi|È 3}!-00f_=\{t 6Wx o\)!%HJ/y %>7,/8R:gaCA3HFuNȋ]ģ)J*'Y"zƿ@ZyC wkQ {X J޻yq$ _'s+3^p( .ځA' Üi"AvEc[ QV;ip'|R: Oc.6&طVwkSx=ђ/97CQ:hٯ3xcӲXEmlF㰑|b]1ij*Dܳ(_6ڒ*tOu` /B2˪+ L^#o#: 6pHzV:rUWTmw er39;vc-2/^o˽oa`kـ:3MΡ2lԋC e5 g f':`z2 `Jφ<U^]8YHk\$=-Yi!0ⷘ(p_6xI:30 tӀ`ߺ.DVuۋ_.qSl˴GJ]!q4#Jx}ϟ! pt5uMB{ a!]]In.BaX3Ԁ^O\ɱTB?5ZJF- B(j$2xq+ǥx0:lX/[%36kW^VTDx3gKe$Rhx+iϱj@llOɓW`۾!}pG1nuc/ (fpST!_ eU܄Y )cȏxsڪ `# WvgM6,UE?)q!xovs <.4tQbZ;x#>qj] ša3$5[&CpޠrAjX}ܳ|2α7~EȻEӛ90 Nn}i]AJؖjsSn3%K}ٮ<[Ky bhFqwoj=~icկ-(Y̠uGRpZ0ufk*&vb 1c/;exSy<@6]=m>6>0^:?"rN_ R59bv?_H 4)^OU-qM68eT-'E )bh$b6&'G|t?i{4NrFALm=ukqiǭ_K?/ R7]TM{yBSӦumJCF#׼sŋ?w{1cxY nU2~J-g_]~e%@W(/`'eJ@"RPf8'JIyZ^aR *X lȶ'x }8ZOjU]c&-;yݯ`wq;ܪ&,+XʿQu-,Ml[\ o8 ϡJul ñXl*}>GahϤΫaiSMc 3,jo~ϳwc*+?|5JVjz5a_~Ne&4F@V12{Iޥ[S0}n66fj8{3D|=;Ob7o1JRT,|} g.BP7hx5fWSg40;MH19vZ Z |Zim-fxl>ъ]aH˨qKo3=Z`տWP-ԮRO)2u8V"}'Os?L ^T GmK)ہI Q,U7kz$6ej'fgEtL]x[ZJIk" qmֿծA_'Cq@6CV;z@?c}Rb@2c%vm-.މ5km ;oU=P]@ oR`|f=]mf{tE֒~u]Bɱ2vVji?/b2'ܱ\!u2$)3@0TeL~ßu1MH~|kviñvvVmtD33H$ }ω73ò  <\лEcMr XK3óxP WEC%;*4{hhF-p"-Q\__%GL"n wsOupM?_ W"ˬ- ӋB:bW)PH<Hd,gӉ.%}T׮exL@z6=/"m*V2,}X+Qeado| :Qi9o0 4-Hq 5@Pt)O$_eM)_KvPU}y#rq7^:v&q;[/sPFʹP8PiH|c)iKXhA4dYxIڸdsJPcz 7ӧ‘F@'z^e H^/ ].o;2Э(Zqv4x__G Rp^e*@ߙ4vP6OIb}/e@*CU+&u8N >')d@)]{=]Y{o}wKmFOAkL6` ҽ.bT9 _gd;]2tx5qGUP%]hcV?6y:] C2u$w 7dX0ȗ/]viQm(;8Ο򣮞0uGٯҺKDz<2 0S%f5Rg a:>Ü4Q ' CPeX_݅{'[L;}^Oݒj[SVH<AUc&A&ǃ;K* dK,!?cifz=gƺVuxcHF,u*pY,(W DW.fH҃<\^xxqN<]6+ǍWGMؔ[ePo|/^eS73 bzwQ \ OMPl Ι/[-w/bS.ΎԎDi ^HI:6)P+ #6IGي3kd}aC(->FE&}Y;g'<*?TE&J6_\+0=baUZI"cK$Tǂ a,ѻ#G9R@|r9FNlj J?jN+$Q?$'lHYQB.itnԔy!#$2]*ћx;9 *~8;xwM#xE臑$1=X["k{؝Mo|ʣVUG|i0]]{6|m]mIt^ hST0Hp U )茼رqDxrrex ?eSbqՆI9Oon[pcBKlϽoʻoς\ynim`UD7}ŧI{pb9}Jngѽ?JЏO~y1EGrcWҋlc1lÉOKI"YN;k\vҀK^Aa"%>Fg*As9"/rm}kz >- hH`g}l^q6.}uvWVv8qM/v(m#VQ^UVxˮPH5*|)J4uYZu)XHK׮,1>.c Ò܃êEZv>7D<9ח݆r2wwqZmy!Yn]نS]|Ugi޳(lЊdFQGE3y&?@X p% :@A R0 r.2ZZ=I#`OGE{䚪M)!uӑUinh.kIYjr: ??Lcqf!YbofJ)<_ >*C\Pv?v`9aZ2*B&*dHϜ[&RlR޻گRA(d^Fs5wwrKۋ¸iTcԕ8KɃi͇Jd#B#fO),?2eylnx؉N÷qP ke#&c5 ":#,e3"b_;OrZee9pIW+x:i VȬKzpbK7jjyPB5нp X2١U<^K@Ag01"S /(mW2 YWPؾj? ܯjM7'p [3E[(Z`%x̛~., l /mLa9m9@A{|PFIY: ࡠ+DNK΋}+J+#;ʣ1]siK:E.3dͣ6l;=>a VI> 1=‹Җ`rpq]QmFD%8`=]sꬽP {1s|^u֙NYplZ{N_[S:|Wǀ|M[w<$ble&'}ź/{3ss"|CR]]7lq@9eQC S5$"xU L6 >PFC \Bڱm?$x (KoIr7.zY2z‹y{F1Vprt)Y]J`tg]z《Z#LǬC4w'g7uDWn?'`E*n,]Tɹ킍q.aF{Lo3R=OzU@鹾Jk2Ĕzl݋e-,R4l0WP4txDu_վ1/^6O0$X0JR31 u#{v ]< 3p%ޅ F/j_hcI^Dwڜ}uvqMYMrK` bO!TC)xrd!W4547g, wY˭Zvayzt`9l šCiCLӂ:Ӂ h(ݎiAZ j(=,T(O|553r8;&3 #}#\JFnpŌܚQ=)tJh~lI2~7CN~7O2? SҼ ^}ZD_w5}ucLk18(n:B1sX!7%_!G8j5 V?=W(/9{mmป ygѱ~H}=%p#=HT=[pmu^ A!Ѫa9Ar/\Xt41qUJ$mZk:L|+!qK0^*>|ulgFYU`w-*Xv6DO69fPPnœsHӬ\O~xńF;Oj=cú!H~yn1c{=E67X7}!}0S-'.(n_U)޴Ѵ'|=bط/D@ 523O\e:`tij~R{^86RqrsF>b{[(}W0x A |9SǺƀr-z7R+y? F4 Im?"ٷ0#ޚg5BԞQx\@( zwS}ছ4%>eij{E>WjZD'ׯ~~*[kdhho %A!+#̀Mّv./RoBťcx ٱqwS(bP܋lw?tzޟVwCѿ }© !-3ج`9?w{|UܶݤCvq=ZrCQÀOT.:>e \%\Vf >4x1g.)zW'b~Pk멱 8[Є^vT.)5 TwO"gAMFvK YS "?E_lgn^1j{>3֫M̦tp鷨($-0Ӏkig`I+sx}HE ԍkB\.ї䵷DI9Ĺsg:IE*` O< kn+pbQL\vN0EaES+i?n^N[$Yz~kUW,FSν63 nj7<imDjUi~{./[/<ԢofupG69-0퇡t^P) w5+\~H=KAM9ԙ~b=W&%ݿ'A{9]FO-;{cG7z%Co>8W^Kn7_g-(T hkLKװ1l *1çd!=O I>.L^xR<#Hm̞L,XJG/7%|pmMdGZVB/4vH S/b `7bW7=)sw<fz>D \Z[}o\T7g5W֫`j뚆5k}~=A+p7/js`߸ a΍su\(3 X?Bw^-*\My|,CmLLrO& hn㜺J~Sk- (}z7iӘߪ&_-v.d\#Op; ~ח,7_Cxr A,bn(ŷQzaviJ֒Žԑ9_n^D^H"3$nLbݹZ\䳎^߹aоwocPr(>mBOro@@5gȇ+}󗄬wSl~TǁЉ2lׅ$BמlMj8h}o"j<>Ϙ+.?{觎fk/qL`0.=_:]_E.@>+H .I͑v=MI٣K7]fiaH7cw<~ݾ!Z*{7љQ?hu~?`bߜgo#{B)NnjM&A 0X5':DO~].Lƶ ?u>NC2}o_p˃ Vis~MHP;auRآDݾ ZkO ZM"u^]ݢG{n-诗N~w-*t6ӾY]籂m"ʻp UwEх%J~Aq>jr|zX(w11WLX^Q^jvP6(?SaGjS4?d}}?ez^WWAEECi ,)77mK-K6~ˍ(WH\qnEsvŵ̴B*5F~G9Rn֚Ͳ mGP~Q > 1vћX̛m2\~t:0ŐAVy}_W&9WQz.?> ֍]j(RmE&9DNG;nxUASŬ̧Ʈ2~?,' 5G*癡 >%sl/y $-Bd1_)P`z%_X;*ѿOƞB-@*tk$lj\*,> )lQzL'@P)drm[gIj"n[(E/2P4O Pk^5Ϸ a3fՉ;'R+,Ҽ]N ODW^إ˲Tu`S(zzٓkaT~-l'TJ,\UH7j4 e} :B߁AVKA`^}x &OʝWb.ܯN&L˲smi]3mdU>j6жT7 "s/;H $Av 87@8|?3"{NWh)]*(?{&GZí&n1t=y=jSI%p#?1U}~z,ʈg,E,\$p ܈NЭK˧בg6]4><\˅ {ھKǿd88U]oE$ [QA/_?u>qzGq/.%I꿊 dqԩZCKPXЭ}`|nUNT!p aJ  rӌ)[UOOvi Iy{U!,!ޢb|ph-NґEz-F&u 6L|$P\휉 SYf5l,\^f/1GOָǧE̯VhUNK='ҤZ;-ӷKzۜo宥]kn+h9ԑmDX`']NL|,l͚9:oo:aF3#i2~ tҀ Fqγ{UxY*$d *mZLǾ ce.Nh$Zn^~k /Nt;]\(Cl,./A4 !-NCyRIh5h}˽y|xr#KYڸ}c,1-_mWP{;:hif\.]}]ӭ޳u&ƕĮ=Vñ]RF({c"9:|ebp 13AF{,BnZan>B5/vE;Y7Yޮ~v"wU#Hڔ $na6 ws) ˗&6f@Ӱ-ԉ$@X.۟LJWK2:f/8ըS=ƍy*QvtkhJwT}^,, #Z ,<;*|.@\Mq${Y}R<\䬦O>:>xU5COqȴuv2cV8M='.8l֓j@L^|GU`_ /ׇ3Uq6R\A ,tXkSފ! pˈ0vz> ui. c:rXTbh86™y,"sź&Է  4 @.iA w`%v%3VBk/?-` r&^;«z?dt<~1'n%1|tPr~Bu#oc]?N\TvX#JCI5C$$yLC'vzsq ҙ|sw>_ѤPGUXHjv1dM1_@:Wwq ǵ_& #?tn_$𷦣B>C>m_;: ]lLVNm8OJ!hDگ!8<]JqXM\sycyE ;w$ۗ&A%Q״)9iҷ/Zˤ!Yvk lNZo6G6tnWXXpwڣtT5Aq#U;M4bګ֯YG Z/~-j)h>Ht59%XB/ߋR{+!F [@i^-~s `@h|,xyY u~Y+h'P wBW\=66ydքv?xv ܋C'G/ԥ@@ ˻#ćY}WƙlKZwT9D r}ٴu@nmG;Y$6)V%N]liԟII ?iU3Z#*鼘T0TR#*d,,>#CؙTə#{z$^i"^־@i}/z?og閧x*#'X,k}ѯ5T}M@&qu0bhQ^J};_|J/Uj۾J!׳|$"!XI3E\kȨt,FIr?ņ|U 8nq]Ù-Ľ6-t0:=ub$n&T#^P>jކS\趷-tL7݅?|+Tqɧmy~i{Ӵ%,F"qT`CZdG`NsYl3frYa#R\8"%`C!0䟳xHFH*<)զ3Pՠ..ĻЅd<9^tw?2gբw]Y}}a;LʼnoWхBGyxuT%cDVZYvC65DULƁC!4Y[ FKϓvZm/(eo1}нl]6!6Ux| C)Fh[&V&„pz{)ZylUoVX/z+׏Q Wϙ@qV57Om~&VJńMS:=np]*Ϝf3sdz@}:ߚ߁y{?HRm:;2CMG|ok#F;߾ڟNOvSRFn!ص||>iִ!>w2\;{+_!)x6úHVe?NY^>20د;M,mk͟\qZ jƀʇ?%>ύe&˥pz[ _b`Zm Ľw$~;jᾓTG-UuTG8V)An4ݤwuXf&Tmfå籯]VanZ O#t"'xev֕oLP՜k4`!^J:qekk*ZbaV-&o9kM$O1Deq)uҘۦIfxf=4Y%Ϸm׀"ۣrH\"A*N囹 _BQ{|3l;wS^wN9<!jvoYmg&*}o|o<hTnf5cAzIW"nSg~% K.NAgqAoMvT 8M#ݺI>5I9v'cgy sK:迈E;d6}<-Z-]%S|gB>py'm~Q6jyYSq?]~@GNd>Jk;T͹z|&#3g['\z5sl @u ƓK(R2<$lp_!``xYGLV@rQa4[W2JNJt=Gqm4EgMR{aGHXwi~tBowߨO`ꜱs0{䪵ϙ(:dO\Zq}3#,43g\xyʌ 6P `NbӚ%x߷۱vʱEVI2 t~:u{ԩܼq= `;tUҾCAt{{l+{ZX)pJytt(X|U}m| =aӐ__:jD|BTBĀ?LT6=xM5+V:x`nֵ҉f)5뽜s{@+zXeB crt;t}Ǫ-B.ĮKcx/ظq-В\CJ/gt.! }pS}RHӧ4QȖt;-8H{S^w0m|T? F 6x<*rL ma5^u7nO[ 0+!e2p6>U[>[*HΦ~{X_{peO괹::q BjuĭF~S,VA}x")tnNEj:E/Gk]d='[gsA P]ƍ_m=1^5Ɂ'!D)8 G7sIZ}(==??F\AtRcܣsBHD0Mű~݂ GP#1n`u[Eo)=7 Ԣ+o.nX|!hȔ%R3\N,FFCN)s+*^SrZ3ES ~hacJo~˯Uŧ~pE8Y FZ?}i޹y(0&guOiOv7Rn7M:zif)\ ^Foiժyp'RP20rb7l|&kt7 J8O}z&B?i_A}Ҕ'H{~tj { 8w#cWG=ϟ7y:R&8Z[G]eEk_aI[lJ"?>0hRwuAӿ 'w:qD/(ӎ R\f ]ހ3LK6 5)8[#5ߚċ oЖStPs2*IX /UAj kgsbo`x y~Pe 2a.ۏIۚ?=- ^cYJ/{$SrlhKWĸTIk=}I="v߿Yu>KZjI?qg!DFk%ȭ˜hhH+2ozKqp0likDrWQN }N\6+\Wo=??r1~xȪzkyO[.;.j{_5s?RK𼺶|->ׁ|O@,!y;%~aв--mdp7QPŜ0$.N1eaO\:عBϝqB|o8]ݫ?l^iO؃1b:eR'j?||}v58D:(2+6&B$IC/vkyf}Z'ܻ'5Ai <5wLy-2ǭ9+,51'!vYzc9Q>7i3Em:. 'xB`t% /ti9tHEz,uk͍iiWXE(aa2@7ݺ qkS@wvL׀OvZc!s&Rbzz 2$%uz^+@mdf wgzd )>D!JZLg>Co' O7Vd<ԓx&U`ihHNk)j]rl'Wxl:W^v|lGiz3LNH㚧.>Av:eו]%W$}b Bˍ՜G`ΗլjcT|ۅԫ}cMCM|[s=A*qnh̙%ۢ=Uڝo_ ё5 յ!B4z80Ok+p9T4oz>K?”шzªxRxp|Қ@hvOUVg᤹DNsEq>YV~.fC*WFa|F 2{-2|I|EH紦 ~.7@GW1O^ZC4te`mrCɤcg^̇nbZlPywqRn9]Gphjyd<"}i;~M٧xlvzrn兯Ś$Ik5]^^4Q{vl^Qot{k{thFKu0F!f1rR>K=\&ݱ;?[=a5hĿ ;bpXd?5&xh/Ӏ_CHu?s 5AfV]mm?<<ގY6,nlT2]JnM@ܘX*Kt"2'rr_& 6_(x 1x]+p 4@^~fk`vE):,-K֝4L'Y M+RC${{eeGQ笩C^W86j etmdgQR{wV܇}݊-C)U|E>4RI3Ki4@5Mgw ClEBT1TJ6\/Q Xf<;)/Bfw`Sp $b~>ɮ0gl{$9[#ymoLP:ֹmc~$XVβY]ěg.RۤUTNu;y YGZom!. ]JӿRo^Fب&˓ ^g;HD4  0~cnz3Hje@\QqSw9Vs=dŦ7erhW;ҟ;d On$s/Oeuq9cn:ʎI 8y=6ݎH8 i5U  @|P=NWrPܢ=Bh¼WGŠ07WVF=,@ܼaTį'ї0UԉiSNeҵr{+ATErCHZӂU{d6&7UAvxOh%9gw~m} wjY15ϴ4[M Z̫_vAoU`^h&\PmlA{]<d F(e]4pʨvTC5b3K+\q\8hWʐp'o6-EFcqaZHEMViQ"kBWӬS: 4sHdo L^uq"w&+D`2,Q~?Њ6 E誤8BP`}lo^EH[JHd~/ull;z{ra2 ]N"m (0ހuW"Ԁ(UC. ˮX{ШB& p^G@[ Y3fw|^.sz^,ʆEz()-UR@,eI@xu(WK4}\+ѬkT3SX+tV{; /Ƌ]x.]oROOH?f^>m2'J=ec t92pi;I2E)5rŒDv.oo&-uI G )w@ !݃CI=k2~V]"._BF?.@QS(OWo̽٘DZ{H@&4A 2з>1 l*вcT϶>taab~#^xtr$ԜgV6EkL/xtܬd0"+Ax`Z*ۯ>:-P0sa$XË"hRou÷,|=:1Z2ŃR# nhi4߈EEҐ;J2Dk\ mQ$*t ]`'E [,.jI3W)JC9j|/-mlixZoi9;< ϗ~E~UnP2O&fkWV>s!`.@]ʐ%@Ë0ݟĂsQ-4%jpͪ:--mrZ h5AC{.?WQEzpH@'xL4ۀrw&pF;h.1ق {$@S:jy)Y 6S0F^aH!is!=9FiZEѱ{lTio3EK>p9c+0ޥk/g:Sؽ^_YwKDoD7T[Vh5#&,[  :ַ^KRr 2d֗P2 EgvҿQqt K2(M3f?OMkJ?P]Sq^nŦGoazD' 6Bgtċ?Y>Mx}ݔ\Cd0O[=lo'Кb՝W(ȗ|w!n95lSo**m=~Q2sz)Ԙt=4>w"EE31P#X\wȢbȢ~q6Z~`t*={R4k U3n;YD)Ig!`ıSDW ϓ}0:E-3dl$ VWŠ^i}ޱXi^['ɐ_/y^zwb=QCJ{R>@L7M8-V>i~zM]Hn(50f~'ToL|raCi5͉6 H\YTvr~8uǠL]e*U Mj7fҏ$nmZE*&",;"pDK X/s}[X KNc`+\|]q h`ȫJ|GZ,:O&' 6)2M 23P٢Ę&a e2=Dv|)Q[9C8e<%" ӭD4s͕W{IIliO/ЃQ`ݬ/]H /l^C@uhQl4.e,çLam Q;ÚFڹ-I"MJS-*[;Qt "FC;IffJ㥟LjK#2?rO{5:a}Zii]Z.q, W3i(HTNHz d mv 8~pF:R UZ \|FUlKZQVn@n~W?{t9/\%BgA ;:91"`/YI/ccbzL\;1n0m1)Sh*w0؝L@p}iM ؿ ]GS4I1?gL6ÏgR{?c5) JH+EXZXߞ :gx7_wl /"tvLnb) Us7q2&.ho)YZ5!az_(7/:ӷ06{ЭKі7ݏAyyI%c[ӻ=ceC$RPEwR7i];:N2­"pA/gw01dy|+ ,%Eú:ݟZ֑V?DOO՜WQ=1t|dt@>S?ibjzHσN)qyF#@p o&ޭ_ SX M/,OcXudэC5:SgrQ(Pa$)l/&c&rG+Yeb} T1n+.uouS,|J:puuZwTIuT= sܖǜRayQj\\6P*v;y:{AE:p62{O.Z {M3X+enlh:5OFGojцRLRn).⣒_* y-l씶F{NpVTݢ57c|&*R;yɫnNKN.uTo/Wws0#ºb.Iq>QQajO%Ŧ0xaЧQh1O!1Ӡz/O"ܙQeI+w)cumGc{&༬$QB{pOS )et|8l"ި a8WmctZm3G =R_(^M 3n3:?=(7iυP7k죵a|ÂeדylK"oYVߧWKjG4l]Ǚ(uZrCҖR ;vӫ01GK͊2*(X.>Q-+%%NlU.uRÓʆvXA pj5Zos[Z冁 IU]:&Fb4n{|.ԍe:vOrNUY}Io5_x̊b0 n3eHS{ =49..mekLFE:<uS^5rWdd.vW  CP- nxgOww~[FISБC5{.&@hBڐd%gDYf|jWZ_u;`eO`@ᘢ&|7^fX=n4s6['#K7ۻg<6&W+6ζC%x>_;$I:UѯmڢHٵ4OW+p=V 9t~Zh&g[.4'h] m*<8As_`= VXoD#hw~;lm`؋'{cqk:{n' O:۷{}FqY*Xu4C~8^J@8!j{Fbb0~|3fo|ṾqlU&pw[}y$ B4^>CTR#fu_?㴽91Hv8iq}2}|tޚ-dhF'O<7V5=Pm[Zd~ku>I5<4h'|e0ؙ̿拦a.;zvi*% p-;=ɏ㩯O.kl+/coF'MA#6.l-xf?׿;tkN?lqFFEX#E_AAK.Ղ+h̴drY^Ƥf7^啶[S ^bs3:/%ݺ+^(GکCp|[4ʕ#n^"ߜ^X[?o65#s ip4hq ~p)\ ]Z36;6V.c^m Os݌tew7 U߶D=Aqsٵ1a OOS)]rIbJ j66.`PVi˳+g=J‹ˊo&bM{danHZW f+]S9 덥MkO9] fl僵$k_ CZ9WbT]m= 94  } }`xfR: ݅taaX+Ѷ8qDvWϾ}i ˝_Suݓd(2  =Åf0?t}n׵0#9]RÿT~&Y͕nլHǛOxdT4"eT^%DeWX~"V>ԭvvC=|"SԌh:& |5^lA3uKjsM+2 sV-(J7Opz諈0WO{Fzo:ӯgt0 wיz;gYڷ ~7Aos87T˂HKg.rw/Rr: %2, ~Bu6z!!˕]Guġa]/ӻiNXWC+w`lc ,2 n[[67._A>6ֽ[%kFwtHqx{y_kDcae&Q{Nqzԕ; sU?}| hJpշzNBu`5q̱ղTf0%~cHlݐnH$j5O$r8R:񋨜c(![=F')cz-y !;Lvzr21Fm[k+Q~Xdҧ ӳK'Q(xY.UXYWA'P(ߩS2ke 16AyU[6>>Ǯmcc=48;E'k a&ֈ1kHΒyϨeҕwګl|1u,}?#q$ؓ0F)ES<{|VSudO d:4O!s/₨áaJr>is@.ӼҴ R5aVT'қσKot/"h&OW~ yU(zG6D#YTȿAǨu}:._a|E`':Lj iZPbdG^!eEQu4W;sZ|ocg$TT GCJJYmmH긍U7r8)u<3+A%3 |>?"S>]W+AKuțjH%Tqw67u3YueQάK5@>MpY] n[H|禖''ۖRwFiH N[~ʕ #[T}s՟ ts=~/g ':ZQy}qp:zȈ:t9dFy+xlLKNgŸ[͍{/=58oWn y,'8oqϤ$shSJ{q{_a^rM1\·@l>!L2moFǹzx<'4 {nujyNW BQ⑩ j{.g0mGDUv5W(fvވ_Jӳes25)kLVĭ{Fo@X,_)aaTL~q'Q}(Q ^KOepȮ]`G Byk6XCKޓCp(pt>+U*̨D[R78NdTYd 7d &Y,!VӇS'l#\N /uh:]zp#i0-;-: t7Ֆ/Q 5uϩt]unh^>b^(ƏNsqۢkx!|+gAHڌwlB4"͏cMW]*(DJOk,K,~n=Rai5 $]?cg0M3Jk)0b)`QV=IRLgw{3i2L@=)V+fjvZ US!dYLx 꺮zUo'079t΍le/"d: `ߨ6YY '32d_@[ɑHBhSO7#ْ\J (6̱[ĩ|OLpJE 3rsu\'ޗb"Vb$4"ݶ&&]:D@NKYq )E:[ _sjy L3F*e?W}w?{!k?2AUHəIؾ{;␊qr\ ۤfdn"#Y˾'n4x50x%1}^2w@w'ޑ}bj+Z `Dor2keںkڒ\'Ų4Q2ퟟ67M Kto4pLJ+}hjD| ma`(Bt ӺzU_RhCf6=.,5{9gTŴ_^oh}cg X#a"_Cεtwm-#`:m%%ֽCnvYyet;KD~ҒfO7ݔLt4Sr*="Axvm/zbMB!=rz~FH1>mD:B!)^}vS)XZE_vc־Yʕ/ 4duJ/*|N#-1e,on1~wmF/Ab\jcN'cy`߫ITovz!>>ư.bq-uh*E^xeͅB՘?5F7\/'z~>.V~x`T W@gfsf`|*J&ޣw]޴Ax w4&]Qnڒ+u zdh'wvj{*7v⫐:3#ѯ1E?o~?&=_9:s:ImQ4ECìy(#ntG/Ӌ_.XnjNIzK}- رɍq@:J~/5:tPS|52:xMDcb:_(Qj T02H|vX#|2:n)psԒK}ͦ}.6Z1O2PcyھhZ  tzɝrot-Sn}F-'`0˄z8frD]YNڠJf3{Xab|/onW 1_qTr$/ 2I׶ -osFG7ܶNݭt[opQb D/,S%+ZMs[_2h+G*3bXֲ7ER}p<JLVM,KJ7Nn V@'}ך)y渕զe73;N7^MC1)yl\zQ3S翋QwټQ:S~=)̠'rNY fZUbUWY-[7#ޏvxfUPYzf37Re|fg<&WtE3]U5DGMaKn˟#g]d3}YiDkkTR%)j,,3Id?7 &ܵ:EF78--`[`$$C>-׎7T]̍1ےKb@֭f8'e< % =\:P#Ʊjsª HrDȮ7 Pv,e@Tt0%ܬK BZ+''Q˶ev_ExJnEJtRzu (Cy:=>xRPِJج0 v/c8(ʂ{TGtբ[ Bw롥z$e/&Hzjc*D3o}vI>0IřHʪ 船[+nEi ΓЛ7Kdr]gOd^ >BS ȏ|&pI>{hϬL*y!#5 y"NNo91.rcʳӸ0rCK̙M/hJ*TY+vvnA(å1s $oH̔ $D/Eo2j ?ݭjWk]M̮yPWh.۾nW qa,«f,"`杀Gɪ#i-?'/=](Enŕ]m5NϋSQ'+L]8#G^cq^U8\ &7"=cV:Í8NӁ@|}{Ѩ*1Q{M-dD@ s띅gSTE˹\9_cVM xdd(И}GL)< ,#w[+L&SW.޵ؔ{6&VExc"B.xQV=+,-f'|7o'b.:IS b2ۉZZdޑJsjl~@\3Zr&]bm9Dg!mIPI_V>S*󻘾K܏ƧB*RE%(" +м.j)rv9䶻]F c!a{KJB$g?lW+G^S/G*V2KBL]b%"ŔAtxiA;^7P:ͼ"^b Oڟ3\A!y|8 <}D>}p@r<>3t>t"cP'jxp)@@qX :3 I I΅\^j9K19VHwĂtGG{@tڀqz$g{g._c$ E[+X^) M3~+40f^u'ܒ˭I#1E6R 2墔4K{SqfV;Gp\ :BbAy՞ᓭup$ —A晎gh,%_M@?Rp7E;E)`Y %WIJ+c8gj&7˕e/x;"~^,(gձ ERG`k̚vn: nqSוNdSiwqF>PE`F,thG%/!%8mGsȮmY6>J~|Kw9r: UA.pުkI6ѳvOȡo(,2ߑ*e`?.H8b> u*2a֗­7 bS"A5LŐ ̙TU9lB-0xٔ=T tSΪՎ"U2h/>pÇ\+Ң &P-nmW )z!?gۣ "?SǮϐhrxT+K0Q:YU.ng(xuieKٻ~rW Jrn Isݹ -B+Ծ ¾w>JًU\%(Yrtg*JXlِTْL_p d kᾮY)-1Wd軕0h 0Ǔ"{{|PƹxuTğRSIx᎑ӃtP!cr6vXUSk(zDɦX5y"nYp߲CGDy6oVz49=,}m PxL0?HA&ӳʺj¦0bQYj+V"@]hGp8Ey$3NponJX _UuiH8BpBy`aN2*4 /6kMjrKH*bm-0`'rޅ03(wK9C):n4M`0?y^Օmx`n* ߔw@LBweF 9/kw"] ?&#M8ÐS qHd/xq7/y{̞ &aɍHPhMd^PΑ KB XW۪{rM rGᰧ6X[GMt~ V^N w$ZCrX%\ n5(Jlq,V> ~rfo8+U4,-NAQP Dr%P;|.H8L%@*M~R"a>K:2'C":Ui %^2p¢H 1ȟ,C+\ X{"-7\TYWӯ4Jt&b\P30OMD! Y:yI1]Aޚۨbh$pbN3۾BGЩ:̄hAaqF:AXJp 0Q +~6Z-([w5ᾘI>;-pdE(]AdCJ5 ̆nBH^ .eeS҇q/f<\96zY 5FՁ^mWxľC.U"?war OuԌ:'XhcZN*k5MdhX\kS!t*bxY+,@6WZhma6E+dIKg2I[FWiX9MXHf)|?J܃s,(bA~0JݤRu[L:4M$igRz8Z\ hԑ)cr:DohL`#_q p: ޏGc&^]IUicL/qgϟұNdV"H U͍ouM$]?C=2x; C*__i0вq_"vB$NSb4wo*{uzcf[5U֜ͼ r 6W!U^'ӗ re}0*{םZ<{\ѧ5R3EtGvJ-d)Mp0\B.uS5'W9[<7./q(:$u/^,*?@X:@YMx0>Mq+UW#|iiȂa[JX8 }ڥwً֫b~S@CoPp@z+Z̅od_+`UNۤp2o ae5Y>,F< <=/3^V27U6 E:TpKrwKi+Oۖꝝ-8sU?rGKpFIGk$^A.5~`N?^) nL> ҇CV;TNGj*p`r0{_h>+ IC癣 R{Lѳ,ǯV,C >x)|h4ΤīeCyUǞ[qᅬW}&{DIwM>kTi<,E7Q)9 P,&r}DgAGC|aUOϓvRT'<ܬ[PdS#dCİ{ C;/]fDTe a=XRn|55fJV\R}nq4{lx%uӄFC/ qPew< <9mk(2 8hUT] uM5`f#PP@rwsl;yn``۹[}isstaf S!;֛>]2ԎD4no C6cТwSe 6>'= ӍBH݃J>M -,rZNS6nlERiX's'$ ZƔ+٬Jf0)\iLt_\Mp}}%ڦ#M\e~^WMd9Zҕ GNaCTJ' rWWv0d|=N&*ㄺ< o*1fCmyڬ^-m/(G@x%*2ɽtڋjKO4VFVq [0ʤ @&M 2ѺTY|PUtg] /V܏>vw4{jvB+bO'#fGo3IG䔊aWI:kL ɳ:j^.z°͡ !:Q @{e]8M׉l4?br[zjИN̲rXHKU)ҳLQU)tMZI}:v?!- 20;gmHH Himei|'PGNg2tqXgT:`vI؊U".kLVSB7i$PAw/:#U]sK,?T+S9mȚqMl]vV V* 8 kO@$*hW&T${%3:7[t` ͠r"+%Ôwf|Ve6i$ҽ_jIN2$N"pS.ĹsHI!Yϒc@Zk3qs;ZRG:YBx˨9=ߥWvt<@@oKʇ*lô_ɼoj4y@DL_3y`;W0ph!wrhP5S;Ym̵H9gPC'Hx1MYxWYr*`;?# !kh3n*MaHm'wRo8u+Td o2dn–0q' !TPԾ񷌉2˜ެo;/fO6_OA8{jo2oh4۟R+$u#yp֫.{M/!zjm|bK|+5K=g0Io\4[*SXYpc\72Z 2lvOn-kKUs`k]e6wczdX3 .mo_,:GK|$LkPXVoO ^:}ɂKxaju*Rz[{j?31|+<*dU vv؛A'iSeuέ,Uӥhʯ8g' pL}6 h72_wkP]I~UL.fc?$cGYR|$5~'{qNN;GA6 N6~c{sO$w)d+JQK2HO '쀅\ No* D<%5|oS=Id6T3w1Zj(;T9[ZTn,K}By<~B#WzUMFBAh4 ,Ex5YJ,sF5v}fgZE$PǼv| ӯėي5٤ A𯐅*ŪJWqZIri  G+GлW"׽0PZI5alR^^ryP~IOOV(d7XT Jkqpm)qA ș'uSnֶY=j;ЖivlOT!iБ?s hX[*/mi7x^g=^ar| M*u}K,1L#PA2dIS]Tۜ*&]Iw0ȕʻ[-AFSûfq6r|-'zxa0&@oe-|YP*٠mwK;W҂ _Vת?TS}IU[<C:SDo'ap߃ N禾u)o÷5K[Dsu]L3o@Q%AaZf;&B.2#h6ԛ:׬M+&ٕNIƏEGSWҬ;v疯Dw%p/ݲ}Gf˂3*Mh&dx_)*&r|kg/R͈94PeԒ =7PJjcvZiVr$#&f?^lЬA=8Yo[g'Y.P`ٰ3A$ӻbɻhج )BFa=W#+O"X$)ŕBe'$ay$Vu6<eoʋeȏɆ4Δ.@S? N_qe-m/kLU :M$ȧȮ;/9:_of^Ȼ{n1 ;s]Zv~5ʌϭaBZ"fG./"RHU}I"l`{* TR&"{+,ϧ#K9!3YLy|9ӑ)〰Yak՚4byXa3cEA3MgNÕ3y{/"?xO$ eW' _7Lş  j_Z%V턌gn&ElC0pB+sl Z N%H9Q$+q2hUMh7ﲈYJSK)SSR,mnhK6O&]\P{ƞb$,hr^zEqPx@c)57l O)Xv>hm=m*zDPjN݀Zmk{'y 8~hA>&YppOϏ&e C? r|=z(xxxa#c#"͑zXHXaᲣۀ`x؎waYx5HXq#C#SxHmN'lj&Y=GH~5:Ddtt>Gj5>9 C6$@pGm Ot= ](1\*2'ŜF!̕grZd?l]zlI4# _F&vko\"3F 7AQ{FIl4Xrx(!_S9]o;c!##Ft 2QIrVpWx>BEX̀6yCgB6yǽ?Կn>!kŋjX * qRfq`r3WUq`wMOٱ`kM`qL[C.p 2@r48'}o=rOPw$O-A{|`}-m%6xxh|l˻7H >Tށ'vVnW_l;߿XB@>Θ  Cס%P,;8hU:"ÉD, uo ΨHLJSHm[#BvΝl| Y57aXJT$0? YUo7Ɣs!OyVr"7+yq_TTcrHb癇] y_Ʋ7?4uW\I]x_3zxp ?#t^=_cA}09Ƒƾ[J9^䖟=xP}w8}+c';pa؏B`pK-MHgN[mmGMk투wɘk{2= UY,nF#,o6ei$]V1`cmuZ `gXO_:wmgS3@~mx{yP>#5 O}.4!( #nQ+C5C)\,saáuuJhx+FT{=m@̏{AWAVh \l? ?y-I6sAl[տoFrC ŢH9ߑw#/wx BB>sVc}] 9'g<9I_} %ۛ>"9nڭ(8'PBcUUeycI/phat7Y !*]{EӻOuL6Dc]{-iTvT([ÛM:W ! x)S33> vrz/cvIN5vʎ/. :Q?i[ ;y}jȍL6Xj1zy65֮#q^&q4|A) <1ʇ}a8>20cj;>i}}$N`kg*7doy2uyDcBTÔr>%h9V^Y >dWk:H`P\i јDOˆ79*=sM8"B5ܼq/>rؘ*!k˙vbǗ1m[r`;_q'>͐g|X亄9UjAc9UoOUx2S'̲riiΌ8[v./5P+".z, {59钆kdC~''N_c0)*>] ,؋"u?oW)4'$ tDse ^"$aHϗf=Z1't`vNs^gS20*U5]@HVRu0nPXrR +ʱ/[׌\gMDBe#R$UAx՗LOGܑlnHgc;ފ8֝2fښ bzddQG@J,f*TX@)ʣ]Wkh<˘eFb C# e_ぱ[rOV*i[xhAFU6}"z?R*YV [EgR2lr։ħnW2*^NuɫT:^/ P/><VPVw츙J9 WKBR-)J\0I3 VLf 5oЅU&dwV6s) ¼Խ:n6zr&PzRѱk+%`$!%nxWVaj6)c0ɳZOVԤ\p0 ̨n[]jI]d}RU%t]Vg+uV̄xzAܭeEGa;X*O*K2XRsRQ`uq8^lt^&i+SDo9F<26nU,Z)Ȏ֪E" }*ۻ+GTOQiqp9"Ex;YVq:N"}8$WmYm+.n ݼ. b#8IY70 >tYĻ_j0arl *Gt"mgٙ;*;Iy5%H5F G \VZچQ6t26&Hսa%VN<ĢzVyR&DHlY! ,Twag0qi7s'LDŒVLykRq8e\s?x.լ(Q}h@a[-mۤT%]B&eXS'(IFY y@%^=2kc9)!VW/a'HW5PCڬ-fjVԢNfɻW`IFaHeo7+ؑ YIRU#kAs6+82|j'~mʹ]'m^]̘ 2Iy 0Ԧc.b5Z`+ qZ[1G/p=$Fy'v[=j@m2G%O+˵HfO4rqtS\kȟRnM1CF>Dmj!6gF'͐mQcB񳶸iR _6g|chUa>)\ x|\Uż&v|Bggʹ"VI&8HPJ`*#gM*]"Ǘo0ARb@%w82E5AUk ʊ+-b7'T R;/c zĽW.Z1 4+ò)]5ebXT(^ѮTrߩyx=A1wv]J[oWR.B?-eFGQe1&Xf@TG% ~ S zS`y4=`B .c>\Ub0̂=t9]5L1Hn8F-O`# X*ȇ8sͱF\}BlEVdP!#7S+B傀R:\YS!yI#{yj,mBvS%Iʐ Y` E7CGdSRHU%FAZRcĺ䝒:cB8/`U-|7.oJ GDEY7(47Nr|P >( ̀oZP2 T,+'ZV2bq Y;aPt&2^ & q8ay ĬXn HhTo ,ˈR^y ٞfLi @jǠ׷S<'Wի̓\8bk^Ёr9h ")~1*a {/Gɟ;v1r  #Ca$R8-s KVx<|v*Wb!Q`?du)y=rl9f'},-/E)|2c,e.y"䗤v`4dGJmNgB姚瘇ǂ8 xO'DLe }xZjpM}z&2ua;u랣МؼAm]~6'p|+ђ")y x,NX8xa%gK?l uطEf탈~wqcDpυ4D# q0P'1>&=\j*z ƢC9Wz~5zã|8^ʋ1o.Ė!fx00>F|wܴ}0o4~[eN]ň.nt|OaV~6s5f>ړP3L6tm{!Wz/N_#JYć3lK_Ug<9.^齹c7 Qnr} wOkdy:Ixe&4MCu67ylv(AOB|ψJ|2(;şDPuރ  S0i;z;g+X ,: ΋gd~@:6b1_И~83ۯCCV#Xn@@&{]㮂Q vCKƩ<}.&ۭBКЖ4TI_|ȇ䀰`ZƯlak)0!O|7Þ8#Gq!^}=/8fE+BKDἇS4"ȞڞR@x$ 4ћ|F8Hu'NVyP;{TR'%+U,`s6Ѓ 薌ODmVv*Tz:i8pnFQڡdb *?J =P3(Sb?^x)<7B(>n}BHf@8CW3ǽJ* X0b~'a0c[ !E2xz LOt_O`&c*j}—#}xyb.A8|C`Z;]XXF  jo!m^?_Ńe?P\ϔDC9gБ0?nG"EѨrZY͸32܍jp~G FgP8Ā3 6d٣_3+4NTzJЂc*w_AfgfmkjYu?U?n3 ׾i ͏&lwgƣM\Mj47ھS` 4:1y#B&h2$C8C;&J> +Qb V?;6cv腄g#5xm0Ƚ~n@m @tD k 6 ?`x6}Jͺk`1AxڼcGw/]8/Ǐ΀ ;x$:qC+MWyȎ odM _UИxb@`&]n<C_"U5m\[=r ø@oz5mWh\ XUXkh\LhƵ@"?8/k 8 Lq-j~(v\#eZHnQE<! !C@NO㮧|p"sՌii&\RTwC3yP6a`jmM< t89 5ń8O@)ZDlR6943Bi?u䀫DC؏a/Չ$ CŁ]{FGk!#1 bL[k*&2X5H_Sˍ}ܟSY *A2 +CKQ0qx$a6XbfߺߩAd1]{QYG#$spG98!G"@\QB8 2: 6sߨL& % B?-Be^A~̹$~g~|m<&>,VIB!Vt76^@,bBΡ Mcj@TE8!.8I< f8jtq!n @dG&;jGx)1Ed1G I99zG0 w% qaġ@y-2CٿۢmƢC srca4$˧AiP"M 0ҏ#Aǡ@DLG@) Zxm,&)<>Ox35pxܧQL A6G="zJ)?6irp% 8.=j,xHcYƏ+[84655YS|&Hk;||#0CeHS~G6? XI?ng$@kgw;llۭ ]G ,>~F^'XHa!#uáX\$\t<$4tx뵏P<|8ژ}D|dtNO x1_ ayJ}PHt T3\SA5)e^+t[X8Pg?WXW}$sTI>a/g,$W].ń Y }zH$ڐlucVSrFL՝l7X˓VߜOux(,ϫ $5K?Ҵwn:n' 69~0)>,ƃhШiqu4Y''sZyArY?Hؿl3G3KWd:`u%}zSDBggôMŒT6+m墀p*uҿ\*fgn4{6Ab<-/-Vs#Še=/IO3%ըhJWD `t VVucJO6 3jap1 "H{W /ΈIOAʉ'.{cl#Sp5{4XGf0f'2:-wVLӆ4bY* PAfc4x)n,k=g}P9tQ2?CTg;0?`rhx>/e>>u#d?Dڧ; 伩vc/ތ5= r_ˈv+G/Xh|Ou϶:!%!iS0$ްX~8NMcsKfHc#lsk8} d6?Ls8vRĊBj,oj&4 ꜿc\ 1ǭi#h@}zAš#6^бn-@hW x'YZHSʓٓMWs '*Q?UեK߃ [mr4^궻7OgyГqtۈN $H&\UuJ-N.//oz|.iqP}^/[[ nwɚm3_a{LI9zPnseT8^˸Obl~#CZJ:W{,,O5Mgj${hK}NJbǶ k|ẈěUVFB9"TҐnMK%}JY?A+w܍hTbGv~2?vyv\ۯUT_t.p.wk~*x?[ Nφ-5 /P m{ Ȫ|J]R:6.C\~Ʈumk,FerzAek6\wLByf).`Ըj/cVc^o\`ȁSUlq@ lƆ?1V2)hU7%*{(è]kpc9 X?2NLm?Rc.#iڦ/"q,5l4S;2@m#fLFJ`zrFm9]UX8N Ӎ V!gsOy[ V(;1+SK]Rbo?D@ v,>ޣ{ۮAua Pb7O*@hSe3]le8;#C2ƳDBRuhb9} yXj&\2ꬳϫu<R;KSnP"D)]{Uu]tcOVEUgl弉M g}"&tYŚۤ\TI}H쳛zVet0?Kj~ejG$kZNWS`ɞǙtj}-@M^vĄ7ް )Jq7zߑP Nau$p5-@+;%hb1$i~9 OE3XDjeO|R=~[0DcE<4;䕝̋jC%A7?N?jsYrة:mLU^+7wp0ۃ{[(sǔ)v*԰OiHi^߅ϣיawO͹#Koa eHv9?-E Sq f-joR\?Gc@􄥩.77w&KY\LLQosې^Rk,֣ G|Ai.+9ueb{.āvvrflu9r(!H.Sv+vhlU`bcT*zӥ6M0W=Wy\Ffɵ7 Ӛ-F lKU q9R]73fAߒb|)nj;{?bHB 6)$/Q6ڬH .ǘlne{XMxNzE2dhw^EF&(8~Su.,˝8gHc\+z1Os Kx.ݥ$ JheIV=N `->%ʏ4E7d߭\^/*i]6ӽ <×&H|MU2hx!]$3vsU,(l*&krmgx,nk)R'КX9Dmr\=c̓>3Q5Cߍ'DQ=VF'oe8cLF $"94~UBhcs:Cמ_; uZ|=Akm4Jd]LA_7Z% )Nb^ugţ7 /`:>ag6ՎY03T0Ԑ,i̾Ĝvq Bk+Dj$6?n fHݷ [$)~ wn u-qKkI "IfK^7ֻŖuw_=;-UuSjAէ<ƹ]cU 7ݻO+k+P$Fl[\7_/S0jJ)߼ḫ)DV0Knd^FmpuQQGY N=NH!ؤTw *#V%>{8X3k7oUKz I*bWy8Q.O>K(cL0պSEu"XU]$ >8'oC"Eh""kՋD}l92gF7_Ejwt@#nW)(x&1nӑ6DJlg1Smd("X!L>v"GJ3*1d#E$n[{[FKJTTnd%\˹esi:KO$%<Wx;-By*l5XHXIyv<~nk])"lض85v9 =eGg@N^hIR)=i/9B=]+ z$׌clP" {Vէ KU)Q-JB½a&md;C3%VT[l,F[rn,mH{Y[x젥/L. і>.pQFLl~W97_&.Vejo?mͦs|Ĩck _;5HVVenG<w%N%A/'Rvb*Vzg,K$1%_޾C;_z:ǒꘀyl3Fk@]UX*^P2J~E>JNcp` ֐ cu=i2J/-'"Nn-i̭6e@͸i馺GΐbTb4dnbeetNgd^v\n+fnru_jx]hlťWz~ jr#)4&àH^jU&4hK} iur=3w4߭޲M39I[1qC_'u k=3QJY5q;ETiXwD=Pf+/j'3|}[ -e"u\r k+HuZ`m򵊺w͆| n-"ޣWL.16V6aoW'1Jfdicb/ы=o昤:R<٤W}Mc'Kשko },y9m2-lQ x$*!HK{])<\͹Q{ǕqhZ}7ˎTU(h[|$t؃yXo(z:jYn _xk;_.Uu]=mWQrQ0 zuO 5m>~N{am;6pZg{ݹvlto (mij`رU0b[ؗ1ݭݺ[joTK@T'2^tؚJfŐܘ/ /3(rT>#nKbHmIqr9 (sgqes3F 1wcn&~ۜɅ%ʞiI7BI -Q`%>:kyc 9)p{jAkQ)oః[$N -.]b9F( OO@* waU)ݗs6^U.w%H[ּɆ%Pz ,jPqڋe=ykK.9PzjV3w,MN[T-QD$>,*@X?,Ov)pZ#cR$ZCs'ZD5CZ\UNNFn5mոZN|γ:F齲JXZyl; UXS"9 >88n]=tmsq"#Lizʿz̵&z+;.06ҌZru!i%u[b#rMtjGx}Z+qZLF 'z+"My[4Ȓi$1/aoouA:@QS8 LiS;?X{rYNw86Z Ώ<6AтcT!jb50ŀBEajuka50śl67 vkud@։2 Mp>Ǹh#"}rh\QmZ]GG|~~ۯ{ِ Q^Iׯ:xW޾:?ݱ՜vqֽLW4:P4KA{k*:#f~7!ۃ<θpzxᙎύl͏{19F\{|C7?d6p|ʨqPNG^|TR(#&,L>ïPڡ[ϙ`#]>?8r!-p/>X~C}v K5>Ou[ 9Pön >PqSր _aU}g MvGfr5$ [y\(0#v|v;ʎc(LjC12)`7? #jo0gsb3le `mNc`>U>!߄w^;A߸w~ߨwَ8͍v7x W΀At2E!r7*!g*Y;̀{s '{WzeA5} LbsE͙\~x.E2J67> ݹfw{f뽖߅#;YgZA[4Y9.?} $Nf_c0RȼT'b'_mE*s|?p\;9>@Msy )˺1} 8=-)Jd97AHuxMh\r–.K{OJoԇf(6#@@NF2}]d[%~p}Jy|b{os1(9L{!A)H&1>[_- %ʅi Ѳ |}pƮ,P_8̔(せgρڌVTk SY%F:6}7L'5f=]:b8z/b- i{R3Y[* 2cX'pC2?NPv`_S5;E3\rhD.|>2kڇ]vklE'޶2'K$ۏhx#uF?;]^Q ~Ft RQ9ACbIr8"*K4К 3VvwK${N Gm^#IWR/3tjrA fLl=-)c=M-`j6D}{+Nc2HwvCOJvsuH}R&aS_¿_^Uu,Yu#x «cbr&TU/<c+UaVHHGS4pA@ ݇+S.S<> <n\7 M  nW۷U#aKt/]Qؑhgܣ|x/U}ս%^t",)T2_!pttג_gjH}V iݔ>do2XG%Tpo|.O+΢2*k+a4 +K+>"$]1,_:iprsӥs]69LL }(iKf 꾊{bvLF 6]HBQsG_w?¶(JzHm1]O;vY]5w.1:=" ҃!x I vg$7[av y8lPV0ǕӊdI V T-gʜ&e0Hʄ?:IE+5 ϘԮuTjJX`K`fiyCiӐ)Do>\MbSl3ATP!a5T2Dbu <:HZ8=Ԡѽۿ[ޒH%Kgfg ȵv%N?]2 )~@+Eh`Bt <׭wBZՑо w>jCԖ)<*уuXOFJ0 Axk .(FXr9$sQBR^_~]m`Ts alW=jE[)Gq?Ϧ˫?2j]iXVx,ıژ%M*?Pێ:SNp5|BҮW =ͬa~9G.Pz>T2=VXߎnO]kGJn0&c:[W4Gx{'f*eӻn1SVk-;"v"x32X򔾙IͿA]ͩ8`RUM4&~ ^GOi ٚZյL@z"`@vͽJƻb WH//9FMv)y?:hsԖ>o/-_4 hfwxFaN?n[6 y>5LSh b&RoTd8X8喀TO FaX kAP~W+ חB`T(UIj2A-pFhDq$|"m1o j$ism_ bEϷM3#He2,{6&dPӴY6r<KBD|E+8Nɿȼq|,B>[ij!,6gYT9f^tv~ +_~: \+Y`6IҹX;Gl栔\ ~Ϝ((lE:ftSmVm=qTxthܶIh0'EyV,?zOŝWR1U1٩A&&$qq`;kyBI;Ao_}"OpR)RZ!+@Յ ߑ &/PT/wɜ L 2Amkc++S-q ʋcrb  @&׌Yf1VyrJTםTCd't2W6B)*\ p_[pb m4R#UIZ\F3G|3wA)$~D;0 8nt#mm8H-geRօ%.֦%qg 3ASGK8M95 *Jlpʮ,(;i Mx(0u&rj?} )d )/XźJ^A[$0J$T|Ǘ~ + MlMX3`/d13C^әt Ww?C.UvS;db]{)H2'XSHnIw =|BvOjm"nbK Wщ~V ѭl/| Ee)c4\vt.]VZ@!*sqfXOad%`u&tX !\jݺԛMWbg @"G0WY0բ,}IlLʍ>wPНсsoQ$YhX@2A<6=@j &'IPb#Obbz5[ne an!BfnY.c3ی|cj5Oa6ْNZ`\w4$ XckjdHZ\i }h?u@#Q_$,ڱME2h6%ި` a2F־de CJ!ɡ886%'܈ݿEMWTWO)6-fO] "#ݸܐZ Ď!Ԟ[?-{[{p~sJA is#Q} @xXC>GAŝ8-0jRz7_Q jRnǩkZTpt ɮ"* )Έ `~2X ݛ__v;ɦ.LGd# ѝZaTqKn6U{OT׋&֘5,TXe.BK>EN0w{35AZ)-,byRhcGPi6F9Xcc#*~MfF\txiɸ67HT A]IZ_0:g'Q79X:-ecִ{&RZJƖ߷ӗK0k'/^i*~6v-jUAp`,m٫sӠe+Mh3y!N`ay +FقNsk[g@rvд–y\'g׷>7-k#| ZH Rxn&oR\. =Kg71 )I&­cQQw2nM8|SNw* s j2e-Lb~{V TMo#% bL{;t_sjex(vXձ;@(F|9otrwnO5خs @:k~8hޭaCσe_1_S_J݁U,fHNL5}qo۷egPVK$oVѢ̣NJTo/1\ @Fg%(w]⯔3cQi+ eco./7u*8٨Dˀ& e,SˡIC2Y> օ{kK66R!v3Ip9~X0"7<ŠBǮP"ObC$Rh)x>2eM1[,M=Wҗ`?SnjfjotOzZ&IPf(܁/fIB,55\oWdW,i T3n@t 5*\j'  kE17.6| ;POq9:\gn3wx$O;h<΢do8訖|~.Ey)V*NGiLN_kK{ztT{< ڻlZ}4$?}Tyx*0^`q¹lgSirĢ@H*prC6)DKY9K`N'w ds3׻C5:ku(|6m<6CW߁*nSݭ ww[\F`1$ܚwπϜ^nu)4+_25 bbf$&QMLJ2s~ cu{&1"^cS-tLWӓ%؟(B-@0/󚅳YS(YYYӒXGX* 1gK+HC(iŔb` AW)8l3Nk p֩~' CVziNqʋN Ow46l?7!R TڡK nxSoYnmfլג m(ZH}N1ZBسeIe8{#b6ғJTڅVq:RmpAvrڤ6\՚Q51W)~> X4 !%֙=H<ppC>}é~Ƚx"_OELNɰ;ݬMc{lsuc,N=Y!#+k.EZq Z&N-e(6?t8 3Nt*,r}sJ/4曔g@jf^d|ݪשS $YQ. 5Ķh:朥y +TOVL_i_ "yF `QXdLJa{e ɕ/VSxVK3vIm QZPB%?`ڴuY\n2vѼ.gSKJ!V{iS'^r*fk0 :$] gT,qҐ\9{u`RQ";tctE IT`B3C52(NNZ$%^NvtS"'L;iBkO  ˢbL!뻁S/cBpY/v/LJnmF T$i < ϠuǏQ#NfX4| ^RQ^rݪq̻nAyQelCČ.Xؒw*ڬ.h"żaM#ʹ+fV0WP}HBnm.H}`fѬwps)xݧڦ6ih;ÎibTR)!$,J19sAЃB!)JB(J(J JB! B!(J)J J! J(J JB!(B!)JR%)J!)JR)JT)JT)JRB!)JT!)JR)JRB!)JBAsJ%kcƴs=@deDD3D3@؇>HzH< j}`_P/|п/ B|p0_/ Kh0x/h ϭ~  %dcazICj%k8g.zinjb <Mo-W%690ƺt)\>oڶ wW(J'{9gVc7jwmKh8vcdt՞퇻=6v1kDO%qam4] Kp=8L{Z_odÞ*RV(^$QӃ)vFd9XXGӀ8Tr@̅ƒıp]G %T5n9rӣ뭾*'fNV.AvS]7S7j.LYLWAg^Y7(&]ܫwd M|ZX\ati{F> OazcQ}`I%'nvR/~|l#vFA8Oy vȁp~$LkGC5m?LKOQ~KX?g:j@q$*qEclQhj SgO~'V 3!ztd;YHѐY~˹cH9AG3VRhRe"we.6gi9LF;-Fp{Al(ѣXbÎgcDI~@ k 22zHtxp &S$Qr;;qAkXN=M V?yÖo Tlhκ^DN3uܸˇ a9\5΋)TbBղ!WK{^S>tXL(.$b"s Hf.aNt{!nثn3chӓFnCŢimYeuI1<DԢG8At:9K8yS=4lJfQAbiZ ֗yê UoL9+u{{Td-r@3=9we>X odd"SdI9b]l tY_"YVwNKmc "ֲJe紈Kρ>“{v>yjf 6'̀ldc=)/:KvɌc] ɘƣQ2Q.}W8btT#٬Zם)IÉ4~EII=av#T߂j@A(T.qthFQwL̫+JegNV|`X'(éZVM^]lCBW" 9嗢O8jwC@Y=ǚN/%I OOyxeͺOõآd\zcnk-ۯ=/-kxNߺee깢| "oG{n^xF@GL(,N9>vn|.> e6wEꐍw'R0Fw=`e1.Dv]G_^Li 3ذ(o =W0>3WJY̦@}a"JQ*TL1b;$mQp^AZ %%G*(WEsGG[GAStTu׽HJQj1Z^FEཨZ1rNxQ{,~WG gײk$N>TmI%5ƭҕ2k ik`<# UG6V}2y1`sG*Bc]£h9FIvQ'ȒE3Knr2)_^)հi1i-AF Q" br#,"p0uG9SqAASz;:>TEO^aX'AZ瓼Pκ%3Sꏩ#q C5|_Wa%6iXu43 [ĚJeco~.RtA}͖O l=0dp1ƥZ5ch}5<:Rs"-Γ!ևdԼI "4 뺱E>Qڔ>ɐPQ 8.(3L&()I'F`K`ȋJS="t֞ /k&ˇ|h`I)P/85/7oY"mߣ׻7Y02P#6R02iɁ2rlΎc!)eN;LpVl .'Lh#-hPfZ|v`)i0r*ebՐ+ƻz#1yYZ g-q2M5;w>˜RI,$kbiG*w,x||FObg|A MV^u#x aRwkZoS@K߱IG@| *e UW/P=:B\*#aUWh5eU-6ݴ[X־o-D39ImwɇOfYB'AM9:X| 2i`Z`p=Ua}v&a+<-<>E锞^Iʡmm4JK+@qBv%VLW%&i"lhڈ0%.TK1$3#mgLj8 qeHDn?w:|lk8mqNKkdrKJ᣺E( eYLWʀ?ݍۆi^Bxl nw-('5,v%;ࠑ@ xR0#K%Gψ֐DQ8Y`#iqBph\N&B7I>ʎ (CdL 0Muj؅!ex <xdKlDN7I'+;iT[]xd)z'>T }"9a^4!V(H ku |8/ I>0V Uַ3 C^./t 0-6%3q20:Hf{s@$1oc  qn!lyh >d>Wt+J A@8e#l: !=% <θcJG꿹g죑#mBB>A @AP"m@f9@E9Ms5UaR<c` =c][6E,ujoG nQ9No±A}4p)k <lqSя% y6˦vf+sJE1 mO]T_2S{YQyL6?ȍnT|>MGe+{ذ@7VLs_ 5t=VEkz9rեOq n?c0 ڥ"R;T?7omX=+$OۭE&/fM4[g K7ZZڮkC)<ɧ9dXeS(C0:?Bl+ףZ3]Aς-$+ͽ7p}ߨZvDhl|r1Ϭw*%&0@PѺFu4H ޛțd:Ymh"g;+ZQk_/?Ζ#Ur>N#4A|˞"qK.`8kAmFXfʎN9.ʟ E|HCgTOsk5#koR:9(raCØ]_acòCËCƽw.&/[z ;MKi1VۜC!oaZjj /+7 B*&C~BAi+{O2]R3fqzP~O?Iͻ%}d7c繮k`qu=[$* f?2Eg\~3!|7g)GQdGb wO4S[bv1~}-n{P^-qAV|qR9~ec c#7G591uͷ2W>-u[DX"Νű5f#<-eqQhZ/3FJj}$ cCu"?Eѡۊ Ŋ=~ٜ.!l3XꟆ#Nx]g@|̊u-ɧ8^.qE#)SկS6)hdhE5L&E󞴬Ԍ}$ӘU r]9ZMpvLn%5bCiccy cc:<]>՜_NF2.6BK0{~pSfg3U8p 6WW6csdWLH4 |l"[@7$+֑)#,~n;We$7Wlsn/GlsXJm`1r:HbVbH!^<=Mi! ~Fa-C_ }j=u5 #F%t⠍3֋ՊzY-~7E!5.R&.UcqPs~=W nJ!zf涊+=uG2@9Xv,iEo?ubYWbbk9NGf68XH8}"I^񛔹LDHdnMSD橚smQ8=nnZgn̕j?*q2Zs̽lf[w68U$#{Ѽ;wت#Tx5 3˅Z_-z Y`>1$Ba%ԎQ؋r{&\tVKerҹ$ϸ|W{KT9J7'KX2.lMK00K *Z1f`><]ūr1ZV<9&dziNjNp_7f4z?VÈf8X :Ch=ѦJE쥱Ƈk̶1E2@G5䵛io#.{?q%6fJ:CxlmAܲŴ5TQvCϕw:)ֆM;gs9cIG/D|4@,?5e9>\v"@tTI=n[Z1bq-3^cw[Hapf)1ۿ["L;cocϳ۴pi|5dy3 7 5g>m{8`9+;pBgn11%PF<{i!3IՀÙتk(oT5h^}9E=}:i_b\sC3M=+9s܀TR*!% ,N787@yB ^튴c!= _@( ! A $ q-Q%[WhxD=O^mu5:7 p.ZffDv&CTsڴ_,jԡ(_l/!kŁBUpqKV& jq1hVV5j YqtC|@.amhXJ>yo<|}4y^z*GLt7ao)T|ϯGOO6 q=6~>҈Z oHo}ڕ~%I:מ5:آV"{汿tR ?iSR{s6M $/)Mn-a%m|Z`_ReMו؝ã 8BD!$ʅR25Q(Cͬ;n]j#Sm]Dt˪lN' !_6flh=a!]xT+?[uiPl'{t@pf>% z3pOVNz^9S5f=b &vNNJY^Y<ݕ{(XKɫz~O`'K˽[.{6)1P{x)qtִz7=`28z\%e̒#sèS&uX0ިwp~a]w$&%bG}# L<2&<=)S;%$L% `>?&NrZ.Lm'а%FQrv xd<.Kltj=XuN", zsX&RvLXib&ጉ FUiG_>xYaNVݥI$_cLDhVO̗\QρE"L6Q8F,+k5M­kFk.B8M)};-.ZGnr/ W/[S3jY丩V `~=2o\rvy?}2[uZ6B/LIq=Y$[KyXSB.j6]6~CDzPd2x p#G-Ne35fᒭ^ԪFb㑡䲙pH5K~a&*QQev^ȼ'fLwii᧽z~y0i"b%Cw%pd=IA \;{ˣ˥:Zdg)IAkTUQv1L| ܻ(}j h(8M^vb }v#:ZLs(F%ȆSxǕL\Oq&=~d}ky-2snGn\&7d}`eҚ.]ٯn0Zz6 |n"\ bLM9tzC4NrcN KneIT^6+ϽffZ Z7wש5MHhsF( 62`PG&GG&ƚaOͽ.=^!yNAE&UҌѼ}fč˜VT0֙dM! S=EvJ悉/Ukk($bf@ xONCYp"jCFQW<~@S5flTyBf)i&5yCKdZ:>)(SseyFòG&twyna^T!(^rģމE ٕcJ\%5;%x-Ԕ4.+*"brik@?bk*a𩕕$>xC j9L~>2pD<͍CdIΫQcOONHG &FƇPFMg4?ԙCML8OHuQé5fh%uJX2@b:յQܟ3ӟpNxn.[ ;Uр@R16Y0$oa}*?3.arD `*: R P xym|S/_CQ'* `@8J@]#HmW$Yq(&)hQT~I*GvAc"5Y0f~[ܣB8>۠?l ڮY`6[(F)>Na.Xij $QC+aj9'GL:)ҚzTtͱt)>h4!1憏:|5GEQHRGKދ;ɜDɜn+6%bu-YLӓŝԻATod!o+%6V;0jrAY('b֜֋]7g!.aLe#2~x6t t|y1,OP oeF$[3ǽ9]!*^$z~6Z@%*u6- %ti'*A\5[1 JYj}/28#em s+Spֱ@sX Z6~pU1>i[]6v2623%/L0> IwqlhAR_\@RJXj\]3Nrm$5UYꌡFuB+Id)V%czrUC<+Uno|5S)vYuOJOFŔUxԜ6՞T쁜^&;T\0wztz C6GyO6!0eX 5,%-OzqR^TG(K PP<(4 3Ydǂ$W3feW|ɌXq)4-] 0:ňd պt 㲫W:)|.9'ɕ&a>Dty~;f DM[ nh7п9`]KN= 惶']'q}'zz:C tNrN+h|Yo:~{ /9'> *!4'aR3%0lt0v ry*¦-NѶG;EDH>$WUx )nh)Өns(zb8`V5ڥʖUAo^>ׁ GoM:=hF=r :~RBˆ^<`1o?n)BVbL@ )ݜeM`(Mn$!%@q\J=rer9L$ֱ+Ó5he$C| Wy+VA"1d "~pF1\_C 4uʨ' 13ϑl =vP6/j\䫹tZ'dAb Kt@U}pxfBlL51:HP5ZۖQ/RmB#=5Ⱦ4L<Ys;t/DPbU#*^ `(t<ƅg8@ @=FdXIV.3 ^ʒ\p6E1 KKxk5u QX1p5SZ- b⤼[#.xk ![kMkΉ` t&#jC}& mf9Й5uGݝY)<{d7&3!`4$bǣc(2At45\VWtv+P,ֹD [եT۲Z;Ssקqo}o3ԛ@ƹe=qDMfk(9~s ~4vW" x7 ` S|{nR֎y3 .,ꕁU4=(Jâ{|P.%HsU /j,Fs$y!̸wt|{rDf>Q[Npe@WFhz*ۥh>Yh:{WvjPjdopd(xv; D KM}CɎ;ظzc{R%׉w]ۊEJ|[f@A%?;&d&HM]σsL59y:u6(GڗAWZk/^@p)=;԰w7IfօσP|eqewZ]{|tV#uz?Qj޲&b YPyVi#)u{f٭$Ob;yGr݆V Qnhzgތd@WYU"CFrdFt:jL7booD xlMuR3هVr̚Tw"{maӞJjxD7Ad,3NҡG bm85. Y](L9q3Έ"qe\ NBCoN2udC*ڴ ڃ&ˉLjbIu$T݇bS%dvtCǍ. KR3'$FGMug]BK~:Ugj?&DG}mNz0<sjz{Q"y&T,];6ˤc5\ed2̪@V0Ag{fO^ޣx h򈮪Jrv|de~C8ML+&hWv*Ъ풣yσ(=8EG7S*֏*w2i+uЂ{qIe(9$ƒFD"^-=p)7Dݪ-| ܵ;#Zk>F mʦA=ѥz6-0,b{> Ɯڰ{ʬiQPBblRm>2e[2SXS"T{1>j67HGI^%i&;PNx<7 aZN^Aō=Du7;wSW3#Ȟ\JHqG/=EK` >ZGF-,eT5Qċ+="pў=r6>w>)eBզ <:DH 꾁A<7>vr»RY(Az%BLBl;fBptdf;8/ 8qJ?b>k`dt<=v̫Ŧ$Z\D lwGsl9T"sBObY r6м6 k67TOgARE [i~Gh)\ ھ-ob=V@xy W{ⱫXd|t^W)Z̭MΉ^R̥J''Kp&0..X+uXk`VOj5E/'5sBvʡTJ8A >L:J[T/~Ȧ$珦FPR.bQLTP iW+)Ž 3?s..P3aMzd=EU ݯ?fh'[ZŌ7..H%MDqoEG7PwT Gˉ ot\oAK|i ʴKSS^K2h3 F^4?5LTzh5?sms-6C>=2WS?"zS=w{(rPlϨsBKw^6z",=e q3qq_܎:YB J9ٌp# :G5?k[q61#\$qq0L1O6?E}ݱt;haYTַST |쇯ß]|ZY8Ugœ3wЫH9횝/.2ֲJƺvgz鹥/uږw`H;7yd |\&Q[f[e%S`h{B)Q"] ~T*)S!RLv9&:̑w=b &ZhwK6 x,\d\p}lH;a}c2)2+Bٵ?D^B=,1u4BTq{rS+HV7ngzPld{6m*b6\\O\%HP%\K CNy)IJtfi6ɶiaL fá 1/bSI| 'I.%Sz 8eGW4dhz=Ez{_jbMP F3'@TR+(,X,OaGu>Lᗘ |1~W+zTlB7at>95V2c(q4_dYk9N 9/>X2푒V0Rs+` #:ɧ0e3'2}S@V[P/ IzR?spm:e^%xQIcIAvَXq(._` y{^=$*1C΃htk#(|E:Qٴ~d>2?W\DwP`>8l]ٰ4 lmAtuh FF)QcF(cьQuĶ~c@eI{>@S`  V Kbr&g+ ͹ ~mzaŖ5p+hkUCMQj8SanÔv'UȆȋ(>"ԃ7r)G\D~:7G!!$dk&"t mi<Ӏ`l 8 f" &CB*ސz `*ҶVlG>tElSa ¢~C5?jq :kCVhzB2kA>2Qmfp/(8MxFE EmsR_l[s}c~Vq>R?݂\f >}`ũ j,o)ڃ~.haE$@_\@GmH`+^mH(ͧf|rY,L@D\I_ [Vs eq%bO.9$ Q@LC\p<'s5[QVc}8HD!)IBEBNpylJ}@[dr'\Tھ@=ZcN@ *mH5w F0“v!˾8\@ r3;Z|:cGa5x6+tt7[\܌>L+&B*:?Z+[XF$uq?Y0L{?]ټDua3!嵬Y߳ef$<]ŚYN3- IR&Ei -x/R~XCO RA![@wЃd}u):K7Lqfft(cgg8۬R4y,D0#V?&w&@m1vCX0\¡ *c.>j|x\\ Eikiޟѿ{ըS+wӅQR1)\ ت{,%֧diF\vQhJ|=k|! .CH/lcOE*ӽt[Fba^Kq |Y+] V ]6pQg qw,xU!d#8{1m<0zvZz Td[Vn@1}O5d|p@^^Q*Ȧ^U\#OrpYdի¼˂~㵳 įgQɖ-3,Z+ia-0]60q8+9+Gzlyln,=n'WZ& uMd/V[YĶZgEP4t)ȇ H"J1򑘪.Q_nziw6 Z jWyG5OJSւ|ləh8(od2 1r"_ J7SHLL;FJt) -Pm-'T Y,q3)0, zvM-ב7S&ZS˖Ymi)'?j0rDwHգu|4pb&`vZU.sGKA9sޏwq~fghK}V<ґ(<)$ql|t:fF*tR5 3GsGTNbpL'ƨqhi#mhucq!N3AYFA}W.F M\:*$yJԡ=:hh)YdwKlRߴ& 8Om|/giTHMwwp )_9O |t͈v#LWgiZ<{8A#\S24|y5W$phg ծ˝aG+Tʕk++>7N PQF)[H6 de+ld"nZ7}Fo; t?:7b!VSדHyIOKE&ّa{7?d(W)4`D,(9K)MPz(m70w Vz`/^J=+>߹@SrEo4it`k鹺h{`莫sC_q-Oâl~'LJZAVa D I&2Ba.꾼;կ&-A@ aBe]dŮ+~^gp75 ؄bNӌӹJ>=vxIRW7S< n_&NHIaPɠlг̣bB*q4 0+-W>ɟ4JxLBA)@Il e8z5`wAlcv'r3d8x fC.җQ [6ذ4 RAC̝òaHMtAJZ Dxɦ4nWU5&$GL7QNn Q:ǯ b*e ffɌ2gLn2(~[3'Q! IzU#J*ɋ!I6`q涶;ӵL=2^J8˿dZ'\(ݏJvj̄ 2^ J QQ|9(i(jn`ً!<S^|0xn|ȀQ{vwFԶC?vd+FNmmH! Ѱ;lWܰQߙWp`_k~ՀvD1 tIk`0 eop[2O 3p@\^IZ`g0frW.j<KSog+nFOݠA1VCny`! rnAn!y0XTg1T}l m^$M>"7Q>1eWNU 7p"? } 5?iD@Yr!i=/w}޿)h 4}@G4P PGIߵj҅el@hMz ?}AsZ5KQV+l[$0rPi(U٢~(H 1Ւ2Z9@ee4ג#Ͱ 6Sl>1 >k(HIx(ôU؃a-u؅ X(shl!T(=j{,#%=.P@R@c6Soل`xM,:6A XYB˫ D ?BB;Y"Cdn߷,~X R _ncXҖ£˄¿ e 铀jӑl"%6wQ!o-]EaP! rn"'KOòt&ҿWh i6%JmDi0\f /ʡ ?npl Bb)K. V1qGA\pkaˡ !Oەt9zI"PXVUwꜬ4`hAgb~D)??cIꨮʑBV(v^T&ڀ49×䈀4xW 2#`ŤW3R*^wrV+J?n_G#y<@.y?͏o0Jʅ'n 6mXxa"zxDX^R?:'x.GI.+6Tg 6?Q$.:6 ]lldn]$~O*6:'TTs\^|}Aٴ/'-'+@@ sWݰ’/J1`~ a`.~?2Bo]+,3VhWCq֫Q'Oϟ$ ,nex~DEx7#Es;Bejΰ^5 Ef丑Plג ĉu~hy gБۜ@sБr]~ Ů6SXdm+A-ahwkjwmHn'Q5ȖÐ%>5!MG7n'f[6wrZk/%NW lqEmRXteJŰ1D+ys=U`L13h].>}ƃ8!. ^ ~r5Fд0e+0OR;YHܗ.+Hns붮%/y|oPyg%#1,ͻU,oTy8ɸ鞝틫S%K# -J> ؗH#-d;f+\q,…7C$ܾ)z|. z&9a.dҮl>,:;~L׸sU5H=qI.m9V ҙX)ɢ++)ѹh1%kO'Hտ-PVfZt7VhQhvmٱȨƕ%+`"1Dp @fA7M'n44&W-ENHrO{)'[MQ{)Ṣ󑓰vp PvUTn,}&>YihyZDgՂ˯M[dsC"%5VDBdR'!%'XwI$NS[tWVSA ĎFN\_lk9U _[oPSW|bbʟpP>> x*jsw[DM;5٢`0-?BTB@|n,B\ (lhnopq62 e7/466.,FSoe{fOX3{ی2Yka93Ʋv, *'֬&+rj$Hzd,m&S fx`ylؾԼphH6Z얊֪ͣ^i[sTkH!ibd%eEzyxF(is4RNR ; ze-{bl:|k FDx@fXhu61Wck3SXG>WG㋧=Tzm&ii lߥ{{!nD~?y \F~Sȥ@TR,s%-,VC27-_|KCNqqaPc'x8csF "9g.(C]|qL$L31-qEz쮫A 5kD3mvӄ(;D i g (v-1.8.!gBh0ބ3OmbtaG:'݀ YK̎4㼟Nd@a,+Θ`D`fy\p*FGd? 5jz>_0I0!LNO~S 8&į^UZpǐrw[W`fs;D`!0ZixjP': ܄pp8Bs- >||-aJOG`߂J!Ё0 l! uHgٷaHZPJv`^-@PKPKHKH[ W&[ \T0GP/tt-#W&7I L224@-z=P P fݫRD*xkNc&Z ZCzߙ82U uߎGU3*U E>Pnp0`"R7v3Y"$T~&aX灰ow5[I 62~2zbrcUR,)Z U<0׆Q NHTQiVY*4U)EJ1я] 6u)@ͥDs#)V3νOGmJ42+v(}jv4ӻswޚ)JU!FJaq)&ҦC YmqwVI4LCa0V{Rr襫gJ has߮ yEcXio%, iQv:ѯfyլLMF5:BQ 65fF}`kٚ c\5&BO}#COC g8GLsWySiS$1[:1K{UbIx2.u.dc!NrS?U cY~' ?oe,3s`VC)[et" F]Wv-hEj-ơD71ʑz83P+q2E Тڥ%$}*kTX* _CN[s{ 7NpNݭ|c\{.tc/بyjWJ80(eI6MIsx8-8nY*|GޤanO 9!9Cr:yIXm OOeD8;5fHfyS`U*QbMP\$ 26qfDJw2N*NKd-"׎_5AM_ȍ:$}m睁>쯵h2 \5ռ%CiCxUsS΂["QxDP2΀5j1>! kN.J ]BJ_)f<4_v.BcUNaH qUi ~"s1W V2aD7H c8}tsH+kh̨G*2Հײ?ٿTS%>mF.t*e9.5.{n {c8,SHQk;qs T)v^R#%tˊqI)Y/iT:}' #qͭ5kb%C Z gqoo/XsK-tI ͞[|;hi0됅e)c]thh6{&z{y;,]CtY>R_w/#}ΦW}zp$VL,:\>^)MP\"rºaV}oCDғ[)UvRdӪ`ݍ /u]x7 KhΊA2w݈.U_ܬzzt8ܴ_bS}LQ bvT mS6x\9>}^_ ϰ}-ϘGS;G qOX] շR?ȱ+WOйҤcWZ ||L {+f VN@ejZG4 Sɲ v(W/?DC򡁆_5}d,Uc` V߽+jxChwV ]E mR NPF?F@<X?)hmQ@ 'VV23eEcMLb{@ ?6l*Wp%x\+JѠ%R _nc-V ®}4\9mާ h ϥ|!b<'ߛ? kd k !|Y\f}]"R(#_Ƹck%ʊ(8@>6  .n`Փmc#Hxy9:Sa 3b@u G #XBY4FlV\ J)XjF~|ʆEg6z:MYl{3h⯚3)3dhf+~VXp{vmbA珀l;F^2kW[C, C P?˶ vk3fD5p{'_A^u!`+@`qꚆ|6J{r!2^Acr֯,#=;ދsⅱ;:MoSߍ7<6F@,8dO XI'ݟDie,Nτ_̫"ᅊ~V pc,0[ j*4}ⅶï? ̏;݄Q5Qҝ|퀄M>^WagM'ne#S(h9Y_,,ٳ}ZcSbɏ/PiHLwe1E*o#RFͤRM7?Ӟ/9|o^W^6(hS  wcnnK KZsK)ᡠC?{}&ju^=צ'J"a"څUVqͿK!lB E C#A }E>6yWK7BC*=vGI&_F<.r/Uz<>$CNaz-zBq ϖ"<'ظKA\ J閮Tx>_%njeρ*Z3 )ޣ! b3G4Q%vǯ%!imJK{>]nbͣjroQvCGO"hs jYڝ+2G!^GO_|IZjwTL -z)!Uh! ސ2Ү(v.[+u\3k58h8Wr\ ,t?D^.dK N//amG"EIZ|3UɇW0['KdaԽ%!3k"L:A*cR b8S;N <<ϕ=Eazv|x|_viGbK_zWi,XYUNW%"܁j7w:NZz Y{|Fp兟+6z`VW}>?] uq z9=j}*F>tv]/'c{&3.rrttǗSc$~/Ckh3]D6/_,W5-( cֱ<^UM :0S Bߦ*I/׹J>}r4& ,[s%ObX}!""kNQg_X}X£k~>o))%wr k -- gZ&2< {gGIyu_O#ޭ:heG\*]~.Ӻc<v uc7pn.-F>?y o7 ˋGôeE'O3Ag>.vk@+Õx\S}P0~ Kl31/rs]iУu+OmHnK1}a"?=h-ͅ Z1YFA{CI-v:/2'b*jOQ'u;/5*{uOU$ ߭\D2x_g8~@ڹIñ Z[^EE9ߋyI )La+*/j&&[v~WkԽ'U^'yXo0 Z$:γ7n'󹺍QXP~=Hm+/l%Dt錺̧Wyt:Χ??mu%$AST5j \ލ|h $2*a|=ˮU3"~}x~x޼5}i} %rUOp8^j0mm@_l%l^]j^&2UDk}+$L9} K"9^crc[0(jcl #.*HCtD _u7jr3siDJZYye$KlOo97;̴sgt;`чx 2̍g(=)96}}ϗl}<NҊtx'QMAŇ(V~1Qmy{z"zS&\:Sz̞HjQ~V :eN( *r^ kՌ9=akvqzz(y)4[YrL,.]"=7&(RYGV^./iC M'l5H{P,fVG۔R@{(VogJG=:Ofv^4hG{SpLRkDDlN/uö5?zC>ԢN'1ɬֵ$BB 2i CǴd`~)pup`5F}S/;o㑓F:[;$ٞ;4Z 'cf;LVՕvNsouXޖv{_vѡ[-cY8ɦf}_SmX36AԒ ] z+lqo]E\#yi!ݜ_E%vs6emr*:蔰F' 1!-PܗҌxW֢ٔpg.'v#ɹYy˔-Vj9M%4㼢m4޺ WӨKtILuG<)`'|ª=,/2BdjcҶն5y6hgEqxG1d2q&Evnde̟n=ׂAWj9BڃVksV&RL{/MBNKAhwJu-`IebwIFܰ ne ro?K7ѱ5s˅ҏ1zR)gz걟T8fSLl%~z|K(| Ѧ¥K6{^/GIj'V]$Y晫WNRc{nh9N#dԘf~uJk/ZUձlfF=r|%+:Ued3ڪbc鿭5MR=g9AQ௄ ~ D8$s|RPt3?Ĉ@TR-%q,2d1$o"5w_-1a F M!I֭oTpM6;E-+`SRt8y`ߵV]H2m`@{D0/u/\_@l[$0rRIjY$?jAXE+i$hK!Osㄚ=|2h~Sg([ V)iV0`d9`[ nW$rm36s81>1M!sZ7Yz.K@@z?V f x Pb+MRD6[aePq8oOs>^M~qۻ^{}\Z~@&{n)i"2?.!: ȡow:7p-i7Uvci#aP`,˾$UL̗ωNuROCJIwnZZzܼb DOaA.ҥc, :4qJэ^K,iu\@[2m`h_Ў}g5ůOu6GHв"[#G}5gYUcG%1ЋftzG08tۻvfg 06!xE CϞVedZG͔1E!Uvn*bp4;ǿʳ(#"\1Ҽ7g죑#mBB>A j_- %12*|k+ `(G,`G:l *a 4 8pۣFZÑ>@T-2mu5%H"VT 4Ff,C}; a)+^5`70CG@2s9Gnn;W'OI!#Elx6WU!,D;‚ g G N$נ:AYػnIA.|<m 8W?,l͛ͲA坞3mN=.' e H![,oBh)dԼ[GV/)vvAjQc?;x=;,Zk|\6fYH<3MmdZy$G>H;6؛Z]jnXd +r'\z;+c٦M5cƋ)[6|y/@vWmܖ^څqݖ~|nt[N', вII!Xk&=4 a՜I(XOż,IY~x\ t PЏy$3jA]褅,l#C~S͕%!eψ*(bѴ6u 4[E$A5};w'WE<ҒD1X[^ Vބcq8y Aق2ᱳ&eI,:J5d/"8i6tsv,bwTGy<.z/ΫחjPwL-&au~DڽkG NA6 XVX-R4sWkȀs4#F4Jf?Zajks;IfrAWvA9/3zh۵a/'A5`|=!yJiԑroe<Г7|q=1uRlq$gCT|5yI[9H[ėoVRF?P)V(бBþtp-V$`+ 􂏉ӑ:?W8TlvU#?'y> lV(6mcéڐ~Ŕ' Pgb A~sRb)#!ڵ;]QXLͨTH)d[VcGy=1:$}F#6ˊp,Ȅ>x1)vݵ6Y3 >~ʅV|aG_q##cKj4f׶>R}{x9 6W9E{k? |pݜߗ6n ~&  $KW,sqf ][NKEj'7hr]|L-^U6~N}{&rw+9@hZ:mYG?=2 Y5;hY}$ P^cYR@VϹ?ڕsaiLįc;,tC6\1x w v u <t,[^X,:ʆ9@ XRQÆ1T;D5@~&tZ𴒶f8\$}}?uYCXşgAoo|40׵2؃y\8ځ$_}r~{u^ˏyfi:1{Bz}JξT6t3M7g{.+a9cܸn 2=um} .$ Dc.|Ė$϶A=Ut6^gk̖tv72w#f b:w"^[ߟ|ʻur5^7 im. K*D :Y .oU0c%pc`?e6R%;׏VYCK+ki-(T(uum1Rv}SM\OI6ڹ-N% f"-/s+]>1 9?bm.b]OxQIC 232؆mWPŪqim+ۦQeKyCgf/p>o\Ug&^o }ed(@Qpw %( L祵5CFk~f9ÉEL|o&k3kl'&/o%5$9JM%WC N43K%see4=捺35#/jǓ|Öu+ilm[>n%OG5]/_h D0Y*HIL;j{zP"Шz=dQn_>Gnӧ|TZǬc֫u{ńTԺaja?wZӋrYخ?%rY6!^ Xjz1/Hw#$RPg e6_ywr?w~ȃUyt8\As]%줦\ ޻'`͇YfA׿KC׍V)mMq~ޡ=[\l=5rZ6Ȇ){dG;#D7[)Knsmp݄+V֔_X3/a));ާ*-p>,RҫC8\]?qk dt ,(paj=3;]G119i39Qg>^Yf>gம3Ӌ"VBmQ͎'-gσ VSkF~RXlUD??5l#9o%u,8xS6Y,⻐S)'oXp7G%Q_X<'h-,| 6 (fm Op壉y'3|ȧG=+nz-A%M2vVk`~xx~."<>wo3K.tĉ$lV)0Y11/Wg/fomeU[*c(ǪnAah}_ qW26[1}8LSf*Q;py-7 ,&a+4V'N̏>| vWCW9JZXv̭`RUpd1KeKV;=ߤl^; N&ky@ ҧ2E&~TpWQktu9wy~ǫ?(Sm(><Z\} N^aNzTvﺬK%M}=5Xn)'1ڀG-;=PwYZ"K*ї*v|tͩﲒ4bCTs!i|7l N'o"(J?  Ev7~+VJ2R} gD\bnp5>CqЭ1v]e5<6HG]pm$b12R22\$q$9lvWewsI00.(e2fV$HxM O2>1Zgw&%>t*9mucgw{D68AΙCeG):A3iإWEC}{I563+-9:Y< zbͅ=TC|>`Tp޶Q3g8I>˧kyeq e-̵̇Ro-뽌whz=l&3됫nC1_7Mk=CG&sAH/3ФfL_u ݚFXg3u#qЃ|_G:rX$R%6jZ1vu2&y: y!{٩VxXOVĞ韠y|m|./ R7T("lէ_W,CBT\6'1/"#3C×g`!tѭE77KՑl|ׅb Znvt+-w3#ЏOa;gB6(MsCick7Jˏ gezUqn+JR02_/*HYY56HX#6 J|](۵Mz7 { L옗g%^`k7lw;Y8/ǡ0Q|}۾k9ڎwQѓ.k՜wvRʅ8o[Aܢe|rFF^--n?˩zzno'PB'ye)4=4< !Hz<(neQ_6K(gBW3mpp9ᑦ\= Y0q*K$yyqql^wYRJ_>\mS$y6Wx/aݞy)j3*1IXCʧ>P YG&cv>qH/a`\[GӝI!܊,2>ߟi z\?jw| H)]}?G-K_}$VznnϷ_hj fiIUFզ^)'{YO{Iy}ݩ^[N6Y҇|lfJ* U†ϡ߰85[{r ssZz>^cIf)ِ#{~{{JUodJ;4q"6zbsB2:Y Ě1rUaewsEE2/<߃A}vRПIg/co{[| k!//N'TN!m`C@ ǃvL]_s[4[' 0R]PRwj7!BB8hCo O] l )B~33#ڭTl^|TR.(*,DT,X%7ްEc %C7 H}_ϏB&ӂklWJg(Eġ4dLG_k3QD/jͭcN56G5vM "$S<}>At0Ȱ9[zs/?P2 u 1MXN0X bXN`̺ ]pn\Pa~$DQ :Cun*ʼ> )zӁ+'·=6^;fh:+X"ʊtP~  ~C|Xm̵F#:Ih EOeif"2m~oEc]r8^j*? X)m)VI/ѬZ@QPX2BvP-KTlF<Z VX l:|ĬQW^;X6̄hњ:.r)Ԑjۃ`ߪ[ * G49LQ`/RJů"xh]xJP5B `XJ6 N概1A= (rcلaWx/g 9 !'Ζ^Wp=#zJ|wa_k}$q惝fY mhzh]=KTt$@n,wT9"5(p x8pϿfI<-oU^%7.lBA Xv2 n,:(vc?Igkd5r13@ XDz?zHnu#yR}ΒjP4#ُ$z!rb(񆸚u8:PGnT~6GB*+ $WܱK`t}muQ[- 8FaTSSOjSF$ɇ\]/8'%r}#<{Ud.p/O?#KQ~C$g206'ͬGf"IC_*pJao~C;/S~oSst3[2lVw>}6*GG@ktn:u} w~'N 7|(}äб`.7qYKeCqb7vF柍q>ekPO#h}^ƽBݥ Q` M3BJ訰%DZ+W!e|1y_Dfcng056O*7ʯ# dDŽXMM0S!.}/7aŜ=SYNkrDi-NÁ;9jx$;V^#VS¥l4D1|YMם7ˣsb4iExy0v$}K`)c_Ktbc$5nJύԭ |}DvkyȪP3F gyM9%ַ޾6²[H{5k4:Τ<ǒ&)zKccuWgh{ґW>ga7=t?:ܱ( +% Irv\×Ǿc/Ic)K$cncw=YKtŶQ6d ۥ1ctZz?Ssy }ƓGؗ.chaw3>)+g}}95/p_6x{p5;,"Th7|N/貉nuo}dݷHfTRnR eweG:釩Nl#eKWQQ{WR&(m|eΒ'kֱL U7o, ݳxf<+ώ06o=N9/m$1bdmGP)ΤCI~Vچmo utv# wwܝ0%ӋFL.݊x\^|꺞̾]֟I.O̍>_Zݳ#σ=tLVK{o8ճ%^מ\h]5/:䫚/}xP1fxoz3},ٯhqWQݧmResNVk_}gO!IrP4T1r>|:ir˪&a콓{"Gw-?2޷ݗO\':]uMk;vz:<":$5a1O?= ڴD ,hҾQvX_x6>H#p(#MH{~֭J va z&ʵA?m+;Y]V ⥂GǨB`, [taW# GZ Y$siv{$`,`¸Ni0 O~џJ9_Fb=]ۚKO(hA~ܠ FbO~h>l[$0rPi(U٢~(H~Պ!%XM%LjTLw'Y@^4sK9<06>ifd*h~܇A?0]nd Ƚh,!5Xlo˿@\ˮe_b>D:+VCl|l>`Tt x DuϏI><"T5$07le1^ n ([qOQhs}Of^=`}`_O}>*@W __Haz3a}FܡQ;:H8HOI8+?r{S`0w]w{ؿ{ ?-WU\qEr=o1!q8^2c`p+`RL }9K0R**hS(DO7$m^y?VΣ l9ri+}ANUext!gxJ"_h>>,*C&vB X"X]W}8]PCH~Ex"0a߀aYÄp}D!S"( vC>"uN @:6jKW`oϝz_aqʳ 'Vt_W?~cXK?!8#xnП?ϒgJB 9>\p_~m$cgVI>xR՘UH!-]!~P넬*x.bs!ψܘM^5zx+W_=ChjxФ5Pn`c;YaYԈwr}^Mg"|؏e5ƹ8{s/Nw`GLm%_#t}e~ӈ7lM#ZQB*=M})#R9꧑ouX\<~SJvZbVcux%kƦfpul~=- ~5Hg=0Ʀ.vk$KO93ʻRkz:f&#-6Sf?cO_Jdǥ!Ѹ|ݯq R%zƣrbY|icNt-[|9˹˩g/T1}1w4*&yy~IkZKÍ`dY^=Fb)Mnsp8C}OW"aUң'ƟlP +L0:%= iV3˴ T_wZc) OCTһsvh1f:،"5W3cE|IݺsX?kv~ 2x^!{IQOVl6"w;^+/TϡF"'J-͏vV!.SPGTUqx sQZxf y.-o!V($]![ȱJ6SfZqr^?gu sZJiLb34Fw:fɺ)y_n(U8=}DzL ņU(? Ӯ GY ŧ_ '9Qs7:Ux[:YZ^MR6.dMsԬ 9]Lmu]1 hU;ej˄O'% Mzt3^7?X:]4\ A _vϏ}(].ˡ&)gq UUYDᬠ S(w*Q*G}NQ2__瘶À5n:g3z?e.uNR%&AuPz3~ZF !eyf.la3rgq%qhsXiLۙn5bsۄt^doL-\fv {p&,q|Z]TeF$َS[%Hfvu]g1T\4N }wZ05_)K5>9 4ZS~S%S0-֥/tK_Ӹw3phrۿf@{fy_f'& 3ŧm8 *Uct;<`h+9?Au3Py C Qsk]"0Dv 5kn1m2Hbz )S]M~%oWEMqr "H5]JIx&C ;29 +҈?^Eg#b;'itU7ۦ`D qaBmg]$S7y}c!WmcrIOBFaӳ28e=_'u[$̶ߚюvém(Mv_7o=џs`)Do\+ͼɏW'UۨDBɘ$oͷq9V2~b$& YPɩwbkiNNKIsN'i!P ΚpT7JiQG^~X׎^O]oy|H>V(-/e1-5xƾw7Isva bQ;UjXgϷJƚ&9ȏ˿\z1>zFS1;?^*kn{_wٲ+?p6kyp۱аЊZE2m\*o Kq|>*I:# xcNc~̀}wCsIA>;߳A4Dρ{)y'~93mPZ /Ň wm/PfE:Oѹ-h}v9 v/cMlBAҾW ɗ牔xش:m>g9%3N8tX} -3?v*VU _Do{N~ڶo@j0 yǽHm'S/4I*dqn~g}c?ZVo5]O*;u{ 0G_jDɠug"83'rddb3-$5IewMJ eezl `-gvV?6 }:#aժEJPweA8|n^쀌2K`~,dϬO~aѱTtKp<=%oH[R̍˽_M`%_|YQ^DK]lfi8ۑ3)%3fj|w6Ue~H5rN;O7Rw[9$J5`rvCy/qzgǯ l"z͊j*j"o7gz݂hz<1C7Դ''lf|n&LC.cUN9n#wz 5v_tfg70mKdNv>Xj&m zOꋙE3Zwaؓȇm*V:e@[Eʷvv*\*"ʽZrw.ۙ>C2k~GTQ ynD* Egtb"6wJ[6[Kr)<{(Xӓ'dѴ2Rih;#-e3~ FЎv̒ss0`l-- S G&vkHWwiZVρCoye>}UN#_So> wL*"ʿ_Zo٭}I.埛"4>*ekiaM"XG*,qǥcQ +gV Q[9>(F6 uUDu6-&.6;CF9s77Pӷ굩|9W|2~(r^txf'VHw\_MoηE6^.}-'k$ݐW?TVx[Ex8|5vo9 C{_;.$/|Uߔ @prJ>0]"uİZ ;o"2%2ݞ /nσt~H:~HlA YN3Q~;ꖵmGeegxv(XN/ۖsblɋ*7!z&I [rS~0\\@HGA1Náb6DbG]lk;g`1Q#`0ԎG"isAj\:lF]] ذrGfH.Z)xh pvʺ@lw pw?0{GWsuKw~~2DI$_XW]ڂ=n31 ;9+5a~܇ qTR/%),^}n9sAЃB(BB!J!)J)JB!JR!)JR)JR JR!)J!(J!(BB!)J!)JR)JR! JR)JR!)JT)J B!)JR!)JR)JRB!)JBAs9ҔKbֵs׺@fTDD33D)A+gsPJ'Rn¼q5E\~ǿ}5/;IL?莝-C~m7Ƿ~D>۟ u9:.Ax-%uoo,o71Bh4zN=qӛQS .ci<w#\^wUiI/U\ΨJ9W–t{||z\N-buˑRAwF}Mq4̲*(GАEޅ1k`@&}Mն{AA rT w[x=OINJ0KO\"w=>@ [ak2#^6dc{(.XV{M^NmWGI!g(S8즈Ѯ?PrI KWU>tmxŠ}' &Mʘ-ہF߲e#~K4ڎqPiM1  Ͱv|+S;+ ܮٳ `LZ'݋ՠlM dTf I?lkK7Ȥ͓ f Ir<'pfl|;XID 0IKtpv MnAÙ԰}NkC_E*t~ɲfL)wUFZ3q.)_B/ <].Yd2]Gml azx8d9ª2 xMaM6únS| S .lyِd+`f[R"JȖv٨QCm=M5$fwk=?IXB*h3$rHq!AI>Gn#.pH/a9oku똀x`)60c5&>A &""j re-l!dxpԲXr꟠eNKSCj \DfW2ՆD%-~ Qb˃M GȯQ>P" |j%(dZ]E%l= ޗ{h;bdr q)k}gx{uO-UśRQmt -S!Bp#^ع1M cI P-m_ ݆v'?v\8%A. zJ g+$VGԋ[hk/93Lq~yA3x RH|"¸^fk($-;Ws!:y[>,2fQ8 =}P"{pO}?낒OQvk+B-jjks>B۾O^j/_$6j3//3ꎫ/4z<Σd1NO4b%mTiS|;5v|jGWS1DϤW`*dk?~_2w˕;tZ[Un/o߈xTy<=j6HX#n0n4- aқMvGo3uGuʵcvOrE眬,Αtf3VXu,L̂J0 ONIRk"k/]VW[ -/@`:bF~VbkAS.L^3Ӈ#ЏT<|s'SX K2Եv/u31u"o~&;9h\=z $״$ߛdd Q8?DK%^^B2M#aW:j4٭]0Ȧլ13Gb:PR{Q9Ӗ7*n똝NjWVhC}>w6ErJ*5x[wWs77W+}bxNxTע~7gF{ 8CȻe 0e:*G(,Z>D֮N[sWGcÿmV=]ﵹD]Z~o7'(c،@\^H]y!_*:4]պ燗g~i^,Z}iEXlR i #jHu˓* f<_ɠs9:@yu6WVTdàؾd! G6#@387@nы1Sk;##c1r4o57=Vw:;f^mvdgƵc۷yfL('Lp' mN)\{P|B" 2 ULP~;"ՠQ^ >Okxe /+NG0aʏ<6FJJL (]O7nMs'NR7EL ]loXT\S^GN'8>V4(弍,4-| G~YB$DKb.BV2=SO=f DŽ;b0!kvV mʨIfI/[/꣧iB[ nY2\m4"6L͕8R $FBʋ)'Yor.=2woz$:~n#bbQ^'q]P ӥ#~z݋j5KTTicOeHaf)!-^'Id v2q]w+;F\؇;Ώ0{)4D[n\l2u2p/0#ţW!{WyV 5Ce9IzZ~~/6€A])b:U̾77@:lQ}34C",w恛xbxi\}GbZ_[(oF3 m2PWl3rZLsp G/+U\SΊVq7x-]U%ryizq,4ҿehGia'ɲoF^ QqհdXCLSs #q\/趗>{Fp e baF-Oaq'VCVjط]8ܓa*c3eBz5wш/Uw0KDzI 4NIdž-')ՆVX3Ӥ몽okGt=řQ~SkHvZq"n>vn+ PPLS,+ŕb rRad[.ȟyh Q3y -<;l-Tt Äsgwm~,{i?ՅWNCC"` ͓e$C2GS߰l"Z#YzD1 KEO|{F/U?T9fC#7| ~j$s_}oII x4dta!VP]OSgppxM MyIΝ3eV`j\rbQ.~5E+xEnAW]J$ $,xiO fe '! "Trif'ڣͤ 4u-ycNҕ OZQY+ޮrM3DSγZ\qtBt7 \+ 띚e 婞䖦V~) %#dY;/emdN~9y/VpgҔ vqHFvB̅Q'wv5]pd0+`y 2FwƒZfe^Pbuo,׋ysLtxh\#+8&dcj@QETR;a뀋b,.E,Y?̳N2ϹQi_+Rם<ǚГ AohS;|6.87\his?qEwB0ߜT2-dJ\zʡ;1F3ʟ0zpwJc_`mV`|h}?J"'U@V> i+W?+)^Hx[U~y*{?3bw#;xj7|!{x;Wg )#G'! )wcN?a* xS/JlʗmR{ rB*u)= ZĂ`v:c#\Y-L38]-CjW!hQԬ`p97Nyz_o7a~\tӍutOei7Ir,} T+#%kp$q;IΓ=o-꙼$~ B;H(_,v\H!ĴcaAG-f6pb}:=}!K ӝ,hi :\uas@h>XOP@m\!0˥# /B\ŷб@q-tQhᅮ?,CBjbZ(4,]ÚÐ #0y^ !CIg%Æ(Gmh!au 2*yԸVǤQ&M?v*| 0@wcSIMSh"FCiD(H~ @bĭl^5-#g 9A716FD9l^;NcX~>]Y O&nP!Xj}+kh,W^&L0Jx?Tw8^onA`w@p BYuPH34܆ 9 gK,OkobJFk~SخGjE[T:%4z>b~=7?%!8Tf,pU^C͊WtXY>Sjx0|%k/~6A?t %)XSui. ZsL8ptD"@U&:xH5Y_%d6˰ |r5 3=A*zS@XU=v(gլ={3vw4#*htꃋa,ݴE!AR?'rϏ7@7Oڎ oױ>gj#HMt1* Gi~vU99,B>͹lf'O͔dEfa.Ԟ.]\*%-,;6Yŋ("LmTbzp3Gz5o%͌iyZBX>~:5$AXo͙Ͳrpx , izz*nl1p[l}iB}5"ʏrpUӼ>+?8,|t>yM'͋En 9fJ~62S7Ed->m$V܇c2+,Lq=X.}ا v2etuo pqG~zL\WIwTn% RuR*tV5 r]DM!tr+̭u_"?>/nN7Nq :ʥIKFyg~Mhw6fNq q)XsO476gj9 YP}JM+TXy\( 9Nxw#bOIRg bܛAKސRQ㢤v:]}fcw͖L}>VO UX^-'Vl꺚l P!qVGPщn1-#t%xBܹSXTļ=uLV@*Uh[KH䔱=;j"6.<9hߤ @NDDm u711 /wj1::E#O=ZQ|Q5Tt jBL2oQ,+ ]N\dVYBƠ@k(ySoG[,[2ne7A$.,4̟3Ic9=~t}e$m!\V?&R(\+xZ2N !#T1M3-pomz:1'?.iyP}F}92cls=Q!_S@Ja1NݧVR {O,x`ID C`yC?\Zߍm:;;ї BZ`s6 o}cNj87EeBknD7Hhݫ=Rh EiH~Ot'C*c=8 LԨ 0ږ&xP+ ^v,"a+6ȝ R F.[d!̿iAS1F>k0R8TR0,,a+}TKNj gq޾f6)q `2D@ۿGPpi ӷ\NEHpȩLRtlX&A4u7ON҄;x4׈0+ENjxB$dGtfȍ3<-#[+W!FaVWr vYIW"fVUD"k9HXsSJm#Az(0V譴u\KaEsrTeo13{t@:PY|2a{a], vlݽ?vB]b2>3ɚ>}I;pҁQ^s3)lJTT1 Iy%ljKu1<di u_ j\y<|,QIlMXȡݨ28O͙'cdi.YfXcy.Za{;ymTQ\RJGTRd3N㾽-U1sCͯYm`~睠^5BlK3970US#o+*yJ#:$dbz I0j9m 8>3"gmJhAYgz9ny͋Vw@SjѼV\y_fi[ѤU?ܢTӖ<%'vZ]2msB<[.br, FJ±2EOC0¬$`s!%lJVw̰s%2^aJW֬-J4UBUr^X>|&'Nf8pFR^8PN0ёE 03p~;9kUlOs>=Y'~U9| .n^b'E4 Z 6Sf~K0 X 9gjA1 kŊVRTRxpq){ߓz"쑘VɨԳC6ӷW,Dhz8A"kf {M&MT`Kqg|#gZ̤$ ӍTdL:ߌ V `)8dkUϰch wѓAD]`r]=*<*@$  pc>Jg!꺆={|VI7iT-3ڑN1y8vҷ%g}|YM۫k;[&dt.sK†.?_xLR;< ˽:Vc,ې3Gp-3%q KPߍ}^!kq5ufDڗ*NC3=3_ Kigc.nzv;dלn9Mt ʙ(_Ҙz%^;5|9:;jc PLj םnaִQ)6+,_0{rBO7IEc{IVhEd[XxJ b?}ⱅ,S:vk^gGDEZRɟ}~o3Y^ߡ|:2>vYU\!_ֵ:dn /чpbj0vS[0C,zܠ^6c~=G{Mn5yÏWE ،./ّܪ'ݞdvDȨJQ2(M |_5wOVyeMg{}&g"ogcn=OOMQHWʂagm덢#>aޅph+|bݪ=d]Jn[{lcv@7ʰ4!94nv=~v'պYtms"QǷfwƗ乒 l͔vdO֨ԛ][mk L>^02yk̸/zK;Rx6a]NT;\LNe*GBt\nW Sʤ߷.DFk0#{P9uͿM>}gyF}խM"bElm_ uc8Cxs-~n%yGH] 緔rٰq6E!jnSR3mףt1ՆgtT1OxAYѧۻrc$8J鱊!5QFY% J2 5 #E NY&Η*H9BJ(mfe_cl vvobJdeC gAc٬q);^oe1>Zf+{yyˍo-w;sHQTcHJ~J&yYw+,É]JD ̓RGv0|vT08$H#MWf t6>yF[5w8)oo3,˫ NltT y!ˉ~~,U}%-5Jj}!pXd%\^mFtl)L~yey`N?|w]%tIb29='Gy/J:):Ar\]&wImR_'` b~+tޫH:8oh;e WIr uJ(MUt6OYTsKyN9uҷi_ܝ ytBrA'"YtYIkJi$FEylh]!yL9I0z'8` kBsJ펱Zd*oxHp.KjehPBL7Ybah.fezh*%hw2WիW;gdE_w!̪UKs"+*z=cΑ SP@⍧>bo}k1쩘yBO!!I?j9%=ނ>ީ}-j6<,򬓩&MIit>qH@i?M.>$G?Z! m,j?>p_"BDn G#z#?d*gb Q7oAn;UyDvhޛqZ]|XIL{|]cMc^i`ԇZ7ӞXA%kge3R#1(`P;\2ld * "g:.78Ѫj& $j'YSؼߗ/ú~h?ȶI\1-SR@Ubf+"e-chvHmEV Vld.TFwmk{c`/AJdH=eE>,zzV]KD0о7vH(d;+jll.FV[5ž>NăuCr6SkL1Q y[vG#m:[$.1fuZ~!ux,M:T|㤛x^e׿{(˥kwqjۢIfY8|lݏN+ffE1DT ^++ue"vf̴>rٌH"9ȱx,Sh_}}v̱M+arj襷`gwȾ >,̑Yb'nxw͑pHČoyk7*25҆.ˬMcaKE Wu d8j1R!魵Djk"D6)Dl#>%Y`Az[WM4!U̗󢜚uqM*˫6adas2ŊKNj(.a~1d`i%">v,pJ 7Ҿaل4Oi;{YXQ'rv ֶd{d]a>(yON1a,TR%.9h6BG%R}WSvFM{1 .Y g`p rj=FaKWIϓĥ]@+xk큗gި6Zm䎄IMp7\M{Xh , qhw0ExJT[k!$*4 :A! Ypx)|Bw/eQ4L5!Jx+`4"8,p'2ܣ KY*{Ρ*< ~K~S(:)?T?Ԕsvߣ:U_b$(TPkr@]);S\V~`FI&)RR\)Xm~KBhNe~":-L, OI2ZQ4Ȩ6Jv|qziQ "6C}~x:i@2&qx%Xnj-9q #Қi|c?&1[nȯkeewsni1ⲇ@Tυ3{[!?(/eUm<dtvJFZjm5L B }~b"9xe h=FvpwM )j Y Ę_LQ[KD{LiwԒfSҴCgU'U꒘p#2s\QPz8`$`drnME/.Ȱ%n2!CB o_TzfШ:E5oqSLuǗȍ$&!rFvR]5I+S 6MS7Ӻ =JSE4KcnDNPwuk }&\PS0i0Ji1i{HicMFC ڕ Gv%JH}.O_d =~%KU#N!MuRԩTNp}{[-FZ{yDi'iOsU=;S2| @8{e/?Ȩw } PË~50¢GRS;^Q;o$lr$S˻5c*W*¡?ji'OwX>_]W ޾pU@g≖:I241R;X],Tn[ RqP@T>X@0ڛbJ*Ӽ/1.˅^ 60ʇޝJB8YO*>%T[vU]&ri.B)`N2\u;ퟳ5bZ.;Q4\A 5e8G!p*IC̫j#*lBi.?\aRLiKo-1);JU#JZ%)c*»fA=o Q`ȤJ+7!oyFzk;{HfB ҥĮvT%CYAS*?O_PMa)Sa E4P"̔D2=C>VҒP-(tHBE!])-"z•M9LR5aLR*>)RJ g96<%φ?s%ſhq]??8{QUY '| |knRR/:(ΰ+yGXC:[mldkeeˁ+RlLe#W%-rzS)MXdCSLظjz\>õb, ̺SJ晁Ӊg*9L2N~(N7Un'RMa(g霰%ЦEԨ/-cԄzԦL!J*ND#ORTzxaJNl)3X?ÌS RXQ;jdꁑsdF^fu--dMVk/_/[1*TˡO;Oɚ"zNo9D%:%JVz@Y%ӸogiN +miGn~j ݦTr{J01_ngSV@UV0)~,m86ç* rZ*gCVK-)ߩB)EҨE#{I_"R;pRӱSLdPjb?ubX{382Q*oJҩ4zJn)FT8ݭ3.1iu9z:lI6w:M&\NS TR1+,McAgQ86F:H(TUr ~Fo?r8ACj# u>ķBs@@R8!D yчx/$RᲃH/&&iÓ1S p| hÆudRL@Gx)ȑ?" ]8|0?~&%;Z#˧a!~)%Q㬿W'QCDFWC/I߄Hϥ"6&oMZx?P87fkNY!$%ɩ$%G?*‰ICz Kg &LK|"@&\Y</,pnKӿ6}>x G1 R؞%=zp`u' !6xzKӆrzx1@9DN * `.Lӧ訥wP{͑Z ܱ7 WՆ֣bW-x" [0]SVq}z3@j"Q]8ْ!TҚv+ȴ(Ch":S3|Qzl\(P\E*/S8ec&G128O)M2A;_`i%)M@'dE)!Lg)Q=lrUK)n?U?pȧVlI6y1+7ɓ v3JR itQޣݪr78=dJJv):BjM,ܿ(/8\*ҭt0S=r*dN)~,z䩄y=)Saa,aF|9_晡dCvlҒ@bdD2Io nAJ=h L1R?4D? Q"(a(lv*Q!\(iI)%gDQ,%TyIULQ)?+NtTA pw~sH&OBNp,AX(d0^S78Z<0/~"&e)h_DLbQD&*вXH rVLP׏Xq ,0c p;AOҢe* `ߨ6z*ς:8Z&|׎%K͠,piNJoRBqG\nK zcVz\1`2 W!Ŏ@2wON~[4+(WX0TIZMey[l1fu<Ī1L@QKfupÇ V,SXԓH-}IP$"M;YE(#O{TqH%<qC{1bv ޙ4.E&h`T7KXuc,AJ|Po7o3¿tH`8-zpB>ХO2UM.E;IR$R&_Jy\-r(BCWz:>KA)0L}ĉ$NZ Ч̍3ˉU4ISk$!ʢOȕի .hD?O$i@xjW)۫/x }&n%*bɟ#OC[6/ L |㧃M<& J J&%^W풳lPbfRq }UKtĻV6ɼ# ( iR6,xɏAM"4giwTQ*\<;tZm%)_NMF'i)6CO)cM_h^&h YXj[u&itkd4?mtMIAÏn&8&|5k^62h&GhSJK;Zb0}p V| "]P+8IV@Rb7tؘuzdtxY' TUݦx".{i`&,aZRQ:Gi@hV:+xg?]ڊBmM?R(QGRHW,(a&₉>hPj2v "vp_&Je>ߴ5S$|%v@_c)GUro)nMj!LD)6Qk*?qnUCO9 S}qq1{N91j'[@u ;B?_ej;'j ~~S!%c|4(fLbJr'L)ܘ&4 ,M+Ms[MR>i?Ej1}v[o*Wa` gv@]oi3XɤV%ZA'5ץ5eX0dvi|%,[>0VS\dcw>:ΖCcJ86/2 dkpÀ\d68bX6hʶ%+ăS` }bFE>]|I.2B'áJ(?m"b!P9ؓjWBSd6H]"4`JQo Qϗ7gaijNi}(kЕ]k?( -?z&0^\S.|7A&Cz|JȔa'@VR0ϻv_Tc[PT?r\g"C/jF&./U/ jgrVwh//΄@gu8N1K?~Rc2b01z&+:"XbQ/ %?Ԕvb[S|?kq,Qd$Fqgi)LJ.BIGa a!%V%Jf<ј߮ EBj8PU?8rM !e MbDGY49~!CLEd83@>O&p€F:LsArlBD ܟO;}$wH@ІW@x<nl<~ *.cx8LU8c?YR~= h[┖Qb5 %1mCl><^#UԗGECuM<\^MLN ɷd۱ pebk0GH z}<I:ۉ/H!"ibu?%RaQ 3%3t82 ŶL!|%m) 2#\ GNZP22, +68O,o($Æ"YjCvJ &V-;3k..{%Hˡ܁jh` /h@R)܃H ! ^Lx NOqdrv5Lmrj$j Ű܊>RPvֆל1Q : ]凚kТMBFmrtl-jƫx8v`$액`Tlxn~[S;VƷcz s59XT9^@z2 I>t_<5GxzNa6 ]}t_\`ה'Myv= 0#y"_!Iu8‹GD/8׼y2=I۴+)a2^u"쪐}l }>HI*;.ҦWkz9ĺi /8s99 EiQq\ff0БZ^QsonCnE_d7o9P}.%焭W[o!JŃ[qЪHPo^ qfԙyCW| sXLX488(eKYvS>5xabټ~`d+l>w1ۣxwYVGkT375gFZhBU ű+ -42 @<*x:8;XqYVN˨سQ;|Oc:.#M4.{s^ |!+ e3ި)g]܊zez v.+gx#,x)&;Q<8i| y(!&4}YdJYr6.ࡠaG[Mh_^?Ip/u.=,}Hwn;-|W$/+-k1"SEW,=(SBrKdvw)VEW|E隧u@n|6Mٳ7q\!3<,ùQb ;Pf*=ܑ(E>Gj5<^L3׻Α=2=gQB|D77\60zʻ\u;>v80ی hGk{ls+;v6 ٛ*MF$vϣ3* ,fs9em4m!2υrsOzaQbzpUV<|Y^C +^ ?:}{9w>[3B^x!0L=NY봭 ^H!~#V cˮϽr 28}`WmH3jZ wi%"nfZY#jF $^leO,Fc 9EV;ewm'!_K{0UZ( (4K )ECI30OM a%J3sW$ї@VUk+8q 8db* j/Uvc\ovJهBOm_t>=ca]Ol5PT%+*c@7vԎ Γj0fd!yܩ/Vp"uģ\Zz\~-d~!2]>1ϾT_{fLiQuAP KGfrevܹ9ɹs!ǖ;y} l=stê-~* |t܂ B0}k#zŶ<Un߂T3Xr^3ƐX3涙Ge77ZۑgZGŸS6j֍ޜژ;/io nN=jq҅ h_|ĥTc$QЭ{2: ﻏe;r<v Q 8/O䳸76Ǯ&t*zJd."psk7êimAvI~$oܑӜG^ZBsyOԓ)w13b];|m,2$w +„ARS?swY]Sw[f-w%?rP^S}wn.U(!]oEm;.Ws*ĸR*a-]vwԾLEׄMDVG|. 2{r̕4IZMe_+sa`t]%NK*]mdj焳m+\vC)b8ٮ,o_blc~wk[xTW:C*?yX#q\3D[ 9NU_r ӽ0;u8a\9訞#=-&{Sne2p4;sO%v-L^ &B6] a r.޶a"E6uUF8Snt&&ݙ(!\mE>_p2wz~AV95Aۛ҆*mD>'XՎp w %ݕ D;"ͬwK_fM(lY]. Q3iwG (q iwv AQHKnrf~/ (I$%m)CwYӀZl<>_7Q! } yTJ9 =~b2 }Bqpv"0;ECSaEpK& Y3_Q@FM; WP!`&|'MSvKxȰE.~MKd[ &pChSJ>}yh =3KݝewM\cexw ŀ$.;$ I1ՒS:J F h[; Dko4a(zp%VILfԥ56jq{$f{Ԯ?1Ym6tC}5L~n8| s2~g?6o3VjxFj0&,!ůD20͔rS E8ni`$XJ)o9(+F+NwY6%MҊP<2a[ AYD֘Lz-DWO%}l[_Tr^/+NSA&$t'>~̧$P3y=˞Kc(IP!YA{Y*criӐ\̚dC_asQV*T)ŀ?}FX*!X$Q-a,E1/  *ӓPaX6-'q"2ÒDO[KBWewd4cR)%blrl䶨wR8?a-jWd}DjoM&@efFp^(T29>[vqQ7nBlί\!28NxՓ`Psb[)O*]}?gB-9}Jk52gu<(wUEۀI7dg L8l ì@F) }vJ(`}f 6Mr#|0r߻ի!ox`©aN*’{96nTOx xf@D8tPS USIyR(4ir_v%5 ~&ŎlY_ke Cm§np.`\TZ!b36R3,<J$Դ!* ݘ32?tɠN8|BՏWC+!fΚ+ Icݠ#2&gN6pOo .L`̦P[U(,a%)uj| Q/ы IioM$KPRexO{\F:1o#KCWF]CȢV8 6)#Ǧ,%lz35JÅZRFPVOe^wOHc瓒*`Zexp=n$E>PkI%6_Äl惕mF ;cݲ +Ju? zl|#ZcGچ]>A$'4:4TR3'(,lIu<@A3zFKm|+Dn×IܵHYF8ŵ!!$i+^?-۴3 U VlG"tƸke>zt}>yQpb~%|̞F'[x3B66>w7W5s3C\e ]],Ή9i!St:RZ,axݪE_E L"0y3N%l)>CL/ҕ&:{䓔^'嘗ac?]1WoL)$LiK}u)BH4;=|3ڿ=ō+7T >dO j@vz#R ۾y Ve}4W,E9azkezm6M 427<y$$r3S?dD:<#VWb_vz^q)q6Qu*X~Kۚdu LXvovٗy/&1JSR:$x[6: ^G ӌ S,CgHyw1/ux.m ŁR|YV#BYsܐ] gܞx{-j1'8&4Swclm]_ލbw+Goy:'*I>S=)I`Ce4잖^`,.}{z;o}suɪ=,!GIG}.oظ+ %bt;m)ݮmbcWvu.LjAzI~~N!xNAzNXW}SQ5^{K+NS/ &v.YCKr+6}'n=:'22M$:ΙF'IJ8dtu 0MFjqOyIʍp ԻI.^߭u7Z+%=">Z9ҫOҚ,uK^k ~ӽ=aSt*oiilۉ罵[Xc oWc>U۪ s̢f"*{I>?9͓)Ęe~ $5nY\mq.)+* F!jָ_P;> PnveLZy^۽'qCn+M^>uA ˛"̐t(K$}΍B7idקD<?ۥSbEMK͞AY.پ_<\'9_.d5zڽ̾_gg{>nI{w&fmGϮt 7U ГI):-hn2VH=<) B;-r>UM %?eW$g{T_?dz_d[Yۜs7aӳ\E1>>Ҟzg=y%JdzЫU4ǫk(|}gG+{B̻ XfTM{k[.!$Uv]џ쐐O8dq0 NB{9XJ~0^Q je{ 퍩@De>WұdYҭ-_y.t@}iTtc-Y9v\EL {wlf⼟U~9'\EB*)'CW9?drG q[<3>~ MF8~QP ,R> g Ã/ǁLzJGz/08`4f}b +_!쵑KO!tA48(b58L 3 \Ӆp3;n.cxd|죡]4آ ߲brW+/W\fkUq7H0I uS'ʎ(ZpP7v*OQ!j%]^,"0,5DBsIuEOQgT[b;gp}n^[ 2Ќ_hmdGߍ`ǪYEA==k>9|k Ʈ+ϛ蚢D^;5%h2E }m &p*G=orcWvdqs$>AٚjMD܆m6+RC_0rzTni|Qidrl/ C,A*?}֛^?dF4ST<,WzaG!R@`PE'Hifz(Yૢ)(̖Ͼ蚿{oȡi\dvwO:g2i_7W̴BTmNovmc}E+Lt;Y %>Iz~S[ٮNjwA$6? x׼ft&#˞4{f(nG)WHѺ*9ˑGob4s'gs"&Ndz*ih1_7"3|b[&nL${,M}Ϯl\/eH3F9;gW$D>hH2EFfW]"BӿgJz]Olg#Qr9ox?y1e&ՕG{za癒=cRO/vLdKr9/9tlrʮ.n`hk| MZjU?Io7@nkc6DӠua04uW ^TvfQ mS[&ustR?_kzjs;SOY-vKNrpfIPt&w5;+WfSFϠ}[0Qn~Xn8BŜwcJ$Q[19w]r;>+8FeDf7ݵjdhvv!p1o<T_:_)@T7_\].*Och|gzҀ{:gh}]j#LOp_:~LZ^k5pmsu&/S8QVQR?#1ٞ-7c}tM5%Lk~hb_c1m8h k'6ͧH}㥔E1yomk W==-+`S/"+c3Jz/,N~0?CYcvz> ۾We#l:io{ 氶!+̛kheb_{70&Kcȧ|:5Q|y.`Ct~Yo=aq sg2yV+1cD,z׃{Yb\5Y ׯaXٯ9~Am킾N .l<zg"'1(P|-hWpyn:oku{;y\䘶\'pKda¬`~&cl,OۛoQ]n9_{G;@P# >֧Qxh 6IC=l`{`kII2r).dT³.n;]Rǖ;kJ3ͪ~.`Z-]ǚnTR}.<#﷊G^;:ɏɩʫlN#r59^4n>M}>/Y1|mb;xf^!pp{E8z2~>?/oP\f"ugk*޸݋6Hv˯|ǽU|#0e9Sx0Nu/cx]VS@{*SVôAzbX"CaI*~Oc&_Hiw-q$:f{<)QKֹ]j&('iUī74l=I{WP3C+C\E0vls0UWl]u#l,=NTL閸zQsu<7OiP@Ոq0SP?j#t ]6w,8 WnTtĩޖ(Ki12|S:n9wDXbWչY] "IE?$iSP׋kǧÏZWۭ+;he5^ړ{w^@}eecdl4^E"O)k #.}'~[hW՝9scm5ôI݆@9wѕef8%3܎nOh|&S'3s֊xdaݩEVEqFXWW|]Z/2˸K0pp&;{ԃ?ԞH]WwpȞ3 V};ROՑ *Iu0m=UY∊,ZB8mx_gռBf߸0T]]RXƋW?uWm(@-.7 nw.ىOXZYm- ``ߗt`fSѣUIT@0/:l͇ O;}*z%w8N ٍ](_a~=\g*g<6VHzSAɺWHɚEDTf>x_8`P~lp;Y>EIq::Tr9ꚨ.!%wRQX2| I"Њ/q"G <4!k]oh(7*J2>OM&΍׫9xJ[mE-1yнHӼ84}n> -WKI@Ⱡ$Z`:Qm+Tz8-PcfJo:dّ#gSֳxR -gI LRpU;L!"C!}@O;dlJbJj[ JOwL f;Uwib$t3o=' y_-ίC^@=D,pa,r1lH: 6t\9nTN2]Woy>Ѹ%_YJ/Ky/:]z`a#$5FB<(XXObnfjc6/repOTrF$JW״e~ABkU$2]JFN+%y"qKjCb ԣ7l!DX%Gk TIzûѽfN|@kR#cci9YTz.ؖeH$-w,?'=HbHѧ\=lU$tK`hx@9|u{iLTmXҦ.Nl(P^ L[ywW˕+O tnwP/POƛ Rc։Eڻ5+&x(2c(~WaIy̼SlK|UKo{UcAlQZwP[ɩa"[W ^/l 47k ջ9V-+t~z*Ӌaരُi?PcGwmf;c8 *>ެS'ʎ p9FJުOɵ`I)cItH Z|`feofM5*C7go|eaXlNxT/ d,( 7??éD̮!=-8(t_[VkV?F[-xnVOXRo7}HiIUm{Jdp OqrWRg4b*6oO4V\k0ިL섀Goq>nب_ik6kxi36}D \=^ o4Lli-5.,gp 6DV~O4@@f89/JB~+3KO(H8wm>5OF/zxԦrzK1+h*) A~ӀmFRN)J=f ]ɿ}'@wI}T7H+pq78vR-؛~/gZ._ܞ.' Sok** I_T!kwJ+)ۍ` ķ[XԓϣT+v1}WZ*\ A #e&{ mv@ޏ4&g,44ɪ'#) Pg6kf35lAl2TV0R+8 (+L)f+9T.l2*1ͯ fXÊ|Ӣ⒰@W#XكgZ-ò{] &vl5%GJ3`\`)aW!\MGӟ)YiŀTR4(q+,KvqGlޟ7LеvKdV? mt#׾t.6bjicxȽGFa~V8T3H+s6G;a 57$_'<um%tlJO/ (ҷztxs BR_Ͽ!*".)H6u5@}FY~!F:Ƕ7ܞ'.h˾u|SE/uWUz=t/M5Idڹ4vztoǵhg266$Y,?> z\v뤙d|V D:)%CXD[sҒFI7S.tlQ󀁿E$ꢗ:eJ8b}ft?'c$J撁hT@TvܬUKW[7,s OJzRy3rl QX^OK ?nrqJyϕ<<顥]"C}J LZ^]$)*G{n߻WhrNG0b'c:]~ SC[*cT%@Y!RqmZ4V3^VK3/|MXpqjDXrō.QrFNk_ deIc30Y.%p>0)\Tŋ]T>oddlm d4&ŗߐ.f{r]:hQ G W⶯=t]  &{~#+,-[K}dk inEWhE৔ Ao=/T$Q[kך鰈xq[Q]%):ܥRY wUR!K1sY޳k%@I Ty8z+r25/ngINSAF.0-6U _Gih/|ߥ< z1(*p.w#.,0b#f#ٞ|ߢ.5yA K&6<}!<sr^7vSࢹ[1԰{.2ϨI|f1yJvcw|HHq(kY0TG !#Y/iw՗t8D@4ʺ;1u?&n@NpmR}lbHɯy0恨xDE8JO͑/MM{?JlT-$*zFL].DHﴳ^>9Ao;*9*T5[l{Z1=1YOHդƑ74-L;6Cdupk0Hciwwٖh@udut2K\BCSG*=Ɋ7Q0!q|x}mWLF K).`>}XR\q6WWJjQ/X1 `a"8mュx[M7٭(B%=>it7ʫ/Mg3XuL07M3!GuR 7\`U_I,bMʴĎ"I}oru DC(22km^kdJOqA|Ur35k2v -tJIsOdǂ|hDxEǺFRS(X.62swƭ 6J X?QaG"̀~ O{e_i} q7'+JNua`j2⹑KUO~"$n\ Jh rXNcme:1?$fުݸ9L9T\cclٖX\À3`6HyJ?Eڵ(0IOHy,~7>%9qV*Y8n|vtk"R7ֽ$v^BFvGZ߷B_ñ!>} NhTtCQԗW/sL a0h!6nR[zr(LRL_jZWpU6Fuu,Cs2}s,~#ƒ4%af2Ψ"9B!ro_[{qwv R9&y  ~_Pbh8GͶ:A]l)/ uX0YҘ5|9̗*\v[Ɲd_rhU ;Y]z:)\p@IξkFZ(ӒY9it݂C?t m򴓮IvlSȖ7 ^u!N7RQuARFsEMp\c31 l==ӈ{Ct e;(.q- Ll+mTi0mvj|V΍;܍Bq F0x{bZՍHm]Ct̕kHK"o q͗{19d'=vC#JVf!r&[iSvzEFgF Q)v0,&Q :׏ruSR 977I.0E4nt3oƁR^ގ]SD-˲<*swn9.ˠत{$u8Rrmpwv:}m#Ĝ5!esѨaVm ?'\j)e4}3(;kZLF12/<3-p} L;|>Wn܋]΁nG)}A2Ѩ|~]22jgϒ/iow-1Zy\NÕL'=\tڑ'3zr1.)4鯝A5nNJ%yn;>;噧|c?VFE):zq^z̤Lƛ ׺ͤQ0݁l?2!} GJ֜YRH1vCY: oMıOF %4ĚA4ǯz^*^ݏQMМ8/uYg3)@O8*ɏG+'3H`hGZ;ǪDmh{{R,is9-M$M]z!wsN5ѨPSV+CI: VzccG~5Ub]Ѱdv۽߁PU]-V܀Ua<(vPX<ǭb2.^ӊ쪫z5KM 0Qa?gf;09adH0+~X9|1[ާtPR?&8P$z=NX`<R0t=vݠ`={!{臺x{懹X{䇹8z=>N({ᇸA{߇{x݇AanA{lڇCz\=,WUr AY3«F6ENe6( `u6E bHÔ7BKOtpj14_R1(u\ȅt\kͤ2}ڃXiv̜}ocm%ގul dUO@CUԩGdX;rz'Sumywz+oXbk;v-9M]. ~?Θjתg<*nrRX0d-HHHi8^XXXV;fY{bݔ,5%4Š H)37YQiḇrOd\N]'&+.0z~dC22iE/ӆ؍ѕ2#zͻtp[@ jiwvpʞ\,11GKWKY'Ds%l"\g>\ `R<6LMm ŲmSa}|s/-qQμRrF=*8gKu|y<_w 1J> $ _ۓcb8;BDƞpt \EgMp`X9r .]kY0CK9EOy"z{Kp+mX%z%~]6l.y.ȳJv8~G8D*J^}g7Lk˜"lg?8lSF"Syr5C?-.I[37T{O_[6-Pc")U: ߧw{:7hlhq86?3ؼ4ƥ̽Wun` -jHcix]Jwզrb u*nL {/xqϖ2}?>C[C8 6/2ZtupsSo n}+j&%1u2L黋44 %wucݓH-/G 7EJӪ±ő߲Ip ghI3J#;UoYUMT 9.Y>*OX0 K/RsA %3d9GL)oUoI4?Xr'L{mMNR18nnp6W\<,y&}&z1Szeb4R4ko7~s/y)=4p-QVc #^im`l:R}jcLAV`hl?ܼ˃Qr2ih <cSV'&rv}EK%5&L+a!o8{GS䊇{wwoQ!oKbp`xEr|L*^%RXɍ>/͙g=|has^ϸ?<0=Uau r9LrkSt5PSJWJLCi4ݴX:Mq \>+h'V{#8 =/m=,og T*[kJG ?5K'JRih&v SnG! 06U 5%3:s<n5 n SR+F/HԗDrp«w$EfPFk iuWA]ylxxὛQj/{qb 'PpCZ{O4f7`GDVZָA[=VZ؊m;Ǘ.4 cqZXﲀ)l65^|HxmLX*ffHi+2[LqƮ(p-hs`i_BekǢ[˼}wNN2b{%gt7xB}_I,/pJA]wO21NiԾ\ri9x'kܳ|8ewJG{lpYIJtks$ ۴̹Bi- V)>f(ă.#6&1ToWq/CZv"ѧS X{G;RIC>;8yn-wUA̾rxW/ /z[ u} ߥSe*9+Un⋽eޚO +Y+A/Cƙ(xfs<тpa7Nc؍zZDyY\Ŭ<6fS?I7aNd􊩾/8읩RGU¯|^qҖ$]LT`wM3md5G;rlĊYO5l{lʅxlbǴ +F}+͵Tlj {⊇z%>#Q┸H^;N'0v,W"/qIO U㬔>#s8|`:W˼_Qkd4Bi4ԢWfA̳Hz3DyERܕaOys0gssmO@^Qf4Y>N!Mǜ#;881l>FK?dJ^ U419+Y.g7羘qI5Z=.9$j>p~+O*$t-Yl?]q̺|6L.'ǹI:?*:O㱅poJxf8 W85b4\XX֒ӫT<00cQ+D=Q⼯g+y 8GƄ_cs6׷:= +a1z*ц^FN[.m֥ˮA_Fovc]_NHo| u3kPcP@Q:껴ZH+^:]cι5`8̸2xO?G2 h7Jw%Hqx |)K8imwNmSX)އQɃ7sG8wz;4W:v".k8Q|&ҽ,;-=+wًtr$Ȩoh|}5k Ҿ'ϻs^Y$uZKnl#(ܧ3^q۬[vOJbIZzν⇿ 6p,晗oci9'&.Qlj<5Ը@ĵ<Ro0cRzL8(3\λzŢ4 {$f ,/YN䝠yS %hJH.Muشh+z>Oz}~bY{=C +L|فbuWӉUyW86}q 9_,u~R19 +9qԜd: }2uS9UKAbCwZ(wQ/9ϼl~;J:D1\!o~6XBMNSi]ACkaMSJe{qjq.V92OBv~}_#jKDج'r{|n}ݹz7Kz:]Iwجѿm,+w$nBM\`s.b |5Lk30"i}5('*"d>͊Y|W4'LQwCC7JzfxsJZ=$l~\iq9,Gإto.3E6Tʸax%E[2WuM {E#sz}gzN1%V9gpXعדӟ,sR$~fNܱ'78p6PO+sy*O3 9^b3{*h1'`[s֕alZ5 F֛521byfs"a%sz~W#V^2TQۆskv~>!& <Ь['GaܚzXGNKP07VM*1op u5Ȱv>1k`BdQ.qQla4rduy5 GDox ?ۙld~]$28XZ}"$] ϻgs.~(};?cInLֳ&Ȫd55x(]&3h+Ukφt`4?f4*٪̫m.X 4.t 2>诚hXfsӬt٩N23 >&HN(ZiwislN:\2UQ۝%_'_xǵ?[誃4'MNvdvhm G$8 kfl<@hgw jvaV;|vo}rv,e>[?~^.҇Fbn+g_Lk@po^r,6 7LӐ%9?swf㟢?lglv|ekc8@0sՈdvR>˯@絺2b yzIQ |k.){ygmh9|`/LZzLjPr m}徺Ak:c$!Ӽ^QU%?quѨzNg]spo 0]x9,u~u+=tV\3Ҵ`XXxz=a_lb񕳀d3p# e-PJ.v%^Es!e-23 c1Fr_eLUaa}H0TR5+e,,A`9sAЄBBB!JB!(JB!J!(J)JRB! J!(B! BB! JJ)JR! J)JR)JR)JRB!)J!)B)JRB!)J B!Bs*ZV%s=>deDD3D3? O@6׭>_w/̉}9=-9<fk[W:Q>Wo>?0AqϨ=k x{t^*gRmϷ=O;LX|Hߋ帐Q~o3\LJv`^9"j-?jw]|}B[ {7hmӰ5ueQZLYy3ebG$Gs cA/zllewkzMl.=*SňL\Yfxs=,F֜݃ri.Ӻuײxj} |֐Ǿ5Mjն/I3تK-fcct}#>ZʙPל\|'3OuOĊȖ66r} H6#kfnƗ{*x,It"tc7a?n@u?zKcC·5kGwc2X_jbEGӦ r I0} eϏ<*t #t֎`B[5C4k2NI8gifX/ysճgu7J'wc~w>Χ)}^8n<πOgoH〴!ʔ4g2G FQ;̝vRP%X3^4F4=!r.xy+F㾵v1u<63X4A>]K[W(Pux36=g;?0 ԷquBKAt0ps w9KV1˦βn `%z޾6[ ;;}[*6*T"Y\D&<$j #|"ch=E⿅֡d>ۆRg#F%R׈Y;0u)ɜݜr:ȧ+grPec]`rIc0r9:m7i,BqDeSO7-[%j< et VڅBb0#fϧb!mbgs걼iތ+ru26 x^'wkZW7G"Cd%~n%j\Ę=J޴t2~T@] 5"%h@4LTM1D<@Vt dKjX| 'loK0e1!PqWB[,I!ly{TsDꔳg* tmM1&ZdXORٙܣ ^x%U5'$ d]j+B!ʠ+#L_1 VD~y:k%o>(LU5'S{ ɴUDRuA|<F:R>ܘ` ZYN̛;O)1UR1:j*iAw夘mLvkؘsح,{iat2ap@rpPh<|1Rl}_-Lw!zw?ErGզ"|kw=ӜK]l-. [9]$}%8: CS( Vi L0켹L:'Lsxx3ʼn$[Am׊׌!T\1zK /d.ˤ W(O% /:_5U%!z9VM1.+wPZV ZF9\e"IElhɫЀ|f96$iPDP}dP! N:}LrU?'M"Zg%wU҇DgPGΤ|Ycov{u8_iRZqb&s>}ܽƧ)kj#nKYZ8$$/2>lhY dHJ4'U \f)mWDEv2GFwJ#= pv"'E۬q.%EɓIt7t'|Юk| >Q# 4HX,GawJC7ZCB}\[ D^fCqL~ h}ʀjD*QqiRofI^Nr˂E6ǖFVocW*EzZ\ 0d$olCf77o7ˆN0 %˹0Z c[D?VG1 oO,#F9?ڹCVyh:2H+rϘaN|rʼnuV J}j_mԄ㤄+S;(}[h#UG  ,6%D.b Gc1I@MmBQGOHTL}2v4 /81!Ha#'\?L":qJ tQ] QѹosYxk}wv^$h4+1!5 No24bey푲:uh+3ߘhz3ʾ"jsfn5 L8p%| K΂P3^!%:-GnI vRj%wY.FNqKz|l c13kXˬ}*d;,.XuHv>ґzvrRE(ᕖX"9jg]@SnHc.V}Al1||kO]>Yq:>by ?o($-a8q>MrQESQŧy)O\ǫA!hPJ*sn}7^ק6EOS򯹲dun\izyY^lKQO9[Eh%peE uڧNtkg59~V_/? J|2ЈO~g#h0i`Qn'quFFٰ/2cFLn#%5i¡vt;svWUG7?mB#9xX޳=mgN gę | }JRW %.0>I6Dk8;*Zn \H:wQ)d{NfY!#,k%P'>xZ/+mK4|[xP2CPϟb9%9XL1 Θ\ 'F O FIq6}6}f nԝo_ڻQC֤ jގ7ķ 8T&[Baq/ج2%n gm#eӉbN}3b`x8|0T HP~)'{f41<9CB22`r`:YK9P$7jX':3pt_fIWʊѽn:KJE^G} d@nION(th 5E>7??Bh3K;S2)d\u>xO 3~OQyLIjPwÆ[/m%ћ.] {wDZkByo$N1}Jp<|k yv Щm@Lii7aRms3T F  g/9nT{[s0v$zQ >a+\YOFZAٌ0̝jY@`ފN?YjS93|CgWz~^>S\4T7 μ$B]\]KYnM x+(]ZW5*nYvظG67i|ǺonqJUll,Bm{v#9ܵ(tw$@v` ?Wɀ'l3LD6ֳKv|Kvm{nZ>%g3Eg˫qF:CxWOݲgF譊HaN8$85*ϛܰB˯d[f Dw1J]_dwlN}^@էvUmGd7}>-g3^oq71uhkjY>ޚ'lW\瑦FcR7KyB"h%Vɍ$n Wu/'uVS|}JѽT\?[5UXHdPX3/XR_ Y>Y'IJb@Gջ|NhnZ!%*SS"$ o/LԶ~]EMLIDsHqV y+Dc)e{ 3`&.HSa)q#wl,Z9VyJ͌y^[|Ѻ;V@wD ݔ6rR52{<\ҝ7c@=cMqƉadT6Ha`88sΉ!ng -$`E42j9ݕaW!Jld]Ɇ?q{Cuks`z6\-R`cwi*Y$6⦇q Q6$oK rLCqhɥInԺr\,ysK]08$vq(^PʟC[(^A;2bsS%/-c咗>3[:poU^YR}Ux<0 4L1Ht p//ejq7ћ F#FT\tR0 2qhi)CTԏ'34Ǹ ΓUj> tiѐu?\.ۋKSo~-ZFsX5/OYN5l5ь(5B u?*.CԌA%؛pb0N}^KFGy5|X"6hmu41?2$䐅I<`89C{Q#U|WGWkw4'`7M?%G >2WpmW GüEj.P*%j*|WaJ] &g}9RZXt,?lwRյE2$3_S?/Źy RfrZo3-I.ڨ(y%syEeũixSx_p2@tzwɍO 0s1,4 >XF\0#GWIȑV٩#"0ߒ8 &5\^=|Fŀ{ޱI%O[6%:&gítYzߖaϾ"w;JEeG0}ڍbKA0r`X0dF%92h00!tw3y X&:JH  g`­&'^&<58zbe]yxhuugew5d9-;)rd{'}ۧloD8s& dL#9 J! +єS 6V*4!\ []p)vs d'́1Eٻ)KlN$ltSr#&Yt(H{ {l?ޑONݺ]?˭ CyϸL8cf\{:c>EBh8O}u&H§Z}y?u2<vtd neR `_➺X*@f d&yh‼ۅ[dDv8#\j}z{mZzȓ^( %?΢لy%!SBҚxA.ɓ?Q'Aץka1t1g:@Ζd;JE ”qO!У$>z2@4AU0H5:KX=^?AMwPj;񏾱>?}K+6%{s\%t&m5nvVYÕ V (e T!lO2QeGϒ,d wVC(Fw1ΠP:jjHiB9]4g!h@aFHmb<bK #A&f$`R:"d]ɹt&n=`.rhO쬸J+:M?+!{s@ϫꎏ[ߖ)YPM -c_vuk1ۣrXHTWwC\r%sj% ׳qɷVnzT7Y/Lne #"qt!:;8RFxs͢HKYt<>˓meimow,?26trsYBė[2ān31|ٸɇC %ށɁ;LoѾ@ih0aPOUMSsZCj;[Jp9ȋc^snXra)XL[2/W,/yc~9j4Tt%")Lv5 ޫ/mdUcotfQގ-ǵ7u=~n/!}sp,q;HPKG bSn/(Qָs(r 8#Ak:_4elw"m/WOusݯ6Uc雼e!olPwI5{J].Ǎ㧒`;2T7h-5;h[o?:>g"#|&RY 9MXFqijm4vmWKgr$IUtb`c(Vw2uQY[Y+Ris8J[d~~DN)*Fr$#RTZ4_K614 4wiÜq$8`*|^h5%܏5T2*^ fpp5Î`Lkڈ?*q%nj~?krآ햘]o9Z}ɐ,*%72Ì#0M<1>%dOLt㶚Ri11FZb:aZJ.$gJTisNf.ّy<)$l;rCzQt)"=f ?C[уi|F_[ٗ 7޶uW;0I -PD4~V4g͗#ר ,Do~UK5}" }] @hQC$,lF0\x..d MڔC;B2Cm!Z)f-bg2ƒ+370aT*XE)K|Q#7tщĘIYSL%aкhk=ӡ3Ç}u>+rdƎ-j+pN/D92^:qI|NN{3-B?nl9GudZXʌ.w-@Lbz) MfQ8/lDU$L %kG-`t2Ӛ`>()*7UG.v:٧0a1:ʭ6u =/)i7FHk}7r"~`Z7qg%7ɍ09 `v`]f# E5/ rqfD&/:}0jnڹ 3HaKU0Yi.NeÚ.E2N`S˼)8IaJS 5ñvw0PPaMx$-^InHf>)L,kGi|r ⊕YD >LyD*->Rk1'ثj A _ uQTʛ{*մEj1-$M!\$rI)kɄ @*ݍ/kL'zԛU%t/ݶd&ӊЙߋ=ľw; y(;.nYh?Gc%eT)'L>G:5KanY+Ynވ;qFttܾJ8ϳ}gl͟kee ?oz$Ⱥ*+x'aiIKAC̖t ѼߟrK8\(%6'h:xV$E a@,G:#~S?z}Ew{íFrtn%RRM%o&3j$3\(=~Tυ Gٹ#K!瀍k_okY=)__ nd"1&gK&ϵ^K| 6>y!}TR6(*g,+zFS <71WAۃ#YֺЗw缬jQ%o&Вەlr6K܋9{*&N3c()X|g/ܞc]ߩ}dmT˖x4W&ʌ4#l&AV]lL/Vi3VWt\k#"J]䍈yЕQ/Eo9Jͩhc]놸,4btwAlqVt&ۏg;.7|a1vKIPrքUe`3- ?Xģ 3J6ai'NLPђfͪUU\FyS\6B!F,Zk~b|m}ݳjc߽B:-LP-cs7 y;BM ՚RGSt4ѥN%H FF 60 =CqdjnC/:d;\{4~ӷ]Sjvi]B.PT; 82xu d#?EYi=<RnI/+i%9"it>#7صb*.#WAvK))x7Yu.Y芟"^yiԬdc䨴j=4YwO 3 >vr\sr))3]Q%+jo]#c ǖXANs>adc_8[69$!gʌV|[ CL.!tD7;'X3>qC7hRd@y9MEXPYfiy @z\O` _uL\q𛃜iEua˻xƏ7;e`V*)9S!?y?l?[.?g R. o3W!7hs 9-IkR9Äx=jy6f2"'l&/y501G(~̢!}/+`?#שYqpdwȄ|ܙ@8cgٵ>gl2=;^onkc$s+bDSA3ow/ ܔlwZGU]§-7Gv((-d*rF !8I3(~낮{l ò3A`CA4CwїݫIwczfݣa*ą6Q>hgoyN` BYp=HxLIa/Wzm jTǏNR+4JdBstL˰šwt%6 &u"7!&I3=uKbDV$6 gv\ę/l^NWҳ^Ri\ߙy!V %ZgvP'Pa4 PM< =?ylN5|i"A4WnnFtwHp N* z&o(1O<#iu!3$7i_Ɩ}I}~.ܱ8ytR4(*ڌܻo2~<~8ERL8P< WZzkYd.uX{ SWnd8}cͨtzzLmF?b'bPgy~9AA GoRw.UDtO=  㳕D{DŽyXU;3T0{qO;YR>(kj9% & l- lGz]3אQ8OSėh\IXE"WOœ:jRXۤES_8l)xn, .9i! {/A2}uHN*~:0?bԹnL8UJA9of{-b~t m[+q۹#:Wc;L";i{r\sD)^$$t5pE Tԧ0YFX i]Ap˔ʑOWל5%*&lq;aCbndwK4s9N"6JL)P֎)ԳNb^ׁyK'GKu7W]5X`Dl+~=< a SG&4TDx_OU=s'pT7T[' κd;|%mh5&Xޢ_qWѐdD.9@nL*L@Gy-E᭦^ڇP7TA;Ʒ,jӭ{4"pEgN_ū{:PK=}0F!kzfTɋȯA&aIO2ʿkLp|dMKnF3ē{)鈗. T*Hb,2Zn-(h%Б%'d~~kM%nu&l~h:]"{[H%PN^l>~׿[|J> J]oSM#:zA8s93ɑ2>2Fw[Qu^+C8|YoEzc36pٗ3t'6tC)CF}崕>7`^'" 獳O])q5|vPxjZ[!^ˣ×?ނhBg1ax3w&i`m}cK5H#x.ѥeݳh;!rfr= ҁ%.Ә9!Ш>m*Z&+c@ ?ҀTyIcRx#FRYw;*3詭~-FSʕ>ґ XPGyw]r+(e%.:@]ٛd E =-eJjsZZ[#N'x*yL*8ek^|[݃Wu?{b&r+|"ӽ̈XYJ0>ԇL7m w7csyIe@Kp>z1ogur98Iqa&P4DP@`o?,酉O;] ]60A_dsNiTvZUm!gޡƜak3(r5M+D:($cSj6worm:~GJ}ZYeI .}d[ ԲI7Eяt_Uϰ$ˢF}z41 -p59H+3)5zaon9QG]d] Џ0K_3\i)Ŷ}lѭ5NG5IW,zwc-lD6+{,cz1F VXe) O=w:,yCEc]yw Һv{?,Bq?~M%NtHvڀZ/,PPuՕk ;cp7jwte{[M }>D6ps룵R7-{X.n7#kɬCsC9ӯāR1JE@V(-]*p :'[쬦0$Xi^Idϲ ɱW6R6^3]7kMa[RFD^C1}CGU^hq>3\K{7_uB]#i!rwGKa]y|yȐ#/-Q ʃ,6ޝTCJyݓE yK֛b bE|fIǨޏmHA?}MIMYExnִmw3{T=,7""] ΖCyߌ6yX\ 02k|%0$:ZhB'*_YNJ!M1x-;\w|‚f>-ț'miɵ=q+;I՞l+hȠ~Zsd%>{*iiWfw@pvh72"[Vzt K74~1]e2Kz6sIk,1]kn3KK .V"Ϟ?Z|鸞%&6']:Ï8| 3!--6'Ns_#;pGFLA Y=Ǝ]?cW{( % 3ljפ[j>DzmI18p>889Ml$*Z;jpZmq24tYZH`>/om9-S6>37qX9h~g)zҸ~8}{T3C>]i4Ģx$R05D(Y#"1toГiid`>\B[ ўR*pSOJkc}ϛ%SF/N&T!#{D$_K_+?}nbfJͤoJdvIsq}R vIn3y.1;\ Nd77'b= =~d_Y <Ԧ疐t<1 is^m+pPi4ɃNK)0gnU˦@h&9 IߖS'l9YU9Z0Ւ~&!Ϛ@c$%~ La|}ʇ,:3zkșIsf:U .2+|_ԉwgsՓ1zql|XZ[>Ēr͍:\0J[KѬ$XSg$C[`~ȨthUSp } j]-ΰL?1~Z?Ȫ< N8Cy4aAKsNNFd;+>7;>Ԟ&J1"3u+~nIv1690u9sU9}pʓSFa8wtOUZ1)$(^ fi%]]Rӱ3]j|yn5՛g,$0qeL)(3];ڶ +/ڳhq!M TFW˔+л]މVox C(&^$,мDKܴH@2~9@?KѰPd&\ܩ^mR8yLKʌø"vIe#*Z-w*JfћO,5MՎΰn97b xGOZU*_ ]wf<ލ]ŵSҬg r<~Poc4fp+#l:Q}m)dߌ:>CJH&3WIm=a0j]q#]vYEUtp-~/> l&toJMGO&rnBƒKCN=a⬹6[)N)xZO~ hjg~[|@ahb,v./RI6šAZ}v氁L]XtRBp!\nҺi H U|xu7V>.D0I4^{.zL".kVgZ/r_$xĘ*N6{ŊHn8q'x 1̞Twl`:f2J^]-hypm?$ 6g! Kir-S`ٮfY4֗ZӜTM~aIʅ@n؂pguܚUtp]oZ+/NQI8EO'#̓bD9gohLL&O-O.1-9c &cI$,!. Lݔ6V_C*-7eJR3ǬJ k 0$Bg$ ԘNOꑥ.x~Dƞog̐3콙m Йi#mOm!zNFݡ43z(T،^;6A}(Ohtfz(osFWLjݬM}c& ^GgMJ$}aL<+w *Y3}gxPNU0̀,lK4t*:Gs_(e4Vs!Qa\JbqW*8WGѮNW7T з{6Apkke}) DBǍI\BNJ]/]:,EF^5/Sb8_;RQDBYq"}~nxu'@ea\֓1_e۸,.ReO=) g$ESi7a`cKhGQ9.Ch,3Kõ-Pn_bFȀ9QA0 Y"ҜO>@] qBp+M\E(f5vuʽavЍi8-c°Iu+Y xLβ;*U%p]8f5yڜL'{8Q\1>e,%մw6xͱe%FFf&K&:/!i M53Kg ϋ3B: QJt;]sX2)uYw(Cz|7Qg\k=`{9ɿFIфGZ7QI5x\Jcӷ.NGOQsP (I$| ms ҄wKk\Ny'JPYH \8&IXTjOFa. *0QbAZUOiV7So=~MObtV͍8C.Js3r"D7W]0et3l~*DڳjͧƽWwj,>΍=lMҦM\hncs`zvVsUIOCbjoBH_ƅ?w>0D AȩM-)6'bU*lSU1bщ.Ǔ,G'Evi)jcMBH{d#k&BhjzxY0aK6v1heGxLth@d#啵)T KH']X[^Շ/sM|i^PG|sD!;vŬw=KKԾ/Wsn Oo1kr9ЧT;j?D m xhjpc@nb|TKiLTQ^ gQ -/:Zf2w͵وM 2xwyjzjro|?&&QuvwϝA-KBE?to?lXUu/''}@ 92t?89)KYgOW vBXZ%a% \K\ʓթN >j咵qP,Cu7[$s]+Lwt+uQ Q@qs3MH{ {4|lBlBdnkS\~þs[:.~>BQu$~,A<0^@ϔr'LQvxR8"rW6B D&s8FAK.}*U`Lzfwdz`Drx"$/aTAl"U>˱IA|4cBn|^qf|w q⌬xoA9AFNxm(Y3˺qQGF"qK{m" 0EjT]*gmT1L/DihR@14ٚRxY34f?/ph'ĽGA bKX識t|92MFQ؞ eA'|xuV7Cdn\η&bV]yvH=x #`]*`NI2V5ܟvu eIy(ΰ4 +)yHLh|ߏv.adT;Y7Y[,=*p4ړ~2DџVh(Kf;# 0ket7ykC7- G rVkn٣x~4V̜Q uDSBL&S""Y7#f\׺d~J]1=ilL>d7~a3y~]iƎ[HE}~?ŲSu Tyn}*"/8*n/\ %_٣w{W$`OAtnzJɇ@KPeh-'D; m#m=jqGdEMujn]HOƦym9~kB|-Ѓi6_oſAQyoޱ^h.PW*MGyF)>w`$He+F}7I⛺듵Ķok׋s.N6&eUfB?Yl^+dÜ͵Ӝ6҆UL8*mh oynVf=m"v{XIwp8X4VT۝nw\=z?׮A'5d xze7ap'/:4n#j_B Bpl-rcPl ۔J#o}L ]TOkΥTR7 %,S6=D~  3K#G9kOy鵴Re} L)~[ΐp ڈIvs*q:>e6Qԯԕo,ۈ#v%DQ{~>)9XM 4IjKOXEMV"8ٸ;JK!f v2bNp3*$L'A֐}-,Vo^&ƹXfZ[Aԃ0̀G`K#Iyx#ksGԳ\$4u|Iwtn"DG*GҫB#Mw+%6upYw<ʋyfDogꠌSiU?ΎuxoWJ Nۆ ?%Ql4vUQ~ϔZ`Ѹ-'I,T)]r֐Kn]fONhRZpxf~~בiTD6JNioBt훀xz‘A=>YyU<dk}mݳĺC;TAb۸ &~ͩ|QWCq"Ye .gQ31*}͠yyͿiIaJ Lʩ8ɵ}O&0(&=$07 p CK?1"'?YuRzA/Kb3Narŕ3W0c7hu4x$|ryA2z{Gя-"[[Yr ɓ9#\CK~Z_7Ȅ~Dc Ď3[tUCQuWW;}W*DL'%w@l8܇Ȟ ӡo~:G&6[7 eJ~5_/) 4g_YwdDCmn;'V)-~O4V0bp!:ALc "uF\h/q-rގɞ׿ZS,A6ND7XȈ3C q˯(Q-YGVX ifm~ ֜K)~V|_gdC>Q9X<ʼYz+;+,rsnM6W' 5,d1;7ag< *1+k4{Dn:uetUxwE2Eټ}U5_&:z]I=C'&wI|ȌN7PAsh|:l?{q<;wj|/}F 3r> ow!i1ǘWSzs9̧H=Htm0:/ϫRP[|65iHh Զ 0Y,+ŻR!mپv{Vm 5T' G!OPF %m~uV;Ģ's ٳ|l̯U&'W42vWxciiCZhnT;TdFؐC0dU)(OZ~?5uϸ$RƴSRe~{Z?0zgo|^͸- OT;]Gr6-8$f}b+fo&5Lp$|x e'\,k߾8ƛ`+m"QxVqv<0ۖ#mzQ?9g%T&08d'+_59@z[G`\d AM%bTSqMaig3uj[W$ :()  >BВI?`bg : Q;JJȳ}1|Y )+-_g?U_CCY?OOX#a2*S ٥Iظ6"\x, >@D0QfoVWQzK5oU5w V)c0C'KA`$Lu֖pI]*_1HǡG:u;\{ծ$^G!̘[ 缮n)oi!lfV?յw\Zw^e34؂hlS9DeJ8GOҞ.>+} kJ)lNۭ{6ѥcX%]X畞VkA @'AJb?uȲ5`ȉH'. ic'4ՠphYS`YL<4ūgLqeE' /.'uۜG7)WH~̦FzY]KQn2"_HL*> צ"X T9ʹ~~==z!%Gރ MPm-^79B{]ԅR;g2D#}YEfa x<W۽Ϩu8r[lh IX8yN}CF[EvH^!%?L(}lݪ-IcۤJew|I9ȝ˂]@**%x0`}27ܑP)0A"܋WQ dzħ( > t 7ה[wt$I4I+Y'?صK =;_Fߧb^\HFϥWȷqf];RNr诶j7A:֋]2{z.l+yo%O(7' ;I ˾ `+g mǮr@2څD"—=߲,;^Go0YLI$6T~`mʥ#W fzǏ M'I7:Uϥfz|y1PDoΟ'#Du.HJ 6% s' dP|DFz;q<~qnTոm.ͺcVWw%l8 J#eg|ug-9K4M IP8GSRJ&)O̷*[ԓL:8eKxw({(Qw~W] ZTa^PQgeeOޅZN-ȏzo5@/ _Bfc;>Aߟbi۔~=/g/U]O|%;w}z &gk-|xICt"9Ce&f-H; }m|=|٢Y0jdW r'Y q",]b9PiT^)E4sS E_Ψ*|]T-r=R7b~vY>߆"(rKUhY9vNgVg.*ҐKrw t,O &#~F%lu|Pa{|Hd,=ƥ &(_,`_^3v%C̩h|4tZi_U9l_ ;7 d?Q;zƃ7>8gP&Pэ?'IHr0cį|$t!y]V&qYxfG%=;Es-I8Gl@a qIwx~༈01"+yxޞ̣>7=!7WYAb(IvIhT{i(o4X >f=05=)k>K 7X D%- $Pգ|̿ L&qOаAVf6v#{xDZ՝v5nڪ'. /{0 9n>x ;&:k"D)Jim~W vZ/53(qQe}ԏUyO[L*{w_ ?/'uW߀ zŋȭV+v·A^W+֋`؞J?P7ёr0ѱPhhh8(3 h/HcDi%w_蟆o[IB7UvG.?,d8?/f 3S[Yfm 6%y,d\F/_߲0_T/P̕)d@.,jbx(ȈOSXlf4]s慠! 2B&Umb6"3 /\ⷡfwE^=?nXT@Y(P. PBDr;ArHv-K?ݾg0w_!xr_LYWį]eޠ_!A20kq@%=D`  Y X0rbxMv_Mv|eh0QcيI$[Ej BEZSLvٗY yeLw*tyxaB}\r7s3 (Q3 cK.u0 &)*JD73vO4_I5Fŗ]ݴaw1O|(" KÃ>Տ=rc04[64 ȧ'w{q;б;bˋ"S4dT$1m\T q1Ţ#E Fn!nź-)hi(mp2Eǖ[y2q1P0q1x(БЛh hhظ~͚+%ލ0im3 _$Ʋ\ _'v/L)3&뿽0tGbۧUm2ulR_(o n o^?R+Hn!ʐХJ OA^Âh_.߲ '3qF=?w Jㅪ~;4VLV+)$<'_Ne- -(n0_ERj[xUS9<] >" 4],F C9zCX9=﨤rL[=na%o/jl/!߽pEW|+ r&t,~b+ pW~]WEb֢/FG(̙q__ZK#IQث #pü+t.nBok_,[]+FsLXt]}n;]}DgB$-9v夺=> -0sҏ3av!j3i!ەV P$?G#ߞ@YQ|!`LEq J&x mE$ YȘDƓ৆(+eVm1&AP1C$%٤'̳}SS?J#%䃚 SŅ񏙇0(OС_"auuAuu"X/s̤-扈k % [ Jy:tmX6lR[^9zIr91.5c*tkLӷ &sIn o.La=jEHKQrbfr0xdY v4K@17n.F}# " 0tk;[כֿCdiS$3V ҹ!:7hy&\hsgG*9<.ڮUx=Ӫnc铋 eOi(g{7_"QNt\}Ӗ6$뒙]wҙp=uy$ķ Wvht#+q fIۉTGW:Y4ղb<1b1/4-ak4F>λm[<@F i88$FX^' {,[М@#kIv9':8\k[F+N]z8˰u̓V"69^@7+C~kZ[&W]bեN2KD$esxdV}e7hZLjvNE)?0:څ@kƭx=MCVT0h:Z8c|cR-[9om#_ԏ^ӝTFAɒ'M: >Ƿ֯VePs[Byۼ-$er}#\0ٷXL3mE iS9r+z S6Co!V!~D.mwBO;m|t3i-ƀ=^9V()BħZ8y#𕆫xm;?!7|WVF<^d/|=ҥaqӭa[ 2efeդm4,ֱ24Z Bb :1*8'WK\|]`kqρ1puBz`ĨO逑\ knYOr! qf8ӻ*SrŇ(_B1"Kƨ C$KbI] 36HSnܤp_ 0^SƌJg@R[3O)룶fco˻R1d^C>))aHܪ jү zgsreZ3.Jt[N|qe]}9Pt]l}V:l m.l:7dlotER,'B^K7|4ZWy{ʒhFJ/Iu ֑05l%_Y+9?D[R)BvRoIv`Ufb1L9U.;M o89yi1'IYT}v4(qyk08jpZFp.VCG3!&?N/:8g;/vE;e-!Ng?$Q/C7|:F\} +g~Idr)9CEQ'MsOH.gWtS c q,$}abc-`+RFuجrMFQ\71KՎwp0Ku9ح|2, .6T+cTS~)J> @.~TyN gero~`j,V;%W`bz˒kS~`AzV`VFh5Ȝ-^ЫZ3"+F{j׵e+ dKbM/:K8mhR!as1B[Fxwu#ˡ9ssba)$0lg+NEGr&,B[@7ɪu;D0u[4}Uhu /)2aߚjt3ۍ4:c̒4Rd+w nNRnqw?q=‘]TE8- DFcq-6<SՓq@ػjvF5:9zncEWqͻ9njݕx#JBH̆1zֺoa C꒬JPb`fas%a`=w/W+$ .V^.Պm ShH%6cxa$חu؈_?ѿYٲ[Z.d0 i햧 4a$mL:H -r[8=T|vC[P.c_S:D \xm`L&:aJb̌/aKQnڼ-sCGOBY12|h&j)}wa5T2t&KEm;`h6R%gi%)[#%& 1;qz xx7w̿o32w1Aj*jNsKSt\Gƞ ݸ5:BD y{YQdXW/wP+χέaF~~4Q B15Z2U5ƥ i%:0Lѹ +""0&%-by+9w4+8BoK*k$%0<3Ȥ<$FVpezQzM*<;/HQw_cٹvPV Z}LjL*q:,AX vq[NblOy3E"-).<G*c{,O϶~j*R7SXMp6m.* ey[T3w GFW (xDK;^0y_B|a#Smont}Fa a#Q  4>@P uC>^j##nB0DJڥj7ȗhAU$|GJLV}ݑ6^zOrKh XNa/jqRvLjG grM!Пgee/Y-sI4E&qyDV)q5ro"rڂ*qJ}[' ,rLB>͵9.[4bTp^QE_M܂'H?u#\SZݐMٿ+iܭqQcR?eE/ɥ8 ]N}镟T{ ǔ3\J.`=)$R貴h Nrơ_9Z=ʞu6Bxg2qW~Gy~G-iül/w&??('X'OeB8m㷂~on;u|PњӮMڈq13kXFL OWzn[(;2 Կ,3 Ҕ`r5Y9TjIݵ45v8|(Ԍ3Mk^y +˜ (u5.JZ̋\w(N1j RK_zʯ Զ+DQ%GxwyсqF ]Sh犡_ ~`N(hm6UL4I+3z%g k~jRP&?-[x]z}1Io 4$k(G$O&+>~w'赀 ѷ_\lK=~퀮H^ir ƽq)XH{3΀Uk& R2T޿ySLt5:UeaƼ .L1mtZEJDŽUN)m9NGAfW"u5&: ֊ e ҇PSP{i1BOǑDQ y2k"PjHf.M[}=U>#3kqJrJM(-:m -%r8#fzgmϞch-LY'cv1`|AO!T7z#n͹]qy9,&l ^3'eoX40|ƱBݣ5R3Oi[5sNA8+!'B6ik!t#ic4}٩܈S't]C=ۅ&n)VcCF>1&8 nۓuiu  M=Ё= O[:luqfY2x4T EcžHGOt1-OIt&AaNgɸɅNmXTdܺk}ԙIhɃIOvn:ChLyBǜҗQ%G`]&5v`JT[M] >Ovdt-?-@тM"սb"0;daK]4OMGލe ]Lŗs5ڕЉdϿ֧h*rWא1~:y*d+U =ί]z_A.+2Mx!C`4PBsBVW KlOO?h:` y{ ]3ߤ1ҕQ+)^W:Go`Hb!UrmO^Fh!QS\Z~,Sihd%&\nh{zZ)Tu TВ'ߢ!<=^֎8Z጖S=Lq\YMd 9HGBuˢ_t' Ͻ0fYWC"Ǯo*ssL1̑,􇈘l0X혤vϋb:aOG|_N^r^'n2yE]k,WtͅЗf7^'ތl?74J7[$HAќt'Q|=SBY 16"K&&H"heVx(}m:O}qGkb-V |h E)8V;ْ(<l? L(`?ƥ,/WN/hst%A=t>"j.b> q,HOm֣YPO,3%s1Ŭ؟3C8-=y@[G%2y0XӻBrӮAsL0j1Rx9[[Lz*p9C GMy^66]%Af?Ĩ >+0Arz Gg٧i]QWA$\>A={{Գ7&8'k4.]zW * DXj .M4xjrGG#2RzV8V q%^M~$S`#RJSm'K'r1ݬnՓyn鈡Mc11U u"c "ח9vLU啲('l]#y}^5͑sIVok{10%tUxVFJ\#j-(tᰮ/n,JXpKGT;ĆVg4lA|"/VG!oZۧ:@*`*EtND٢F&|֐ѕ驫@3ٛ k`]|:3 aoսBOGx)m9Ȓ`!7O`2)w-䨙ontK ^&дpO a]]~< ݚ`6ڃhPϓ4i`㑪ژ'fF^5$i;z00= W1A*Sַf +P9^A'{g!ތ};sa5!:r==L=Aekuuq}Z6 WDw%~lYr7 |i b19zіrgof8L! 8CI9&a6y! YA[-&{QZ",F:ݮ$7Sq䰶>?g}R0P/oz|?:l&MNp L~S( }7[ua$ ^ir?l}sJ s(.d\$? U#ܾ;ҳ%}B4QbeyNj[a?=mfupd4T$}.|hhGCZDSXzey-3w򴭩vc};4韆H=zlm$l ~ږt/aRTGԒ}OAU(lt #BpYy}p'<9R|}40h&5C ysQy,߭e4b`W]@.r_ Mt]1iAIhcvmF8Yeo";QDE}/MqL*{bGAJk}{7 #a&o#0j.,u [Im-5j 5 HȘ.J /Dz.Lֱ(ߨr|}}_II=iȵfj`PMV/;N u0oTiͷKrۙ4ki2Ee0zzDZL{ծnWoh0z!h'%Æzl!83 ଏ&pKW,䷚UљD| W@{x}( XFO0±+J zkA@h#fdҽɫl8˩W#uB.Cl0Jzo9A,8/ޓZkmGGs| )"PP%r~8۽L4Ť³QCZ1WL+iGZ$;QnWFu}OtZeST'c,γ͕qsx}|ҭr蔺i]%=GO5rnAkw,Y,̡_x3W-->b~z龮JM.[wX+4U/CXU?e9Th:cܠDVz"!g3Mys5Wd]ן:k NQɕN1VithcO=<:9/mKJ*>EIuا)~1{[zӻWaǃݕz@꼔i6vhH:$\T.RwG^Wt,KawԬ!znD&)|!__EO&%={#-) 7'fyvAhsfKD_7̰ܻ׎sxB)]`tCQ靗Rb[G]zZ Al !p7o$R0A ^YO`Ǡ5?"WNrv `2J\rw.:iNƔu$!tt%0 ʃ8k!Y1#J<*E)5bܭ1l. gb/83BfsBܺAByys ڤsCX SSɕAzc'Ε`|rYˉ$ρ.)9]}{GkL-̉g ˇZB$$Rr!ʹhFq;z xZԲ!(ٛ я]KpR)K-hD^*:7;Q'~rz̸ƱKU2dmCn^Xr7t`-g҃^U&]a--MO~F.hf3%Xck1 TUFk` +xt8%DʎܱhEKH~EtD&:D)UYg<=T59KN K*#/}kz}ơ{φfJipF4QXWop5e^E p']Ä4KnҪhr&iCk$ TTa ps؄S\-Qǎ>ha.v}]v㍍F/xs:ss]hCWG[k?&UJN%_|bژ3 c7F[ٲ=~qcò:f{1d[9.p|[wa`8zmdiIL5C.1Qu^FxjGl45TO';Gc"Kb%ya勇^?}#޾c#4yͤ lIϔ!`1Tt?gn$1^LšVӈ"TR9\#,zS1<<723OGhøL 0d:B&TmkUjinl{\RAhD[F^O p <=RAQ-&7OQH$w0\6F0r(:kJeRMieߞb"OмDC)4f<5Ħbz'/tg%q&n9&To>$pnxʮ6hQ$tF}\ л8O='ӏGx[Ԣl gvlu됵֤pfo=7 ,/WҒI #cEVxmX*fO̶I˕7fuX)4t6DӪ9aidqwݏBrsooG[# ܙ*|e׭tGƝX{(J`qxOJܞێ#s)DjUglQńxV]tM.A*q&g'q`w5$w[bi\nFxVhޕ.8g\j]b/axU|uUkHTf_7Ro#~L'@;J=o:"QYY*oJE\ǠzS}<\=6=_=51 E N]HNZ> 6$ NW"SNh JjEoR֯?UmǠ~{cp~"'a*hv;vE;2K\xu $koUc΍ا9ms/MD2u]?]DCD9y.o ƾxidemi9\ba/0yRMPR@t=fv'pP@pw{䢥lM9¼]i;=?vi+i`~87ELTb{{_W1x(|=nLutGNoE*%kL"/'PP( &Y|kjI(UXߏ6`e}p#c7ۋu*8p=g٫r-3JԄj\]Kl7(8:OZ"CʸdzR3@#;JVb L1<ͤR}dDCNo1q3Hx+IbSM ]p &x{K}­xBC Fm|u!)zbPFx,r1ϩ82HCgAୱ*V0@xჴtOK喡ZʨMYwՃ>1ܗCFx L$/)Ae+ @c8\ 3,d9N޳Gwi5$g)5$ ϧ qll@8ڵCV&}/vgՇg6jFRkW. i.i[Bm!x SHue{do>1dfq1>ISv1%o%oq?G]qszC(!{[[=C8O[KxS$&wϘ&I]8h8dL;h\4tۓAQ)|l}0`/;{< Q_ X%yc0(5 ᤣ"a``dh:R?<4L+~-ϐ}}i.M'FKʬѤܶ4S iٛy].TEBvqA&;mWYi~yB'iw$w[љ&0Po-.̜ *8z˿+k1FdeI7nj+X]痲qh,VCdD2\S u8ReM" J): K^1ƶ92be Z@2ImrU"wܹ/xI'5ȏ 9Sim nF+Nh|5lt1TYܚ"b@n@ ܍=p44ht~sOX5"JI 2~yHh>PC¸E`LB2;}7OCv$1[bl*$uG[qrP)&ҁTπJ52_g<GXMI &`BV +i)66~D2K\es+jܓ&9 WCAa|8R Z kxo<"YXzTi $I bY< D:2 f0i&H F }a(\)O "!pKj!1J4Ԙu(Ǟb.`iӍh&rc%:]`lu |cQ˥Q$6ɎHt_/؋ͱ-yr܆C$6q.6gg [>R/SKs !s 7{7GD\ _ߙ9 [-*)NΫ&& ؂~1Ԧ 9U_RO/rݛxa?R"e{hYxڗJmU]f&NuSĹein5ujC} |t\p?$6 "ͦqkp3g}3ty͘cD>]F%Ϭ}W3\4N;,@,0&dK)WFZp_e}N{EHEn#OeL8ŕA*1$Dw3)S)l>PɜN$٠s/*\ӖVy\ uNޙ=X榛A8m{htp_s49}?rqbfоMmՃ~=tDo:~P]͋j8wj9긖8_W#g~pIbA=#Og8 rJ԰o ǁ1@+T_Y[a^5~Hw_%v:_ D@ƋX#Jk@M`gN hR ț78Ɍo@v3Zx2lØF`2AIL!Ջrh-(Γ 9eX6O<ޅ 3`&??_ȩʁ|?G ؂UK}oNB0 6Ϥ|tX?%jn ]UE)b8''5JQ c ^9qg3u,l7Lc-D j 9ͥw[]wҴخ$Y8 %/?A<O?7򘺺ss48vWyx?)V+>`ʡ:5wAwH%I8Ԟx/1h0r^~SVHbmw 5- dp*^P$=92?A|K\8'Xi3Yy>t]C7|c ".Yn̊XM>y9;=ߒw:J/azɐFL@}q҉^ x8\RNCl>)5`r>/ /o'ȟl U.͙,0܆o-Wd-?d7VBS7C"zSaԾ}͜4L4WT0=!NN*\zK9f5Y_u1QUMJOpfi[;s{w~yWw y).`^ |M /Ln/M%N 0gؠ^$t tמ-ə z3f@t0x}^ $P>?TFakȓA?O{ꢚ4iHY;?]lZpe^=B,xO邊-@`\A}SE|^Z3g c 6p3HXooK'<8@aů,`\c ]0agd0 7L|܃X?,+>3NC-&(/@>=.*5(Z(|aPƣ!EYW`vѿǍg"P {kcVB-o~r;ʆД`BIKJowa:i-&[y'q,.&:2* L\aḆ/xVgx̄+4dgź?/ ì l4t6>;bFBFCn?G># x(2OU/eJ:G6R򊙃@,Xj$ŊlV+,+fb!c+bht,.F M?ለ,!b)^+ 4X 6,Qh¿dEXXJ aQb+Q i81c+يBw,S `R6sZLhNoF(7bS8K,?hT?~=-fmDYFĒl6ޖa#4 d0QpDl'x_!fJ p{s|?u</ضB>&*&>O{Jxh%@oD v![3P"#*b TYޯ2/żMgL_v/WQꋳRdj$ ,Nhtr_Ƚ.^WY@ 彸zz"m#]?kX)u˟V_4RAz1Dhiyh#|5.g?6|0̀vB{./ 0O P{=օçu} E[k$Ẃ9# 6.^NC?ԨL+0EKX5^GEPYN _MhÃ8(Ͼ8dٖY|pUs[tղa(ٰFߜ_2ΑM/[Sf&s`H\h:0hBs:RG_=J%K{yy!`y|пƎNNrWqi] &߰|(km-&\ K1OfRﭦ_έ+B[TR:&E*,+fC==[xzy8h-7u $^/o;4|lT/q hc`tߵ1ѿHFF IOmCF L6.Ck]4 \ Zh{y-ݫjtۍ4, 6.+5C1ѱq0h_\٣z .6ufu.0xa:CBEE7FAB"?9ܛPFhJwd\&me)GqBےTT$\|tDOq D`?(؏DEKA*\]A^3/o$ylfEQ:Ogwyړ7[b~n&ɽi8,n/C$MmqꝻ[wOxoXJb#^}܉tBTf1ڋ=7'%f\%V(WNu^5:%\ϿC%^xrZ$&>յPuag$&Ug]*w!e#2%8/F6tkslI?"#>+fh[/܄H034*N(]s] L\x50:ub?kѻWٻg'lWQNHǐȮ&nxil5z,.c>a>ł]W]&(PB ~.D#$my$@!񈁨Mc螸RՇ$U{cr' Z"h ąVQBع}ywn𹽋_M9L%Њ;t_ֹ»߄_)*[^Ay6,A,D>b~2P(jNJ;$Bq"v@ج e4(N>,->-ͣw'烊ߪߋr~}~%.O^rBbEZNb#JN1w7/D''1чr4& |{\w׿ź&K“`lz{Uz0r]r©wíCV$yA8X쵴?24equx4B[_CC%?|wѼo xz+R$ϖNm< GȢ1.&9FERa[ Dlcz>C86wwʏZK.3QTuӔx3i.eIG&=//g'NX 4{RQzI_wOkd|^o /pb4gQhLY<}]FE؎PjVRۈ%wf/ ԻƗxtNl$odߟ.@٥n ؚw8=O29X5$o-xHuԘ(?9Ҋ t&P-#SBj'q[L\aňFF D̹wX`5zTv\a]EXlx?{X:>LLp/BdυԧDe^lC4UVq<;YУ*Zɽ?s\a13;1 tW]~6HQ"gU g$W>#8-U/hi53Ş%0_W HnoJT!3uWruxs< NG-# `SH *2Y?&^5K=%;r'Kk9ةHqR9Tct\[ z. Oԙ]W}6&d}Tfը2^%B ?gpko2.P!5'99S ||OoB`sCnB*(%W7ΒOVDwsVe&XYsVi\N<ǘMܫG}LztM]$ ?|Il?t&u/)E O/_V־gAUSKI lC_n9؃Y}6(M4MT>w< xVh5U/QJ&ȑ9z4DXlcQ 2j=6كsArЩd֛}mӅ/ujB֭G;Lp"6YT;Нjuf ttӏ1{:.O}䩻m;q}gPL:t^29ca fĹβIJ}~8?A$^q_}u N4 ]\)>!*2 "rh=6@/& U?NBI}}=uљZCT)>-D%5a.7] X+9-2Tɉ<doُa;u˷I GSͫu%wz)b :UCΞאD,0{-rދf@o%A,a#.P#rxE$6n5g%jy>`% tcL-0^IoC@vaMx05~XG2<'8K&4~G)De`nbx;MSN\7ց{jEZ_v'3KtH8Q|m~ErxEWhC+(J轞N^W;jթa+˥C\ܐ1C!}~0;D ?/Kge@W?7YxQqM>Wf:Pj%*X \腋.sy:mf\LG:0B{Jb_2 Pl'':b B4F@B ^?7.AЧt=LpRe,;n&eV|2{xX]uC87șTi%7n=ZשwzwÕt-٨X: 2Rجz~!PxֆivN0kz0܈U-B}dІ E/8z7dvluJUCyz烋q54ZU+۟$o UNMQbZ"oHwG)/B^= ?@_E~ohFbknE:?)"9?ՠZs>y.s,LY;92c.ٺsy|d^J' g~yOؖH/D#%Xv%=ML78=Po/CϏH/egoGNb1VΥ5\_:LjU@OxҼxIXN(X6tf#KcK}a?]0Y0oB ?993hզ>~/ڹ@O*v]D"כ8;efO׸̷fxEA}eC|IwNvqfxK] &TgC09 K'C.I}H1+3A G OJ~BXK"njbʼn/'1VOXe^&^ч&F^?Q}<n';./F93A1P޹y9jt_HQd Z sRYs]+~ o,Ed[mt]bj6cI{mw$t]{3&-ì 2Zⅆt`<%BEI}HIŗر8k3rD@0FCO \*v>U6db6#nq{9y=,E@|t2Cʆ%8W^᛿R2g[Ne,rG- sk$MUy) ̭۫}luY^66,-w6};ou{%∸Ioqy."Q%Mi)mWD7H%:OG̕)Z RK0IY#"o,)H-&vT5lJkţꆫ33=O%nF]~mZVL XJšmHѢY\D͞(!z, kSSp|&ǵ [u5_ Hd0\ ˪}4w :AulLxZv, G ϾN_33GƖeI77t%'ҒS hv9gc +8G;MW]`]JN( WzwpyF>LS&\J\rԳo [29(j{/vĻG$ q0.*j\Mn {a/q hTUxxծkP-o+TK'wWN5}MbOȹ5:> `+dicbh?E"BR -I*U$dFNp?Ezvh2*>?sD,GIV~ucֺrxA3wK~/n| wxۥt{ցίEEwg4Ūޘ:k/b7'TXk1+AVؾs>A7T-N|XG Xi8:jCm4rZ5:X$A<ؼvVH} %*ΚA%4A&0e'N`ޤZѱ; 5NG7ߤs]gp;+Xxx-(5ic0ҎqX=y?|߁S b^G9o`/ &xK? Lz|AT?m(n'"H{ȏţD |g0E1XUg*4 @!ijŨ"My]]FQGK^si>[kV>N.Ζ;"xKf.4/ߠ(Mm9x:R"yk[m0Qm](Cb ol4.~|yCK'-(5 ůj'J, .` f"aR25^s۬6$`uA_L8:TVɛ;96wRf*]+ S%Yș8ULͶug9JA#`E-nZP`tUv'z=ncdf~ 2*^w9lކ{b["ȑF #/8h/ςP#|o'FxR>q  zͨ܏)jF21Q ߄ z8\~f4c}b3#^uWM:&iK.ധGQr|"Į51߻+|0C2Ʈ"\A&|TV}w}iuOrG+ٚ}zl(8֚Ȭ93MKՂg\so4(RxvOy|o8,?0c삠h7 i rM]F_e7Bܜ[/_u@HkSUؿ5kU%ˎVHɇ:Oabp*9zraszS 哾, _UV ɻ)ewfVװg[qֺcxz"OW/b0,$xWG~' {4ǖ-,/nΖܱ݉K$1qD MχYϽ6#B48pN9 ~.YFAvJS)C,if~7:y`mzEpO%sU #ޮFtr|`/' oʋ;<3кzgg.{o}^x׃h^'1#ķHtJX~_Ȕ6r N1b9k^KWfd5E^[d=X RK}ra}fwv ."&<c &N1W&kToJt4"VWU%皙2ɽ.Cؿ7+ZF h K'_72(1Nlɽ<9p q2E ?ӿ9m7{G {è_Q;I ҆o!- /2tIԺC~K{p_WJǷbk>c#3,"%(̛n`ŷC P ±q>Kbl/3{Ek,}Fm:4d^Z?۱ҹx,Wfy܊`<: 7bg tMm #7ʨޯd=uW?Ȃq&t*9R`jl!ͽnJa (NӴ]@2 L#4% x\u+r;K]5HTo2NN΁'c%Ǖ[x+ߦ#j7βo"ɩv¾& ɿ{IZW23ͬq}Vl^dz{gb&]]|s,v^{au"a rAyG֥!mT;g%g:zO(*oэ$-ց"SsI&A.6,sզ9!]j103u+$Dž Ůܕ75qҶn:vMfVԷyKl^V K+Sqj0]:m;gVc/mw_:b~($7 >SY#_;g[4X^f$uQ1%+tvqLC7>Ll$4e&:]-q/nYO$BEkgɼh0;J8r0gud_,;.<*x:̽_NZ8,{h~h nùEW-u;ImL đ=%( DgހS;۷mmUv˩bbӉ;0-2Ε-1UNx~{ex7L:ͷ 1NJ.uMbd(揯 YI#^kzN.vP!-$⊳t$A/_^7ã2[ާ krBppDRyD? T0qR> rHewVNx Dg"^Zr-8MuO .A!_mHm퓌tW~ spzXn kN7,OB7Wę>j TWԵw|'Gj0DPNW*0ml٭b7'%/ ĐeG OџD,=jw;4hI4Nw5jtLH7FIWdZlDrߞu0ziCXk}g/3 {r_=\C!cTD[zj Uri~hjܿi<'+@NciSb!w~dEVɧBP&93?ŘbUҦ /p\Br8) ߨPY$2GF:eMb?_@~~Nm*+oh0^ gYi\׉(Mf ;7k7FB5*;\AUmqȃxN[pYsg˪gj@-QiBټkQJt2K۔~$~J'(Pa1uhh#kCnf2zvqFDx>8*徆8S0,k8\ IdLA O3f]hc%wbQ^YH;UCE)6۷D&:%]ÀquΥQ.3艹jUyFh&ʁD^{<+}!꧛ɵR~ľbrsi>zD R¨EImӊW 5p7d>> 3*ƹݞVhVbc "8V8H@ RE$U$p+3ȤDQ~Pk&Mžl'0qV9&/ qqt)8ķ:*[,cT ec88*D kD9q-{Z;4w[7Ϛ/7t 8ȉpqa[*DR& eu33oM>DrͥchȎBst٨}nWIsݽ˝sLWa<߫Gv%3Q[(9~[RmRq(ns1H<|p8ԒXy.jWP*_wç÷Snߕj!GkF+6rL.}ї L ܅>Ւ۔E?e9 1tny#vQaO$(8 ΉJ<#uɑ~[VMy1Р\Z ﱟ7AjU]*6ih?*q<ѡ? >0璦"sv۵%s UBG!\!X#ED<t <[^`UY^z<$5Ң@ w aJ$xו68J*5[ 7+.X T'1*IE;PVB0-o-yUߩ$5pBA(?L/t@Q,+ʙ_84Ѐċ*t@;봿T kP(zңB }¦KQ:!W>TNTjRIQjo)B9"~as_GU Sp?tu}:pj gG&8eOE'X'_ !{ǿF9Wc 48P$sAa:X5^K=p/pR l"$ vRY"5^hTE,#;`^*^ kiH"Wx)m]?H)\",.{ɡ!(?`;AMS<93L5<_GS򩩪_:}51/ǃǦFT6Bb!1K:87}(5[l<(Ioеn:tV.cqaMj07B̾aM7![`ݨ 3W%@6S2蟬wj䅒3' 8H跋yʛM39Ђ|_1/,VԻ%t@rDM>X޺&;v6!H/d\,ˢo5co Ƌo_*kƙ ě2NώxJ;﯈į"k;қ.LNEF:aٰ#&F15 Q -7Ӷ10w؂>yI;;!FҨn;|>/6ʦ" 1.~&niׯ?ydž{oq1vjO3`S;{`.d-.a;p6o8Y)I+ cll;o#dlq:)@2llKZ`/m1fwDR  PQ/sMjd-7߫ ﴠ-ְ@>ܱ9~廱5@"Wޭ__Ix,P@ЇxG8#@Mn(7axX`# ~!sH7_^`i5팍i,ֻʈ"mtwEe,%yy 7pɨ+JӬ|8C6+rK 5KRPHie!wؖ(SXAKfdJ! 勉Auw.O>CNx + 5L4axYo8a/xB]F;'*a>8bb>ג4\ [-l3v Vg8\fws-?RÌq> ycye ;^=g"kb@Fۚ?$yMQpܥ I "k!K\.gˆq&-GbnsI ql)"mKbQNxJжP@.W!ʼQ(Gj3LDZ8аq,Qm*yD*OάJ^${}bc o82IHpxFFMY|+ԓ /(Evʀv9ꄘ|j঻J /[8r;L;;:53Q΃coH[hw:AqCq+ I?A#aꐇr1^%ۃ`UT߈ ru~ܓҤx#uh^ )(W1?.R(YDZ;[|YRRajo2 Pp}GS:qruuh3W;n|_TEѝmrNC6Bu_&}U߹5U֢xzJ`TGoqlq`zeO{STxc~^< wc;HB['>tZ9];uKPQİͶ&9?9& TxYSCgIPxԶ4,/:0{Ir~(цddC9dCe/G20dBwT oWWTZ[G)_̴B瀍Zyɍ`Y19I`65cRszsT=z-VC8P;3xpɏNY!2zޟ*(~!@%).p$L1ă㩼ZN)ͻ|+_eW2~susp'ǥ*|ceIs Y7%b]ڂPw3Ng?)Qw*Nd*U3 "XUe@M,F\U@xRp,Nt 0Ji7Ӡ 2f֞%Lp]S`s+zYhmWf!H ]cfa 6T0NmXpQ`d8O,8 7"&\H-m<2(@ S|N kIW{;yx#lrk`V~w7S{NԩM ҷD0TvG2<_Y赯7z'V>Hq#G=G^/i'LV[oOFMxI]sfPr] NWYlSo41], Ag*wGv -eTxw*}˹~k, ϾeJ>onIYo}ƫF*3}8Z& `߉;Ok@7vӉF(~G{3q@t[DEz3?Lu @ߋm^U}s(xј,Ye:iDD7~ 򢣩?f!h0h=)}}Nr]dؒ@ fSѭnl]s ҋdʤMJ޹z2;ЀZ]89p&(f x-X;Un?T8H#R /2?6?W: Ip8>1S.*E. H :Ƭv~7/seZ??Ad/3 0PO@qN@v:c!JC9߯`1]T96侃H5/$[{3' 0E33Tct!W@?egؼj!x^RK6ڄ%@Wk$ln/;/еT^Ai?ݦRF90,FTde͕R:gOT<0gwD:tXuOHZgGȥL9$~K?p2{xU'>*)^PQ jL1 _%>*;CCUj1,tĐ"o3[dQ. Q ">4^DAactDQ}-gG WY~:E8V+^BSGYRr ~\{/7#5l9kOo(r{'9f/M=xq[ʠ{z8w;cOu$Hw|cTj1:90لT_y_G<)ՂTkg9Ӟ6zP-?%Jy?Wo4l@ D/#ӘVi=}L bb: 0$FAw`yDZ~ x^JYna>+X+{D=yN5'LE40(U. q^b:TEy'$e?mֆYoL`P !hPv   H9 EENxw+3wr:Aes %؊Z>{H(0~Ed5&?iV;w4ȉoH҃&LRÔk4aߝ=$.,!9}9 >;})]d?ƂGCs5ϟg({%ԷCxеXQ0[|w8 q49"% Ɔj fEi m'<[0vw$IV^k5!:Y+E~w>;t{9mҠr8Ѣ 0coлکAb?!3(_Bb[2]7BJ>pn[xATR<"),>PrfEv:{?\tnFVoڴM:|%p7N {i$qs0-1]HѝԮ]yᣍaZhka ;qDNOf ɬ*C"d yIcVלY>Yqe0fy.S4ǥ~&c ɎITnY*WeyԽ`5/M1WeFHȴ-3GFO{ݤ.-/vZN!@qrE\2{MZZ aխ͈ڄ Oo!]$}d#7O ,rӓɊYAό "3|-9GS2S hVCgJo|0S~W6x;/QӖk#"Pe@pݐ3RLt#_uIdJh#??Wݡ-:(1p;:,>Ϩ:JDEil֔y?;Yk8oj({C4) Ip!1P<^*}8 yf_SD2VcR6[7r _SPetFF8./gik᭣ h Oӥ-SU(=Lw[rǢWs'? @4\̜wmZN*R烲'WMkB~1]h9RL/^b<"f 9.X=-)HaP#nhإ"q`.)*6!LFC=//ό;9 w|X)qXz! O%ͳdTG0-m3eV2MY}$ tC[M 5'Q%bZ6X`{6cٗ;rujbvҗp_ `OŸ tWhA@(y:3k 8ϛ(VJ՝P~W@ixޓrC8}3,qCj>TceD0g{ vm|5k &U{mePК|B2/x,bG{07wְiKj`2_س4OjM8B {,@ $Eզf`i(l]g;Qqѡj@:('o׷A3qV1k9 !m/3=Z DQOjPj_M&c_;<ٽ8g?{} R=4{N}\\t]~ol.ל'?E Kj[m ,-S7R> { Y'Q#KP V,P"ǚ2wH2嫀xfUVu;KPcJt r}!?Vo` nt~#8]h{-ax߹/A{ c/ Ke @:PX_HKe 5"Vf eۨWKtI㦲F)k?j#=NkZp LH (,KM%3؊ >(M9-zQ|9Ax8h4Br6j T1E*sAp8D|h7Ǯ0Ɩ&.PǷ U yGUXp|m&ɩ0#zϵ@CTʁ/1UZw^@>r$wP@)]4[9iG.c52k%k)=ں:qnw֓ mmލT1:|N[W4`` ad5#U&ɳ%0 -qkRFe/sHgBǵ<<_` 3@-IW(,j aFjRWt;oЪܐ8ހEU+Ud9ā3\ĭNV G2mdroq+Yg[W0è* PBx 30I~LAԋ|d"EZ@O_Nސ4Q5:xiS-h:T%z5^ñ7٭!R Q_O>psZnaiҩ13p+75NHEKҁ_sc7sI0WTldeW]rLXt[g6FZ!#H F 5]~P/rnRSO+X&ox׶)Y-4iI1kս*%W7q|p.k6SpvΛgaJe(3kw'6?TBDQ5NZƯ?P;Z~~  Ť &M_;@_ Xc/2qƧJ~Y9Z^'FlNB[Ti"' rktf&h`z@[Dy=aZ"k#Sxڅ$ZNP?lz?h-*V8џDNa8\T``-!" c6y z=f$y ހQ9'(g\ؘ;Pϧ$YWn @O[-Ic=2`3=Wϱra0[_Cz?_89Ϭ"QD9YOj&@z.]6Lu%d GxxqAe?I? }tC2u;<^ i0chW1K%dW~J9ڹy,T`#k;LqHRj<:[K9ѡ7jO(=> G\kF%(~W,m:֘-W~Ey^(:N |4/kT% _?t9@ZKح2 g;Rݭ% Լ\e]ORWc'Vh&]sBٛNOڷJ2|07L"'E,wC>γ=aȐ3?:g6piZbHE:;J'E~>R-IOEVv5Cˆ^[kv\|ja{}*zՆ$=6Μ 1GL|:F],Szux|vQ2EiXhI09N$>qx9~fx1W%zX빜]OB0\oFLbjΏHOXvm;[;ꣿ>p-@+p2@XzyX  J,9Mo-{n!#'CcMsfrǫAZPz躷)ZI15lpT+u)u+\vwXKT1K:hi#@6;1QOzŪ,i^Sq%D&w89EFv7jiIEΉo9-r(W d?;;7v_iPN:k`LnF4evLC')[,`{ 'THi2džQ8OVUO[P5h`Z={ǍLJm.͎%S 7D1 fǼxD0`$Z޵]HO(ӊ=3jE^Ovƺ5nGt9alZa{MC||Ybݒ%f0X J+c /\*OXwu>Oޞs-AR} Whleܷp<^|@mWyJv@#m|MÎQrwوy4>NCޣiJZ9 +M>8|%=EdQa4)>J}kxr*WF`6\ P1R.;~.49c2Uˑ=X~#ץqap41@9@;ugp>rśc4VG.J^GO^,1/~.ɤnOѾNd9j;߷y`~U173܉km5ê@L\ҿ?-BBNʔPKп89s S1꽲,7/WkY1 ;o8Tl8( 0ž8O g{9h^hGd{H9e'UK+P>4yܵ>W C1J' O_zѥ7QY5JUFgDk7kE_:>3np I]՞ZΚxop7A6-Po @y69P5dr@䫟&lˎYn~g%);pIenc?!B&P@|LkzE9zh3l %c .- [OR3;?wV/]_6>={D$N(0n4ԑ 4T:wM"Hy@)8O7AQGd^ -b LPc*_{ qlV@cťyWjQqKbWw a-Bfhȿ 14/ǵ ]Gp_{M# ߢ 8JXv.Y YkXl{DVK8}WEa1؟|7Vu+P;}?"q[hm[D%ivғ3e ?gJŪ|BSq_q'rU~Z fI(i>[- A˪~ƨ++>YgC DnS: ["NGEDy,dRcG,cZZ= 1C~) HX6,nW֩*SdD~UJ/MvQnswpG(Zd4ΐY0x']hZoi@AX?4sl_!|ư.f0_&xba19Bl9n_gx8Po{sv'V'Aw )=w-@EtaUr`Vl{dɜ); "OvaXHr>O3X/kad%Wp|lh~ɂ exiՋ"%PLh( v {$Yq큎HsR*Y#EKDۏ-L( сsGZw`>;ߧBmc9s<RONYl#0&źuۋ+O[9Vf|sI\%~}jߔ"bO*O7o9ՁtB%,Ό5-7T =cɢ2RÉq0B~x} Ա77$ONgY>]7w`rхOivu+ocli^`mf[gy 4Ƒ{0trޝLl~zQPARQ**V(?Iӽ~1kņek7R:)b̓iV[yE9 ĠSvPv݁/5_803G$?쥓_xAWi0 .w܆KL _nFGqO{։Ymd+jm!gx:` _ t)y1ٙɏPT2iw3Il 2l,,s~ƉL R]h!"=E?=xl8Ҵ{)Zc<~?;hmD32!S xlgwpCV\!?(U |kE.E"@(?D  Yދob88k-bUʼnk7ܚ 7;8Ku,fd٭ ~HȬ`Li==Z}]I҂VNp*Ŭ:0[\ rs̔>-c )KwX?0'RROElhq v0!4e_Uמ;I;dzo׭GG)7JiҿEw%N/J@ +[DTaX+ʯ"TTR=*3,,{y\6r7jF8@~Pw $3|Yr_^+e<`n~ n/{ })5yWyѾbcSO܊>L!u?[;{ 3Y5 z0qWxU*nj-ykPAXʥP(I7|GdrR9َ&w$u-0dX<3h"JiCsEC+3 j'Bg8k7FFeJ_/s9dQLo@Bħ$xTQW dQ\.;mN:&mn:1gPɧUbNa.mNFrw#$(Aw(RH?u[ S.X*e#7O>D:h󃃖J߇kki44uT(LtԡwK RC e NSGZHM=,0e܋mE/)v {"r`q6j4;"hyU|v5:"UCxx)RN.XX,؈r;sO~iZl}~gӳ"E2Xs[yF.t $9^qF;9eG<$p=[ 3d89󹣞v@j0k )Ad5zXshV| +)d#ť Z$V?ow҄?iԯ7dplq/ޱגI#H6o"qhf&66(>fBh.+}t(J~`Qڌ,k)ꨒ3Cxd. nZIe16Z4HX,3S;0)tR' _+-.ܞ,L0ag(oHTPUu5XH@a5N[EO oJD6Bj "€lzp$={!r9Lw<~bD x%ztqUhns׎7Wm>&2 M\7iTd49V+o8g(! 7Dl *T|xrHecCpӀ(`C{\Y%W{z/AG*P<ݫq%E},h@X NTЎN8 5fk"UC#:JGii杷%0B]?h`ak`j|0@oA^]ꔉIܰƔ/0Tѕ|ׂ_^~ߣGjVnK>cUuwffds8~Xߚr&DUO57{;{7;֌t@wǹoh76+xl4ĠDz -:}oohwV='gLF[Rw,)f?ԩ(hp#AxgF F1Wf3z8Gcy&H!v*Rk51ҭ~7mZ e-ϣܾ8: |1`pc4<x^j™%~.NM_+RsUT6H1`` ym)JH; !%Jᬌ>bWrBO;@aDb4jĆކY:{A+(\xd-mրqyɀ Rθ-|[lxy-Z0=N:B-s,H吝Ye$c)7Ip; iv~Aqp= Dȿ}?g -Q@k{F,VP=@ߚO 6Rpo HI%2>[h-,|BQnc8ˡq]TG߶B}lQn%^vWD9)9K; ft>-t.*S&sԎ $ 7eT51'ҀS=ZNuO011Ӳs6mGVONieU &~VԘQnq'Q1]m3;(iÛ'eX<¦^,-u2nZ6۳qVB ;S]+ޥTgnDVڠ0?*-ɡe/ 4΍šRY1!c ZWPG OFiE8߷~/c6Hjx._H\bޘ;"P0̤z&׻=G_SG2PndGE IH\2iĥlŷi1gc߈2gZTb`z ޤ(Na`|s@} EՔ{ÛS@:3F=Xq[];/z]PF$^ pe0$4?p~+m;tM='+.ud)DKCfVVPo{:^ z+z=j1ݪaÅ خC J,Q1 -4A^m)H1!hfy`ivGIoV{}T;@N,L`8J܀i`(S{<_P9^hJD CBtSj0QGM]<#i;h[q15W_ŲR0*iљOrfqu23C/1vZϙ=_'9]k.}^c Sd `Ầ}q0.;9zZ}e$'[# $DVjD4&X5AedOTXAnӛĪw$2*+Nvh/kAe5X@c ^CD(q a|lDhԭ0ei[ke V+#z_|ݹᔭG&'5Df |m;%ƹfr{]yVmk4z:TL1dUߒ]:>`pPAiMkҠ#'*8dc XIŨ 9l|kam=Ĝ)px(K+wy:1=Y{6\LOuHhnlSfk|\"=:Zk=@Lu{CsVtxbN&=\ @P;;\;_UEdMWWmPIQ.ӮDp Y?V>,|s.-'Hg;J IzlChλrbf \7yi 1!LH$LPl!`f8>g_?`OR3nKKY怂vDJ:,"-p_J̈́za@WTkCXs{A:DoAw_/LP~vlM٩WZ#OqBo9`Wv#PC({uMZꝨvȾ vĄi*u 8Dw&َ%ޜk=y.Zljc2ssz lxgT#ƥHg@ '@ †No3,lprM~fǭswAP{vʼnS6}A!ߴ:y26_ K" ?+sOh[jn&eL &qGeↁ5+G^+tral>"PuT k0܇ 绽D>NB;T_NSiq'Q җݒ k1Mڤu $mYPg5ȡ| |N{C8<=ax)WG2>Pz/E6n|mq?-6%58Q fq?3٫{'x/s.7C:xc& C]!7FrdF"~5m1 }=XtT8T0< Ş^^KP`uvXqsԨ6V3Jsf(8g@V{Ƣ7Nw/O&mՃFiҰ*ۓ%L֓5e9ur':i&B|"+.,u 1RfJo1lTfqK5ӳj9)HgJݥL)sdEF ſ wsc:f;A-ui?8#AׅREe=73ݣPglg8KLEY-THn ~~ΗXkSLCq<8V2b驚jLQ5i):9`.}:f`OELj5%CYb#9hq (AyU#܆bӜߤܔA҂2SΊ-}⢆Zv C7͸ʹu[ TIs_~1f9b:Y)/M4^aXp2 ftD.pbuc_zPM~<юF F7z0I@r4z]jVfPX}y/x&F:*ʲ;˘~38A'I_X=|O-U=-K}Nu.oĊpb@ƴ9#L`ׁzA:#w9yL1]m3/+tMFRL^גCGf3x&e19_x2ժlF~lmꭀ9ۮ^fD+PŹQ%4'M twIO̳yHÛɪ| < %|buDP)`kS=, )Tw]XWGaiG⬀Ѩs# (ߩ,mPʲ]c u8ځy=[uiT_@'xs/X;R0|94KLkhʃ#׫ѿ1~y)k]\vg.(r ϴ=ݯQ(4f~ĝC%8 Vt~).UFy%3<ۧ6p=e=7(fXG#;~o[Cy(=?>8/<>Bǽ~#yFˎ;P̑J<3xXC,R(⺂+7ܚi|;4Z W@S (9d.L:SCs=_o̊rhygQ^7d̈́2W{]׸X`$VQTCVBSV(aúBmO^5 }ΘmE"âOE6 c/w4.#} 1+2_yTm[N*x*e\IX-K#l1ē8gi7b3s53#r/6%y"%%hTR>*],,>b[80irrS,͗ܕDe^S=`^O";cJw>T X`$NE|l#L6bύJ_ ī=C#&m&Pe%t8ix&~a-0J\0ǟKk U>Cq~c깬ۉd/>ʚ8yS,$$ijX_Lh6G^"d M'OpEd8Q>%xZ^ BF,7.6om_Tg闰FRܾoeHss5+nBꕕG`]_O˗lJrm=$)Pfz[\ԏ!uk-~}Lε=?2ѵ-7ru2 q|)A·6s;p ~<=^+R)1QLuIq+6pOdTP#k3Q}|_Q c..O3# S/6rύG9SE#Գ>ZVlmU(t]`6^sCACycJӘypm xqCt3+kP>%ǹ@Ʃ+79<|_oO*,tgAN谤^9XawȚD0ٸzFvYcΝ{e!Q$x ~so>o6nHxp{cad /+ύwW)Z)vT-S"=3z]V ~>cN_y۸ۣݮ@X`|+)F:o9s;U:&vNS WMɋxˏ'SOMNpH' l  9;) ֑}0rg5-4EǂN} {"F&|X7P)$Vn/M.j&߷:XhZѣ*Jwlݩ% w#-r\O;b%`~J)ފ]tױ밦߿QH!ȉs8ZdNJ-wAj Pa  ޏ rȫV(9[%,PbbAA[o?cVPURʣyԴ ]~ 92"H $ch70U_%Iv)C;֮`>V6qJ C\z\gC[ɕ8mO Oc$A.jt)GlHrF7=2*~IVڳ~.`Hxy9|!k ,?lwdt2&+hƟnw* i w|gd$>InW;C8%(1^84fǙB.Z !s֏gI=BwIWS3d߲nԚ珳wΈ[2 /3e刹)գV$Wm$ ߷T@hh/ =ދ+zsH)n(@!qdh^^O!^4jK_M\a]hx~,et]x;8q河hp S ^k 6b8EZEXf߶^F3s4t3r(o?mfQlCRԴgfH8]L߷ق_99* s!A}G$\F~hGs)zv+d6RSu7) Z?[Vg_?g?ϟ|r1]voO/a?;[2tjv{ͯ0.5ic$dWEDgrp^lKOYKup:٧1 VQ^q[H\TWΦA*tH 7(=GRhaB_'ˍH‚ /C3(]K))WlI[+Q%>k *:YmZbF7f`\8VҨNNWVs6\4}mk/ʠe5qCzD0k}:<ߘMrt +ٳ*joFI~?P'DQ1 @]]'Z,V gMɹ_C-e54>u%Fd_] |hell0ߟWBƤApO;HS-|@a4^N:(4M0e 5SErHmc9xizNYCJޮ jVD8P1,jJsƼ'Ud oަz$#UΉo P[']G"tRF0cNO]ab<2Bg9. sa1STh*i'7WJ$o:3(jjt5 ! i"0^?Ԯܓݣp_[]B4kJPPn;,X~Dx({`IꃰWg|. xbkǼj/g{ ZܽrU. CqDe0MX(/˘ԾxBx⣋ (Mfۆ;ț IPRZ9/Gbf۞,f86'Dy6%{H9 )`J֍?ܝ/y9@v˪PFćWuy0^׳W)aBKEwΡ OF01:a/Bϯ8hG*4APa/#,tohbO a?k-`2W6Gos_űMtk0ɝ/}u}+ΐ.)LgBI|AgU%RS%c$qr|Ng|J8Td8^=?ri.Kbhdߌwf\ivg2. b jSo'@^߄1{Ҝ<Ҏp8b߬DqpBȉ^ : DLGGs #nX<sd9,w ukAzSgju\ǥCˮJo(7=@?iI;@&$Usݡf-VRz<4bm=)fFlO;G̾٣It%eTnc!%#pY#l 㓝; m wp8C嫯dEU;gS[oh-q@O_s9VL]u1+cؼ̐ ޡԈ Yukew-z驦ftEӲt*ŋFZi:ꛬ~ڊ*mn ScY^X_[pRƤzKTaU.hX,_X>dΛ:Wi֓{YN:ƴ+41Mbrao QLECcĝ]pjzKP% 2TӚ|nk10x/˭kE—MF}"5xicEs2!S RbĀ8H=dZ wxWyb_\@8tXIQ6!ug `H0$ܴr=bgCV7_QcXVI'{s<'pE~8L% p#jq^^b$7_4Sy#_}ZpX7T~J9VA u`/Pf:Ϻao3+ZAԺiCP4ml+Ⳋ٩Ť}s^GPJ+ڃyǢ9*{{ @:b1E2Jtosy@۫2Q"rsfGNoRFMߦߢWvu'_nYOY'([*)@3H ֺ[1[{RDMI"&?toL myV+@?+۾@pmA.DО:OYɖd;c/>gC9a2CyP{CGF^Xݛi$Y ` 撔 ~O*0Z)1AY9 e2OM\r0 lG\ /}%Skd@(BspP 9Mxe`^]A4Jc'C#A8<" qlԇ/5Aq?xMP CD;Vxg$nNy[l{ %gF4gk[$M/m? >^܃_J;.m; b쩌&{$b?2NS}2zorAk_<$ak}\ 9k6Bo {!(Ǚe"?ZIeyBW@Jʼ Ik5,Cfϩq1= J$Aobz -Ԅ{o7gDk$(d' AGkZ) ҝΐ(vn]EvqXz {&vHi~ɯC-vF9f z K=@b]"c'/nlH<*GF|@CyZax1Ȯw>kYY. lHU4`F-ʛ{yy<4I]?Jo%Fp(`B_cOOz,YswDB N9lFeCzCؤV+6fޣ{Pl"[){:[hh4jϭ"њćZ+:#S)0}4\ {(sRjÜ &z;xk"{ Du^叾}<#2O_[':9Ml%9:T3eu}VC&~+&A%q/c]C(d Hc8L"8ؙ=ɕϹ-oֲmX֍`XWh9v IM:e9 L ŎLOӛnpe^t`g{s*5)2_O,˶$.Ϙ dQrOz]-?8>j dޛ9@T4> DBo#i۴Oqdړa.N3xt9?@z#1>v]\??a` Ʃ=2Zd ]A/H#i {VgOUN^zhCh^85qIqm9mivUkWo.JFj5iޣǨBv: S`mKIF6/r#!.ޠblNM0w;MD$E>ٗ!HU=EE/^ekkPvmXEpRá%x_dFIStY߀Ȣ$n~ZEi. ӿܻ,D\2Vd a+tAYf֓m~ȿ}+X7h76)YwN\uL;p+Z!XTȘ+th22719x#̸FyC{'dd6`ņT Ud%s:Jjt<c{s7-Ue4A|2s@u~1N\K7˄d8-[u.;#e6%\gn{4~Qsh\fXMx$MM n(b,``Mj'Dzh# (Syl"_~@ѕ : >pbY<_7Hpƿ;=-W4h]ڇ/ňDnKMFtu``ȈFpp蠴 ɹP, AM,pu:K%p j7p"1,g@A>R ܩ > `h0ipy8cO4~-:rsmyJ{)!/0' oN"`?Ta N"ɒitZ^̓ Txtl=Y2NaQ"VVIcr5X.(4V )<\y͈rU:3&AEq!g~@K~RGy3^f4mIfՊҝbNU{sCcnvgCh09 Ytci\TgƮx]ſkr[?.3(2=ʈ} c[֏`Vv{h֥y-fnh<՘?Հ#ctxbkzv^ףrul!zUճ"hVhFVVc,feET 4yΌFw_}: 9;Wwұ&R>.oV3UJNO=0c؏A{jHhM>T._EBG Iz E>t Du [1'-v$a>G,mL>Y-b!T]֞nWmNRԩFY4ϼt 9+vh PD A@ hfEì%z!T:RGZ٭icZh3e'D@uy`#e"[)T˰nqg'0ڢHQ(x¯wEr=q(IvƁhypIL@Wqz2n\~y 3ow; 9\ǬhpEkȢsө&Na䔹o}}\k7kA2Y4XcAe"iãlF[| V*ω){nrZמ5#ag-5;W~?YsgbF]Y[ĖG* Ƿl}7Sa_':x2~ٶ֞p}Ux/6U9t'=$pr>›0E4x4M|WsΊ a=xe,f\A7]y'$,1꒾zXݔ .)?.ON̨ߨLX+C] Wv#)tPLx O-@LQ$QCT\xuv d_>p:V:Ȫs)74mb둹ܻ32ĒrL{~FPPyl5j:>֙3P mC/U!*iޘulxU%'&X!vO=Nj[@IHۉ)8`|ߐy_8(rxhڏeʊ_Ω),mPZ׿S;ee9g,>NI$hM\`(kJū7BSyXܢ{L"p=r4Cwĩ{,G)CgE ee]Rg̉`2~{W rF=sv ̣SuSO$)~/}ZfO?__Aę?Ԉ!/Sj򞵴v>@RʛQ  N'mMޘ tRkt^MG$}H̗ܡȫsDi粫/vKxǘ-6{>]2¸KjǢN~v+cYtsvIت9uprMžp/'W~~1Q*Q+}Mf4,h<~f;L SOa[ǵVV9?<B('|(9\n,d=+/3KGX{{:Sӟ{3O^O.x;NR-u>KQJ==ϩJB0ӳ̴VTav )PLLdő"hvV&\<} {*WO}Aԓg\#y^,I3 *yxu(=9[¸;Ɉ+u{<7Nώ7}V9X۠T"ݻ.q?nhQS|ulv%MH:i/!1y(QE2S>O(8eB^' BœGQ9QëDz"1[+lLݩVLA$ǃl@=NKr[=[#th$.l󶱗yb%31B.7d?u yԒX{6}m69$f2;^2o3pt(,vXnzXzʻ XZ _@y,a@ƒ]'9 ܠ;Vsgp߭4Ê|!&>Ū}i3~z3 \D,F/a{F|c#Xnج Y|ZOXOףQ@eh/%UzB**B=pp`P@0 0DDDDG#xBi f&&B&%%;b4 {DDGh"D"@#D ,A,HD@D8G`"# u:a ?fҢ BfiˍTֆn7l th&+nzUfS6!}ө?eG)Zb+[JE R~Áppw0, 4O 8}tqXy!M]=ڝq0gK,8{VQDK#qmT,<|ʯ6Ӳ¡ntAAt#*ȯ|)om+ā:\8760d:t(k5OQ a-y~m/F"*-€A;-0n#gb^ܣ:G=f$3->٘d/ S՛5kٖizA-(FT 2܈C%3\W%)V0Y]X BXc&+4eidoMqfiQH!sI^,cO+oX D֒X[^3#K)coC7TvHa(͒~p8]3󩨹ܐ?7#ֹ|+cHK5uߝOo ao|kHKCCk.g~-熥#k0Ł2bkҴ zb?E~w@ǐL34|"6B8,<Қ: {X7#7~1೥1t@Oo\>`ڴDy|Ma EFߗդݬD[  \86tLp8V2L䢴aSt^ )`^%di_x&PlfW64 &|h?X5@/lխOqђߌ? ctdǚu|GLvg,$x;Dq&bw'"DrrG퇄 HҶ@+|?C]؃DA\]n) N]qKKzAV* Uhә)Ig{M~ٸ" `vܳƪ)7"kL!9Y u_8LZϘ;{}Qgb>Z͗ ]~:i?"/')s&% iЍczΥ) u=;hZxh/9d6b5薷ݲ˜%bHoyɑoG6w)]Q=W맷i@;r^al8JUHVMDp3>1,#a &4qF`AýGyAt)5h@jSY Ư/%!)=ogsWӎh]x4:=cPB n|K&l黤A3F|Imnu| Nt}M3?m,w3Vj@!?jPa$E{ oyԆ4tjcћk2sč@k?z_w[b[^vSX_UMmo3;_gWjJ0Ml5D?FD;Qp^w5Z)鯁:JDKgVET:p4RTJCvBL%:~} F/?j7tbERࡱ'O~T˹|HLȓCߘ!$r*4s\׍T-T#9sN>Z,p#5ՋJӳ ZHN*ϩn-Ej2εfk\(5y3fЩ jcoa?WʀWq%Ap)Nd[<MNƧ̬"ןwg\hV6nF~y REn%;W;ܜn @㮤Jk91!2qm` ?:G#d?:B'Hbl c'Kss ɖPt[0FKƹWK.lg/y65`A3 H}@q[iW* +:1Ãk[We@xڞoQG/ͦ{r^6ه;}[p4, kۻ$6I)s-wM{`um^sp縍-pfp2QD>LەuՖcx$_tk./1֟aq|PUn`SI|)5.cR/ZZG17 u޵eW-2 J sKg̯tIk0 L+`ω ZQ80_P@ȚylTOI>^<$ܣ{4-)dWԃ/c5NX8ə0Ӆ`L/iR"wJzȅђjRhs6xÞC"Go<\5=2,Pc56Z+aJ?ƿ ʚ6D: %6Ċ=1<*Kr;Z8I,lQ6so oraojk\)ov%N#ΨS]C~4wuj2QdJSJOn2v(i>0ؒ:HYױn0䚹P5DA5㼊5Lmd7K|2'Bb&w 7fž[Q}k==z6t@.TU3 +L@K=}e Ō:߷o_1pٱ_v֛>"B ߙ̄k.;K\XHݤd C ٜnX ($=iC:b5 S%@rz}!{L> f(oܕbfwarbDt6}郸@mO'U5 X ~9l~ >^OL`SZeJ]ޛxn#F|0O oGXp,%E#kG I0~i) _TZoȃv~ju@ѻ @EK O"]+^D*l3%xTdGJ؞kpe*`d@WEKsjK"bJalAQ_[[I<0Xӕq q^M/0_2$kO Iu>ܙjǮ3یmc4sߦy?8ݿxY $HZ^fbpc1)kx;TKzbpu2H+#:P#3s5`9׀%GFdqyz$W'#~.fw>WQI2ru/i]:'eb_lư$`*$<\ʜa{vٓ g*=}y,8X,f8[7 ϡ0 q]0;9Ѿض^9i: z  =5U!mߋen!<G.\E꽀K.K_&r%6͓s%Om|=TCFW-*^fx4N;x +51%/ou< L:`-&YlrٕhR2GunqZ1\(!"m5u1N)yY6FQ.l~W(ܫ_Z Yl׫I7bJH={$Hd7Ȩ a Nz+%-^="};2 Fw-Z-‰lPsFyD'yxPJ1ʀFzދJHZDo>Slg7q}Nqz>`9Â[^ 0e_u }~#2Ewфj=A:O8ݲTRgKЫ|^Ƃ%{ 8ҵ~p:U}vw4>Q6jR 7zq7R6։&g.K*țQgQӪwˉ8oCUZN7g4>Jq=D;}1`Y>+z79WG ]^4G ZZkA39HT/^zUjl}v7 B(ٓyo%ӕ #uTuzٮٻ@}, oaR*sѯFcղA \P[{(gPkp?' HDkh# 7,~A?[_cgʪhA{BۮO +G2\_kS~ʟx>\.waA0#Hd'x^`ԝf-mh=UhX5a8{,q mOɑ#DF6$ċ k;%B14n" +/Hc_Df'R;Q\Z Jy0{rn`t*m,43.|ru~0~m-lViGwܤ GߥtISlTjcоecbzh>a"bXcQsbKf&k@|ܕ)'=w%9]LϰhiQa(e z,ہCw\$u*UrxUsz$f\qo0@|jl5].PWV CMo7XBkHMv"^ pan7ގQ ;gS%+8>-3dK񓺽ap}CbZ=·n6$Y6s$P };:ގ 'O!mA|(1?BBjF]?!M_TpK$08dH{NiWx/+33_`lᬫ!_^2y{r<yynhowѓ3&1Ab]sՍn}Zxω-]c ^@NHYF<3~/z[Ns;M6p`!KOD9XS,p%7HF7'2Y2P|~W/!R To%H,Wt0bzwJ9MGتrFDRL>&f/ FiK8H'rWM1Hm9 ! ͐/War 0>*/J 4MI|"DM)7FPPT s8+/^TSFXZ^klX78V,HLq LP2KƁ) EZ0rTyY݊s {wLanQ|(|dL*5n)wKpl 9bEў*2{#\m3'0SX52Ŋ aۑeJg!HAlMPV#xG0kբ{XI@~}(}#n`gy54[_-lb$T %ܶH  ;<z>RQ8W.vtgP{/(\UKQ+}qzX qtYG Y5X4\;M"[yFnrqэ@Oly\&`"p(UNfD8L DK9m|%l d Oxmq%b7BLPq n$[A!Ottٵ6LCkR|̸4ڰN×jm_6)_wvOv_[:6۳ mMN{ioTꏇ;w_bȶp+Jt@IŃVyOtaYXXs>i6Ll)9g٘ 6}W$7+VPIv"v @b$]uHW^L* ϦtqJ2%1/4̯9@TM_)|< nc6l6]R O] 7W3JO7t 21OT !f` dRִϏqT _}f5qag^GDZl烮*'`_kֈŅRpŇHK 7\rۡk~9z~G2ݯGh&QeҚcA<{]n+ ǹ$)-B?gvYQ*DJ̈́ƈ0pW=3kqė,L9%9JtIP"ĀfӗŠYU8[~_K-$K#uM\-љu-Kqv C ?d3ĎA$=N?ML)Z ^\%Pq%iʥO`][8K#Mڜ,:_&  @Qe=iO6%V 渚3Bo"TAx~mg00M4 ī?|ai Uh;SĒX9=[J)̽Pqjv uu*B@bⷓ ldkXνydcj U\qܱ.SHFWyvSAMCa7x2OfZ4R3C9.YɌ%^tm:nu/絮P B/s:u;a?rcJuuShGr)bVyuX8Yz䩐 EΒ}@t=)XAARsE%bӒ޾ؐOC!bb{+ yPbwPi|pWQBw0$c)K<|-4o`YKWXîSu3 Em":N5^b/0TR@+,,OLؙAЄBJ!JJ!B!(J)JRJJ!B!BP!(J!(BP!)BP% BB(JR!(B(JR!JB!J%(BBR%(BR!J!BP BP%(BB9r`r@p#T2/wHyzAp\CL$Qx9ʼng^`gM7;y w> $%>__$84 /62Pxv_nԞsrnH3t-|o%5&̘Zt3[3Hp+кI^Jly])[~6W^NkIks\.}t%w)Z"Keeҵ65q.2Rˬ}>=kC/{|w gGԉugJj Ijhxߪ8#2ZҞZtD z3=עWvHa(jctx˴oΗ!~Y3hsin0eJO/[\4Gx;q`YjaH]*ӁBWcoq~B{7GkqtYr)ITSo Q:?rK(`pd{}t1G\ZѬ2kƄθGWlGX]|nt `>8U" U},<*#&=~bIqimcm7$m5aevLY"s3ӕxo,|t?Ox>7$ҷ%=Qbx·ךx2()Q;Q2q1Y#={(eλaoTy=lCVIy6H~#1"S'^K<*mTmt{ 9>#eFF]9aϞ*lZ}N'R*guiZH)E$v%)Xc8GZ%kG;ιJkQK_# 7˯,\QVI hJ9 3Ac,C3' 26jy#Pdz0^q뫡q>Io~->kA6p|B!|R^R >#?y䡞15T>ǦPӜ¡ΩāaY8vOCn=GQ>WY nlHFdEį>:͉0\ Z3̭=vT (`Mۂ ]9,7{ﮭ v%: /-Qt*B{>u:ẘ'jEaqSXS܎mt eq97]${zpӁ#z:noUA+YC÷#9>0)r r3nTKvv^X/rg1.K=\}qrFfW+Y/uth*MET)Z4KVi$E[ͼB6cV#aд-nW)n좧(~@ݪ>Wi=/ƏN8Q_?b[ p; DApߢ'M+Q|XeUj\Y4-FW5% )O5—SSWËdzW ?$ ]6B~Qi5k? yA o^vT ' {V*u&ƒ:ŢT_HV.:HAû[ڮ4(r@0F3z.޲{;ٜ<]_߶sҐoh ΊnsPx[H$„TILB}E澋a &8Q˜%HhЈ?HtxHM+H_ɜۢT BJsI@;ziC @lX&cߢ*2<4&l3Kk\odݡ>q7v͡@HAc[bfuώqogs-{u(G&{iCӞp⹅h, auOE;:l6x_=ٴ™2#,.3(U}y"̹?ϝ?6$]}%%}f%upjXUX9.G;4%m.u8 $0҂b8u=ƚaj_g}P? %g>uq}y<LdL=ώN6*Hןj.yu~YK^!Kb٪5=ȺK {eZwZ69oiž+ϑZ2e:],- .ﵰ݇&B:p8TF ݹ" SB 9Ӫ&u&[ |lƑ;PB y2hEŎ{I&|if)Ml3VZXb̨9]K) c΅VaE0)X9AEܓoQ( XM#L?L ݅CSo$_'!~L|1sZ/r>UÌ#+H獦؛8 sj+z4HS=&v/Mɫ1<3i{p&҈*簨#ˣQd31O91>Z_]A7̹׆y[ H!ws!}V ʟyWhMUЉ'}W+י"m4ogVֈ)į\ j/r$ۆ<oTbe贳0 Tu]'ANi꺟+سX*0ww0NlҶ|MVJ/CPN@{v<ó gk@?Nj$Zyy[ùJ~~P1T0~:͊۹bͻ-8=@zkGK8d:&b0jb$^4pG 2dMp6ӕJh:mT٥~{W ; ,,_[jTAk8_"ht}bJ ޢK3w@,6g˳<)[]f4h\k}ęqIoVyϷ>slQR8bl;2^tĹoy8gkIc%}bQk5x -g0!Jﬕ3ҭB˙?XSgE\f<>'mHM7o^{8,ߙ8&( X𕖝ӎ}]/p7 W.}OD]\ޠ`D>ihiqǟ^|Ɲ pXX0*V`[8*_ĵ~,x[/|ִCj9iL d:hi EpTl;_]$kץWGR8x^QG{S'Խd'JmE( 77b3M- g4UoLAxL|# āEQqySJ6SQA,2}BԷq^#mp4OZ5e=lynj~4M=w@0SylMQvV8ėajHҮusyc]&_i<^_eyfqۙ/7?޿ς$*6]όÇ0xy$Nu$JkHvHJе =i{w6oUKʨDZr$SKxԲ lqnlD]:rk%Z|.g,{ΙzzCT}3`[СԷ'Zs<6*΍:sR\ȷkVZurGA Tl-Wn=]tɰ~Y˹䬯jC:$v(d 6m[F`1"PU7lqϋFqt!}x}mf>d|m|\\<ЦHkۧǟ_7;F3(TyiwG&v%Y+#5=uo n*VX/qDǎ8WX~s{Sr`}Od|ԟ0J,WbouبgFqBz f ϙPGڇiq |lg/"|D:_ិU7M6bVrifSHWY.{{y:U\K\)S? ϳ6ߖ121 iςJ(iK|V jC9ck2;De|Z8s-oH6O_,Qd3MkO۳9=d ~Y-<&oM$}Y:R}t)ôf6 ~Zw+3~\%U\~(N5v?w L9vtR'{إ &ދÏu[8w 2@|ݶu<%8'wW 2yw>x$k( cJHZye-2,!VS$?U_e :rŖmm'b jv*5 :X-E.g7df=t]]9!6=+pp΢mPo$9 5qߞo M:?l B?wc`ɰW3!3fo(n{LE8mT*V֎!l@ M9c' r/3%&ǒ?XKCj84n F8hjay2sgmM/Qz:ʵ(l)*I1 d0&4i>q9_8%=_1#˂kMOK(2fn͖+~n77;is(UBk øRNW4o~%=˖MWtvlR3jg1T-3+?2it5EyB0#өy ,ۉMTd.#r$E ʭ/CoL՛狈x>g, X|~0x698W5qɼR ,wD瀮'zaRUGi#/īs j?=rⴙֲtda!LS5t$}6~ ycХtiDvgXйp@܄7璿ZNu(uӔ xޖ0)юo}>m, 1}G n_X*>w<v )-k*pwK!HuZB'[@YI7<(_!65yݷy+iUl'\ɛ6SQ;>l;bZ}FןAMsZ(Xj_xlBXW7y͢ wT>Rw,F~3="*ҷxZ7IiO0b;'G9p2ytuI_.?ul([S8Gs% 3L= nsts>؁v-5XP.#3lHӕd~EE q0xE[F˳Ǽ_LL^EGԵjzw@ўzi,j]"'}=c%lq ED_vYV51 HȅQ§D[ *>:hFՐܐ'<-8^慃ú&KWzP5LlƁ+L>Qyunٕ(͸#[>TR꯷Gͽ>b7 憫VbF &V>ЛunoJhƒ7u-jS8|>c1x^H48pft}r{*(ldJ6fxQxA޶P5%wJks@oc7pwP;SMWoDuuBgegاj)1\ჯ]9Lm y[fMEpl  a"zTH(iZDkJ^KfưMEofwPe[{fIIkr7<8VxAi?ፅ/\ xi61z!F(Ir.YT< fseVY,~ٌ*+"=t2H5G1G51[EƖ2sZӀKlNx'aΐGlJѲ"M%94YcCGCf\bH aD Lg,o )2v];9L3Vp46R_.B e4*NuIFm1el_n[~w>/O 3mϰhw!0Xgk]oξPuujPlxv?] CZkLLX]"i-;{usȨ"b.[Xx#TDAbyL(cwWclPvʦ~>YkO?d##]mg1ہ S<˽̪ƞ5G@B6sjZ ~0*jRMMBODtrFIHTi3mo-p PPzT3J[Qz/r+n*StTz/C\%o MF7ϟr ِ 5B-rFhEV[Ke9O%SeZvv_:Omn/;Q sButkj}[}IouG^v9މ闼ʗ}8}K2E sD F8lċdu;Րȋ2LC)j'RyHvNn` va-<-!sh۴xKkkk$QP5qtvDƇYɊjLn\<U;:jhC!ԍ=N̻Ys_y VZ&yNO &}].==$*'O3hJr4uB=[ l~V#1GܙY Q fbrc|tX׽Cq :~S hA:'p!# (5}h32}U- &)?WL3M)nJzjgf Nn>) YWִeĪl PJ肧qv@wֆ NOѫxĘ9ly>pI96gKNW; 2;:_XqcR-S :Vg hb3}~uV& sRǰwky7]w}Vq4#QhdngqC^PsP6?eB]͙>`+H3Q*@#uhd'[_b{IvȵrG#6Sl;|IB6 @TRA*b,,й1 &!=CnOpHbpE5ŏGv<>(D4zvE# B9oAYJ͛OA_AiXߞ2?OCg,<-ɮ_A@?kc0rkP7'QQ̬L!f[@ϥ떋_gg KPgF:_.N8< ÃL ?;;es4UIzroa!ER&my:' koq"Yw1$NLKy򻱛|~#pL QDzsʜ @H6BGX$b'9VWN5Zzv3+EfLMGE35x?]. ]Z)5|P~\i~sԐVr _MU]YLRAHٴ@-ֿ"t)V/Y]jϜ{QmO3e$xJ]P2#NC$|Pl24\0aOvSU0iD~,lpכ1Oz;a6O~ M}*KZWz5-EsBiM|5e=[stm5E󄖦IN75>͓N7mZ?|BPJc|*h2ȧ/Y\{6qgS{ƜiP22<#TQR΋<v=xpu:d8?s&d˦'U|:j_،~̙3LfƸ":Y"EiJldZ!Tsue[S_#vMZqVwιO6}=%6aP 3/lm4ɜg,P;^$Ɯ[hkTz$ hhdUإmkpl+ЀauH(p }y6E6ƮKGE`lB"Y"f *{~"^dxggt4;doPd<3;Ko~NUg 1Uqwk6b3jtiU8nv$4w߄E\x-0`qTM,0M-wS86l' mX^AJS$˶ ^zs]3JqIx흲?0re b__R'C]ZڽcձGbt%0|vIVLZ"֝GؿQL3 ݫ&'.yS(l;B5*p5ukgTOvdDWfP>)pNb,MVtp!y3vad0{n! $EH0S2  ;)V1+1ƄFŏ!Gvip lɸ2y7;,͜e.>Î}'a5L-23TR>7w7ɸE-ȉ^6>rk|kƟQkk~b-7Ԝ /`T3QTHNG#¸у[A@o%e.C 'B1#?;ie-=Y_M]Œ*}8B4S迾}=Zҕc[{qiၐtg,8.ۀwgڢ f=4/wȷKwMXu^#} ~fцQF~6 a58a&l42it|/t5Ko?fKQV!_(X~Q\m1u+Ÿ@PEQSX ф\C.(n`E{5Zݼ1CF zkEF!sI(P›]Vj ׫_cz`)~)Z`1(  dFwiws{mnØ)}]> `WZ88W2]Xl[ [\}YE^4 E9"q5B Mp]I,) eNpZ\?~<;cOKK> HFX5p}δe2X,披osf>uDb-#`Ǭs`y%1WꪉJ$|EIװ1$շ> :7Lo)_G5GaBOc'.Nug7H-y A흍鶾WxLWr>CźAX*\<6 }9H~ħ5ʡ\ _ß_ļZ{y}9ƣL}3X|#?_l'"<PT=/5lۇI?^3:أ^((_X`AD :Vc. Mof")W]2q0|׮|OClTBSѰ jy5Hb u1d={ͬC@E)mP)F2APr[Cld@$/#{5.Ҷh|[ŽJDŰTݵfLZUœ IDTV|hi%eL_7.CzBHr*m5=U}#J9q nO/șg?*l0#L%d|i=of$rh~S\|ߗ:ʱ^ $S棷6mMC-BnXhFL/769ֈ.@a*0~_+>?Q8:modkkpކ>ɢSNfz;/TgmC= zt$b_.^jݩ0.MRVtWFC+t`dNv|IEso~`420Hiʩ=b;:n'bR4N~KMliZ%;xhܽ 9&F(^կsYh{GPuI)=.#|o^]K.~΄Gԫ"nkkȣ;Bl h7I%ߴi ?_nr헚.)~UjfRT;UHp4ޅ=B>NzE(.uHt.GkCXyE!b)T}yD2LN4zlN ùv\k> ;fSV~jtݞֹcwjy9b+@D9 ٹT~}h'$3˧=Q_H9Gւ$3Hj^5*F;ڛGjo$y9SdH>6N 2|S88j?xGu$"?wzr:'W}<г(CDH|LWR}:Y}(3-.뽉anǘt\8`OSWr'a Lm.!gD70Ǯ}9ek94=<.#;^ﮠ=45`-H_QB:;UVVbeN怿>?ē7sMjbt/a񴏵LUTeX$HQUm<](WBmΡK̥ky 878.Fu&ҵƞv*jK/-aQ]h%?-9₊uYínlxvpl;F)QK=kPz=]'w:u;gH+X)\}= ZO|˚J{.2]'Hjsz&Ldo8DyUUDCH Q}Va։ !Jk?v*~c\}eyo`1*x{ OYrn_gGےwճ^:ʜh\Wu2P)=7X$G^:nE'Qvwo76会7S-$4=4GRgJeŹ\_|3nȋXMQ9M[U!6\$p&!G55 Wv/l7h0zc|챹]~s$3=$X!ܚ7/;*ίLIHAjh{W!㪁P{G~%wWZdk9 &**תA} Sn6Gul`++we퇃&Ca$3 ۞Xt[RB6APr5 #" %/tW| BхoiD1"JY *\Wl gٔAkZDvq3Ǒl> ff*NmԦi,KwmYF>-"Kr}h_yV$tYiJ<|FLz>w`~U{_݊5W\9clւ3~ϮQU^6~_斓BfjZ$8{vW{)=DPB`M0CAp d#D7ТQ_$ӵ9-~>!CKT~\.l]'Q`~6~y--#[_D1QOFҨV7P98hpX;p, +s?T9} W龨KZ' >k=gŬn"}vgt(; eZ0f+DڂGGuf+\+RY{c^vRsY渇@K]#<'XWb{ `;Y}u)%Ti9 ̕!i.2yPV2\K2Xz7w̠@i׾ 9u% o|Iܨ)o {Їdq;qq\>#[R ۝ݴAQhq+L{s^T~Di@E)76$,05 GhtGou|==Ǽ+ /AѶz!3g>|6"FoJ:>e%L]ډO㜻/׍:ՊIG s/jk)9Kw=Vi؞w6HMwNk波$.V-ܻ&oTZn}0A?!o6`|.?KQꤑ_APh-ZC ̃)pYkmr5jmn0pO7>_M~\\{Gr;zoV}?$ >mW?k\y[z8Jl;z:U>g G<<7?pU8Lӡ !8 2'D6>cQmr|6UyJxKƠ2ۄppܡa‡`2ߙ))$٘_TWK@cSrPj0U8MJ=#Uz:>8>amG3l_#ge/STwkEB;>^Em3cCH]>1pvHb?g~iweYrb%b( y-ooNg"9]"3,kY(-(nz\Gg) epHO(؟S/Ԗ =?g^_6N@=fGeo*n _& x.cX`?`uH(?,'$?jpŸW[z.#=wytbWnkWH>3E|f}OjL"y]7Fm#?h^||D[ β] \`;CBo`kn`\;d3OxSgB80004:X^zrP5Ao^XcoVz  ᤂ;sߙ,"H0qU4'ߝ^_c_$Q,<ˆ{+]Xzz2<il=p%/.&ikEOM=L|\eϨ Ƥ!ݒw &-0HM޸c[gUMYP|Jfr`iy9{$^A.i}s`$>xT"NAKc>ⴑKN~WGG6em%uΆTo|ZLߜ‘Yц?'4=a{ea Vʅ{7%ͳi~DwaOFہefi:=~?xS4Q mk 5 Ai׾yPr޹NayAKTe B80Dt}TM/qBO-Ď>vb9,ں2[EeS"8ۤ}dB{\Y=[,E6ɤѫZ,VhҐk=c w4?F!7}*[ m "y="6,Hg$B󾄡\`!:zLL}ξ4FI[Rx>HTJ3NK`.TLl_~=~3rlG`a^)h3Fn5Ѷ \^ߗ !/j[< h쭞tWF=[XFKs|yzH%M.Iɜ eЀ6C7k=6#%xZ ?#Lqal& kPk7S,qҺ"LF]{֘ P;}-wpdH:}}|WS%h{Lv8:RR'|Ω)Uҩbt{gMsz?:M ^&+ Yܤ$bYZZ}Kry? a }6wHTUT3*粎@4k tǠM? '/ir8B[; p-%c$hھW h |RVNJön-,ԱWis3<Z0z-x§b hO p=rVfqhDF}J(1zy@xN,k^ ]o*Ht'\|,J@[fxt)`{@XC~x݌hEd(6'YOyQ3[כ\TRB(*y,'T 6?,=0 B%>,ݩ/O>FJ=|,t̹t =P9BMH~1MqwWyb$Jja`f78j5¯L(sc<΅ƠaPb|22QuxAAy`my^K`rDtt,(#͂>Ιx8޳UU_K4 F\)z$uxtBc2QW{>6:;܁AEy'Vpz2U_Famɏm*1 EJyG=S>k)HƢڄL4n(Ź߸m4z4dOBY ^Al&PGqʀ7,8P8$: +mDuaӢ!тS *\IElv )g+;vԗru*cf9̯MY8"^cv]v89|bDj <# 9+\iiL!;w>a0 A#Y&qWy~ī $P[4fȯx+cWg /Kk Wp?aAd܉d_dP/ oM~7^Y7iؖ*#BScUAHߕ \yg _;-A{ MWLe^HG_dՔ%16 ₤?+~YPZ=' ^ێ)/ƒBF/_FGjǑ0{ؤ#&{EjVnfw{}/<oƠ^jJ)R~4LM6|<}yVh5#̄W&Ηr39^Ї|{1ܿQ5w45MTJ'Qsh<5~]kK!X}ET5%{5Z1E|/5xmtrR%bS9d9%as B2)Mm,7|rX4n\1Z}mMv/d+B|" E=d69'Ff0Z'>Oo,4o_b?^F\U\.Y= goƏfua&xp45o>8"Dr9jmy0VKlY0-HB B.{E>wE0*-ef`(b?!nAy8__ŁNԠaO3#1ƽ!X~ʦ`;/?KݵFNE"xЅd W78g,4a=o9r†*R ѫBKQ6 L sOz/t32\| í#E~9~4΀FL\s$>G e@(QCCf~zIdC  >T7v"EKn '9{6qe[虡4Y9a1p6@w;CwPz|n^?BB:6$bulSG΃5WIvopɮ4`1@nõw'gJf$'C ,n $. ;7XOyU'6[qnt7F5]vhhlI᮷:+o[ΛrЃ5u~9އU{uGMyML%-HIp@=ŋ/{e2|K)~ BȰw=E@- Mή`-.iږ6 %gqD8n|{8^|;oB>юYsF;rGfa!Ichl7$bPoeayxpGDtmg㝺\Encp [ 4Xޏ[ur.]&d.S<>YGyu:[483*~T k0t>/Qӵ?uY9b\#r]H}oV?e8鮶8%3xjŽTOS%-"P#Y&!~B $H~|y0})g|#fT2m N#^u 9N4 oQ4OkIHd,J7f ]6npc4c_Rsk+~!a(yoԺgQXZ/@ORl@VN?L&׸!1ZC0\55np N+_/70FWy:ƅ S@~WKx#F/1Bd>E#Ry%S`_j$ce%O=5H7 tF]yx8ˬR!DZT?% bUB5/kfk&WKM)жJum7➩.|ݣng~hgjgE\`HD3֡L+SKb5 #A_8)Z(aFܱ*i<F\<ͽW4޾_L-ҬBͷ9H{'SJ淝߹Y},r_+!#u*pEA);4HWn[7 0Ƽ@Vbl:y?g,9P#ql| Iń;Jr<]z{EQ*4^A ȟ&#JnG~\ɀ%tb"A>kiY#(B`YڸIz}w_< U p\Tc @^/Y;U٩νᩴ]M5*r6.qK8ԙRrxY^&HZrLJp@hf% Lz_zay{rodCú ֑jJK8O6=ݑL[ raG)0S+ma?# Uָ۸Fߚ(cœԊolv$Hp!{݄łNM~n@w,jZo~}Cstʏށ,p\X(l++.hO`cG$h$QjNs}ZɊ,J{.qb#RLoH[y6P \`ҴL}M ɆK֪ZȰaUhkTuh+ɟZ-}x[:^g_(s_.q/VnUdFG,΀h-9{Jr&CjǨyz@v.`՜ q czb P|-e?'K/@7ݟg 73/gz/=Kz(e\7RZ dO+bXUXe"̡wn8yGR6h5]ܮ`E~@Q S~ć.|ˣ\=k(Ï4)xΙ&lXS*حzW]KUJ3h l4jh$9Ѿ%ayi0mU \Ō^SBPZRMw;pa2^:k/~5U>NFqZMʫV4\rR!zi`-:?i.T~R_I?qc~AC9.[XTS:-V GXy͔  a~}.#- qg dCy!\#)+?M2;.1vIT!awRN$wĕ+}2P11'oftuk7Ed1u )܎'ʥd)а,wܢA|Y5j 6-!w81>Ӻ\wno'=,y_ B4`juNnT/7꺶̘֒[rF%th~K]-tl%UMv_N[G[})I\睴r?g>sp;(p0|tj7)=XQ"x˄ o(%P&ejRg#ntxۖϗ]G[:$cf$Pkijs+ l}G8TfLw%O[vOw d7n=Ԗgn;_E ԩRN% t1@8.=#kkW:s3uLQ~YS\[9sscP`#9u!{,R|P>^.6}fMG6mvCI_m~49m1yH%o2;>+*C;ŀ,so/[X#;OO\tQ vQ-Wwa֕<mi{D/zO3_48!A|0 "iIBƊ$c*Jfqj贆MkSߌXmmw; dF~B& t^a6.W8"c*Өצs;Q+_:[]&# -=!-v@:Sό},h`F?AaUϠ(IJǫh~ [c$2VR[ӡ8ual% 'y44gZx%}5cDJ@`'>W.(mnt(+om Ò;.Tptc ש0+vatjNUdYBvDO7ڻU=ֻuuo wڕ*I]T-Z=]e ] <'!$"uIlQ]q7N 6WW^_ZP,vd'Ơ*w;f¶b;w7;H.tn}6E.І3PH,r&h,9 s /Q/kZ@;1[38p 7E,A6K?%i! rWl9XXzTzQ-3"iγnݹ+`6F ckS㨟G#)f M'D.}Z6; *u(,)FoA̝˂a~f7`\tga =ݗ zR2r ^`>%"N⹥S6;}+^ղQ 9'ѸS9 B)t< \Psyp1ޯMåt N ldE&P]ӡPv%Q8k̮hs=R ]sBb mXɮlY:qEqSvMy6)3E3sv# (ޞ@OIP~W}EΡl=CjA}N;ļ4h>忽mre1i18Yuh/?<},9OƜ :^r#ݡx{`{=Ny Vn^ m£-=ҵAnG?NРkP&M> {$7dѭk^|zx{3x굟` ƯBgʞxDKXo~4rP*Н^8Cgʥyϩs[yվx:.P+;JzdkݖɳC\ЅHq?6\sҬ YyiZEAš |Ոv"Vӧ~S")H@Wr4߮s[̛kƶpz86==j|H]o$ooO1_#7.$ FΨUg= pUMUXZ.E+oq).c6c~Gj}xbS@Cz7);ٟf;fE5#/!`M`;hӸkIs r|b6;ִ~TǺ kڄq k20]Lǽ*l Sv5XZQgk}w{5@mf%Y꛵xșW9xLyo;|#BiO'7e^*X\8B]BQTQE%&Mt ghzOS'Ä].2q. s`VC#}/ q61;}sd sM02y8Ns $D~@hГzq#P2`lzyN9Me 'cDm<3=dhD,RןڑOE ЗD_95(zF5n_QO4EKCK,nN}|*!+rj/[K/|nL*yƻ0Θ"±J+ (mLUѾ󵨗Z~~섍8\gKo,I5ʣr=i)+LLv, ƩV&2!`59ˆ#]ջ.y=;%q2il|U ''4x>Gٟ:xѯTEcj⸄ r4cL#16SrMM <[]N#lw%mBY@OpV2hz \X1Fk$| }JDBYs~h&IВPŶKtP6pYމycq$7{he$=c/73iG&ސQX 9c`G\+\)҅5CEW1P4P!%ۭQazImxFͭ>T`OBC`V+a9} ]MW;Qx8op:ή #8-7QiGz34٘2 nV˿K֮hțXPt}G^(yWr dHxǵ+RrC?/-!.n<c3 ^Nk0kXL"$cJ˝St8Kot|~~Xn 1tb mk86ޛauij+ChIl~q `쟓8&B6+&{0#L S[2lOc[0pӮ(xH) 05v \CpЄU`| &9í>Sp[8oe{l:q'#Ld6 2嶺'ȩŕ{\`' z98fa^GHpwTap~;8 (F'r*N8m|ۋlW?ѝX_c9>V]^5nKֈ` tJ`xvg7TiF~XUo6-0Hu^^}'U"7̞]wP?C"?3[狋qr=(O;} oHj(3\ L7 "bɄ1|'*o.38&vCf-ywcwĬg.Eؽ%&TJ?I9۔Ɉ5:E _F,6Iw͓ %9%}b1R4%+£xg\TyObSKт{jqC ņL:Qq}PRagvUm`'zo! =K !S$9겚o80Ђ "4 ZR &`'/-/O\\SW=zyP-^L9 WyFFkn|n. &YHѨkK:]* ! Wo*3Єpn`NmS L%g1#b=X O \rPkӃ|@jӊɂa_69[!BG_3m9j*`ա=YH"H԰W=z9>y rS"r Ĩ0>s^&+Fm}}k4Z?@^Pu=y4:%iZٸP<\VVYrWkFuuGʖ{S`.WG?H9W?r=IDfa4Jhe<Db‚ Ӈ {:<)"`tڇ!*`,$r"Ә.GHHY(I %,*csb;M:qP}FX*mz~g&Lpt .Gzyįݪi a-/\۲fY{ _܀.jxIZ蒖5k=Jp#{~vYnݣy@[!:A7ߵj$nk\wE;xK+CE~ rrnΖ#{K H6"u3_x~W\` }5Y:t΍/҅]lTlO6`a+}W1)>Q"op1?8zVɒr>Rpԕ:!$|(-A4XAJqK'=P V8PJ*Je,¹꽢u4īBcgsV#y{JfA-syaN_H[1ZaHt[-M:3nct+V 9v}-'Aq'i[iV/1u6 gL,1_]cd;ɶw65]`ٻwy%d_kcԍe#0ኯI-xf"I>jgHNҌԥ=saWL>>fccc.Kȧϑ\(Sbz6b$AY|2@}g dX[Ъ-D'NR\Qqras+6J=m~agMˡ( ;ZN{GDs|OE5;TF b*Zrn7^Ea»O>,KsyeZ}VP y6G=tԮT&ah\Tev0^4a1+Ib ^;֨Tn^'_ձ?IJA]ADQ&‡KKK'd8S=< :/Jk#n Hץc GyG*{J/̩l~B2%˶cqfSg(<+Tj{ƽ^ť?HʙX}N5SN1b v|XL1cM~r@N{ wA;\b{(^>Dc\z*- lt1<&-sQ J'fd0M櫟~U3Pb.K}<לqK*aI5)oA˩S14ߊY"C-5d-9VN;Ah%'tYQIʕ@w:$&df&qhaG FEI{v<St"a&|gLf *3g ~\ )&/hA4JDj$L}MsB ?veA.{[9/-)9@s~ەR[g< vۥrX~_{QBl~ ;iDby$B|/Z{21iC!O jaNFHC {%H܆3Pl(k*v{x1K|Pa\X[{$1)3a[+(#&d>'YUk+ ʬZ)j*TMeᾩ"NElcl7tDKwNAMC')7i d= T'\pFq#(90<(3c},]_t3'rb}s:@7ؔkگ Ɖ-`c@\/-QZN_ xIxGW49ɚ5v 5̔3qu.G52уXOÍK.]CPd=s)їMq.ApR{Ў:7V9i-J<^Btμ\B ^p8I^1(gNPU?'{ش)j l_:%4*3$1/WQ4^ZǬr^ĉ?WA1@J]s'ڹ-{}sVse{:D~&қ&! d1耔EޗՒ)plc;/KtLN0$H:\G(AwhDF,ݦoX0We9KkkI!z;<{.?̏X5,kx7)mmO/)АK#[d|<[7CnZ<[kgv7zUNtTX4z4"q{05*}|d/M&0 >=uQG"L;hIV\=dlUuwa=>iBZbbosmH"ջ99J"Ţ&K#cW1?u/c>,q+ [c(GgWgQ_RJPn7K*G= |7l H>yΟ?Lх39KMqA@'`sTdSDpB% @rRWao|M-1fjo0oh 7"s0҇xr3u/7H>;I#4FaeTz[Ӝ/[PdZKNIwh%[cfIXEncDϐpju$=~뎒ĘD PrbO ^ Sa B/w5'iό 2 3aj|fD =ls0>AQ_}&q50tK7$k/`GHqlMH e4ΑSi}amX;+Q]`qLbSo? S302U۲ P%V4>d=H x¦vw ~~Vt}w*D&(iޝiFb'I(F~>t^uf;=r!g1V~ *',籋D e-)? =_"Z#x(0HM$-FD4- h49v5ivh{h .BdtؔKNܵazWHFk%4 Xe m?4 i#պ2ð1D l0r,yN]zD˟V#qW_lcX:Fc_<[ ,.8x({uf$ta L ,n@$@IަOe4GY/V\mn}Ampl{Jut2e4@%gJc>V'R/z$Nꍺە*j<tT/ǃ-ű)p97|jb:Z6x<RAi.)%eNđ vDm%21HB$!YZ*rqmԋb{$5"{fh*@3h_7r6C_|3\ӘM)Ru7cU)ǚd$b&=tLߝO[r 7KE#EitA05 }gw= ȁ@a&xBbS6XﲉZk) }'iARGGpf X{H~cԳB-;l qS|})L;#-RgWxE .XQROcGAc Y~3'OJe3lo-\R˜ph Lz6̆Qb/|;\ `\O[׃oaWDDj*p淐k{ 53W2xB9sqGd(_ߎ&e5*SŌirUgbBE [ #k;@]%/OaRNήDX eb0Sig3& IbY1+Y!c"Ʌ)РcWRD;9|}RbΗΗೝ&N@ ~'#]ƳW近vL'ѕC2qV{ƝpC`P" NPbL30A!BV=jzח,h^P0NEURmH G,R~TpޓJA 0W3a0ݟ3h:Q/ HM lDj[G9P?ɅO ϪaTR{oq;Ħp{2Ͳ$&~bxy ny@!W8Bao-GpQBBU%x-LL$ӝO^ ~I~3. ^LӨ-9G }6ͥM*J]kQ;y'rIoYy¹VoP?Oxdd;h+Rjsҙ.}`+HEBMR=H娔sY$V5pt uSSWη,|LLȭii;9Qr$%T4PPT46]@[,D6Ovw0j? |"Ð( aYNT 뷾'8-?j,`jAQ}<2X%{H2cGqEG4QՂ3߽6c؇Ġ9ٻ2| TiW~tf=ƼWh 1Yn/"8u;T"g0}ZgPvqLsIe&Ȱ&mV*5V .a~8"P+$CHtO0>SVaރN(s|QØޯyJ "Ro=MfLgcAAi K$I6,&I 4>;Bx ח뒱V`pd5C6 mFx䛹j䏛AMyoFXw:ȌE|V)#!b F2S3t,SdVѐ#JR pw ~{:ևKVFza: L{Qb܇EdוL&$8"]{b5^GoGERob+ոLwBpS$Ħb;uVJ)Ko;R7_g$@Fbw8]iu[_FѺ)-qԺ0WYUN6eӛ7 y6DO{^σV-*k7QV)cmT^ZӇS` 4_&q$L`l}g{nfhz[nR 99=-a2vM3o)goٰ d]`͚ҋ- .h|ƹ5M6:j|mc`y|C8U͓pO<$RX>`3Ҏ|N8Y7,o@OLo>蓡 \Nx4na [\ ~"4"8? C[-&Zu~ 6MPݺ~.H6@`[57p-4,2cbMwi Xr_8 =Kg9ݹ}T;Q_b^ g*ux/g~#R~Hy0nglg"|F%B4ɉE8Pa'#;]kup\)s!"o(-M͒8c[g"o AQ|KjysSv=)1uu ؛05JXu6|<%x.0{㫛>Bb3-/e @l0*+p]3!/]S>fE)O룶$mwdhiwPߛ`q?jL 8&m!aϊ5MR->ͅIC(ai .Wa9@ɍ <جG5Ϲ|.</ē<%3XDTt\܏) ˛3#Q%A_iӥϗr/ GL*͑A9; {#?hnX9p\lWn/,X [e/r|gWѠ瞇Rh柔ݽt嚯-"PsKA{mN1~E){8@)-|$TJ[69CFݡQJo-n8u5ufίXA i? ?A;[)5=?񹚼#kϛG,;-+?k,0r ρdos saO~빫CTnQ4<U |Nj Ɲ ]`3T} h4_$3Ů:"ڛ~Kymuc7F$Z#KCr_HsWzx">AwPy|&%-aԴ![z[;e]Y Cl!u4Nx/ ׄgÇm \Zevֿ#X7 kJB6er_.@}ߡbh̽ln2;o Ӧo;ϲ:GK8_e|T棉ad ciخ6&nliU!y% "LakSmr9sT=>49uh[F=u#I幉S$_,jo"X#"HίRL-na;t႑Y_8&0ll`-Ź.uT _RZn*$75KsFRӟ$苌[3= ~?h}7ѱH{eAhRr阺z[.x#ӳƘ6+pl펿 ~@e9Y(}\7R.^}pX h|Dw}5<;˴WJ# S~k3q_]m51\\K֮#yCY}.?T=TYG4_@eL&($ SN5ߞ0fxΰN3`&C6';8-oFDk#np>JFl38?9'~*U ΈhYnώî94o w3EHLP]g!s13}۩*{Hey^7Z݃kvo1:*hB] [ls1\@I zzHdwck zkx M.w6 bkVoSjomui/m?dUOww~k!0.ߺ-R48An (P/7~ז(E]9{L3\ -ަ.썅;6a- 9eŕ/ַUVRqAxKVpoOՃ.;N@xAS3 @uI!!eD`0>[gLN9zlXi8h,Oop:fށG<#eDu|3_j@BFCz=ڃܶҟǨFk@{1b  &,6' omKXU/NPߕ>PFU U 1;Lz 4q`CZtm5"lgw0o u!ܟɠ,uv&;8PmWhApt=`-s `'"BrmaO]$xeu/cOvIBTN+l."TOy&WMKub ::t>f]vƌ_c9X`-.W?5E V/LTuN-9Ȅ\< kДz V2 m#خnw)BKz~2p^HUoBe#t8Cߟ-LHZGIK?XK}?iHS@{2Ҍ9'] ^gegHfS0RNfiq0+W} ̹#? EX92tKt˴Q۫\fq7*$AiO@a\J >m_9d$5w?4|zˢHܷ)[]^Dj BMG$c(\H-]Y}=3u{e>q'9ٜI}X`]!ӴHn@bE_I]3ON>hmvػ?N[[bLd,ˆ>g6}Xg)/6,ežev&k&Yd̻{Y\dzQh7s@<$4[/$_+Va,jrդH;G|4v$m'_sFqB( vC0~sHM E_\c-&%PK6h˹3Ҩ< nPj6!G|/jEE'k(3RBp]I#WDT V]\ɸjT'7/sZY $ @\IfeW^W֖l}l)$ Ue~V(pk2^`JJ- -hQ /ggYU|syWvtRAED>2e78XR,'(0IhUI#'i_F{ 79ҼWx J6N;Ƶ7#H. ;e]7'8a dž~|.N[QCs?&_8PE6@@O 晭1N0L5b /i# ]T"4  q\LM'xӨHwdz~.2zi[g3+BFnntg{fɑg~* pٖJ׮_DHT4 vtQaQqqϐ'`"Y۪7|JivghFA`3m{IP}&8/ÿ +;e~lAgw+A-> d^ :i=axږFIJ1J(WNۄ.62-~[淉2@x9+`+}4p!@}5oĬggإJ}o,V U"8&S597np@]/T~eH b (#b+yG8t7ϫ䢎1/֢;} ƛtpBϣHV+#,aМ~FZvx,8lHCd{rkwVqASc? Q^ܸ=#WgTw3k`ml|}sDwpKc;|>qX^I҃Uot5c0jc}\ζ1bi 9ܡh9=ߩ|#q("Ƨѡjc;ֹ}yn f@`w-aNU3= T(BWxE}dnlŇ1JkJ^7, J:}!&Dמ` IRL (KQQOEie:wǪwIo̧ٖD"Q)T<!9(CyVY?v' =d/g٣hأc150c `̰Y}w>;VQY꾀`yRE(99!b16kAoGLVd;]ą#Xgĵk} G:r[e2j&5.qJ P%uR^4a6#<0bs[\ 1#W a@+ 2.!tL>F-rrYⰖvG]WR'iW*hAt`q\SyixFhě yуUnoodŸa_v5+']\CWc(KMl:ji!C)j NHu/塀,@Ba<6zEz2ċMya}9Eqi!aPk%7x8ֵBREA>C 4B+MrVl+J5nOc%5i5@qt-dWof黊cX}{Z$3LlDR[!b~9+7ÕNG9>_yi$fhj-%pp 3q$eα!_GS=s;R€KP!6kFUW)eI}bC,SkW3D|XX7>ZgU_=jcjwuc=-/_Co i~ I}S m%DL3([hƏ x/dyؕH^7r;T($AxX7N> rX;1tTqsWP55b Rrz\X?HsK:Wþ{pfzץwxE#wKE ,P^B5O]_2cEMIemڀAyW}0@%ԧ+؊5{4-'*lEjM_. x?L#CtQƋ2 %Ptњ@ u~T{Ux8NpڄIKZ;5QFQaeg~kIX~m)}" yIMOpͤdDviôZo$ܤ]foc3i]Yu`ޥ8q*2x1P0lw Ք~S`&A(laG"B-w+]p| '5ƥRo\Ixs7dɆl gf8k)Q!F)Rm ^]v./pTRE*,,~х9ЄBB!BJB!)JP! JJBR!B!(BP!)BR!(B!)BR!BB!)JR!)J%)J!JB! BP%(B BR! B!(JP%(BJ!BB9rmj@IvR4C j+C\dˬBL% ^p+& Z-,6QG?`YR16qfYQMx)2Y)cٞMaluhĩZaIdvdrf-P%Zl\'XMyo\N>iQqBZP~4x Uyӂ?TMg:u0~rlV WnO9݊-S;n*Ehн¦UU0ؠ#c_G:Gm/@b?M%*FCÕ;@<:m'}8?䉬K^pvs; %4\_Im\!HaX2 OM3[zZ6Dz( {+f@jlF?ܗڝ /QrCȂ'7MuST:~Bƞj1VfRzYc!㜦KĒLooG>or^@m _<(B5'*Q!6]3 A2UI7i@tŅzx;.( ]R$~2W}_1L؎t0.\hafIj)s{7m܈06w2@оk_؜芿}ymg˃|{8gس0 $(rP|~ Z/07ngwuwa4u5x_i0bT+n~(FshZPWᗓ1}A.cɧb>Q*qU~v?c^F]2,Z?Wi`kP%r^n% pbTnT2i'̜ߟ#͠r3|9K>nN}bܓfDz8A P{To"Q2tj##9Fsƥѫ.tƢ_n}:rty 86sh_LWXM UZ)Ѻ^;Աw!;>hۧ]'eb4.JK".AmdgD)?8 6Ý*mwB^KB]J `h :Ll2uYMJ2Ƿ+ίHQh+_ &ZN 3Smp@]i;o7X?FcTxJͣ`558<?rl6ZS[Y+_+fA#ٱ?W!p x `<E?V g6Yw@xn ~ZaѹپCڪ0WLZˮ:v꨷ H4 2 Z}5~#[.v^3pJOKda-p[);tOc@=ډIES y: #\nl!x9.*'H*ȱb(߳ma: 0"tK`X 1L2`T)X嵔v;mJfM{Ω{+5KvGoVd800]vR.7^X"4iʒY߬gjt7e"3U!ɭT5P)}净:gVgiKvh*lۨ&,jO |ğ MA]ϙCn*U4Q-<9ƸNStSOo/gkFGw۰@ͦ&Cbrg _eLj?&M8*Cw]0Pb*Sbr_ʍnwbǑ)~xNz^P`U6gz3a[F`=QOm&4\5Xn;J`=ejPsOIo۽ޤNjSR*1q L X^Ю(5t"(MBINg6r!J\me[,:±~?9wiT:4ˡx. +!mZȡP?\qU~UIkR9HU4U9o_hV׏o槪\լ._?zl?xq40t fkM4!,t[dNlAuu g!HJ=qbdFOG4 <1_EJ;O`Nr:1Ik q%LyJ*&Lpdǂ Qnv2޻ g̫hrM:)-,mh# Wď.cGBsa3 4SW%3ߵoplifr<_0EkpэĀo5:Hvx-!7,(7'p52Lx)X* e BjA@X!%M)u\1uSR--e [`H-9$̂&b~#o~?署a=0|+9{}dV% =CтE*w̏fXp2fO]۝l1-СGO9 3plby hp]澿oCWO_xH9M7 =trtUթH'SZwRTq53HmwP1n!q)eYuۻXhLZD,WyԺX}1$u lB,ck+n L#_DvWG{-U~Sj!{ͷ88Uv$*/?*2`^ݎ!Ws'R3v"б:F aPs '@_'jl˸v 7o&4ԓ5zl4C~,}y7>(ކ*gn΃ IIa_i}8R܍F`s#@ HspEmxYbjE ”+{پ5euco^=(E$ϻL֍ζ3oDB%KYJK.0dbڥT9Q5b_Qa}}7lZ_|b(^ˆN uoAĕ1WdOeyG}ێn** ϱ+&tl_-A޳=TP3_8&?)Ai5^iK.=NZ}hq3BOSWLo1}d;[;\^Yic$Gyᶻ}b: Ec0.9+;4u YElzj dbR?:͘:)n9٧Ɲ&-,q j<璽5ΓGKbeW'Ǖ,Tr61Q\!k&(GWWSwZm C' CҚ?sv-:$y9\wzÍi Z[mU/k]{4Ÿϭ@)2cǽ _qܦr \MՄT #50c*Ґ5=WOCIYm< (;`8W͇zytN:\93j|obfadM(E9Z~ ۅTiK"[. |I]CŌB = 16b2^icX`HJއˎw pF G"Dz5 ˿'kކ~9;>5*N:}i}Dbxt[;ި6&j÷[+8$)M}=|N͙J͈/]S8NPF45,Y[w̑5tx#I:BJB'#ardxH:} K=]a0־ i|+HF;7^v~a1Zr'?OD9)1 А}Vjw){Xk&=>TzR8u:6xC6Knk~!X -'Z8 I\_?Ů: g! mSJ$irБ+)909g*0&E+'XGsJ}u7sk.P-dNo~RPXk6WāY+Yʾm Ra>%mn+cE*YR_]fZN_8aĚzעZM)j6cu>~*\PѢ'0`R_zrBETBjax ctb Xdmy`&~ vh"FtU`t݀S.H#Xbz%YՑ)1JUqb$G/7?&RĂL5Fn_/$1qgy*khdEлGo dhFIyYa70y|BmmeWpo A0W 2<'CB:(nsH8}LOKݐ2/?:wR!]OR=r&j>R3F\TT!{KQ+낋z{38!xs^_EtiM20Xmzt}maJ0p{߱"60QL̵F-=4Rd3jV7=k4F4 ^$)-2` Zw0&xcz2.I$.o\}Lmm&k Y8Cn؆SccCTXɦU˘"i=(}1ࠆ0樱!! O/ e[Dv]hb^N5eO7%bWQ&i@=S ?50Z _;RFM( t|9X-X޹H;\?=0m "W@劘lp P25gQ3CӔ%YOAKPzf֦S= ek=)1!yu*eHqyMBPl)T?mx9;*9} ڈwf*-0V|^,ZLG7m\2g}^x9VVG磄O?FP`օ2?+\+ÎiP8IN*Vf7t c`dQZZ?ۮT$׷tǵddw_P~sҋ]6?k̓>8>p\A^|6%JȱaC&m{41p0Pp Ń:N%ARtbH!=1b|o fȳ>tZ!l6~@=ǰHvBQ1}~{?+Φ=j_͗/6x.ʠʐaԃ򨡕y!`86j[=]5mBm//\VUIZm͹92uT ?A&-31?]n.4c*s 8Xa4j#S2ՑZ'-9g3gHJop-AY> l8Qp޵}h`}H[DMR=K]/Q8}Jd~~ ]> KGZQK;OvI/p;zYT>̭/e<-ߧgNH]y44R5dqtHț%GhS`tb % afg)X6xbgcb)ݶf%mz%J"a91s5zCuؙcpwDQt6ti38%24}Yg+R}sӉÿNQf#3 m:Wld52g .kQ~΍ln=,H#SGTRF)0+d,~`Ó?-h`fE@a^?kD_56d _h7F}MJ&?,5Q2VW*Ic[ij&hQ*K_7}3)~ًe8iq1y8-NsM(x.g +r[G N!1FLQi9\H0+ ~lS[ uzC7w{e}j{eO6a`a)d:{顈FԎN'>$SDTYk?K FҢR8|@΂g en19%ecL@~eRilY 'A M9~aQ{S2 `Fy*µH<og~{ ONo ~E˚W3 MhQ~_u\`UВ֫c4Cr5-`*Q3LbL& !Ct=kuXRؽV _Eڠ+}~V mG}:VV.`S9ղ2z:x,q:&0a,Y:F_ <[[:QCb` :3f(s٤>jcSEML72"@`K0J|pHFFy'POCڨ}ymG7:Wojcff|jn{q3H%aϡFKV`ڜ IfO?}7 E008rOւ,J|rB7 u/bVkk<ۇqģ}Vljw-yJq立\8 ݠL)dLi6/I 6hj>4-=BK'VI?.qYsb%vJXT}>Ii# Daq*@ ߤՊƉH6~3EWO#>c ̀4g fjIbS)#ac?҂ȡ:$%k$>mf+ieqNKz(4FRfm%8vka-v *Wni@|i< AP'!zWdKӋrq`w|a~,/pጄ>ib g>Fďi)0O!m-)bpi;[<Ŝw!"e} gTN(HimQm8~xhл`Pϣ?5:β5U 9H;4rn%%)g!}9JZqh쉑@MI(o4n.n&6ԕ,!v.EK#ߧFD%Ȋ8? a!m:>x6m,6 j} i y儦ǒ)yӌ\IϢ#x~z<ڢž<~o#A8Z榇"[*}bղoml"zcsF.ʼnrlU90 ?PɾSO}XڏrϸB^10 l%.Cj՜9`hTAْ0/ćgm~ݧZ Dl?ٿÛSG60P m%(g(խ [:^u\usL4XhIӋZֽt]Gս^iF+jR>v^d1!UHk?j m x]r?rdfHV ]:pa迱F`<<plaT)z+fzi{c~,o-2+sĠt/=^nON_]L\PO aTAYO Û&},w{I,TI/DIC$d6KX;F06[,rĀ_a$/+}wDxA "`Լd{@8u_dפ?"\qlik?n:kG[Djww#CJYW{TeA 87+mzwORqòGu LZx馤I0o}DE,H3S orz+dV(N2rTm!~$]b^YEojZaN ,I#"#{x瀫F/Ww [ZEVlfw@U3۲gЙ4Dޯoaȴyf'PyA pA0?)9j?r~GIm95P+1pl#NqmM#fb3o(N)}e Y-3Nng~}-&ݠ>&C )hp$xַ[+5e{+ĘS8QտvMJ-N~VʩR,{ЭI0/FJR;8܌ Y lvJcTL U: TxA1 qO ^w8N7qw~ >#kj raDw;ڶ 6l7ohJ$}b\D+Ϸa{q1P=mtWB7eX9δpzokR)$rn*ږTJ]=U2أ˒g{Iσu`X,#iZ~K@6$(s$rѨP&9U6pd~S?{Zڸg뙓nԁp@+x2IjD 2&1fzI.VOtQ&&KU_ye|} <}k EϽ }+֯kF"3DY';L(^MQ'b` 0AFNK ~s/^ `Eh6>K,ˁC 'KV>]&_psۋӐ*L{MN\,9mmLc4fs⸖Uc@c{ޢVw*?yǥuWST!D)`8_oZ+CL})GZlt3^ spcao?GԮQWlqdF2,7<\FZp,? ]?ʉFNZQێ*tj^]_}o[~"=7{BQKE5\1|kS5l/"V9D-ΆM>Nj2ww.Dn~a}i,% o@͕woqˤU|)J%Gtî7H %ѡJ/w+>ojQ>Z˧#.ގ:CsC H]:6=²P_`PKi&WUJ#VLÇ+;KH/fBxkd& uE8I(P,zI BAx uW7&Zb%Cs~ڇ#12?C h.T"\y7 ƾR}&ap#it=TZlLs#[gy}Сu/%ˉD7 sT*W]^ErVr%Q:)CV]xWŌۣ8r*:wNɱIQ4S֢No%/ ϖ-RDЧ̇[+5ʒ>%mHeX yQR?|Q/)ѠUz#/D//m!~]W&1hsv=!F%RaKO؛lE3o@wqRyŻ%5[S>ug'{$\2^V/;|NS:18%$ܦP~hsXsyvAf|L/22V]Ja-|-Fh)V>qɷ\o; JSBD@72kIKM+(7H(_H% ^ZYG|Ǡ4ޮk׎=@ $7;\a C1^*f0lg+; Xܑ\^ 7CĽcv Ҵ-wжX< LG="[N6U ;fnRUbW=?۟BMk4S|,Iǩ,|y'ݲi{EMr7exyg*5z=e-Fk7%y`((k1큇2q;xJB<]JN~}0YH+2'S kL'KUwj2jǫSdo+^X%8SyM4Oyo grG6{:/a<ד Hxw`'yuTNoR>, v1ϻ8ZTF<Řu:1o$|=e׏KFzx^.fcEߟK<} t1QH(*| XGsjv >X7<.3(?U X5w[P3x~Q#ReAzc]d\y- E^BgGyl͚43"^In*ߟ Z*UN}@PRzjxSoaȘ_˚>bѠi<5L:Tra9vCP'6D\tUK`_zv׊:V$ &uAVY#ci2|-#/FQ9&_?o:7dV\LӞգ`K Lyp;Kx(| Ԥ+[Ue*d+31Nw?D,% U1_16$c|(uʀƆ/cQzYJ=)Sra l!]b

G|†#c]^iӘ L@=^wk*u,ҏX!dCZ5)Ӳ(gT=㎵Hop*#O/&,0?qæ8AqdNHܰK ?D6h=a\o_&gU\ %,6w<<-li:j^^~RNJ"gg73#܆]'SҪWPR|}zW~~T۳a\?矀nΈ]֕JQXSY/*F tKQqouSZ8T Kž8,W93LL4> tݟUsT}KRǒ_6Opm%$ͱ?[N4vG %gWZfD҃˭sl:֫U]O8l׷XYl^kǏ+7'[6hRIGp;媅At($DOΜ9(.>sCM^_KᛙQcã^'5Z Ǧ?ʲwڧ_#sk6ڬ\a,I(ƙ2 '{SoSp/n0~wg2˵>1?=Z^L%W eUlI+LfP6󇧻fIwm 5P!ʋ̒xO us]hj`! :SO a|T jf^Ng/V0 oo9S๵֦ 6Ov—&Dz>ahX/jUse}hw9ڷubt)p@ DpAҏ>4 kk1 +6 m˻`꒫ gώl "h}=z39Z;1 riiӘ>J=E:MWgߥg~'wuQWMAR5c>-v,XJ-dLAeVmQ}hsב`bn'{~b3N/=;j<}Q~1֡sx p:,p,grSq(S%bBc]2&a1b{ QMi> .p6ϵ\C|&H%c-ѼTbd\pDۍ}[p(:~7%1c`}E{U)/]5jI:ǖ2?-V/l(< %&~n?LVw]w2eо0KN1oỉ.K9~ZԽCl,.qgx484TK8~*/"ߗ0>+Gmϸ=LmjVߓ5 sfkm8KNS7и=JEz|6z)yC@q1=td\oWldEJHmDT֢Q%I"uW1PXeJ*o[n 90@7t,Xq-P>f~*lJ/NKA)[ս W^Y~ş037m(Yx 38OB=Ȧ}rZv?_*xr!ȝkskwvD JgE7=,smҥT',g֭-B Q5i>`#!}rf~0k{#-LY`9/`bweoJ#`0g7}Qk~DkbiOm2X>2i&oh9 CEm~xϘE: Gmξ"ߵC6!0Չ\Fk49˲u{ƦE}˘/.lhۊ^'[HsB1kz=c16 t9:ZC홲y\fɇ+dk:I_ PjF.eRoF7u_":r@1” 8xLX1a?;9Nͱr^ N.)^0ub;آ\qR}]q**bs5lV(Bt*ϫH H/qq6Bz @xkH&r Dm֠EuWY*TRG)<+,tgA4nA-ʮt̞Aړg7zAZϛ?Pj2EgKnX3M 0U1μ^yx;(&&E[AޤN M1Rs*~L?DSw wFr] oqr-TDh; z2i!Lʢ_4Bh<bo]aBd`: dq?jH5b$†==%4RϙI[GgՄiͻbXB!y>"U wT~8)UyU]S`+MqԾEȀ~ƸLCSR?Saā3rCA1mu'y/I6}&҆mIQ}68a׍ (e6h%`mG5]vuMM%G9#v0 gF?K=AJDx0N fŨaGTF]}{wvOI:rY+?1Fߛ= L-30s ؃tSm}/Mo6$Ԟ*>2ڞRr@׬i N;@ 8lf!$-kŞQ>N?q/HUU+`=r9Ϭ_EE %.Ȉ,L{nlQ<61T>ZBH~)u5kBv\] >tW01н{1ӹܝ|v5A?RX\T{P=]Vqlc;੍y4JDpcz\ÔXpf+'w٥]jt棙u >Ϭ5.-i-R.Gis(YcS~yo`M9oˮAhhwL9huOIpBo]%;WْHE*ϣ޼{J'` Νf+~6I 4ɭw2XyYLWxߊܭ Cּ(KZL/uyO/ n[v iYlĉWq11. ΨO4[)VA0]ǎk@mMa?AR/jrjA^G!yuX<[# 0-18`4gvu8-uɘyi8u1%= O)ƾNj c3;X_ʼnf!$AN:ZW1[([θJV[X̰6-4n۾R^ud"1R~´49Gfc cF m{- <]WSBuA03fm胷/(N wA81-鏙'! IH7vʷ6z]Pc?IDm#:LO%I]XuVzkuCs0tFxbejiw砜Z!] ~)pa0qE%lSrQ1@ C ]syIJ Z㯢n\J.]bgC5ST0^Ku_ۘ| :ZrBUק~ BAz엖I7X9-| pdEyZJmu84.6d2رh\ovoyKU3żAz&Lr&?ZQu n3u_Xi$s;@6ty/ULe#ZokPzOn'CY ?t,3!M7կ̇n&/ҿ~8!ټ&5|L[oerm#|L\ Ntǧ_f)Owq3AS~H<1d> cJo`'ThݺV.U~voJm{SvA4@Z[/nd\()S ޮQkxlA|ѷVrϓ|6961P󽋃.*OTiady4].ޑ9;L ds q]GJt7I[cF0L6>$I. 6}hj濊,rz3J@lr-ߥ'i 'O򜢈v绲Ze8IƘ8/rY0'?$]Qb<ӑ(v`AbmU`is9d!3K uN<”Kc/gEkkT@ďoAL>/@}_vPaMreB-!{پ.uK*8(0LWsGb]!>t6+8,KKfok {DvvOGZSO?<6c&w8 QW.tUpqCDB\OtK./sM .jgʃ/1BX Y&+d+ gׁ]$s3įHo~8)? a.cĿڲɄoQsRFu,hNG .)_hAw^Csc4JNHOk&n&ז! z܎ڙ/T–\yGWuS U睓BkgWmF-wq~KEŴ~X4d@7q;GɎT/KہZ( y81`$SH!+?ٝNI,polpݎpvӓ~7\'LĭPo pl3?>N5yÆatC9ɂkQ+ u?@ #@.z'v(S׎Oñܼ"}!4ۭiv?XAJeK+nJA:s(vreӒ1#jbFo\n&_, f[F˴*J޵8 ;[|lOJ]ա5; BZdQ&O\3M]9=0k%̑ym:6#4ʿNJgӾKw6ɅH;%4 h<8 ?6@FT&_{pL欷ǰRP*4PRXLi5O=EY37]j܄r1 :|{궐[~=˹0z | o@>UH$R%vWIx<-Ɯ;~5P lTSw!f% 9ٷZU $nDL$*/mznjdJSތlB&vv7WAs;.S=!X B#[1<:ոbY_zPŐjm^Wo~(3Z`qժ\=?`K^hw+327tiw|$G#×Aq\<'r?+.+N+XpW '_օ +5& L-Gw',F=9=יL[/rxӒP*Nf3 E_9>̓ OFwv؁Z^66jzZ/ RnL1{ !P_{<D)+!f"Hn5W_Vi!nguxxNd_3ɻ`Ɂ1a~vÀj3wC1_s{?VF75ffʢ7OK;rzn !ሱmGlǵM%`D *Ɣ#QDŽ8ɀǦG9gsCd-R9 A G^{sjAM̋>1 9+Z\Ěn"7z7 ~1wfNeVko//kbۡ9 N١{?)Bcw>wY~ni@5 #|܄! F)Ԥ¿7uqwୂ{0) 8n.vگ`@#AE gQDyD骏H06ףg"VNLJD(`n9"/h8%A?>xH4͚W9D\s M7¦i~hg2'I7cm?/j:M-̏ǭ&Zh$dU(iim3>!wc{U(12ͪp-G:(OK پij%uݿ0\Jάѯ Q jQYy_mSEs4-46'|E%dK!jPt Bs:͠t/qZdu 8 ,2z5zotyޮb40VQn$Yc^({{n3oؒu4#g6YMsz\uc/&ܮW{9w(>!|f+ vf0wE~XG?AL3㜛>=?!593PTS?2pAHT,Ռ_h\Aב ei2yTs*1ʈeC2PLS)Yxe;2NLSZX֬?r\UUC*Hʣ&xVH]3G-XBٓ#&$)1/絆Gb(?&ls9 gN3y!B2f.57~-LFuH@&Ntc['^S:CS8θdR=eȌ(˜_a/O (`ΘiuXb;֫6\ɟz/1v0a ;! [vr)4S@٧N 7ʑP 0I+}'HwSHu7NEIO"Z1482aFn[]@r eЇ'$0ņF*yćD䎁q{ g6^4kLRs_ph]s t/Jnm, . PAX8~h{^Ahs̀33DʢUCIY#\NIk}JqY!}wP]@]p ;³MEҙ˺w-|݆13*vZy\yg)<{\K0 Cm-"_)&Ԗw&sbL Ј./ԝ~ٝqr*xpߩg6Wy+541z\׃X>g$[ѥ.akʚ]悍3ՎQ/@wi#{@o*.!@ߓ!f0FdTw+9z.!QbcB ?ُ#!K'M tYx!)l!qTZx T`^1zm,#HUTIqQ!4#Dl4{=0342 40$*JiT]Y !2hIxnujގյ &h~r,Ma7t!5ٯ/["B$3Bηٙ;,Pdž:Fog-]kӧ1]q 0J_#?t> t $g:)!,dwai;m7PàG"&N KݛB$$fT±};=v+"d!iUWa5Y;A莠bMTx|Ӽ=;ffzV66&p:uo4_K1U̠5943G5P!mĎQD}i̫?(d/\,۴u"3)6bpAyA\lQa{N7\Q=.cǪ30RML{璵 /y UT- [ d:WNo !*AD50-ECtsf{*.gQXC|3xHqQup'D~w+RFa_cvXE8!!=$3mv#>%Nq7\_W?Imru~eo2P7ٶx4_ŽrHPe9@cڏ@P*%Gnw@W_  B>L>} }oCOFc E ĺ9!i0͜<5[`5lnswBΎyyC=T-RV֛)?, Nstc^=im_&̈d/rŸiº"UXbBN?4?-QɴɈo@P"|YTDPp{$ \::`A *:x1IA'2a X0}  (w.N‡OtA*yP9u|3/3?OCteLÑv?q?.jMx[#(XL#a;p+g'T+0Uٟ['X3]fxqpaEjeO[հqJY'ԷĬܰ@EaM'@xa "=οa,;hZ, fɇQΌ,<3mҝW/C'ASۦuR4pmu_*BSy<H5Lx[;Dl;H)w7x"tmvXsWHJ߆Mc[B4tRjjjb`W=ǻg!.H]۝u6hh&ݝ{g#SaRDɛz_G2mm,:vΣdq յPh~9R'Qǩ6׃˂ij < &~oabjM&aP}v_] L✪|eJ4g^CӶL8EAZ#YMպq#rq1݇" ֢YJkO-؀?D9SMt9g7?E =Gb aȉA, S'H!p {u6+yp$Zc&}Jt'fA>9,J$P8TV)QGl@^끗?cc~j ƭPA6@sAgMC%RɧVA/Uudcꯛu"R` ǕҒV,A/F'48覆 9ɛJu'zբ?u\q(_r~_ϑ[;Q~ rТ Tʿh˿fZӻ +yExl*fr5Tt֝^Fو"F+QXL5FT  o,4ruX{ݓ2;"72M0#n_> >/}A3}ͤF~ZG+MP6@D211 &NxǾs]ja"4/8$z_ISY~ Y;/{5)ҷY#+mWBI ]%A*#E_ Eg>pD+%\(CtMkUIz–9JSbˮDrv8<]e/ M:nrceQĢS&YUdӾP%QwN7qr H_S_`HKݻ-T)Qcؽv 7g۷(}Y:2zlĬTѩLX^EWݥqh& >t?狼pw @cϿglCZu5<M+4*,8*{[{xU+2Sjg5Βe&#Htڝ5͕UYĶt(2˙P6akwÚ>Iv]:dͦhz^o@wIFYKspl~2OȰDΖ</7HN鸘JUxoBM2+{`DEfhB,=vz_շG_mA19pd7=T)k ^??}piDa_NmuKr͹d_pLO pl,o>K*IGEqq,b6`Â;լY><!3fmеՓE)3?^W JT_O @={C"vMw qH W@\MPAŠ0J(R!&ɋ>Kr҂Wc1\V77-ش+!S5>JߖGsq6wMmP>vDڝ^Xzma\qĥ.Ֆ(nOUgl8;/"mVJihL!0O6Wڦ9Jq !cjn{v=1&/aͽ?$f;Ed/2|sgh0!->K^4]?@NqkU`qo8ëx=Ŋ7_eBQXh@7׹̕f{c[,ðy@ذ'&#QeikbeF *cT&?$AVz& KǴHc#^Wt]-ή5r/蔩'/0|inNg! ngi, )\E*!!#>@ZIE5rcߜ^i-@QK$n^{q~5ַCߕu&7y%Іh%b2G#J8.%ή]/`Sb}oI}L(=~@ Yf!a#,D?|7absB چT\Swq_FsZ*FcXIɀX)&G+ۢH [;idl/T vCkd,?NJd'Ҡ:%}O8h)9 S  䋢JA(ATٞf0h| [Oݭ!%lV{NQ9Q;Q'NŇr4OyGw)!ʡ$̤7Bn/<O|+! ޘcb[fr*;yŃs}tkQ y@0ގ'[ޏHҲ0(J aF|VtkV!>;-3Ug4d\1kWAo4܉,h{N1C~7fMg[0Nsp;amRhP2Lyސ5˧bRD *iO=c题Zx/f@H> ,Xڕ7+1QrLX FO8 jRENf颤8i48 Mg5ib$c7" [QL s>JC 4x\[OlM*lALuN } =Og[--:Qg* _9ӂm j`)) \_x̺y:ǔ sD>y!ag'>̊|`my@j7 k^%C? L0ϋ'U4hKŮ9a}@;m={}7_N:i%D]Ԑ]xpTGMvu-)*p˯9iyW\a ض(^^ޚINBvb+:DMoLKҽ\2O!5xg^44YeEm.8>(Tu}flь6CY:(&֞z.  Bd$GqĈONor=怔.ފg'GßZO nx=Vxfi",\/y]Sz2!TθC7ϾoKu{~} Nvpg{m5Jc9o^VɒLN*cjȜjH u%}q" vkv['SC`%pٌ{,dh6 L ÷@7i( k͐r䘴!`GR՗~*^1SB]zd FaP݊8 fAq.=PuoyCk1]+-҅`xl:( x 1s4/薤\8kZAQq8DKHkvtd&  ~ԭJ t>~=P5Gp~x%:EBJ.ayXa'R:4H.f-=r+mE W9?Ge 6+'o \6XmZ55=96 4$^ޚImz3'?_A/:t1_B1>;L?8 '7xOYV.Z*̪ {?)1b'b')ŗ*/a*~ۺVR_vF>O ROY =ԗ[+bͩ(@C\VXK' ׸ Nt_ ˊP싂1X(Ӗ{﨟/ }?A͹Y h}#le߇a؎)5&Ƒ]F>D@<H~>W p;GtjZۈ F.8A\Lq ҇坎rKAFgv{ce`*% 9m:ɤ3vM@~ QPXE~*]92?Xua8b"=n ;''ʓ`PC)"CM|ʠl n,5O+y꟏0<^_i+D"p]|xRgI٪U4ۋ?'h9iDnM7`C1}?'q=u^oƸ'&sZ om9׼Oif  $OBnү6M| 6z%DDM\{M=7OM^}U{L`)#B#@ΚMx[hR_ou/c#tД7s-q$pabZR(~פ{sXǬ=x]?7/ġIN YqCsOh~ϕ3C~hhE0%dc㺣7 &q/+:ޘh6߂0(h q5,\uzƊotI[] MDWӪN0QMrr 충z+) \}Vϼ!; 啯MZx #sl̓g޻x6&qE.ĩɘ?hzqd,ǘ4csXÝ>=+t/U8"旚ßsa=WٲЩ [t{U>± X"[Ӳ#7"R5Ecu5c)#ε_r/pDΉMmfva g}0hi$Z}]az oOĥw@=-;˷Q ''-e Kajbʺ?gf2 0e!q~{f+Ȇu&/H oFjҖ6>dY.;a)r?<><&hpHHw"GvSs+gz4= ?߹4vDg /ծEOdh{`xN)Ҷ\H>avC翸j9LR"R(~R_w5DޡR9LQгbDrgCp0lC~ ]̞ў#AY9]_F{u76H6ٻ&Mb죒iw'ht)bwIfi٫3lTlT= [~[[F SQ{…sM=MzH [YǴ,4Ed~hCpnX[xc:W3X`p`_ Z􂮗΂`f +ߒU$`5fkɍg}#^B> $`Uo[{ϑR1҄qf2Ce)o\=97wm0޵ ECiSebZ PCY>{EE -[7)3JYkqOk?Uޛ,޶䈮Co笛oOR5Dw i0)caOJ|Qߊ@ET91jZӂ rJlEQR[81@c%^qHewaB4HBvA.cͫlJpAvF k8ow37%h }7Eְg)8.߸B~M\Ptwyl .ÓF&e(>DFi\zeqTH4̱<.a=?o$9lW(sPti 7b^n࿺V M8qz:ϗn룢T#^<8?/:l t_VɯDfQx5<[z7L6O&١x7>_ .'NȟiW܃^Nni4چ<^hHk9tK|{9 61z2q+H3ufOQZ}&SBXx7XHU~WGVy%O\赬NOܽ12[t?0W]MAh!h5qU/K}P>@@׽=%QO< }msT2`w}67o@,*Rh"K@,˼pYᘓPz<}7db3|3@/=YUů?W܍A5e@0`tWZS3[1>B.Lorr>DtXsnj3Ԉ l,(N\X= KR4O "+:X5XF+9;G*+<"[x4^ cq >g,Ǭ6WZIܠn׵w|nH,bx_|?ҏ)8JR6e=r8k$J3O|y(}4LU:uh#-S- BYuEQ!Xߊ&P-#x EH٢s1}D1-a*R_=jǶ~iPùef5aJ-r^O̸iRrTosIdFTy;3FZ>{`'nj9n7l҂sp楣gWZطW W-;0KHyD Mmj9u6QG@ \YSBO8QF3k#Q/ x纾&ꄢ06 |?{xTt :RtBԪ;,;?69UVROwԃ=7YwUV:tUm\%fjͷ.VbY5jHF%t7'Uy i'no: ;|ZSʤxɳE#}4:-Q W-qy̓]GBtxS}K,ܬX_XƦVd!s_ZH^:Ia6wŠj?4lr.D9&wニ׺c+>g>uWObdI Y!讓U1d7Nb4}J|-bYxzܤmx$5&=:1}=q > ,Sǝfp,NvܙlkVM`bH2f虻؏} '˸7.v-R A!ets( |=2^rsf't޿\?b{û2`|h .~D,g}$#p-,w%UHa^d棶 8g5,jv^W}Z633՟*^˪wH}u60[גl ,'W tx|$`a{ZZWx s%6b!mBDc "XK #U$ӹR`ʑ" cWka€0¾Z򛒥l1?G(ZbflZl-3aZʞR緑Ҥ1a_W~q$79|@0ek8,qIɱF#C2 :l Tp|qy "M!쮨1t=CtT;$cv4uRBx9@.-IX7VLwawƉ[{4x~4[U㳆4X~6ɦi97gON6YJ=cHi bD#_{{M-FRكq>C;dM<'tCĄ_A;3Ɣ h'ғ%?.Dωwfz Ows`2b]]2CKӌjtxz4Q>Ci2/6Z;'2npodը(Zx4&m)|P!/F&#ƢlQD¯KYt?mo.o AC^7sXvP_e) Y;Ѽ$YMWF'k|E3`.S66H='< k{W`c# -̘w5s9V247jуF\ ~`0@"v;to'`۪Ċ"m%i+9MVMEU6 уi?>ƙ~8>(%!CYjy92[rXI 滝aVs86s:Do-zU&WO9V$7HU_ r\ՃP`K_c?VHߨV)v&e,vh×'_ 9yA3Xpqo[>hQ뼜4 L~_)y3x)VFߓQ'H6򻅻PDIsb83Tп\8-(GnegNQn'F&<Vc>vJ\2bewux3?Iqb}&}V3YDS&7ۿII{؉"BQ=iR9(:y^V%&:D|.׭ bͫ>W~rv8 ’+WF_aqژޫ}烋4t`8&> ´M(SͬxΖWʳ0k rGoT B Ĺ`5_).wH?[\qjF^v(y݀r:1кAܸGf֞ecde#is&v~쨦wf7Ҁc;Y%)E9TÔۣTqoZlZJ:Qm򡢞j(~Iq&m[Ѣ['بU+qB! 64[op) THT~3@y1 ? G}0Xh{ҧ( |.p;bш7S^VH9_!LWzzc9<L &bJXC!L`HbEf+!4Nj@"ʶ<ѩ+3bW۳{J$Z -;ݿa7?sD Ub"1v *j+8ZXy_~FEVWPR0/ m_6lҷݘ?Oɿ }3vxkMJ9/EB D\@u!#X)J(=V\H<}d9w)|".<Q*z\O8=FN{m۝q^z#Ví~iXյx<8t#`zys#6W!2,63c[YI"NsϿAѻϟS y뻩Lͣt+_2 `l#u=u޵ٟ (S.# #A[&ڬpSbSϺrR|0ci䄁4L\vlVb`)I r{D *fGJI ƹ{ Ynl0`x?Jf Y4_y滸67_5=ӧB ⫻1]NrR//KֶI]G/:D׹"W_~@E8{Mw|`lqPg.zzȰԒځ}LvlԼx;|=v6<2PJ+|?>! DƱ87EnulhK|ڣWb;\ԓ֑jDHkѺv<4@|JiH#^<Ʃh z}kjO7 #@\v لGRQw %@81Z]5CDР-LFs_0W$$oxmנ#TdUd|2 qj>^]=tt gO@P(~=<>on]³aY 7b8ʤr4 e-aƦq6C& &PT߅%Rke'Abq[z.3$6#MZ .+IJoY7z9wUmnR&͉.ZWi g6Xmpkt@+yV: »_ߚ]s[YcکF2 *T*QKdzd/}".t|G #v(O{_+QmfęǮKlft6mw LXI`G.3]_\)1.|SJ S1՟`+eLLy ): EqȣP/ nvob\iMNO(|=Ubz Hz>F;F[ԅh Ol a $t-{:=|'X{#tU3p{c[fT+i7Dp'1M؎)#^y4Ogv_nV2}^_z4Nǰs'Ym 0h} H_<NY4'U~) yn_{?$gX )ed w91V |OPi]Tb܂&2+'r"Zod@ح^mn^xSikRQUCN&_jUּ%|rZ֪$Ns+S+-xz}23* @aOv"ϫf1;7z/Y9wlq?2G$'vو*UK'c=HaCh[gtwgt{ӼS5iB;r kZ <X/ (*[j.\;!s7Rkao~s'tS/pƁ2^*Ɲepҭ4X_SN w+niZ]aeӛ<Ot翠YbuE{37ԭ&X|erxrJ]WdoE2j_(25LwC Y@!D+}㶟FSzxrw9ƾA-ވN 6P8ťH5>LF`7Hߣ^ythI%f_vw ԇ%K7gO!ڍ/88\ ~_^&lkvS6p5b_~1ftW뵞\}%RѨ+LaOwN"^!ΎOo--_J-w6T+{c_gO xL}g!&Kᐒ >c'NLb"P/cd?3+#b@0{l4C08|T 6~hzNJvɰc&dC/nl;pox0zDT[IEJ|OfA{];41k*qŰ>oV#(AQPSWt!'pP`jdh\:#Q3?7 fLx /xӅo{CRC%yPM VMrZnOH.C3]۵6z:x^e p5 & 4&` #'V]v[]6Uuߣ]p!&ɕ yh 8B3MSBNnG싹)w.ؒ)Ip%[諳8xJl=jG@wcY|2*) ܯ-xU :4U F'u>ELߋ:G@nHnCz{=Up*FMBh$ L=?3 WU$Q^}HQ92=״HGkĞ&^"Q.67)t#RsmR']i%%uͼfՓ#oW.Do ~{w hU\G3Uo 5T$3O1(>Uk󾢢W%܎7br `WSTT^F:%_ HJ#[4b5pq"gZyj@XOUpީpN :/`gE{"vNQ,/U oGN=ݤ+X9,tj@Ce7HM~w7MkqmD$^ {6O|M"#LՕ8I[\^D*Q/"(I(sWּݡUbC䑅jw;e>}Ӹ7A4.a<.?q0G@c_'"$)roB!]hf"LlyQHS}(;@ͪC@8;63 Z7;ZP h16 'GD'N?c'Cn3EoAuO yXCԏ?m86Lbw ibx*CVqYMHZ?DS%l^Y4bx;FJ&st3|ڃCLf*D|oiu޳d" tB g*Qy{M_g7y7&? me jKyy. |G˨O=@r?ǜT8L>u~澫٪ V mc #^۝zzz:od++4&~"`%?K APX}$4 $Vxt,jy3Uӣ5%g'Ao5 d/CG .$%'d;dt.)M "$\sBH)B`iik -C"S/ڇ|<##ΩW{kUz.\'P!GP;{VTPX3ʞXDgJ+ߡ $س6%2|M3J}7 GPif%^=ɏ :^{.I6n8<|ފĤYvQNT3Exmĵ?)X$``W0h&@cvVK6);#~-e6-&-N ,{n />J{9Xkϩ'5U$giT/exfG5Bka%ƓƮPd#ʥ{#n^`.8vkKl+lY~| qe@OX}L<8 ,h/V0Yx9 L^ᦏL0o9>j5rS7&lߌ@xs>AY-Z,Fq7rVιR,4xr8kQS%o7_d 1uPJK+q&wqI ?S8y?Wy~΍oCbxΩ>9/`{keQ_O4Pxp;72+ꌯ4ҩDžU_RC ` Fa+?peD?Ϟq" Q!sBǏ-WmI䛵WWOw|93i# p{ܿb,DQTS c7RCmaإ߸%ڮH\ |#@ZEܯ> R& -3i Lb* rh{c .q6S9Mh=Ktӫ1GU`rDx%4xj^`B-[\t> M 5OBpڪ9 (4(djMoϥCy؇otn!6b|FHOsR&}̸ޓ 1ߖi37,n6Ƞf¦9b'Oq|;*.wU>j^bOM]Nɵ@1ٺDdwL)V8~'^,%X~cPb062~G;uE#x>L[k%h*F5uT8$]WDmJC<:g,9p>I( ް 饂 y O3i ܻ3EX˚̥GO֏&8~k~Di0m gMGrEN=|PNw0pC":ʋՃ`[8%8[?qÆv] ءk C /=hpj|㸤]G`x?yн~sǪ'Si5e7ٻ7++gszpd`|4=3cJ 4QDVtPӿiז+*jj+wz{ff8uA3km8RK9WmB,p@^xMx%M[#: Pu/]83x?46cHrba=hszF5˶nU0ۼn%7y 1:6S?d`.xAycds7bh;g*Kct˜_\p߹[z2ƘoUD55fL`.j<ɤ/,lUU\5fpFAN0& ,uO*w*rwm] = C0zʹm$w}Yn/#&+fkᎳ)ydv _7 R(D`V/¿p&v {l_&yW N &QN570Q1-)tŗiKNcM6!-5JTQb#B {{bay!q]=]ӈIuJמV8gv.eqR!Q؄<ݾԷ&]LmҮ xA _ H_L_Xl#|C-.'M':o] Z{#%Ғf xV假Cќ7VM ~h5{W~͓ͱø5 i1ZSGP __IҦ#7",~/m)>߁&yçla_ih6yŝ{[jnGm/DRMHCԄ<$/DU/c}OJ#L=dYs0:SD1I?c4Î)R{{|u]\Tio׌V 4$õS.^4b:l9`Gt=[AXӴB:}_ 7o8 9CObk?=WK:R|#]ܡ\ VH93HA`l0SW絊o)Bg\Ϗϝ7Q_Jieao0?mm/(Ո\)(DTQZ ʅpb6"4nn1?G#R${:@ xN!rqw'qWק{FETRJ*Y*,cT9sBJ!(BBBR!)JP BB!(J!(J!(B!JR!J!)BP!BB!(JR!(J!)JRJ(B!)JR!)BPB!(JR!J! BP BR!(BB9s!b\{ bXP\7_&RMme<60<{B~)O-;?*$TGwnz<O I|A XuUMΧSrpݳ#,q3ǚ%5ʪzϢC*e qr6r)7N=H7֜XB;/*q$%FTWv+;} 4&VUP5Ȫa=2N\'WZɒ@?Ɲ2EYmX7c֞-oW8{R_oEK>b0/LJnCrI8Nu~ #OX?A7.\ȝ=ΰF-o&N&8 iy? oVy O <:ǖtAAx@Ыgڂ$tl=gaI>>kk1no9ccA%B{&*­B] }A[} vg#g[x..ꟿL7ӮhQ=dT=a`nӤ~NtɿhZG10 }<~s͇EqE=@Q69EyAAVChF GACܫy[`~2V3J3I={t7hA@XӏFGlN&4Oز- MꈷZVOh&0xP(H!kwn-v]'}<p8;bʹr\_>?>/#?:Ƣ\&E^Bn4z+2xI?u+M <2?Q/s ׍ezu~pRopp?ZA*<8ro)pޥQ|mB$—ej8N=]$ jMN%d" CTa;|譈bYf`z=Q;#eђ> "P4 L5q(EFLDm248&N m(i7GAnvBh,crtLHblFȻ7I {AGtZ&x NjK*T'ʯ卢rCkOkZlۜMeepGuR&9B$GT/Z{{5J p ʍ1-f)]:ЊV0hP`F L(J3iÜm-  l| 'T\O&wS mJ{I4:B1"'=+r'j(9X O/lXΌBż?oVlݛfA@J֮Np{IGfӛ )$-Y#hCTW{t4Tas&StY J:`N'fӕP!C2knXt"U c^9^ Dd:aӏ@ۓ3͞?W-ZeaY+8 V%f}z,h顶V s 5>n`#4^)ǰ)Yy裺?fnދ(Clsc̑ޖ`^gn93d?Φ$gZ$qȇ%V>wyLtZ*q4V[vx 7[S?zV[-cas.po%oG߀.=.\44f6&>3;71q~dS{)6#eU"wA1ɏGwHKdG(θbtGءj7)\"/F%vAѮM}3:vtYmnfs1bIz׼YHTkuE>; Նоcc_(YaKCԳ=yH4cS ko$81<.O+2ƒPSl]erU_>\ M _^h- 1 f_Ko:qy͒ '9HA?rqu頻qEyy: .,3a>¼ Wk̤AMdt(3ap ݚxW CWqi/¹IlZd' Sk]o*|ZѢą6`Y-R;ʻ훓KohNPYr_FlmWٞdsv#!]0A&{꽽چ'*3|ͩn#lF~TBoҚov(EAzcvӈ & 3*Oѐm˿MҎad;D6a0;)P:ڏڲhG RK^ep%B%7>ֲu.g?;2`mg@kH %=to4Lu8ΝN;*jdv,/CW񇣋n7O[c&s N5M̊~#]UIMEGyYNj^O0'wDƚK#66 gqpVv[Vy_^@y]6^N&f=3g_ntnMG8c?B Mg6;` Wc-765) 9{ӓ7OΒb}ؖV4{OXR]796~k.>.˫ک b(wX201P:z1N%8y oڨ7ؿycʠ\×eRNrDpX|ELmfܯguW5;/zy};QsŁ,k=)4 ]?%؊jpDz``K΍8YvJںl QgS=|n]%>?ǽ1\0̽Ϸx^p$3%ǧ`19QbwJX4{u8SGFhxr" pq[pÏpe@֬5՞M.PIj`B7+X1b* Av#$XCNU8_P H>j~EI:hԞEAR\L8::x#8XNwT~Smy ٰ`L^wڽO37m2|jljjϏlgC" $%u*p& ~  ~F&J#%a2=QŘ\7 i* .slpg'J)u0&rH!x8Z@(+[I ;ĎQ;;JL,Ǭof'u.n[9Aaw:I;LG+Af 7rn@qCM`6d7<\v̺8b_#n@3'2k@G+ָ2F#<_zV qwUÍN(kV]ܳ4-=x}GdX}Aߕ˧mTG?\P~0fTŽ9 ffs='e>d^W#9##@[ p"dL=CNۏ 2aHꘀX^8W*4A)3KO4Y:[_Td0;V淝j{X{(|c?+: ł vx?5ԱnnRJC"ĉ)gFK:C.ϨTEķ5!_3UIͷYGY<~zctSUas*Q4 2WM4y?TY4_}NM|ԷIXhdG(__և7S͡Z|%X;s8f:V ǧ re}ynKvޅLѷq ?IE{y ud,vj.h6~w!~: {J q,Hr]K3~JC qKn{.\Vk;]!VoCgU 2`^Q90u0Ctۘ'M s8wÑ }))X5߹pRwk5ƫ^չb& \xYl" xp8I_35# -ϓ @ЃАA]  D2Ǥ%"d3P Ǜ7Oa]]H5Jztm~1(&RCo$]Ê;.@LS"+(Ν5~^B̢i\IT1Im<gze /.o@sҀh&"ë;S7ślb v.cؚQXH_1غu/[Jyq-z3T,S`|_B:6]x>L&d a;Jm*M[zŨ(& " }jZFt&ݜ \ 1BN=!Y%SV{˶Ґs)'W[Gf?aPodJC9BS9GwvPV[Ms8^o q##=mCp,8,-ORpdTMvg}mʗJH;: |bd̏y$UoWW H ??Rn3_hp';beքPYae .e9 ɖ@U$78n(mv1rlN|r>'#wQۤ!MzVAIݢ?Ҫ~HOs3JMrZ%;{ʳqZ.ٌh%HXBX|q5 e%QߚI{Gu[U|p1n# R慵]=A$Yu1a $I &-C.vB/q$2 =Ome46Ir|(cd9DÀѼE}=68Nq>.wvhßaKFxVOW6 kNﭧ/Q߻^c ;z/KϜ d/j)-Ґ2I?' .މ5r;~X4N;`n.Q& n]V i|̅JcFGo9/W:솹ZNaͬz iBMfj4oOnnHB@~z` [|K,KNx\_8aW Qk0I=?4dU}I5is;c(@b?| 'eM#!W OI^RaQ0Ett%mkGHr#I>XCvRhW aQUK 3Hw9hSFPk㪹^t|i똬Jtƶ@V pH d+A7*>а;Sѳ=J7Kbށl; NrR\ ,?ƺ$D"OΚQ# {;;'3\D:9zBR{gVwSG4W!>'A}r$QE3NKmf8۹[@HϸŬ TE qq=L AU'cEI]̓F-À ¶uF7FS x2p-W-QK~3 t,>DSd 7&FPO LP'N+jGkg 7gvB3ˮCߤ`v9zr]މ뜻y^'۬7Pt8qTZTo:Xݏ Ԯ{?(7u4&5$\l2!q1%V̪4&&LlWt\ۭ)~ ~?\(Q"H_ǡ)2GXi XkxUJ2ERY >Oz1m:O$NfK\"7V;u3iu.tfB]à"=_:Y|_?%T_aaWh 0'mqC<یøۮ33p(_Xp Q;ib'w@<ɍcP,`}!2h6i.H/~V4Nҳ}68O/½\HM`?BlBˁENMq^WEufPsJLmA։uuफ़ą'P;b/?ppXfKڄn `i*4Y<Зo-ص0clWH3͢\ Vjn*353Ō`Y*`md]/Ó&xy,슬g&x[ۦBɀVq'ܦmiQTRK*U,,z7e#=ߗ@ph?ܜXiF_ `2GQf0Mf5ix9(QvW!L \Wf8/oۨ鶻g"|14zH6MۊR(K? ;F\E8 d &+JxW-_T#H2Eʪ0j"|`;.:! GL~1rm>Ƚ7h/H}Ɍk1\7LkW=D N%<[ϪJ8KėcΖIFEὗ&l&JBpLs䫇I&-_DLem6eyUnK`P%>n%(<+-$xjM^%p5ښWLUvLf>?nWaֿ=Ib^\~A/k;kL9#πҪ0 #zo˕|u?$^_aǛL.@ML|TO_琾Ë8tF&6 H $Bت)"D₾rŰ`rNW9j}$hDсy][C>44hI&HWyUVii `N|xSxcʻ/0߭Q8Ư9P0 ocğv高!R߁q8˺Q6_ٺ{H57_9?[;Ph=U%r)=9A_=#'P! B %jO8s> r,fcGwwޅju\|L12AJXa"ұ e>g1\oFwy->w!qOis2Y /%ۜFط~{ ~fcgWB[kn %5q6pte#}IשPiޏ(WQ{Hwɱo 9ފ۬+ ;'d|cӕjOzG%^ /}B.4r ;`Lk)6"B~>7mpP$}\}⼤1QvN{(9f9{OD~쑕9|7veWo K6Mh-Ɠ ՀXg`=$/+]ⷿ=_z#ͻs :о2! RdyDQ${[rb1|s»;_9P٢v-i|)|\he֭dIP^j It(;%U˳ycs=7Ys ~.OI"DmoW^s#_C9xQz8BpmUːXjlnod}t(vH@ǏsDP5lD{!,^Vv1@<\{2z}U7 rCWz 8z` ʰa7k`h~%G_q/KGͿqVTMU+&6\臊[^ Kl:?ʤɰ)C!>q0c2T^%Ҡ+‹WCDXaW6C!.Xs2aidk~n?uƺ<[yT.#9vjucf9`-,bC#+q]h\ r{]RTe d.Fci=+v.tϦ&د?PQCB@RoD)ʧG.O{BI@Ior߇@p pgIGr)?`OcW֊uz'߱Jja^m?WO9d6cRZZհx4iƪ"%Ա9ԑSoF3 fm~Rw[ ģ9oK㔙NIB8te#|QNVO* j@Vc ДBnQ[WF 2[=wauWFd*4+49w>f`O ,W+ 4_`Д%F{Fnz׭|loˉGM̢!2-[tO?##ط<:Hpk;X^̈́T}3L^W+Dgr6=Xfɽ|!+Ϛc mhS;`~>~];ZޤM2 MU5w)DZ)kk I{"'Z+OD^7jx|D*zz;8=#FϚ9d$*Y26bz$O6*Rqmgm%̖Ԧ MX]GcZ^eS1a ݯ׸??]tz⬋4k TV/}Zw1zXYv^]2WySID}? /!oMjA韊]"22Epãp ŕ@k@53宏k([nP#^[ƍA7h&'xIb{/o7=ڂxN5==u_SR=r{yxη0*|Wl7ꑭ}-CwJϮ^}>48L.;Z6PXiiA)F4$p~"ȟٻl^ϦL;i>MMC>1CF]AUK E{]fO0~gm~ym9ժᅳѓpMN?FNm:jYt˟-+Z{zKss]U{q(4cgqih0ՄDrkybd!OqB_T&cɳtk/xAdyϸH2~(->.#l)s(jAOzy/o_bc#)њHZG֯ z\ߟ7L&6]+AK'V]?dxzEi/df~|g n4DŽ_|$ Q<1)xYXgrdG[k.%P"?TZ+N1 p;O?KsC&:$צ/*斾,qYQ"ryoYrG8.|~){rSQ8QIR`A`\4 ?LA2rZM)(_S9ia kF07%_Aɇ?llE>i}a1{ʜz>U 6^~xaO!Tɦ{&ohv{K:ƹ^GvܥgfS:^t6Pco (.?qQDM@.{n56%߇[^Ƅ=}~#)yPtDhu^E8+zP#/_K-*Gvk'" 8HQzH{.GkO$1aH_ Rۨr2vf!%؊$GH7.(γSɌ S -dž z;'Ivoc3y]蘏' C5m EcH4P#C{o3FnHd7%[/cx7{{Z7=gY^_(G6 }b8403wc;<{wkexo \\Ny?]!0fh0RyA Fk_r1-dWR Ǥ ̓zÆ165N5sЦW'օFH};Jγr:"^b%P54 O XcԲ+m;=X{c4o-=$\Q̊D59A9%ԩҺM4%ؗӛ(9mޭM뤏TIZr)ܟx2DK2]N@:[ԂqD'7ًۅo& ȱ`/Le3WT]>ZmsN*"A}4%z>iqE1ԯÐ[uynb&Eϰn&aNYF]vIDr:3ffe(`RkVk:% G(l;)U )}!l>}mٞ<-x|ޠ/4|󙘧t(x|fa5XnI--u|nX:k/wuIRsY6dfJDR'W*u1 F[5x@j /4Xs̠eKdHW*R35&D(F]̒œ;;_`H0Wb<{l}\5Ƀyx0`[gP5cZYO$ {OIE€o{I?yZn Ck^yZ AyRs~ˇ)n :j~aױwrц_pu>#'f{Tgہ v6c'@~gl][HIeKc϶])+YZ&&kuc5,^d\/¼V h mF'"uJm[!w5$ [w m0UmtY Adɡk/ק}|w#jn-<0f٩`W''5,{˖E[n?yi00"jGpO@8_Ϭ+@J']L8>$9  m=g@W/2\Ӟ0PfN%တWh7`RtpZgaSb≮I|禚xL'=FEÍD󲮍4֟!܃yy7=TbfO^7Z}&ǔ]O"Q8AbeY,Os5"h3Ł1f-?<=;'5vhpiA08󤕸j]*ܜ)sSSh  oMNQa+R$3#&oLƸU.|}U n0q* uxht˟V~3D7 [\/qK5 CpŇ&!2/'Eb+|r.7C*iɩC.ܟ7Edh-i6b,4Owy }:%Ԛt韈I&WCmqYhj)y{4ӟ۽GrA'ӲX:84I`ǯ݇v8k' aOE6= ߵ:tU Ap i4uZ= l!j~:\덜j b18t j36Ꟈz5~Gؽ1H"M6X{w.L])> ȥpd6s4Mg^4v1 &>zч+`ڕ+sa*;Q W.Q胮jk$L| 'AQk#F!zUZ BZj~G AU棓?~HD) ybRn7[˱O[3f"5}[笏HA( ]zd 9n{J]탲./׏22תzX Cn oI|_I}wVmsb֣̊7=\vi ?bSnjBbQ}88Aa"qݭh(7~tNAo$Bɷ:WGŵanu#Q2sXf4;lB^iؤ OUDm4EO"DD~#xȶ9KCm9n$]~۹,<_zAm']ə[3w6ugsy#=Cק~ndcرSIꇌM@<؂͜k\d}=Lxom.o}0G7nB` Q|RdjoS\_"l`kUD<{ §&xƇ e']=5a(J*/Ð".{!W.ʛ|FI,nPxt6UVeT6\cq98ayir_S A2%B>!HOPQwIEsU!fg3o<#NRiu,"HĒMGjy>1IWxʎM_O!v$6{s4AX7쫄qZn, I01pk<*ԝDU4TF##m2\V)ȸt́rq,-k8p}1#Y5= Q!.OUfn6IӃ>?AT(B_WɶY.hKRA̕CUB Op-^KNGr; .Ι-UOX=[xuP7׼όP'$/@uJ[Bs̓w 0{ A(؝3n-W_edKk CmGn?xYF]% ~k%,3LU\l#N)\#D=7^!D D~cd:Ǵ`뽟Ö}Ky%7(MփР=m+F$;3޺}.\ir-և|z&<NָT4ġ؊֌9(LT^reG珦]忇? P}kuNK1ا38Z=,nm褩]P!%QѝŶNN+r_S8Y G6;WzzO(gKpfꜯ|`?1S*h|6&.GN =8;7ԣd gr61N6/2H D e; m=]uykqx! P -AdSAKE'=1j`_oY~'\亨{ՇYKG[ԬC #oIuEF"5B?;7mh&VQ@$Ɗ:xh[r.˫=`NEh&.i/th(;tz2d9?wJs ^!*NS+>Y?]8zx"DW#R9< ̝x̒Yw2A&us3_>˄HYq4oHMK~@D[`5E0)0''e0vQ8>VmF/"x BMqҫ!`ީ`!CZ=t)g'PPJ0Mz3QsdcHmrʕ$tzD,n>P}67SCy4hX@2w{)x&=0vo&eqmY"0QNptzYPY?9z])Y[+#W̪KyCrHP%J`7O|*n#76^I;q,ec[^o8D"5Ywxye% Q J+HAuy{iPǮ'P+P N04)YT`Q(E+dz/ժLKުM.4eО_ˤ!H7o!Jb MWim +d)$cOh)Ӝ7"͚ %T0x/n4*_E WWKRP/[,Ue}BEC"QMKDrʜHoiC{^\XzoR!wdF<IB 2-3NPF! J "рF|/+UKo@Ў{(.Q J2 13@8pi`Bp,?9Zyc0}+Q`Ar)et'bcRKg'rdڨ. 2Ys jCͨTHC50ht0,IP!Á][ LB-<0O>(r"FiΓZ,ccc0pQO?X٦^l\ p`.pA4/H w&yp싃%}r!PS>yE%ڭNB1MlwSs!.,};_ʻu(Rw!ˀ?sfi8 !)~gOhyO+#]v{[sWBlpHC ڿ>.,Oejh˴m3I]{ivn'k!؝v'Ԏ'kbXivim6M~knNקq;\r Nhq?-mӵ|M6[M_i-?}in ڬ}Oy=^"/G1nϪp ! ʕ[DM1;؏inz4]#nd@_5!,zU_=Ϲ1ǃK g DHE'[1S#9 =˯w~7g!nTU߄r42cų ,+>))ydXl^2܀ _W[>GCFƩ3[eBJ@8w` M(^q~cy@G"%n5MOZϑb6y|EvJsc6HL)w@p.&͔)s[=-ͦ A@E5+Ps qAVCnGqɐ 'A*!ˍS0Vz 5L r-Dߣ԰?/mai=r$lW| 4ѼKPؙ'c ϯ5 !fx^_گlrǣP4VHvȲ}}idރn%ILȇh^:(-yY,O\S7*'[{*B.8^w`?D% " ~J>DJfz<+FϵuPEQހl+9n @ zHYGpEj]Oj&'F!BLxwb6T~aD=U,3E]bB^;P(y(|6Ϛwf6fֵ.dہD,eRsmW ] E?,PUld^.1򴾀c᧺z нMb?IlT@䩁m^%QYb W昚~JǢ,+ގ ̈́v.I2@W n@҅퐲bItlLO֖hEҍ:D].sëWl[eS W+Á#ɭ3`Bgݛ=\;(gj«vq+E# ye^K9-jZ?w Flv&B '4O pJ_IyB&L>UwE&KGZWiI̳K=D@JMjAtDcA,y$DI za1{^ݺ7)ZfP/9tiiEmSnq".`bCX9ڞ3Z:V{@ܸcJ~WqSkv .O]5'v{$8ZQ^x\(ѝdRP 9ruqT{" wIpbŻ{ÙƷgZ*HYbwԑ]?24'\Z\-P_{$p{z|WN]G]C9]߳dɬװG Y1AF)LdX)ۈ:QS'#?Sp \pFKbh4.n2{vynij6Bh RqYE ؕ{U/tK}uJda4/L}icbNiG# zjMD(xZs\eZbrKvv96W>=Rz%X;5h6|;ᏍC)7z7 Xnit_!^#fɆ:0[O/}R*{XwCilOr46-񛬼wQaWn 戢eκCF a!+.ZЬq jvJx|cW$.h[!> }q/ o^ڢ}hޛ'җSRj#jw!ubl|<X"fetzbbvoτWF|*A&.pl\1}lr.G,/6`VYyR6K_5\exlԌܒ!Cہ,dr#RvW&' |?M\WegLY#) EǴ:݄W K ! g fP/'ߓѶ#C\WʗbuuGzpzm0eu{(z$Fvzg06o 0 -0x҈B'HƊ(N)e>FC+ǑBrOP 7Ezqocu\zU\!Yd$+W{ ;YWf2_ j{ $q2^rG\Qdk O76CCP'9 ܒ;Kb8OZi/1;K&+*2 /N3X"%LZ,URQ6ppvLm^֗uk $=cmT^wؿ>#P-4"`,,Nm9D5&0pskKȽ%bx_/=xid2ef4O?Br1ٟJt7iUӥH7FM .sV> 4|^+ۈA@ʑ\yE7Lz9Qp%i-h]A$鵈ǝSٙgIA_{8SbK檉wKsR .:1D325>nb|&x =̖br.K$۲U & 9]Kw!QVbb'Ltzu;iԧJ7j;~NsJ<3j-'Zӊ}1&ef./eR_DF1$O<}Q,ҘNAA=['?q.J?+P\rIlbyqsʹp+ߘ7 putpt j#uܡ>v^#![rxtc;:Dƕd [vES:lM\+=@5a<~x_\Љe;J :bAoxSQԈd?j}oXnh95@iYu٪>Ozv3$] j&n6x'Մ3.ѐ6@iS+]3S/rx_^LglJ^e M|ر>e)s-ȃJ2quq XBYq 15+ăda Kʀ ?ãG,JHpw֬fގjZ-AWY]Rr?swzzЦ>w&=N2bJX4ecNYÔ2׉智Q;nx}&9 GOTbaBrdz8;@:Ύ}~ZcpŁ`fYT(W.8zWZDjy7#>w@a1Xݿ?7cHp8#yл{Ԟj6PM@*Y1R}n:6 5nOFA6*!>BGj!x-E Jkj* ~ru^Di `'لch…0rMLPu&xg kGV4z<-W"Gt|^/?#a)p1 B_c(d҈|L\(%"ߪu֟ s` 4iy?PsncƊ1'ocbr~Bpҩ熃e,D`Q2PH5X*Ewb^Ux>>D?ZoLYPsd<=h? ΋'a ɿ[%ub~?qģou?{3~F dɽDT\<}QZwpPra0t"ZW.@tAFX56N'v];EI[(# w<<Ρ% 3Pǟgi-)fKs_-KigfA /TB//\C+mv7OV/   Oǫ؄c|`q('v&|U䱒džj Ft0*?Ό:zέNW{Wd_зGI届bd}yP*2P\Ʈ!9Gea-ƔҮ2G=jL+RZuO'Ge^2R* d'e")A#ƈCՖMe1%2+Nu}y'(B˛[=Lʀj oI^q6xO0ğ?4g]4 Fo}S`$_IMFSͺÁ5=~x-cF (B*sa$Nj?Aqv%FZQGh3•m,ExжagAG4Ȝ4B̖(OM?ʖ)EWՃKN` VYۻEceD:} o<-oyȏ>f>;B.4Jk4@Lŏuaj tF8 ߔ"hW#zŧp`1Tog.d~/"KJ'ש3gwMv_ǭ' } @(]QX~7ovʘ!3rFa׽RSWjCyAh}#'PLwiMl3yn.Wׇzx|:tzQ}-QPU5S  O$ǷHV&`ȧ(6o N897,#*@l+=`V\Kp>}ﺜ-!*HbyŤ웨ez\)Ms6'kЪ֟Zp~q"QE>07z)I~&oZ0*nM(]#-}ORMX05)OG- ݵ76i&x'd6/f{oa LJ+R +, ޓ=k{ ;tvm{}D_[;WTܺ7μР9=P3.,\g \RBmOl)/ȮR$ 6ѩÐc%lĨˁc8Ia2/WwHsF+$b[Jr?Fġ־XVaK'7_h3O8J{Eq k_}~De.D>k9'HLuaUCPBhJ;ׇ`mܷYBe@\¿֕ /C::|/_]rOTi5; :`2X`fd H;A|ʩؼ, K|ȇ-:yJ9T|EGng%m@pbF|`,,tf]2ߦ@eR |(c80)nP{ڰ?}1cE z<뻱D`A,'\|POuI>H\yɫXT|wG,Z}ob ޡZg>@w ;KԞT)YGS  |O]{?}=/ݜ?WMA"hj?EDABփ8Sk}#7:"O^wHq#9v8s(G^ls{0bl3:l P ,RoI.a{m=Iz*s(7}'7*flAc!?d=3߼y`ucuDVZ}zh=[Įqnoc -#-W@T 㾻9kҽ Qf#p=]-L2;܋KJ2|]ExDYe/ND!S0$ko`|Τ0$4S 7u*Kj1 \VOCNOsr K&Q?6)C#5o0/_Ͳ 6!.ˀ *Sxu'>J݈VjwS*wmhq}(+5٪{ڔB4\;.FvAz;Ŭj&0ƣ4l`{@4Ҏk{v"?n؆*e_덓 -ώ|W up˕eQR"]?cyW.^\¸OADK̻X&XE٨w-ԵN!5I8<^_*i <|o4jgޞ;B˩C›_\ID ==MHӡnhuw! >5zO-|U,~b^;9$wvV! S3ޗ~:#ӞU7&Xlb5?NVNyt u8k_}jP3AP0M6kIpC .k—xIxSDZ&F6aآj`֪\߄n|<< O_Yio6/,,UYe~*ef>w 2C"ؔg=.5;%9-ENR' Ҡi/<%@p_Y<H3Y,&5;ă:+WO#[>rF7 O ~s[".C~77H6?>Zn61&b\e,~ ?Ķ^`pmۮS8AdfOA (|-uz9h.Z |~d}@T ePq ()c)|9$2nM"ZPōNevS |zL|6_ e6>5C k4]<5SoG. +ѰgAOn>1 xD ј${r[F  僘|>'H S7gC! Z6%tӞV sמgXcTabU{UPeZ$!LvG@O:M;(s?}Uܝb&u3klks=upg4c̑bӖ2ZVu(dT|wՕs-"G4}@E3`=ňn,`6ǹ=_oUWE0.]ݷ%gKJ8z/`j/GhJ'&"]O?ŷ4rP<}*BPݘmF=t8{S$Zcq{σL>&rGw93''lMGP.) Ja{eyI5u+oth3i `ب kqbowY1ݑ9z!i/k)#Jȓm͏`,=3Z<? b=#yWXvs4(Vs \%hp?Dz ~#}~P ?bYٔ䎻|TRN*f,,"W/@>T b"8^{KO҇f̘*$mZ 3R0ًO>k?t"\{C"}F=;Ц1O/'8o9˺>E42vۥ""h]7OJ dUٲ}lL~h R߰qNTx-Twr߽GiK>p0qdσ8-v|pwX7OYrԅ( yl7"I:q *Ie IΪ_QfE5ߧ[ ].]pER\?;s/Egj@3[-Pp>0龪hl3ujp2D hZ .ࡤ?ݬy.;pkzE*'?ݿgf7_tpt}I1e$exqe"0K`Yl*_d;a᐀.AoQ~2zuDa)oyoɕ e~Y1&\/Pd&A|G@zk"AømVx=INa< lQC7M2=]P1D]ߠ|:P#˫~nLOS㈪U4e/,\˯\aeڏ۳ "4أˉOuuѢ)UHAb !W]#׋ V{ɪܨZL="B=uN=xUDriJdX3,ac!:6+jbE۹> ?ۣ2۔ }~r"G^O1O;]*I)ww64$t?nw4(CgX̘!k3_7]@ӡNjYgP,.I/kG5g]6Pf`ʈ&=M TАIKbQf{! k+^-z8Q_nHxh.:8O91K1#^# d0|U:CEU@2?s8eHU@9`724/Bu%[z4OPˋʼGXGXY޸pBy+Z:~築UDJj!#yiz1|_ /ڠf睊wr8b[ʯ[ Oem&ElYS,Y+)Pԧ1(~RX "mZ`QT s}MZ?=}[|9ǍcK )dfUl i?FYQWI[7UCE>SybA+7x!x?qb:sS+8ǩi>Q};ix =Y082l/TG>)IeQ`:w;gVV3il$هza~>ǥmˮS @s>by }*@Ò.(lG#>{j"-W*42)oEW**z#tiZ fǞk{h8T |KHձCvF#zBI!,Lˠ3̂UZr_ Ezpɸ7 +ڋOʨX֍{G03ݗJ f^/b<;۴;&ɔ"yKh,7n=Agj!i_{)Cq.'-a/v]*aBo€+dD 6Ba`UAoX2QL\>rnA`E' G~iY?+VݟpC) Z.i0,Vo8m%SΔ5AG (8d^6=\:ߙ"T!>%$*Rh`އp@ *tu#DL~OPhzب JMwW,o|Ao!(5刲Ɨ[s^)߹$qmp-,>5WAUD1'K =yow\xީVgXL7!SlQ׫U[>lob$ZJG GfT^# ]0)m;Y>*b:)penvƜl];p*b'i,O\wܙ ʸ NdL:НF,4j͘dH+d CEsqPzONFU8{~w`mz/Ǚc۔dDXeVXnWax2cE/ڊBBeϋXTɸcs_]1nM[3&=Q/?0+5v !kbKp-Ew~TƘtAA?D?vUW =w>oy$xs<rLC 5~A̰ MBh| q銟>QHnp;8kN 3\[&/Tf-´C@d')_hkvyw8p1;'Kx Q {`ㇼ}¥z>Z@nf lT2 Jޑ?J! LX nTww ˝G^M.խ[8mm ua㌤װ,X: ~|'#WD}YAftp,,n s7DZ0i.kn io'n>'SU[]VךR}y_rfEݰ*B(o|4y7[>`lL]QWu^ńAzCi ۳ꐒ}:o}vー5ɷ?)N4I޸Q-Q^HGoһVk?g_+IcÇvz7i:'1/'V \at` |p`r)+T]'u*6ifՏ'mcmƺOI츈yx_T=%XCUDQD&!l!? G}YCު7ux좹|8|,MXfs >9n#\_nF(9{/#{ʋp m;oE-?@pv@p`XxZS/cj&la͝pβ777E8 Ht^gSb`N[<*4BzUTZIZ>4F'Ol|5j7ף5@ ss7e[tk41M{xXv'Uպdsͧ*O|xF,yj'N&UTW/k R4Rs^/encՄQ\}?ē_(.&|v怯tIU`% k/o wИ%wcP_ua "sv"y{d(12kY;UHAc7דfgz37 Cct4~__Ky"}t_h4k Iɤ!& Ӿyxb6?Z{"O3F)j{^[9h`EO'Q5hhm֬wr:ǝ@rfُ,_Z c[8df9_pxVg8_p ly/ 3w5_CCDЪCKǪ֚{5/Ŋ>얈u8 /J/Bʹʍ:ä};K˂ P}`!.v;=BGRjusH",9 *frCf-i!kurˮe `A KjrgÄ񫺡(j 졷V{<HȎOa9G6?G墍b`"u\Q^A~Bwp%䠣! @}mFF&l?X'/y>Nɖ޵므5߯>?&33dIk mMaYC2pSM$"_ܞ\A&Nmog'7}AeDA )<Zp;} I;/aKe)ɸ\Hxr*+ω6QJﮮcwptWۄCr%! z\G}POj1t֫YE5cVqr!KGMݸgipGd 6ISU3XŸZsXyjZJ!mdݝW3oZ#& l2H==us-_6nߢ^"|;WX:ԞqԮj,1z)([pêJHϥFMG ,qo[ZJ+씄sd7ժ7dͩ/;B&-Pn3>7n|_<= XpYKR%R4\f|ldQc nOU(% p 9qokBan/?]\w9a^ G-vK #St~?RyDL@ߵU#lZH4 aotHc1.¢cˈ*'@&׀irNEץ=sޒYp 9RjROP~*I֒o>@RJj7x1!b^/ ݚSH2:9QP%VB S'$ }݉G<#FXm7ҧ)԰h-00`ԟ.0b^ʙh467^:ˇ߄b! w/A&A7* SzAōRQ5ދ\sW[-8H.>}vD*N|{oe$資 _RIL_``C ;ԲPF+iu:RxN+aWjlW"wU+iƍ#3xNLTB{=&ŗ@o/J%#czuS7_yuFЃF|Be#t@Z9i'ٸ1])}Ѫ-lOt1yQW%'݃xꂬ|W' h^xO3u$瞐^j '`JRCz!pFG5;F|V/,UDZ 5VF+L@6vO1Ď\f6jg`".dUsqϛ5/8Hxܴ|EďMu!HEwN% N#MY|WBx>45C_ʊ2k2c=32XƭE _WK8y1DKVaTp yKR|* HrW_ cT^;gpnFA`]T8ΖB~? Tj'π}KT=.k%e3W򻫓X3$RFL"i&e)E(#v>vᤰ\ ƨ䕆h7PbR*֔FsTX{GkEFbɫݪ243G x[A [fOKl!N;kQUU*2~ET t)) 9ϵ3K9R#ɺ  G(L":ĖZ+8f)l PgԸI`U%|36ÁT=lEU6JD""DZCf[gQA+yi9#1g@BF:^k+.?ʼn4i}y & !O.De=@qYE\W|WbQXƣcso8I7uŶd> (zݵeS=7!-LMXF,R!~R0||N"c(*~CriF]qBcAT^-,z8,ḧ?T0kӧ{ր^#܌?wl>C yǬ_= 6 @xKVw8_aDzAc\E"P՜oRl`J쐔*. Ypvf4-Φso7aw!Ҋpqݷm=۱aq=|t9 :0I%1^ aa蕠7쨷䄇ڗ MnӨT;hV+ZPУ"l,ʵ PY^ЄsZM0&m]p]&}R̭j'S L*\ia˗Ն2iC4asM\zZUCO1B5E k>(!yGO.{KuL h| SU@$ -^x5>GMơ;p ΝWᕾnn.40o9R,7nyXX) ]7Tjqɂ!>hP7MO'lW[,TEh2/ftS'oQt~-Xy]!;t̽K/H(Er"fLDž)qCܱX*ĆFVMk@ 2#lY~==ML@gdvg|z:VKΈ>7a#{E^4-9A-SĿ^}H^~GM'ЅOS"Hjf|ֈIۡK*=Dip3і -Q &3Wcƍ= IwZZ^HGRy*$NT(InB0VQva>à5m @*W|O rFwTNoxՇc7H Jtb._A \"ݑZNVeWA1>M(dwRu²&cc@E1_TW6R ll.F׫MO]b,nҟU-";gW؆n!q_u{. *rMQ15vj^>8% %r݉}[]F5羾 6j(VB7JrݎrL'%]T+27} kA>\>M+粨h{7}ã2snzWӁ!µŦjs{ /6] ;4~Ec@=sR{gN}1ƥkDwE]>s 77/z|Q ώæ+] pk5E&Mƾ ;]0O +ȡ͇lT}rەȻ='(ny g/ ''>P{XW"#a oxݳET =0r Qj~xƛ^2si8*ӓߘzʽEr|4VwҀ$o:@=ߓ1"`C`c}ZкCtmgՆ09ee=O᫪`h4~^*s y1:F'ȩ/,\Xk2Ft2s]=yڽhpqY\!TRO*_,,vM~ixMz-KIYhWXBb+V%wg--yvhxVnlւdrs{CsBE\~&fɓOʼ5؈˂rgy;56W(QEG;kVrAa\1 \fܗGl|:@.}+¶qv\![@Uw/z;(%!}O CYrր[ 1Eŋ'ٔ7+gO"Ů[:3#/+w,8|MqꝮS:˶}EaeZw=tEՔ'sBL5K!!;b5j -~?[mI'9/+')J6yѵm^!}R[9Q# ͻs52ݙπ,N+tXN&@:Gq:]Tke* xk_S|s!hS$#$[JֽCشZ/\8@_TG B?zZHio{nI]YsOH̩2\6vPC{k2D)3֏%Ҍ%X;bd)IoW]A~v/ ?k@u`co{ i p=/s.!]a;?iWOݟNNHJFHպYr/ö>R+,# *u6 |/ǿRҟ/nW&l+e\qN[k+d@WuX^N kr8dy0bd Sٳ"$dJ,lA$$ZOq _ ecUi&DD, cfrOX[cD&J|O'gkHQR(yfz[p#"x11\?8;1熰Y1q?vaQN6$ #> ?~N,8]7NabnCvt*;hTwx55N|$m1FPDӈ%g"vD헏V- ZK. K>o)kݬ]a]Qюk(C|6.ȗ V+tZ=<ϥUj-Ƅ:FiY:(߳ǶzM/^eW"׿_?=mr[<EcAUIC>1+By٩{}@qI2L-]u .V|C'ΜyXg j&xh+ۃs| ?oS9M[8JxWוJt P]9Lj|w>Gގ%'.^a hB\i+$Pal+yۣ&=4yFI94-FN7owZԂqҴ+~^Qe'fXNJa)y;M4Pw Z7:~²Qn]xz enCAmYޫ?m,Ecb6/jQ/#eHcHF= B+ndGzB15X-T伫\֕vtbQ?Q7ər\*ǜOSvN4杸QP~x]  Wxn˱F8:ޏAu0 vTn-O XTliEpsK8h`'9HS/ũ*tUCpG]O44¡;Iz)@A&#'I)09NvIR{į9pׯIKTrF  "h݇j LMXsxP>ZH\,ZPX'&픪=D u *!Y1c+nܐ>o[aJ8 .cD `K\|#%SJYL*ay-)aW_0rl*GT=U̧ m%"G:1ϼg.6{ȡc:ݓ ~(DmC0:o:{O۰Εkxݮ"\ xz(GnM"،79ԋ;Æ7F!7q}shF `rhr?HW>?DR;0 4!hɝ$}?P{/CA7w賴`]KDo' :/2Sȅb6p?}Z3.<#Y"Iu)O|XFLM]k~} \ORXSPnaIg1n]ZbkН+q1lX7A<%[ iQ7D+ gj>M19 X ?/5jn%T.(Hѱ^n=.OɔXI? bI :h&e2V{_.)\sTA<Ɇfyzei9i;HfC}fp>سbdfk^mjQ|˰X{XSs C̘-c;q"o1_vcrQh qL/P(5V&NZ+bTR^Qe* uc-?}yj$m,K>Xf*CgS Is\c!埙g-)j[IIEd 梊HWY| |+2lpK 1qU߲Zy@ &u_m(Gv=hRe\~βϺ{<H譝1H7>nZK)01J +cz2KWqw"LQu'/2++"exJ8Rm<{g2*)SE%h/1]_3 "N; {&yxF\k$贑m}w$BX 9Ymr,w6S**k|#l@RVvD|jS=LӱaA#Z!sj5斳/mkcm/@ t3ռO(6[V4Ñ=vQ*d( {dc_ p_snn5TE~O"{?<'QcW]md=4Ov$l XFOʴ $0'󧶪}7o!Ssleɴ:}[wlL:xTiQ:fq'@k-²h!I(2S͞(2/E܁3@{M#SBȏ![/(5.O|\&< Y"L[˧½*ځc.hIYn 9hbؔ:vV[> ;[8dX-e~{{X-=QyXs .+ iVwv' M:_aGt\w_ĝ=SW;[`B㛁! ]$/H(W@M^6r29gCa= yϸfd+`>]kZ2dR8'\xу~ʼnQR(j@pu21\ns@aS ۱?m|k4PUvBO+UwDg% ǡnXMO}P :9T4_)F^j*_Tࣘ>n -~7u{%9դV8MWW+w8jzsS/Q$gBృA ~{/z/ųBʢ8?b1]%i"y.:1x4ZN|-?@bZQb7aF/ijJ'h /(g\B&d% s.Eh{X(z-]d5Q5󺟖o/!żx(T$".H2p$\k+H"z&8]> Ǖѽ>! J9C$Mg?V^/1_L_@t ['Dhp??[ݸ~ I]><:h'T4,i{[9SXvIؚw?V%S~6tDƩ>H֥ |oYwq{z C?[+r[lwOi)ɇu!xԨq> s]0ձOUPwc G 0hη?xےf O3gbcS!hRS ۮt'BTUMp9sH96l||~H:{F) .Xld'%$KWjN qpeدשT_OZu8qZ\Q4B.A⥳ӠM4!~_IAZ@foEcGK?{ʋU>Jȗ)6+T t!u *7?88%9[oP lX;(6bL};0.p +_?T-6m\R&\wTf)A+e(n4o!Dؙԉ'Q}{#,zm:pSɮc3D[pYz^r޼~퀀>ňiw88<%#s3oljy-}ݓ'=6!=$wdIݰkiDO{`(_6o"#-񔈤ǿJLW ˽ .Rc^*ȾloD@Oϐ& ^=Q5 #O\`H,n"Ǭd;ljY7*EPpN!6ZBQ@]df_oe4$((9|2^PGȕ2"0滏%Baճ,~n6(*: ,~jq\& }ߋ4A. c }p .$aΓ+AĤs2]b L9=Fk;v-!acQ@KK0m0:g%Xl~ϭܳ ;L`# W[Ղ[d-mM2r^LRq`/+DqO{rW%|ʡy8ÈǵmJ|f£Vm=};;OEG0/?0?kfKN??ԏ &Y!DJޗx]ҡ ͺZN SP?GfSrhEɤX|)pELHjWQ{hS/ч̥jr`u~ ɄX_c8wW>5;[v[zz!^NJ"Zyw|y.0}~O_Dң`Kb\|Ә2R|JV%t\=:_~N.frG`lQP7 &ajRWڦIQSI_|})zHXh?XkzK,r$ŏ(6\ɾyFCxnLWgh^g'/߻}HEE]upM,䅛a'FvT:䘈cO4G$7kw8ϼlN?PaS%lK~< )$g)PLl2-WnyU;W:< }evq2E~#T<ϐb>d?8GbѤYub7,{lu &>/E5̆ftbZ;N݉Y9ŞWqwcءߎ{cՍ%Y쥅Jv]H>Bkj뻭̊ d xbX#zgQz LD}auCNLuy;%OȓKp֠{A^W?Mʴ+5AGEG۵"4MߓoyI(2:=_hj&5WЬs5^c5Vr8n&F3Xd?T[R;{!׾OȢ~/yྋ< fD?SA"FQ r죃 gt5\C@3,H2i^p}'OBO;^Hc!pw>-2Y5]YMʹӤ-=,?I_53s 4ɕB, Wm?S9-n3-yUYĤH\Lo[qJ`+A@1ogz87x^RY^[Yg?&1!4fim\0Et+}MRh_O1]$w{i`h5@6:+yOnPƂB)hDc)UivEdmR}><^&ik3hm(譯7%?\A|&6&s! o~N>_oN_WJV ŷSQw ?Wg7;y %A hԊ*.]-=L[S#Z ԭ?1= 3q~Vr-†pz!:b''LXԧ-ln8lpqmHϻ Q0 %LjZ.[Ģ #2'ؕtv^.0~S>}*~m,,2|m`}[$\5Dxӈ5TO${mjŕ>d!g[iqѮL4hT^6юRR(J-vodC9`W0H<: 4 :m.OA'jOf_P-rxhX_puc UJ>1B#ng7ZbL:_3[2~r5r]^?A& ;QnfSd-'D./Z?KYjAS;#G/ydL1S۶vīm!=!ŎS]ufnM0:vn^b<'Xt'; 2%\;ՠ>gnJ3G ΍&8up(fȘPM_65,~-tWF\GV==:@&Ȉ[/ű&FXݓ'.olH1Gk/B5m@}脞q6t$IBRURz$|j@~IA;n/pX~B$ebp:<6Y{\Pdӭnh6IFG"Dq=Ϋ!Zz3'I]e8 x@y~Z4K%("P6kqݴI.,^!E @!K ^CP-ZuE!P<~zm;o6GJgiuZn%oY+"<)*_}Hck 6>(ݵڑl|S3zvղk-HO&DAgRqG#88G!sRQ bԖhV1ƚ>s/)<x[*ߛ !gyfeFR #1? yYI y\Tv'~6Vw$wYʖ W7x&wuV3FeCxbrFcV⬍!S3tO}eW ۪j _"NĪ}&G/f"Q rLI˝'Ig(\=V\vyVS]uF*:)UZ.-k8\mXuD5 \㠴pQo Ωv=7ш$ix c7sq]!UD=NB] dx}ǩxϬ\v)8 \'%nV%8PkaZY?uYX>9xyas} :8LE8)v_8%4Q 2JQx;F!D&^MrN0zu$gk߄4C,6껿,ټxתVP:#ϝ7^o11GzffW_BB$b>|w%z-.NOPNcdE M:wDvQuol|Ovs7sO|t[R0٥1ΉD@%NwyxAG4Da%8D^ [7Iyz=fb]xxG{ rPa7ė"?$3$t#p DX#x*YH *1p GKO!Dӯ(nXߋj{QVTDt;y퐄awyYq9Ԉ92?c6hbo!9)Kp _Hb:Ν:Ttz9w9"B-}>n#c-}Dg#scU XJ?؈Ջ8L#w>W?~Eg|j"5!֏]axwHFxJ1^oEupYJaK wt6) z9}?׼fxg`E>8lH-G&v7ԣzrzi5W[˥wɕÃY,kK)K7D^}U@DFiS_W8 F TJK̝|qijt`|Q|Y_Ri $S"E=3v7K*oǔ8]`IJ3W ^9wf }<$Eٙ-yVN>m T2d=%6g+l 9 Q4W:LXleh>EN](ICߏQĒC58msmt>0Ld 7#ַ@iE^<1Ke&)ȦywOBh. b#"#|oΉ1Q%*2[^9k'N-:n[NȈO8ჶȴTvqg_~E 4 *`ذ"/li+KC[kU"?o?ʴ >v*="#"LVk{[:)퀄U, ;bȈY@}hՠCX5Ξ fO ̋Aȭob#ci(rz8&%xT!7|Oaˋ%8:F' 4Os6 [q/q͗ĩcT Az+D_v^9/v=I;<=u㖎֥@F푶b)}~|fήpۓ" j}!KIm{W}%C>y;Cn` MiG` mF/EX^'m=4?G \3]+ ΫZ3w\ED8y͔$#yNl DOƽ|q[_(8&\{1n=n\ޣ!,j*m$sı8k.sWA! BJfnx> 9m@b0 L︲`ģޫ8v\<(ӳnVV۫UҴ#$DnLDJ)FlUҜ9(LKA N-Dv4L-%8'$3iuάL$grޢqiY\o):NPqpЙS &v^^M <\sN48?!Pj[ZE ޵ ƴ; C4{MD:O »1T 8:7i|x3_QK`)ڌ7y؈9=hD&"$%9*NF ?w\}Bఊ>O69A4G$H(#T(;G=Ce<\" b0o<sV oryZAB%͏RD;8& ' 6,)*|oI5brUH8=6,#E|S<hQ'gDY׽J*dA _t$,Mvtu˶,_YEI:_?7[ev4;7@W-xw3@(0Ƒ+=$q仜t%+~|܃FK')HK%cXt_  7Qk'}D׿k Ϯpo y=i8T2=4^]3.X}NxSJyN$]EK"!>B4e%PM;3`Sca_}#ӷf{Qn}_ S޶ V<X48 -n ѭ $H^P`TB SS9K?T#z.,؈~ۺY'6 BUmN7Sj0 Ǟd!(9=y [IiFrAJ,p;Yq"#֔B,Q yo5"7X˸Ȼ9DG$y}Z+,⟯? oLǦøu1p=j]-&ٿ -пw? K)5TMĮ%rhAo,@[\?<|4'r>,T2Q39|FXbi:R/ƣMSu{jvm/ io꧃%t 2zy6?8B1-TNIP3's}w@ lRu9Y=H+q7>*yv*lyC n]VI/%{Ǩ67?2-\EfFagg:#?'!_F8|qtYbw\9j@u<{?[*1U'5Ez;&p(y.FRND'o\ 9;Wp""A8L:o9\VLҭ9RfAR{#k"#7nV/ >?5nzsmN)}""P_Z}hNe=pdR$ 2mglΈ!}$ _(&=is5wgTK<w4&GhMu,[ˀ+@XWԀ9ˉlß99% x< 6S8nGB@_TbN*V1҃2]CP+Oٯ֬IϿ7vK2 nVn~Q(_;*CCJS|Fgb^*+1yz?SRvVWm3җ# |& ,Z; J ]ّm^dQ'?jpDWrO I3''B1HBzD>k5_يX~EFr{ͫ= q.d u&n$eU-j @Df~U735~HK֘HkZ>=G$z'H"׿Dϱ\6J5>i~se@۽?55IݲsT;u~Ck&ͻl}Ajys2UŭJ.~/b vc3vO(1I`GB8"mS`u}_e?4Q(pX'|'YŁ |38>IkS_~:j Ĥ1(Z6ݞkN}1R5۝4OS(P̫[ V%7~x:8"V(9^j/nlH_fTM#Z3%R1zXd"bۍEST M声 M.M㽵J PLvvt|e:BS~<D|4(~꧳9*מ/2-8[JQc4fM))?FM~;m|RM> Svp)^ǚ#:rc+q" ]](ҬuĶA{`l%N']vgϽ5儕,`S|f9{43?ؚu;OͻкM(s9ȈB( E5'mDZ Fɠ.,ӱ L~N5mu{-:oA]!r*!ZQrV%|I8O!ExR#} PIbnvFGQۛ2">^zDp̛W||/K^#m8# AqB*!"75LTU۪R7ߎ%> P{:eR΀1 BM(im"+'"/ o& q4]P2l6y٠.9 Ŧ$mg.fYQ"+%QS|lxnu-}!'E}@ A$:wX )'Aw jӘ]z5nl<=m(ɺrc1nYfl``/-.>wt侒OЭcD"9NxM8Gk$^pPZ)lY-hD&;F@k犹|Y_iF|+ۅVo:W| T%u -r'Ήן<0V^pgB:B{aO"sĂH1GAbBRYO᪶9}XC$=b W1ɣ r(**{99VDAMRJhX&c8^apziV"B ")9G]^tlsG@<9v:$5oWK1ȈJ+KG T R<DwPmLT5[#3'h+1XA?9N7bB<#wޠ7&Lj7nV Otͳ@VvJDy-/s:˟33 .u=»icxNH\jQK%־7s6j>gW$șb5@MTQE8*\Ap?b#v{``)='͕X~]nَq<"FHbh)"Q H}6S}6I>dAkT1TttDm6gM^b[E7Cf9Poapؗz}rQJ"%W-csd@Z0+| mL7fNZ^RMKⳢHVRrSYs^>xς.0r濌URэ#+|r'OVOAP -8{lq(ִ(f}[5&2;{[ $yIlYTR[>nDѯ9MDmϬƇ3N #nw#k=1|A,}AB!" Kbk-pnAk'U}m7*!j{~$d1ԇA^l#pz&]A y݀$M]}5x}Yσs:M3DsL@޻m'g|FU~^awr9~NqP5~Н1h"u&(m.S;QmH:FoXS\N[W)ɛ!yXrNsQ[})#63N}Z:u}4kWRyQ-tl";S3 8҆.ǼA4fEy?Dq q 9){??Nu?nKB;aHpi [-:zXariif(8NrOK@mDFREJb5b :<:W5ƌG*_l8Xgn[ 컑1.lhQ]7]^,aٛn͛`x^]&2;(uhү&-k{OerLw|xbv\D7/Xf"lJP5V2712{bW2 :"[&=ty m|শ) `Ȑl%YE]HK_ oa])n,jZE"g{HM#;YӾӗ 5DGhGŐXTR)+,Y1 U7^7fitraG5_FÖ>Whڔ:̜|1܆8MF5w9=$LȈV_=+BnhVr7QޤQ,|5R%F^a\r?-[ -F3)LNYi8ԃٵd uW~ >kIT}R1n\n,7J*(~H㗡°bfJ$uv_PGGbjy֭8"@mKAOo my@>^xݳc=]ѢۂaF˨gPrg5Ll);8ʟW{4>Ȉ9W埖^a~~d始- zCoFC~+aB<%>i/3^%=H-zF˃鬥a˅+lߪ#:K4ڰF>q=xW`H~]>no0Px,۞PVX`QAw @`^~}S0ETlGT\t su M԰h#Laߍ3[' xӧHggų>Vq1JU"#ŸڵJNJ~&k7$?}zGNV Y-oӋ "[? ]b^tYY5 Z2\yL*[_ǥʌɘ`RPFp  [] CC0Tp\~ mQZ@C>ͲN|c~oã/]CʆjK"g|X>n5\D;,k3|}]w37GOz\6UUC&V ~Aw]g\եXlsNE?-//|@ԧ?ҿET]zDɃ%?[Ir1~{eV/T+l_7rۨbg ubP DkAZ7"!_$7 w_ J27xۭ#,ڊ7&֛as|>$"uGJق'ò҇S՜&0k(5t4ybɚ3h@R3,Q^?Kz찗}ˆCJ#7Rmc7/ec /%DMmHLu7DMDoتLyK"vo۽_o؈"(xuky>UfCf%Y}֭. &*CQ?4SSЌ~XG: ߲2غ ;Ɖ>5@!Wq.'iw uNF͡!@k+yxݷwIVD6q?L)J/j٫s7)S.ׅ<ֆq-NtQߝ*G*ε1vfFKzJ`V/ aW[Yߍ!|y05JXO60ZWPTlEqU> pxXɨp?< FR> Țo?N945T8Z6u< 6@_ψK8[a9(_^y_ΡYa'Sܺ,/,7vfDӴK{(jy) VH^{X|PAӬӡڥM]\8Lۘp:1o~gMّwKy:P^栚/64 }I^Cm~=tB/a"v_ukc\[X*.de  Sw̰ yȐ;ƄԳ'^fpэcwF'"m,$m4ЅnKL몤>n{^ap[6-?,ci:} cmZ_}nC)3?qhNs%iL3{Eθ[( qŐJBV*b1(8n'!Ou$#ubv)jb YߪyO|scJzVBfK5OsW+.H+L8]'Z1gjOܿۮW|6 ٔ$u~5\B k.u:LdĮ!n,SWkb{<.-sO _y# y_GUJu[/إBg9ZT<پ}b_KLڮ6k,2=VO 0R'9cr|1,2j{oW >N/+^,f/[<_`BY{IY7F;ob$FJzJ>H)bFygHu.^>h2>ZxIZgJLS'a9RxJt@D`6|΃4ޫNe2MϹ. [j= 0$7CQ~f gꜥ|㪕-U$PN5zl]NZ.n9!~|}bY>ф6_x{FE'zgu^+WS*0qk9f/+]ny9&aHBȖY-)FUqsr;7"Gc.;aB~6҈GRb!t=?`[VYpT|:owAeC2%^Suqcx`,!g$sXR|,#l9Ofs[F׽ YPs)opMSmo&lN8s~(O+W8v՘=[ݡsmŕ'hJ7KwoʌdoxLmle)#|B՛%2ZDL'Pf{H_C hRh}Qh)5n7 [{kVf7dYNC!@~9pjlH"gn,O&;4Q77G/F 7٭BlroT&gq Dٙ0xzﳿꦈj1&ěpkE?rWg<Ͼ!8!ViLe˾l77̥pԞs0PNAm0h{z,)_E5?,bg{pۊIRTǯ'&7[1ۢr鯈G BMRF5^pvTx~} n+@FBEb{pbrf89ӽE;|``s{_eqҘ.^SfG_C~z0j61?=[0fN# ]Y#6r[+fp=9G2%v ,Is)pG8z Hd)>/>rp:TL+KC_Ch8TɔCN5(x_Rp}aNDˣ3ӡ_Iho<5t7r}cC 2߄F'r.L@ypPW}g(m}z/&h좳=.^>E.EIDHoѝTW=Z̸'ӎ)v"Pw{I3@I'w dr[5AjM%с5'l`GyX#R 97띱'UX$}] n1]C ; ^/ޱ9ݹ`v/7k'BN,4f|SO6}hhT"DZVbvzǯ_I,]q(ժxRJ*R"9hNuG㕛lX1s(Ժ˞HW&n7X >z0N/~/sŏIRG,bjszTߵߤ;H5Զ~b.gf[? X24\٥gCX%0Vw!=w]*ׯّ.Lm;Cns:e^=嚟q:y0gl.aWň~>'}Et7-Զ?p[$g+ufVοYУ7l)ZGt܊+=0pN"(~DD}Ug7JsfK ucRKj&!jѪlS?9y\x5x!;?G7Vˡe3Tk;>aAۨKrr%˘Lsw%xs-aȈBt8e [lWQ(NRdZ =|a3~2%m j\ܙ u/%Vd9IoGlԯ3BԧϽl|O}Yʯ%-ZI;h~oP}6=:*<)&vE@vt".s'b7oaČQr3}t%˖7an$.-΢rOY„uǦxֻPtEq4c&GbDn;9VORᎯQ߅$) w?ѩ$f \U5))HdS꾈_e_sJWHE֪? ^hQ@tAeo2H\M )IW˙]֭Pntx߲M"٧"|qp. #+!GMkN orV {\5}BZ=y@l)ޠ$V|q+52g_W1x۴у#(?1Po0d?vPjo۶@##IMޭb+}\ vwVCqx('"1 wcb{@cJvS ͷY;WSy!16;ezp(mW^n7mr}\ 9w`%Ѭ~~@Iq Cm]nHqnǔEuW'wbSYgc%" &pxS6}pnq" YW<ǧ5{K$(pȅsZF#qLK'ue7~$WIzv,<99p:W^CQW$1EU y^-h~y$>Ic]ђhv)G؂K)#'_cO\i%%J8ܡM־*m_C̺|U{]deY(hǓ7-/;oyZᅡ6m80ׁ=ɽrrbZ7O3RlnI-3g-<2[1xCY;yduyl6h[ef.5'#!O_1w66w#{O⿊+p{|o3j H2y[5:XM=p);ߝ$oM%#wſa (6M_jwba"sE ׄy8uE1wPC*^Z] nFR毜gd<΄7/_g<=%z_ ~!yoT@如uϟ3B"aq\|r"9"tN4ID$C2Cdn֧)rK(5ưlWXe$nt';]YxZf_%(h)SӓXt]z_˰X{5ऎGr}sy4Esk CelJv>}/y<>=WֆTPUs@K)''7 xuR@a8(Rqq:CzXQ3ľfQHqޔ1sEv]yl>z0)&lG|w OղHOVӴFtCWot lf]A͝|77ssdIqiE!7v #/*X xm%aXD ch }wOqt _)DdzRk_CCg /"!Y1dDI\&q G~ =yxxU:|")5|GG2(8ϡ賐`qɞNnU+Xluΐ)w@ʐMT²kֿ!lh,lc@tecw(iNOD l'&{jm9&n6 S3ӭmx>$t/)Rׅa_ꂐݬ_uᖏOٸ5V=nкt"NU:*2}#xչX&wP8)c^\u$%d$+ytݯ1Z:&[Jɹ#-X>XZ%q%EOZ \@UeVhe<`e]Z+f,oSf?کǚ:j.հPq˿asl/+˱afv< qW;PdmHq%`nmHi2jۉ+qg&=yYbm.,@ʚV-Rg&]@^9qԒpFy{QKr7ڌ޲W透w bK務 f!WPSIKîj9f`D^2R/RX1 IJyQ]B|VۉLh9!i ]ǣvk_\xN @tiMY츫Ig0mܾ#ƕG׌*y,vlIٰ%rd9D(uZe,wl73>@AIV ?k>7C-lL1E4Є29g@pTy&.'>N_G颮y_Γaտm$@[&mԋ=hL*:` n׋b_az<((ʫhfR@nFmu7$xAՑGIS.IKt P[%WFA?52齷$3@`zDm ߚ.G ɱ:$s3H|`2tֺ̠ܴ] X$!rY9FKqD%9pސǢ!.UiTl'߫/A#v dHJnu.d⪌!_u9zҮW*l5P^\48w7J=wOS2D,u[vѩޙ]zsf9xu!At4 غBMB!͗ZKϏّAPNY4.(<[Xp+vfm$@+tyʸQ eK//{m4ݼ\@4Q96 Wf׽ u٤,<'_|cM|[f'%;??3w+s>3bb0[7L Ap1^O Yb[\ˈ\?DL V@4 P>UKo|dAU>O i=XU WOȆrK:Y 1h|T9C޾Y pر?NyNmت`?Gl>9+hUIr>Vz$T"3Fa*25DA'?wjD@TR*C,,sM^B#6IPυ>N=pލɴhqj65C6L6{/6^3ZZsFw@zxmFxY/~Ó`xä3o ה ♶OPo\Q?X%ѩثa Ǡ>sigZ*f-sh2咡0Rsikn3ǻKbn"w%f) ?דii9?o;Gj?Y3~pF HޅIܐ'`a76e h/}.&α_)JaU"mװ{lh k m'VIiP%PL/GpgkgR]ѱ6_FϩIỷ<G[OcemZL%!#={C#ro8LH7S:P>-1O۱uMJ->v$ln@?ʢ$rBO8_ TJ --9tٴR<<۫.8'VUILWc+%AZ8s'~lwS$&8z#*?LALe8[ziXFEEgreV1v).N CC<6iۋ;)Z7Ҝ` 1j}_,zO=^k)/d\ 񽴹;h7{Z)V\B*)3\0,;ckt卉o7ǃfÉu#I"y=7;Њ })wpS88fJT{XXK'Vu.hTj׾erWʇn99c5X>04ǀ#AH^A5dwqnN6hC`7^@Byxk]3ti:_hSvzO I{Ϧ,3?sUGuk_Ca?f J0RYaJ-tBŶl)|뱲A (؉=&DtrʈaS]%F:ӔĐo1iWiπz|5bd0$>x\#5Ϲaeh&0_\FJwu q+iTU=Xak{<~$OGS035F|2@ڮ4_5#I/Ld5Hjp v*UJ +Mg .W{FW_DߐI1d+8j3TA"j{D76fiԇ&>J]v\%Kט|uK,lҫ?$Qo?b-N,Ȑ,۽K:}Q߶Noo2Vߋ i_W$Rg&o5̧m\>> P" .>?uU`vѪ^g$z; \a?{AW~u÷fϹ1ڐ ^";`4aW L_C!٘_B~}f'9-hQ+сc\caS+Eʛ 1HTG;$xi{rG553C_[ΚZ#N犗YYCl3~c wx}o8+db4T1ީWoἒU䅈$օ*;ѭwNY㫕ӄbV4|&n'b}چ{]҈|}g96[,ʖO"tG;ݪ%0 H$VvYw/C`mza gbgƼ$u}zlhO;:O,>? +9UWw X"*#w,D}!/d80vڙ뤜LޢzXLh m$=c;Q yvPn6Hfw8\ѾvB9 b'k֨RP)xF#g[wJ˼}W`U)$6c8/ L:ۆs~UVq8g9y sVZNqI胳L981~]F|\TGb%<Js E[ }1) H#49e9BK᭝5"nꘋML' δ/FP(fGRIv>}2:=hk@NH^z-Fp'x\gOЭ&II9!rݳ*kd2[M}/ K7یbZ @+T1&@"vZ}_̚>wJ3T#ߪl2nɌM-!>lwF;gE'_qTOB|(q HУBbYChWB*;F˰c3@Ae[VK2G;Z1_ #dFsޤ.E(mdsg@߱vnxT,3ieEE\εA a4ueZ՛)ڡz]VۻUq|;ͧC>2Q F9}IPrY{{".SR$AHϳ^\C}敛Z3ж>|| z{׏}dJvSV<ۨU.^ n_!=իY3YQR,"NrL4#w^vIҁ}icli;=o, "`Q"Op> `ݶ}*ʟZ٘) w6Wz8u5+}Ա`&OYcUd9O}eUJJV!C>'DvވC &+ aRL?wg>[s}6a橕(  :pY`ZG+W쿬`AmX % * *9/[MGI"* +o]Z7V9JFwK|A$6 uL7KDQ{C}`!Lu-mozhH[@2|5~0ig\ e!F-4"s'Uv࿇@ǂyMxΜx~uXQ Ζh5rj3hoMSc&,LKgaƙ9Z ðBﮂHy-(1ڎ,};ђ0pKo f6܀is;G&SM. @ A38f6&{]ig3ƽ۲*f]ImY?o |*3Y_/x]uy 0Qz_j3y3M ^>T)xG2-EǨ{Ѯ &T☳<4Z2ߪ{#4q7xlpyȥ%L_6ÏDӥ`WoWwY)Ysݨу󨚾2&zT O<)+C|^:JbxԼA#c jHe˓j-ge{ۏveAb5$#[ШgT oD.ˮެ g2nMGKʪft+}c0 ( ּo@BS?Sƭ7.^o֏D7,wZ_bU'c4~uլ; /jR :Gixq DJ t< ̝k͈ "+ZڡֹcMxig|O+a.zVY6=zjz Ad_A| <佪K~Ϫ8fyrnCw`Ug, o3'ŋc:W5 5kE0Tv9V<hf6/b_(UAͧ}0g_֚4n!(3|V,*n^M!ߚl Em [}FT"`%0QRJ7szkj?7ް7b9G<"d`UK;V5tWߕ$uR7MpMZ0h;&;yFd*@5&Vkc<#0tyXފAI;-94 ??z?\_@56FGaI|d3{]exW (gAɩ\`v{ЪۨRo_7p2Aq6G6d{@O6ujh{!7QW4#r7Jau D.ۀ9yO 4gSUN1 f5~E@ ,,?0xu Y1^Zd5AKeDCgɃձdSQnRS~?rog;6[щZv0>D_u}BOU@%i!KʝO`b`e]T('OkD$ n&|Mg, 2JJ mį毱x GG uCfݍGvͰ :(& W f e`pW]/N .(c'xz%V,ȞoUr9_',ֈ3_`-mOAղ ѷ:ܵ% JPT-ˑA#=̀@ΡSJP3%Q>T/r0z~0|3x î*ej&_FG>k:BA$ự(XIZAObة0~kdb$ԏa@zmpS.`PpFWK};l9&a pc~7[?{IXØ̚^;+pOF3p]1 y'c|<(Dߑ2nXf?w?[$&9 [h;sv0m+ /}j  <㫵PxhJSZR0}sj`X3mi{֥h눣_}ڗR_ǿF{, wW$jZ:ߏO1a`:U bTp1!b(vg{ܞoC<^ ˩ag7[e[ȭYl)kFφ1$qNےϰ/R)]lFh@?1QG :mqaa^t:] Cgin̪ - {E@^WwvoևOhnᕔ'%b?_9I^Gw &lco挆ugl /f֨z.DGRS`nndԍWH+O1_]G>E[xYv.-􈣧σaet9-{(nd(ރKiYRS':\O6"!)Bn YG&Z\(9W'%E89zFM4$o7ˣ8Ui1cWH֗+/aaOPάt,txRJeTX<{-upy_.|_SQ?ُE݋Iq]M [*rK(-?*3lل߽LL#,44`0AF4M"AIK:):+d̨ƒՃɎG80k0ք3,ACj[wboS\mߔY}6.;݊òs 8][%,p3z/GEчثȚ)~'=+bX{FU~yսRwV荐 9uCNrlF | km;HyGl5n#9{YǝF& D;[RK>Bwo4mӞYcyÅ]Wsk1*b1uƒH/ѣMewV%__ -agO&cT2v/X  tgrjt@w3w>b_aqȂt46́?yrKu3OWw %%3 + `+%ثKձz "skד4CK5y=m>++ F3CGmB֕d@U7rt5CL1I}зA3/n \˚a~:{ eRKZ/ZA)Xe ~@@qmZafL<=32f#e`_gr' l}KD}Nu5#?\"d{|e Հn\ֱ5v\%tqrVɘZrI4]HG4]m;!u+/ϥ^3J{ʖ^xfm7Ŗ!l m- {﵄~Ƚ{ LY_Ji3-WC2]vk6O*cWy{d̝bԯ4:XļFMï[ )tp hrc. :}{4BuYSlC:.`CDU/]:~ *X]?2E/lCT^_`?ס7lvuW##~hpzsO5軛T9^sgPDb 0;ph_:eXZm9m~;>RA`h C^80fNz"dphQxl7vf~?j;ծ#?'9#b?%_Ә=U`d(ܠII`,LA^jaT'\À?v,sL?bcm~O#:' "ҌGIp݂OҳZFH5ǘ .99<ѿobWgEϖhzJ&BTOu )Lhjb%JQM+3mín5@y "`sXr"e `y-y]R #a/w-~RG^\l"3$G:a` A_ >ˆ q,5X:UMh"5VgZ]TMcz2QMPGep_FgA2ǜC.-rmT=)2yY\֨|7v) D3ag}X=MEmL~9/~|fAːB=]TV套b^&@)Gg#tWs`A`f*eUFs!&Q=dޫxC'S_8{UdKjZYhB37`dv`kfdz\6e0_juSr]` tv)xz + Q4oRJC Ѣ 7uHinvϏj;}ׇm.Lѷc)>ͰTn ѭh;([|~|ߩXOy|:CI&ףw󚹯4n}eZBr5%$Mm_<l-V_XE|3z +rH~+;}); 9p~?HV#1$:pp @Bs;ƴ.{߇y|/WgѫNh}{-#Ұj*ݷ;epK)>3b1h/9@yUq:z3J)8t#bأV=-G4+Q4?dĞ{# 8}YB>*|~l.ԚD=/Qś&Bsi0pG<\A,yk^ mupvz;VAsB 3WE}dg(iRմa.lHA؋Jq@0Ž'J;I4uFo08{ʹ+}N/l`xYkQ^3K)\;. ׶/KgTR*,,rYT;+A+q<3h:<ۜůύ+$QĻ2Q"28K hVk7െ49LvfD7KuAҹt<(*nFA(t*&WohLvn; r8!Jj.4?Cz385\dhoxr:3!=:ap0l!He-qYK%UXj/U\#SYơPawrV庴&m+jG$6ZRĨ(X/'>!ջ}NJȋJ74k d*N`;OC jH//Lo'5}17Q76ޫc:yZ̫~mlwwW [\x0&#wѪ}/؛+r'(\Ïv>SJPEQfy؉χ2X [9}p}Y2|}um[}¦Fh}SxL)~lZNwOrBɀ4Ux32-(Pql6Jn}[anZ`+pWD,ӕ ~W71\Ŋִpei 2ou::Ozev>,gLst[۬oն*mdȄ}%u߶@t3?* JCDAMG]U9 ഍OK`̛f\?KnIo>]bl׫GF_Ft+h]gI 󓐃,M?S԰LYz2Xwln ї^&\Od*( `^JL:Ilw+݆xoyzn2G0ߺ2h&9C3 POaA$'| \HG50B~`upsܮf1!) qh^ #*/z,e~H["OTl"Q!V7-ׂ巢|҆ʩkkVͣ75lkPҺ tu BM{ u7;qmuޱ$iN-3>k=u VUb{ F;bzD{ZV`Y2ce=_){* _iF+7IUze*eъ9!ݒwHhb2!jLfĖyjwZf??lUrU(lqL1oFtU ӏ5AqQ|.l3 jh>gD/ $ +oKޟơ6SB0 z-+J*MD3EJƍGQf15pk].HߴJ{wu(s/{:'+C%>̋)n\4d8!TpFQՀv1 -q:as>O(>6urw~75R@N D?d5֪޳ЬM10}ջK^ $.2ݍJ /=y]xf9)Whҟ _$J.4_{sͮO,-b|906`lJ@d͙_1^;SNW~YagkbA(lJ'qTGԪBKiĩ0z Dqj508N5ջTaMW眺Λj1ާQ,?v㬪(Vɖ_ /u \@Ҭ軮4JqքX#']uE:)J w?Ёk[h>uc{St8wJsjVā#+B"<#g6c݂4f31 žBax'{u0Xi WSFQ{Rkg߳{>"KZ[}}?kּ`5KmPMR>K=uOڹޠ$v1!3 L%DcSKAۨ^*H*{+H:? bO h0w!.$ m&UNlCTP +קO6BDOg"r$F53ީBz ٹSk^"M"0;9JOt#u[OpP|Dt:}y0`ZDMN^NcvmlЌ^ad6kj$ pV4d|: Zx .Ш>@[+"⼥0O}';j?Ì>gB+kH#}r5 ,}l&֥E"no7v&yV`ElU0 3&}$ɘaybU3#UqtwGE"z;}%p2=zA9 ~#X0/CW,ܹD$&J3 pA1&5^/S]O~Txc/Iv9~>;eK>+DMچ'22m޸<,Oa,AtJF@cקUmc{Rg>YhQV+OC-~( If#:0_,"l9N|3hp- s6c!be ьb!bWD[9߸9˔ca=biip*䶶/]1?؄)/WMc:oc0G`96`*`'V t.OkcZ(OGr}7٣[~ ۩]A#rzr2-bsS@ ?C*4ۮP(B?`IiIKQgXcC+42$"碤rx@= >Z']b\#m@*nxqn\8Tuw8_ۜ3UaTm<KΞ(`.c j^ޏ 6yJmkh1U%e`p&3̘v nCe?` Rp{uf?6^O"~g7w-=PFO ݱö7g+H=RbLw!z/UA~Ԏ@::.Yeǘ5qX{ÿhFVPWF56 @"oHh#@Vd a%1+C>n6{4?x4ta!;,|1Ĕ~.R"kK*8hf%h-I{LJ/.M7'0TIWy- A`8~ $7\8(o ;ґ;+Ϯ\ ݐbCxE_6g٭v1*r?1FL4VήkEK1k zl7M +Ý#GL'SL[tmnCЏ z5\Dl+&}2w-[C Likc(x>dV;54ՐBPPĽR皏't+T"A$v1ߎ% Ȭ R+ 0ꏘ REw (,DA%n ~T {m#1vrf mEB)_#Qq@爱;dHap1IG S?Կ7@E.͒Tѳ% Hg6DvB&]P>XEZAM=1UPmX7]ּFi%⺭l1r2LQ(A[H:?_A+/Vg*&Q1ثɐ, {.p^q@նD#GRsAssz891oG:9pI憆?fVFbyʉoi,[>Y92_wہ@ b@&ۮ/GW{V^@SM&\EO7jWF+`o[rWSw:72V٘ F8uߢfT'-f۾]קn _@9Nu*h}3 uLh+f2C+K5 bY +떅}+;@lyA`.K Noa&ۂcg5{h/2Au7T@t wXUuQld9j/v8ƪdc.ntp/TuWC3Hh2eh,9\ h^2?**#6;ti('(" U!:ƞ:Բd0Us{7[{Er˰3xyɅna<հ]sQNuu f㑻B}p@,:ZmJ#47#\ Y -R]֨Pkg#?ҩא-\|p#A *ُ r/e3u2Rzpa8tb]cİ4-]t=(v+J܌ғy];<&yz,k5œp{=I׹׷]ECU[gA^#]rU2.4V0¹Kxpɓ-6U P(pB4ԠUuW ıA]!~_"ˁWCղb{py:+jNOZ+-eT vRW@@ղܛ#Xb˴?v1W.$򣓒QoQ '!oeAgg L͞TI@Ԉ88] WڎpvԮ6, s/r54%O[1`sGICJ1ToncF^K]{0G1xpMq®>#bU/:=mW+@<p4OG o`>p,Qw|6e.#cbo2U%`YOzo^V03ˣȫCįD$pT״*FƸawo;ڇAj |ԉpx_~i!6%BkCޘH{:Ʋ߉2f൴9.F]L|)ߢ W׿%&vAl݇]s2oH^ LN.=m΁r疷!Zhm3jkݯQ4&܈ HvB/h߷o|' dq8vM _d$fWw-XAyq|a|W%iVL @5<6!vXjbd"dpw_vR/*,96s D-j"`5X UCV3'}!8:̄Or u")ox>a6܉To?#'/G6^U57__nti45;0}Ny$+$p`ЄG&F$pmX/Ip٠ta9qu \aMiߑV G)F~Mw;|*8k.և[e)ΫdTAhdoʱg6S°:p{"Uڄ5 Sԍ=iZOE42qD[3R |X|d=  '.E47Iҿ#_ɊOK9rx󞑠MXx#F&?3~vsx"r6jU;ĝ9_V'gW~LCeſzl[3HvQrR'QعC=c/iCٻmQ/ (Cb͐|m-ߖ+zHۯC8:0L" GyX7AyK^ }s āԱ >Ф3oZa((>ޗ7y6Ü߭'ydNXW! #j91Ha׏߻:Z!Tֵۧ+*e;xoed/ruo7c9 r咽tӯ'lZT=ROnkZBWŹr>E/<$oHr jS:bHs9]-7MlKG\g$wtШ1EM/Q3(|qkV mo;@ 6S7v27Hޗ~^nF8fW1Gs QƏpzAHHjO(qӎyē8\ϲmf7r$6H>6顦;M. TR* ,,S:f{?l$\\Y*9rsK8uRZaw⋗Уۆu0ji_SU>AL-0!!-`j-`.lW]3@]R= $*ٻF˭%Qҙcxi5qz5aLZTp(ZH{ɾvxG"=rG:Z:.peN`[y/G=65Pwti'YlvvsMLa-J]9e[h&Wj' 픲;MFddЛ۲0R+vn=zMm,9̴}}u_sҟe4kݱtAe?Wp"Nl=Q'f]y{tQ廮\݉QI:Qq&ksowx\9IE:F/7r[s5UT]펳sX O7ItR'n\ h=( doUu{3XȢ|Wb'==CsulȤyf[φq}אBinn' 4etmc"C5eWu{ݾ%eň VWϚ}RxNhUj ә P~NEࡔ~iJgnGB )b@( h&^@wj!7fMmH=`4ЯѨ9m KFT{[HHl]_A)co+hbuͥ_]94q(|3^f0 o.W|Z\ z]j\TchMT7+!D}36>דV_ho IKD?[ 5;A_~w(rGcɫy|/_3Co2)QZ?qOqw35el e_[zy;1 cy7e46BjW,_ex f>,!-,8 Y88)Զi}{Lv"9-P'S=c S561t?\9ªжOOWNh QҤeР{AH"yc[~.@mγTl*ڢ*aP9ukoitMgЭr /1¡yX8tQoz\M =]EM&3H&x*kAL e.vZmC䬣N }j1 | +--hCfalSk'E'Ø ˉ=|TjO܆!D`GZng 0f"u1vX4: 7ç^Q{yD@ª;5}`Oq23 Cypae\cAK1 _d?;nWG?ӹ_CI~'}juBtFsU:~b~ıxN2=yW<5BR&aiDB^[HY5*m'=) 2 Ol2C-g $=8$"?O=(?4$Bz0\>0B2`lۙ ?Z)àcjUd^qڠЉ^FbX>XUt $0jvBi^p#\~ .Mg/TnI X!8^ʈ{m^3j;K)Om k^o?O;O-5seL $;r=:B,F^:fv[:+ 9.| dd!PoIB[بgX?.+{oDЎ {@LABǬX,7jIȓXhyjE.h?~{ͳ4Vu~Xmj֯[^S'F''':"fk.4v3<9.Kg 5 &{W)KTN}KipZ6-,z!v| Nlp*< DIw<+gAK4Qb\J|ϰ&$ ӈDɯ]ej/P;Fhp%ں<Ҵ+Teڌ9~;NT?;0rΑEml>zz[1\]nX^P ݰOj$B[Ifaʑǒ饔3[NLɘNa(gJ9; ]\*4Óu ="Tl>oj?䃕3&>dW9]Jhj+f\\[ǒqkah}pՙ!$W"^~`ne |^'G2 hh@Ixl +pV^4؟Ys͠k9 0mL,& 3Y njah_>2OF(LǢZCw694^%­R[X>pf*8M6xM4$èk} Rvz&̃hd6[?@Yv~ ENElF>3N6sk {7]*iIlU8d5 zPnokao5s$& ?``f7vkoBvy;D9ǴY6M I#13Qں"`=3z=؇Z DvQqefomyW״I}tӤ>KZсk UkmV^z7cmӠ_x/X#FTG}Ǟ5:c$!4p6q gA.\8璦5\|g^\YX?6.h365<;g\d5`ɬ 쐉wk{bޮ#'mq]"ѥikCmz?h̰Ts;,X%{Lnc6sРȔ|$ dK$,:c+|inlW(^g TwӤuGOsTղ r-~hh\+ .ÁIlT2al,0"br/n"QlpIq:dmbʺx>jq=oS[h>t[^W$̗fd0shgaiIe*Tp;nːzonx} L Zӡr|<~Ufg >t:ɋKYu3U)W Axw]d/Ob]g7UH7jNdUf81ț䢜ŕcQD_ԸA`uAId/65_6eNs.ܼ+`҂`gVՓ!83<}Qٮs7r"3H?ZEV@ A<l$}y c8xy``hAՄo4j/C-ET]Zw^lߓޭQ*)~8RYzE\aXVh <*$I<Xl4b?o3irv7]OeeQbZxM{Fomm/1/H67bE]sqde}Hoޝ4FǧcQ@J3qT' 98R[qFcy4! Kw4$XSAdwla(Bx߾-@^14h#;]/K<7FGnwDr9cX/yê]rJξ*$;]+ mwW?˲G5hX:P~[/IMZe4K> *5 vo{Jkcc:-Ӫ b)~&vpve}I(PU<@Mk W Ags/ʐuLj~.b_Sϴ ~| yyXky\l\p_h]m)ЯUtu ,; E$둏֤pb2]1Z't6_F_Y V,,~tz &l8dE{/F[A" jgk~Zwz#=ng3lh㫆ֻXTb ]fn\R'&b2} cl,[Ab)+Ϩe/H -/|mN8>ۉ:;L@V, 8n>]lȽ&Oܔ"i!Ftί~B㍀2Ч Z1Ăﵕ0-I's 0*yMuUeӢv ;r D];$dBN FXM5dݕ#ǫe-=e?Ȳ* G4@b3:-tv"?fOSJ,Y_^4Q]Wנ\lf⯵iV/%ߟѣgѾ5 J 0?FͪϑB{dJѕ*eŅL+50{'?'H=Ff҆5fVm_a0`&Q6WKKXm.xZ1]jyY?P˷8uTR=O@TbZēNFA ؟Q3;\3S/x0[Rasoג |eL>D$".(W]>ivSWp<FA5N֓B` y歫^=:ɏkaKIGǕBrӠΉtf10aٳEꀽ P[t7Dh`ijƬ.W|<\ }|~t)oeH%~dܕ rLdÄlzXXPMP͔%Ĉ9Iqn̛&(>5[ ӷ&U]!1aLfo]&ǣw\x> {kwo7l dKb_D6c;&*`,QkC>䝁&!7xN6/Ah۠c5|hl$*{706Sdd5 E d'Нm{kMA私eI7[ꥄc5w + l t ίS6r>?VF\,HP1/NacNX2ՋjdnvgAvw4ұ bq lU?Sj w*_TB +%eWUt~uQ/}'xFb+ d$,?SPxhHz_NFKrn?(9 R֍EsR0 iʓ_LB!Y+c:ŴVFu+&o +Gix.W 0-!TA¹55SY)!ep/>Z&R,._og&yxi5q?z儒 2(N#c A5)ː9b;Zo"<% zkmdžy777گTx!0WCP<=Q\(5Li0ׁCG Hf,[U|{FU`zNzޥ =4*;=B~c@eeMjڰ7܈ ĆS?Ҙ> }e\<-/ÊS?_МaQ ~MM@L>eLMg8#2I)u]E wZ?r.UWNwf |Z6c^4nH)M5)p~DAo*U4Gו,VPHogbO?mpLeeHį%4ǭbc?؟OҰ wkQȉRkTqh5oz.T`Ŀ,ф@r6FQG u/s-yA9N+eeHl} 7N =+ ^<0P@!{WSڴ5A_ckZf۲/>S d$ A8_HBuNĀM^F8r A?!jri&j5Zv@A7M>׆+Py XfI&3,4wYڤ @dsCHX-"}k'[(}τM N[r?f1$_X9~Z)X+|9;\Rv١fKjdoQO2&N2!y1ݭ aDH]R9frx#32o㳕A0@@;7;W} w!;"<gTeA4~ۗ%&߫PؐЕk ζ}Wnʼ|qș y{Rl>؅@sF"Xn,7E-Ap 1]flo؉L|r%Zt#R} ?0Ք:0ZL9B %q`?ظR0L; -CH5!#}u0rK}#2K75a '>2C̿sr #q[$3Q@ #uU*mORgȢ EoVag0vEc龇 0y_mSnE%rԓ! o0-x"{AsƉ}`DtpvaV$S<%)0bWPss3AjrJ!^#1YyCzf sD)GuU'b0/~57A2bAuZv Ğ.hGzƟ )^V\/Dw7Xo |@mgtK7CQ|9N ,Tx#5IX7$PS<תĚtI;, 8[,y{U\^ckA{֯Qˆ1s- c42FC_Nɺ#}J$dpøfXnTR*j+S,U219ЄBB!JJJR!)JP!)JB!JR!(B!(B!(J!(BP!)JP!BsB!)J!)J)JR!J!BP!)J%BJ!J! JP!(B B!BB9rm@) #T2rmag]ws= Hq%:;IjMdIFt=J/:G*; oKvU.# (+ji0|Sthn 6}Tss|,-nc@|9.}v #(ryK0v'f1.L1k? OQ\13p5 @L,~Α)u ageJALiLC7 1vdvh\7/X@]hGJbk3Ϡ;j\x4KjI3byEsCuh[9\?x;GkKgp?z%/s e9oR@c\\'[(H'\L 䥺?qh_)-4 4ջ6]5?p!ڰ~!WŪ YSrFot'lExng2"k+Ezn _9i{poAƝ8Dagיah| atH0,Q7t+yWV{w&34uvw?{02g /fҝ_3Ik`$f06'^Mds粒1nZݿn5hGx@ HfkYs/ד? ߾O$ gCuy) &$#:vtN]14?ho1s .<W?y NPg!fY.^OH#Z=`c]2<Q&||WY8q | ~7wW)1vq\WcR^3SܑH>˹5GP)SoZT k)hh`+!RdSOhFq\kcCXfCg↬5̆n8 qΖaLltsVVB4fΞc= #g',}Ax>6=+׺mשkw̩yQJ+P'vQ/U1ؠ`@AƮgqMy?{ZTE0K]~>ɛ<L1 F<> 9$}>*U Hz dLvJia{Pd<. UЩƼ%-fd*QjS9ڬ14__1]Y#ܾ֩27x^7=p9נΎgZuCmz]2 _g׭9%Ă"ئP D%+)TGH%&0?>}?.~e.FGIEzNLfr 3{Ьmˈ޽I`3Qo:%AHih8݀&ڗ)mwS]90W3s9ُ*屋v8d08 l(%-W)M{;j^>A%`4Iuwno_g@zaNQuGzՆ6Di˸,O/M\uY~79[h/%K!@ٕVi3o\vIRXe˄^ضi5[vcXd‹|LU,~)@TCr#Z {9y}\']=LxE-Ǎl%Jᇝ+VVT 4&WיxϿ8&lC͇kZn.+0MҿFBҸ y7a,f e = l/ih^lPT5i؂۴v\ ƒ+0 LA7˰l0cR{hy3Cp/^`cFDB>R6%h+Uc t6x 7= LP@挙UFnjMsm1m~Sm!DmhMlt6Mal4m6e;o6 slmCs6;#lF #s6 &md 8m6śbM ͱ&؃l9 m6`?$&s:eYB}MGmfbQSlFMwrB'c_2͆r߉{& _?pD4>EeA>bIT~2,U92\\`\AT[-^ ޡ~`-ֈµhm$2;&zqғ`]o 4 -"JS(&??_Zδ/(Vo륀YZa;7>㢚{oyIߏoIl[Mh屝|Z#_8}n+C,ɗ > [cb&!xٖ#Ϻހ˿xŠ\fYJ}fRXy} 'nȝܘ^%i8h[VOc?([SàX _&Al~w,rZ&Qb3$ %'<*l&/HN?1-辒4P #nJ`rEE,\-YăY3 fv:QZ~3HCq WP!j~%|ٿ6ޅ]3t@ak?OGpФ^1yM;ON~sjIg?DAh;t.s!//KQ8홐JƉ^8PC7`=\>gWD+ׁTh)s=+y{}_ 0I 0 '1n5Ę$(aAj%`Ȋos!ɲ>X͉.T‚^[:?,Z=_)XTEt*BK @GG&<.GHdNh y_ kנipؠB\j%jb?!sI@5*542yTn<ĥ#xH!tɕTvHCylN8wnX{xsxaVe܁$=͵g׃ۣǚ1D1psB1~ja,sQ-j2J tRزIs.P(Eg_*T&urs58-ˈ9BCb RR7AdLq#S27\X'nɣ}&Qd:o6ҸDjWDDBV{ w} swYƂRA5p&zg{oU^漉1v]M܎}[YEe|L 6=?'/XM5h~b8u,,\+FK*u}l__: T5ցKGAveo?mB6i$(C:{a6*}MXxQq9\Vd{ 0~b $M(|U$4\-U^# ~= =`ځpD37Pj0ʼB*$Ts\^~|Ni'w]`k?Jl$Ԩ.i`/Pb]ef{DZqL4STpVEvar b~R᳖3|'pƶWMljniC4+f칊-ȳCxyu[X :w̠:xظ>^Z̔$/[rNFPz`/>^l*<u4QFQC^Z;Fi!3u4t?"5cgmqԸf9;2k|wnvbG+Ğ.6,v)楅-1l_ AO%U:QlzEr6tv 4NOW롰pDX{>@3.J!IG'2SBc .׻?=bW>k8# 'VK#G*[ܪGY=$gҋ,\~";s1YԼ[A˿qsX| ,޾ Sd X|,!?3=#7>՟g)?h1 SrȓLfSO0QuGˏM ӝ#vQ_\0 U çtxk9Qc+UhKg;V}g&a> Y=txآ&&=7m %7$%HJ'8ʲa4'WχdIqv8K-%,6bhqmAPpÝ]xgЏGmk ; SdE eҩ}lm/pPG ANHy[lqQ}Hpa! ~V6,&!WC&"USiV L7S(d0r3Qow$ֹbL(u4DZ]-ʝZ MjyŜ*\*oT$lJB2(ttTofrLwD  Lv0VGv3tDf5~|(a@}^ҮB@޿sێ M.w1=0bU T246ߦ] `@ ǂq`̍"w.@t!3( ~/u YQYYK<|6D,#Yb)H:([~Ki30y!aDc]mVJ ->}zW:^E b5+5c,AΘB*ajr:|T'Ų NS)zOh@s) ᓜ~)C%^`ȣh;Sǎ2 gd,Y.IH&i-P&iȿ_RhÐ_43`?eWL󔭅/l ^ _7^q)b1w˒@+: \/#f0Dc8y̲T1;"3/!x0(,=j &΃B)1!V0c QVijh?LvOu`)\ VJ ݗʹLfK.)T9&D$6olTPLc>@ E~ʝ{Jr5>sq&`OKiD6÷~Z\F-R(`kwzjÒ,!'[ϥtK m`*?hke6D4Z 1'{e. 'BdJ4d_L#lA/ rnu̡e|lz@`hk͚j}إpmFE+\}"{{rU 1 W-oׂ S]'fJ.?U?Ly0 >Fǚ ~;suĘP+7#Hkۜ!;8u2%KdYދe>lp,5/t}rixd=tOŴn,S,:$v@UԀ~k+}IUB )X]. L 8!{50a7 bίF0?K!bYX}55%Zcɠ e86GK+2bAoT-YӬc:1SlT˝kyɃZYHBR7w"tMr[lz9dݲY/P@В\'Lꅢ_fn\B5AhWZ%sC;"MsE QnCۦ}@޼$76t{s*V>Y$&~]NS^k%({MՐLM'iۅHTt!IYK/Lr05 1IvU)7UƒVʝ7+J`ׁ0ѿfigO0pE‹lc7t`$Zv.5tϭ&j|>釦ӜuqGN;)i#q$t>b ̶I2ϛ8Bј^ϻy~ɩ$;v'vFt@*ER񗛞ŒDC`*v_1:~ezķ踧,DkfYղꙙ`0=e .ͼ$ElQhRxC>bo>yފ/yo$+M h=Fi{*"4}Gh>0'z y i_ upѭ=&d[oIl1|8}ĺo4j*a9w>&KŰJA<>LWNڊ]!>WJ}zX=L 6]y423 GmVhˁ:Рf-aӾ=:#I> ϽyDDu6X!R^B~WXx}",\? A7!bEq}0KpK~0^DMca٫Š6oWs0s٦@#^w Ma{9==*m$f+~yܢļIཀྵ |:[FSsU`<ԟ هhDU,y!Ib&hqԦz~5j l_m0 *G&^'˟gQҸ 4Ab2L|\v0`5ü18#5W^ Z@qr{ չ,Q,OrvKsnx<+49_ Gv{Z@<;Nk^)OA}v~eAd9fsF瀕Z1Lmrhel m>)IM_ -Zosة],ǧz4PIBX>fSz.1EV8 $tLʁbg+IA<}@r#?$"="%1f sYߠYgGF5 [Jͥur; (q{԰llT)꾡brDe'MB{&B1g .{|1HsB)Xcskqe~*,e:!EPyU)BǞ *o?5\^*n Ee, O4uuf5z^>3W0ɯ_Nx!]XPŊ[XC&F6ޚï.=_7uL$!4r]ߣ;IIzEh]Na97$r.A FG|ngŋ?d"g;?F F o;~8ւv $(DŽҵx%V[|`= q.cϋsQ#$j_mc#_8!Pt~o6fd 倵n LTR*U,,zRC #oG89(Q_C_ hzc?E{sQ$*bA&~ P.Ohc#U[d#l~?.%PMzS"/!@41w|_)Xa?To<K=] xsl=y?)~g"Q^کd:|"ĦVqy2\t&x^KC81|h<mȣ*'ho[B w@عՏ飠皎n! % P2L X>2>$WՁYiy z]%uh1`F+q4+c}-ϊcU?a28TSmR~ x5hexO3swǶ$W9i@s\NFkLY, ˥G{kHNw>;`Z1up5SCcu-N^@ ]k|t[`|-vGkq60y;ݐw&5J%|DUujStڟ}]e.24BOT^B@6F͏O7L[~@.?X\ "W7s}@UaAs2(Z(gaT^aT.ncs v]:-p Owcu(鍩xi I]eka[(o5X^th~6KfUn#]$rN iUs|ߣ'-Pomr(Ɋ@ iC`ƾEՆtRwb Jaf,?Yb_X>A|_;۟ԧ]An!̥bŠ]If/I) 98@@ɻ:#L4i@4N 1ж]/3ܡ+WMZNdh/\IZYcAߛӊ :s.<-DuA>Lf Ɯ>U(TJr댾161!cFޗ](sp7#PiB~d "ڵNULI>S7eEgL֯㣻0C:`LUu){ &%(Ni }g0ȿ 璂 ^&scOT72C}^Bw>n}pnj!EE"ӱ):%i/ iͦs9}d8rSJCC.x< 6eԋlf F z#SВZq82um,_oΙ!v`{`b` Ź῎ ]%\\;y7rMe5A]:2n7X]l&^FMtM1il hN$vHU>EOc=#dw(=dj'|ɺL4ek i5y6o?0՛qHdc6aUw#~· {at݊bD2ۈx/XR]~^M4p?-ÀrtX!;_=ˠܺYK'^$ X!! /ɒ54~],s,M}k7x8d좾xWP7 x}q@$,ᳲcCmu#=4Kj=\b VƪOO}y\@mX-ŀz~Q1/_o2_|1; ?3@:c3S}gk1r!]]%Y-,{󥞿6f]a@lbϏ[9% G"%گFw,cbx Ěwg0wǢ$0fRvo9Θ%AfbzM9@64;(.F~ht|P;\X3To؅rf Dgۍmݻ!8`( 2 '7&Mptp*IJSF^ccpVT$*r!# /s=*o/*}~ 1xc|>ﰵF%ЈV%Gz,V gՋ뺛}7eʢ.URuAqlQWЁ$iAL7!TCk{tқ8F^BvED$ꃧq&|UpӤtksyS<=}@G)tW*0~@: dLbdeeD̻Π +V$=WJo bieŊ+rWSr gevlF<)"jP<:ɓ7CWoGhG &ä#0/G/EWuoǔ$Uk/)^d^I_)R,$}D9)4h "(71%Ğ\'XgŽ+ gKe{GVR t1cLM̧\r S22$XM) NS["/i7,*+{YLAf<./h{iMnd_qv3hK'RWMsj3kIld#?:w'x"I]Bdxj?4}uS _nѪL>x1@uWaOvL;0{? #O=HٗrC/SOU`U!Y_Ĝ3ߖ5[drFK3\)FSotf"NuGでw<@c׭OZH'a)L\\21((g{, GiZZ2R+ #o`]ڗ+\>vLCf_]$scax@13mkבxjK d m擐n?>n&}tusOtʝ=7_/;Ux*Gm|Fgy0ߴO3 C\@D}YNP@D.1(P3ÞFAo)Y om7 K TMK{NW4Kڦѹd|?o%MG4sc!Ls)fUs3|2NK87%D˜v[/z:ߟdD &݈ E~8\[c:޳_"$| ~Há/tJio$'Ǡּ[Ycт8Ê]%?2ML'֍GTD~LGWfuA2@G4?p+Vv$j&_MP2ávoc]q!5YjWϩOp6 .hsTm\K8fߢn܇=A!8R_Fz< }A,8!1B~~觸Q Uai8ݒP|!^4>݈0Xͻ _qr8|vʎ_\dmJ1dDz CqH$HOs@d9?%|Htmua#r^@P$o(1mSRk-7[)0^,Y&5L0n.;;1~g-p=pEW (@N]˞9iod ofx5w kC,$9JOsm[/5鏄w{f86]57Lu~*D2\bTHS̔ ~,JTčK[ۄxwʂL._+G<~do/'7H1B}0 ? 2\I1,߼mBP@,jc曑EV]ZȀ ໭g`OruPL__>'/Ux?<g6)׮q5z+HKcm4u= ^tƽS_pEsM`́1u-4XoyC!B7H>^٢X t}ל><˺,S4xZOsjÿo >^""u ѬX̯_,A E^{%"3L;Azy u QV)azD_Jj(<-ܗPy6m]_a>X9ՄFyb <#~σo`ts_8<>0 dږl KpWv,;8w%3EZ~go|"z > ErҠ[)$|ZNk;,~>/q -{?i5k: h72y5;l)S>d1xH|W -t" Fd4GSRbH94!>/IX9z:՟w2t=5tww ͟R8d|?Mu/$I 0.mMz\5X C1(NFL (s{$dbc05jgYDVAMt- W;н1~DeiX$ǚr)@xWkxSԌd+ Gr 1cg:@-X6%a[ɮ \bt+2 %Poݯ"Te֜ܬ2?ϥ]V̝54¾2H/[|gc4)W+aY{h*?v-~?klkiamA4jk\zknBDPVYd 2jimހYS%gRDx @@4թe ~IU$D,'p9ϢH]?04WDXJm{">6GX(^lm#??ϋ=%ČdJEC!38^K얢x CH Pcm׉],pDH L2zD2iv)Amٷ]UK+1SV~dSJJq~͏zN5{:FQ&rBy4[ 3:W &B ߔ9 &߇ވ=yl@Q7+sd>ޑA!wXт5uoN (ࠨZ ~|\Sg3§KIJ+8'7p] Pux.ĺ` q I྽꼱΂}#;S|Q4;eBefo~Wޙ#կmșFbO'8ܗ$>e!|gb׈b)X,7FQnX"4UЕ1dg?ǘ?qm42Jc-I9kY>"ՃkK,$=pSOu%_Fsg#g\ [&ZZ^HY(Oy;=iNweM3BdJ-47Z"ߌ2O@pfW­IEp]1pMW5!"A#Hܳ<_.r&M+L6`y4`w~ hKv{ dOST@ LfzܥbUU@ca홹#xWmҞ\ hhqC"Еi=:Ej7iF9x{^ekۑ;{twbYtʂ$L2@'^8q _gBC51>E;Ms;⓵ Dw.)g\*LB sks:NY[xS=%ɉ1,<_68J֦k7hZKgE9(OLP.Ѐ " NGIA9μze b%&A$aMӓVlYs<3LR~ˎ9c&vL_l05 ϔ ,D-vWbCRwIx[ހc (S~l*ސ5ņ?WMsLtCEPV[U%}GdQdtc c5LgFb]4yYQ\FC2ΜXC/.渑@ùq+!X'PC@2"ۺ|C/n5d#_ͦGX:|lrc^zLIB=dQ _/mMht Dڪ+t  bӏYؕU7:#ev=~zuozBBΞ{zLH.O}=ODY "τt9T)v0`:˺磲9eq/bp6G,%N?yJ$Jl`{lF0vJ#ao /vj Ӎw%+tp%@i @!C]yd@ HδLy]w?~Og:Vۇ?dX-xZǭG=zP$U{`g"t#n F/O&@K;^{W-xAM ΖfK|{·KN踎 Ybΰ)<=5C~Hnw@C\VYwR ۇw19.wɕk*kOC{z`Wal'Cami2(d}I>wo1N?S\8$Lޟ##?*^&%Ԛ V9(>>vְĻpmAs)W]4t&n5Pϗj` (4ӗ& la/ #y~iAQjphp6Keea@ky-^''x:EՍbe20+&dM^NMI$\!f?\c%6=4n;VG_i2](H^{%yf?S ]) Q:z-!ccy&jh8å\'SO AnbW{VOʖUy|N ǣ!BN,2f"FLd#iHv2f&H=Ngkf5 'P/gG JW:|q"BL$7v:Aj}3}er%4#ؑƁcL(P[#m$Nkt&yYByv_J(U1w:CT|W\FT]|Kv ?nIքY"p֬rCi̍;!W)CVgց}: v+Ni_`1["nP؀   ~Xypl3@cpdK^3􈔨H47']G*_[wsr /XolpMp{ |%MԻx.@4%E@oMy'?y1"uqQ|ǟrod'F45 y\5s[Mr^ ;8T8z>w էҺ:i}TT V>\Tg^hq-j˓f%up/.ؗ<.Jz )php\L .h[cn9 }Ed-MLTR*0,,> wV,tx/;lʓMew4(!j~Bt._i<}ןHVVlL_J~ͣPFf8O @:hf+҆6La) uo'l(qy.3.u6. G˸̜y)z?9D49gԮ !&I?ɫ.?}g4)՘_@M'*_n6s&ܿ^V.0Gjs8Ez5KyY& ]#~XQ^@l8Vz KS9q 悴%&iYMLGA1@bk)Ǥ0ic<7=ֆcqI|Bl$4KZd =m2Fo{Crt'S{?KX `6RK_qv+v+˥r??ϩyN>Ib Hrx^VAhr|V :%/C_?cZ{)Kwr<u,sAQiA~/gb&GDћb,bA L(]t2Z# f49Pp~ڷ\#{|a5Rw3ܜStOF="":#K!i-+T3hbrhOHUTzQ0 (r=r 5\r}m\W`Ʈװkd>dL+#t4Ie˧ awˤ4D7:kVam?9oD%+/2ai(T"NQBVńIP=oj^v_}Us"7r@*X5=,9V"Qt_lӞ~L9F_[bg@a\j2L]hDl䍭Ey--(< m?P3rn76.TkۆzCS*:<'[hV2 *S`mHu\ բ1_ϖ+.s/>:ue\:I"Kا/wdKr2%{y<3ZI.*|_N\|ʎRi{y]3i>޷WsΧ˦mi=h+Zt\/epDwSAGBl~]1\.kIb޲h}lUMA&[a"nu8^dڧyJ+Iob3Kr7nE_G{"ؼgz :> _wzYJAAeUҷ (q/ y/fz8T/=՟HRurbl< f`nG#+gkVQe9R C,Nwt)}UGqh7n7`ƗCsrF6cBL"dƚN\DFҢШ F+Mnt}ʟ0>`/mP Ĉ0%}*vH`^prW̹T5^USx֑5!6A_fvĺM(-oWеRDMt]i)R_&])_^?s]e~g^kXw-K_^^4@-׹:V+Oِ`mzE we )G>{eVY 8NQo\dzSS: ۜ!k_{$)n{x$a=\%~<"Fkq)S_n5PagŽHV[LjMLM}<]Ow> aBvG&XJ{i)kI)w.ݠ{ =+4%LsɅdcs=+ AtoƀׁCī*.dJo#O&܋P0ε7J=Pacn[,;f676򛼧! EUkTfeCSTPx[3~f>hsV(U}WOiJLOۦ,[ȃŃ }j7cϋF =凫dh H qF \$o_kM c5\sFJ,Ihju^Ȍ[ =^i :–෗g7(G1,L}(Q8Zr.#3V /:l ]\ EuҮSy0cFoξל=9{c{o^$YE{iIR&9:ik1Bīi̲x 'u$6-aow{+}GRC'*d ^^Z: gztjy톒] ?ܙ)GYb*CNF@C}ȗ'53H<MƻYV&[oynA&l)UZx2+cI6(Aœ&5MJ&R~3sS\ ^Yg)*hYxH ?%qz0L5)?p5j5|@ǫ3=+Z4@>X.YEW!b 2? _22Lo~Up9l32. f>>bABr<Ӗ3 Z1$jr58?c~֩G x# !WȰKq4 ^,~PTA1BeA~e=;Nn˻тvu*@?(Rcܣ ʆ*J'(?`\MDv3lz,&*VX41Wg[e Q2kBu Z :\Ab iBܡ iNt}A/HÛj?׆d Rl1\6~m*2W=O hf2321rA[zLظ).E p:9[=b5{<|,WiW1p0Qrp:?;&F}T'dwaDބ&f}U 9}-&0I?^2xy5WG|OȊ Ņͽ Qwyr-am"k+|L_z^ - Lu^rg75JRZ|PCv }!Jۢ/߶sL\-V'gDFҚqu;V,LP`\%{y"j5Lh"gu7l~g?wgǐ酪(%;0nH~ߗcҧVϓ_hT6gD ;F0 ~7 PM{X[S{<*hS1֚.00S4$'rcB!ff.ջaw#n3l[:Ij@BLP 9t1y YtZɍc=C|,դ@&]L &ӌ_}jIz,^mh6/ 5STKVӢ1 ˺ D.˱ |#ޮ.\Zg3(ʏs<'#8 CLt~F*QJ3}IjthPEŞI+{`1A_7cXеv|, c_~d7CuЉ3vPUdNR >aqOK0tRgɑZ dh 3_!v:k'pו*@|7WX.@#XzWq+ɟU}j+^JS=@qDEu/͵O s [ɾ9Lﻇ [Ul6]NqZ+Y(1aշZ1\+bEx.y(rSy-6_Jz &{oσċ_kd!/}wzW>{C=%띒 3@qJ˨dH:,w=ӊmc01RG3mN4Ii!#'/:b%q|Z:-n*K.wăͳQehL0RA hjӢLB[n" 줃xKyQWA?߅3?T:rO t .1F+f_Z&8#7sknN<*G0%@AttNϑoV ۜ ta1l1 d~}xjq0h X11îtAض *3Z%7[$fxN@[Lv[lxr>ǃu+E"w:*UH14RpH~އNqo*`S#B{X$]8kJ8`B*ex!`g:E=\zMT5d^5׻_rL_*|,ŗg(,@P~gso]N'|4$iO{ ը8`QPu< Ռ*#VK5z~ˈml 1bME?5 h+ !G:S| 7awջ}xě/^Kі)vTZk uqhqdpu9t0d"CIli{ilO7(i#cP8wW,sĜ0 3M{_w7430ab=>k8>ϱ1![c}kLѬ5r4aR~ͲD? O΍+h{r$|H ~}@O=7L?O-?ʎ>. ~Ci3N 9>E|L\rz%yTGmr>5? jJZ9hAy'ܰsFfJjU,~d"<}?Vn^[=8GV{u }S66 Y^)6mJ~;9!qlbTEjER/bI =~~‗B GI%k$J 099sql*oѭrF $ݮE=W*(K[#f`I蠻}#Di7tcT5B*%2Gs#/Cc5V{?,@&^\7 }N8Y"ր0V[MCj?ލ6Ӭ*MU}.oODsf ";n/gWr^:;~h+&f+~.&'KvbaR! uKXwr%g7ZGj507 cYrnyTCoѮ4. Drմ/-4,NJއĆ0me<=5\x-ޏ + ߿k'O)H轭2Y]SDw4Gá|@95|&T}xs{j ʻ#3c_2#Wك)Q;)j__1PYc(Biar< ѐaDOaLYBO`.l㜎/gnH/:\٢φ(tMV%Ni$f?Z$ fBbM 3?`صWxEho?^v 4#21xJ 4{l&^٢}5(Jlbk)FR1h=0kX31g& ZD!Hc~ ,ᤚ1{S\O1cNA/ʪ9uאFu4R\A.: (52oĮ2*t4fnK"àɓڍm,)|hT inTR'+k,qMHrm>#]nUcC&,`5LtG(X9{ GXFY{'BХb~<#]%0&<7d=T"lȮ9Zt% y&DWA :3B,W3Nyژ\ ^d'*'@=Ak̊~WY1_9 l:(f2W9ͳ#PŒh 9wJ:0+?ڂqM*V MqyEsGh˼iQ~݇k#,ȗ!}zYװ^ gK,,j9;4J>y5>,YJQO^xv:ʪ'zR x8p􊣛*?y9r;Y~Uin-GYڿZU>o^L}xac{]Z\lg<4cfJSsPlIja|+)lO{gy:͟w?ˋFU΢l Ƨ-B5A*zIȂN0~o`#`gܑgc%[0ѪCZs@-V~l:(8O%i\x^Hɒ&?`!y k^4wv!ۻlXU)y`M>z:$!X9 L7ޖmhqA8rL.u Pӛb`y {Uj\2 q}̊_R4[hZ_0hΙ栐$['/Yg&RnJ@k6Srޞ f 78o./=@SPR@+sTUS]&u L!qJ! _N.]P<1 x?fO2c1)˙炓{p "mK& .o) }cLmWJn}9>L& ,BhYڡwlp)33KB(u?鱩ГBH9Yss:7LQS0??HԘ5#ۿ" n_p~MI4pSÚٺj5B B^d!dQr}"QO`RN n6ܪٚ~bL3 ޳TogRS#vvMןaF#݈}mH-asid%|ք@ULcrR%[Hd)gۊ~UЪ*')=;U ")Qƒ4߀$97tpb^3疏ٺ'\9_jnIf?OI'Ǎn_F~s,`Jzg?uvr;@Qo?r@CGkБ*!hk.6Ȏnۜ3~['A,j(&fTIX8:N_|lqL$f6hjہ[m<5fwm(8nqȅ5SSnA}hE^^:W;)%2hbh? <fnUVNћ@h%NhQ6=yh}آNP-o`9KX\ ͙-!gz%'ۍu]=: V^rD-0._~΅V\֕)4U ,_i^24[`r\Eܝ >9MWLqۜfrެ(P,KIG= 54 3 ;M1 1\1Ljݖw&V*]ვ>Կ0#A!I;SpFŒTXE1XDSƦ)z8(KZ¥!4dTŸ Ua&0l9X _v&j٦QaHMQNN9C. f^/ &?EuŌhG(bY +;6L2h.,2W&FWo&*0ƼV*SL%1& !4н0"A)ʊ' Bf|Ek|NؚO׀#.Xw]QUSs7V_'QrgeX[v48\Yq=7E{WKb=TnInn}^ *:P GDr#S`[dւ էk:yvta2m*lP8xZ! v<_y!2J_؂HHK:DH#]gApDKb`qNar&$kF'! |#ɴzM4b.SwYL*w܆6?sFɴp۶m66v cnPۦm*m6t nixN79Fܓoncn)ۆm6p mzm6Ϳoc]+nss6mM3o6~oFmqY&~ana"4ZAmP=[( >(B " |3_2yEyhh+j|Up<|N0K4(dTD` xD8=RM=cPU!N9NL&젅1sRϽ]'n;||:qőS "9J!wB`ӵX.&P̛VcLe$ U?\Px08tC?e_Fup0h\!v됺5IM`4f-em/&_Ex|x|;@bᄒv&z2J[N-|SLOE3tp9Lk+۩mR2{(7bq킧ڞM1G4A1d2 od6PSaEXR [E?Fg^r-@R2ae$\xDJhH"عv(7Cq\%Lzef:h("8B2qPq9w0!Em*a6r)V.uV|{ak',Q#l6PӈG=D:6b21Ts_WJ?S47"3Gu3 uiDD˨k.Abp9gr"Z Sm0᥏mA <,2 M0"*[.ue0\Q$?'4j`G/ɲFlVkUɟC]";tԵml<&.0D23e7 bA/־t՟uf:v{\:խFpЫ\Ҁݴx]VOyμpB: U7w݇o9o?$Ǥ tNzWU  #td0m$YD1__q_GO#v@p;Np=]ڋOt]+# $\69t/IARzX^`4,'vuዡoD;b-5#)fvr̾ll+3jؽzB6%[y+2b;7xh aIOi=+r!|EqՍ WTz\*|/gy$H %ɞ 5F:0#M}iD 5CT`W6\_e_c^g`y]CD{$PjnJϨQ63>)xnX(j_aX0kQhV-A<_ $?:n4j>n 9'ߒ^^ʜQ6~#&$2w_ 6Xɔwt״;JB[ksN~gH`/v¹؆2 >L9oळ#D{:8iEMzh. mtCH0kH.gu[̤^ٹe6C}:JK7j׿/;~&)TL@c/@pǓ}[E 3Խcji-Y:p$ŠS؈oj@!t3Z dPV^uK/[JZ BBL-(e a%O(C n9 :hC_*3NV=HFM#s/Ot?Oo"`2f`h\_!MJ ߛ6H8;6A(=Ixr/Ab"rzXP_ms11 |>~V"'> Qa*/壙%{s=}F=夕2XxwAhG^Kz^Urw=Aӈ! ◸GLl)KbTG1rX6^.K8Z(NG 'Lɿ9.+! R_?IF!c5 &{>i lt,O02qgw vrfi4\1pJhm"H q W?)zyQL(673P2NɟfAP8t Q|:1_@g$b{mx s>Mj;4sxv9bηq{i :_RyQ!uN0,-z.jt> X:B$;qxF,(1<6.k# Ϧ%b>;Nsvmt-(I5ΒD";Fhd?0;q ORDp"\ H;#:S>Gitds )6G"Bo= rJ*B1If+{0=J-2s&K U"E~X`?fANu#@ʑpaBI;BK"}J'<!e1eC{c !D ۵Ov3EifCg#ɢhn.HލvWx'QV b( ?ܥwY8J?lׯ+p 0NО7NU,?r bírD =Lh 5hicYp3Mo\xX#M2\Ss]Nm9g0`iE ewҭi Q>EdT܎47#IOE&Fzg"'? ҁFG/-9I* ¢PU삱5,^$Q?R1/@Eа08skt9@A[bjkd}"(5&koغt]D ;R rb@3W͔hsg|]e| iHjNjQt*fp$EIQŏ2sRaRnδ'xs)k@?@T\ek&Puy_[ſ4Oioއs%RC-\QHl]/>s6˟Ҕ${{86?Vg{Xg~}!ֈZeVVk?y!̥ tF  +'.>qȑ8=[:*<~9*ylJ"\Ոnk0aF⣷=o&SrmI :̾ЕptT ONoIBC7Mk3,hzȆu= }/3iAߢԈh%O8-zLKK@'֜K2Y!"zr$ǐ뎽JX$oBz" R!3JʐT"97X0N$(qY}z"+A6'z ^ج5ǫmP0ahцN;Y ;EK~}}wxr6dYe9ߙhsOlr)Ǿsi/J׉&+Hd.8rFtOajӡx?"2u݇M5/я~wJ{Qt^+UAI0 T /Ya]̑5sRS}{C*HY70~ +FbY휪rk~+g;!A !<\l|m"?6sfu<SXAzm:hQxxގ0VN(H,vA>j} ;n x Y!:g{oe)%]#i62qNw|kŃӌ+T1c\5:3R7Z%\Vt' ZTf&DB%:Mwȣc醲HA&<,}%DTʓA'\dɒe_(_O9e6q/>W9mmr[mf+ G[zMhie;0D{d7O }M;/YI1NgKF_?EM.%u*įoÔr 5C$V`Gg)1c>,gckz|çz5бzlU^Bg"߇\ЦݞJ?-J w`Kba(pP?+'څ+dj'XŚUx^7]R9a*;ШFTwWNNC^ל(9}#!&NXBR_>Ћ+7MFh(gG =Xaq7,+-ny^ΰpl-69yn$3jM,8/ovN<Ռ7lw3=}!&W F]G)e:ہOԏJM6ُas-9LFlg3Wy5D2?×y~a_+5r>E}g?;#EVr e(gwENlPU<@oZ_kqVbfKFdCF&8WIE}A(_ƇEC)̬q4j=~=Qb4Lj~^6*7$ްIv]p&#CҨ+ )TSt%UeJ_}U@]ugS+-O x:wEj^[~)/@WCwF8 \x®fq)Y?9Ab5(O\nTW̃}@h‘5-jaYB*E$/O gB&C9/v:L EQGSӓl3|"kM-G#l&SW)8Pho;>Tw-Gcf9:xc=XKf)ZyAl37TcrmIC:8C'_Lְ@6z6~Jfjn)NIϕx\{<ƴ}<7{Ҟ{1g;l أhIdj󜪏|:j($C٭G)}19q”CT6:|~VhR)0}ыb4:<ēKڔfW}`'g:tʸ8o;YIR*qMͶ|XI&=zG>65XAWμ{ݐ˹1[<͎r)_>R=C1cia&p>F̙"'0rMz ^O_vM5JeEɰp}&~LShO]CoΩ{LaarxŮ`"`twQO//Os\[Uw; d4~L9bv}=yNƾO.grwAuHBFW j?&}u'1CToڢNs쵮W DL=Q癙k$[ t"Yt{_a= IYjm~ix0*4QKGr ~[s@uQ> (rX̍1]ab++: J"2 |`qN.3E?#C2Vج _A{tO)~ 7~dOβ$ќP|ft9Oѯ YBm {U5[^Vi7֔m_0s؜4]%6;4=ދbx3WJň&nu8w]75.yJ[unc]ڷZ.JU}#Q=E50,A uT'x24QoG;`b^A%|=j/6}u-777CoIVr<.D/ϭƻ jB~Et_y8v2KGZgE7-FvrSVDZg E~:v bLܴe/`rg?fqg IC?$Nz|i6sDzGd d5u֟ ޴镉D "G026c,S5//ȼ3^`d՗U+c'j.O )#\1JMP? mtM@O_!aT '*""$3 4ùxcWPư%ǫA+r~uC3c[g ̈.58$<湗\[vJK:ڛkk: B:1 ͫ )wW]餦yt9gB n˙<&tt'NJZVn r!-#0z{CoZJDrٔ.tN06΄ZewS)dW \wA;O9$YS^g]yZ}SaZX-٫2n0 =b̒sZI{JnMUa` ggX%?Kp@`KxeIOei3YƳ{ufTd 8Lt3GW8%FS\+"sݹ3±{u`cl\8; u߷}=g_&LSEB*A\]3)Xyȓ?#? 2ӓTkŘtGs_D`~ ]C;ʚ-Mj1~~SMf$~-_xT]U}-- mu_9擌Zv{Q(\ dBB (<G)VdP1g]ߺ[!pTF9o[jGU5&PweINՠ>atp"{὘2ɏ"+m"8Vrbhɧ~uA Ϊl|Xݤ &W 15SI4nD87٭`3ϣQÔL^oᇀb׎a$b`;"^W(hyF15N ==\2ء<1r}1k<^a Tиg.{ TG'WA-9&pw3%>߁׫8;NFI~6"3"1ƣLRc.xX ewn-shv%gbkn/MX7 [piEß[cs_͡sb`.-(SwIA;;pCM nތ%<ԇGe}N}RL|"6>/ÞyiwO J 3FMogoDqPWR-umw077rSa88B/&<~C? a܋*spp'.py8SC%z4ğ B ~-5n9QfHd}g+6!;Y / \yޥV/xb)'nʹ{ju%Ú:R!FWʬ81T8_裌S%)a <AsC/kDooB-!=-r7fw8'-⧵SvP͜l(qݭ-u0G1˭h#{;p5`@[[H %\0/R8崘i2د>Y!!?  >:A~//u֙1=jT~pʨ$'Zs8j5CIJ̠%UJ:~Upm4M'SxGgvccCvhd{Ce̮zp1e[p{Gu ̌}Ssr 9Z/^ rLkђ;'W&N@$ᓻ2} uxE3ش-D΋ug膥9 RbPBbýJ+7ĦuN}iTrS"F•Nߪy:,:lnlPst0Z#3:7Ue<1 <9#K=t+)p|[/jJhx$Q-=Z,lS} WkyDlhaN!pFƇϣqh5R*)gqDP?C$|ǧ9"&y1j.znU51̄Bn1Z&i(uD'FLwwM:,SMjUOGmQ/zO~g=3ZK=(C4;Z:Wl nʸ9 uGw!{q`DS"몾G/1yxؕzJ4sRI:77y9qfDÆ LOZ" Zc(gr O]SH2%uEFX#P#PJc":㶾gRg*+G'$k.hx}7UҲP#gP c,(|wsDzk5['w 3:2?)w %o)>?sbӝQNdz39IG7f^OQ| Kc(R֣*t@pc y GIJh@nCsw5Zo KIDELV&a)4&w2Fa>tJ΅+&3@̘.lyʲIy 3OT+avSzm| B9N1/vBr )09/_EzGgB`>Ea(*C=1<|tkw=;n~A@ iRKM_jj?.sEL 29>7y&eAiB>9>}zL?ocӲʜ Vx]5~8)y@iO7!)&xj0K 4AP<ܜ`Mbߢ֜T gg|:QލڬIso)mCGeỹ{"4tIltNm2C( 3W9],3S2W>k^1K$~q({{ZPHIg#VP}ަW<@vړ<{EPLՙ~k&CDg 8̭#|f_I" #IrܲYp6 VHOPq R9Mƃ<[,ad U Nm7&_NH_ChiW?Q3(py)/ $gGaUD=mD53.*X31d 53b{!ycK%S?|B%o~Ċ0/ 㺝 =4;$*j M ΑE]fu !"R <[Nf1ܓٵUp"i4[:EyY5֊ȌA/Ux3tKDґN.R[{27]7s}tQ23*Ipp1wS\ϙߍ~`_9gtERHҮ@1ℝ엟& O36~iAE8Uo#>^CZ}k.kBF$eg X^T(P|M;0t/-EL"bP:E"W9LƯ%pR@ZI D鬜E&_s8|C =}|xbOOXgxl-ui(*&u$y魂9cf(/uWe=dyPPoKgcY/pu S?80cҗb9sJ F5Q:MQ\(_EG?M|~lDMtȡ mLb :aZ AeA.+%LǥZjV}G?:v& ̘Jy9sjGmM$:\b8ɗ[[\7*r''PE! niHxp4-\i:ܐrU{XBQ ]\}Z&lRp^ !]w{ ԌtS= Ƣi>FԎI+5 OYk%0&Hǐq554Pmr'#RnwĩEf,Yt~ZT"2̗u:QF*Fݴ>GECڝR+n?rQ#]{3\[ߗO 5Ob7*[⻊dQ0kDRх'w=徳`C22hB 2ܗ-SX~rzKYwp&)ȋf+Z ~7#~0%~v숓"7&%"<2+3Jiv > ObZO!d*^ׄ-KcBAPtB473&7CHƱ$e|'Lז?!"e*7'yv8xvWj@:k֍tgKh ^b'O7V~yvLYՕ=;8,˵HHfͻϨZ$rP(:#31%B 4:t-K/13FкENr{MN:Mj ָ{Ja1Oa,ר_%{@7@9߽5$|#ݳ> CaUixQCQ#C͓o2nGKS[kB ߟ  )(A֠DLwdrANELj`5E<7\Wd1?V5(. hԲmn[̱諆:X4ځ+G>#a'c/w>v'Ѳz:'{&BOf<HocЎc_Dw`LCصT|Z @jτ2:דPu=f^+n:]wXo II4dȆ֨I!79J*fjo~?OǿRZ*GsOzTFHp֝DKE'{_Mv'XiwI{QYkBD%}']1Bo*KG8_DU# 7,\pAՑba/hۿ̅PR"itE6uL)UODC/$Sy<}$"kcw6\$'[do?_oV+g{#axC|TR +O,,z_9sBB!BBJ!B!(BB!J!J!(BB!B!(BP! BB!J! JP)JR!B)JR!)JR!(J B!)B!(J%)B! B!(B!B!Bs Rƥ>=Q HxC^p/I{ |VJ笓 zʔ)\m݉"zE 5D@&ؔ7G!scHmT2">0e PNbS$,PdƜckYRSd#$Ir FpԖz~*L145a(-!Z)&R5`eY8mD7n|Y| ayJ tiJ~Y6`CwI8:[-lY M= CEÝgq`s!a?G%*F4{%-Ix~`[Je*h4PӋ '; ;v~l?(h /<ef o`;xlI@B-$,0 TsЮ!s ;.؁,þ2ofZ`BJ~MȵH9\~HIQwd{\-k#tdCQ j\5 ώ|:3/67O3+c<)IV) FJt,NVu*R| _c\:G-94YͷE:4C~i8%#XZVϘm Tlr窔w8+xZJq .Ű(>/P\4;(AFϴ@pbk/aj05024֓6&HƈtU{.DlesE/!.ߠ"Gpm@*SQ:%G ,bc}Ρs|vzX<??`Ƚi[w|(싸3>+[>2"O&/BJ5]BoHY[)'e4W qIlsznC1;ӹ#p~d"%)m2=M|lpMis+";rkv2Ot ʌ7KgξO^!sx_/e8vcB-ܕՎUh6{dgo|.pږ&ȉXR<I]%elR{_$X0v5cc\Yhܜ'>vA{cW'nnFE&*yʆHp(^w4N[9zFϱMK\O7fJA!٬^x ƶ1ĢŖ}=w,+^Nie. r0; YwZ׻DiXcH#q9①1/YklL2#|wr-Y }_t'/YSxvWȽ/EܷXDϴs*TSz'*_3oXklDbqdo!F :r\885,wИB.SO;{ sB[lJR[trKn RS*WW rI>4QL!25Cw$dŮSCPS*ObKRgV[OJK)n:٣uykSnWN61I[i~g]\ OnKU-ɇFE8\}o{%J3?w/Ӌ`*v$v&2vM1PIj~&Ńlf}YTGV6_qd|Wœw=,k&{_0|G DF_i pZt98gDЍPw+0!>f @bag2h^k=ۧc̜XR!N|,+y?`1\2n#V#+sOt_ Ҝ40*k 7.W+E!j_;,DNîb|ŮQ/]41(:xFmgJ.yS$Ї _g1H~}Tg hd ]IySu$crʙUZ@}Y􍭰[6عvwՒ,R,`}sthf>R>X6LcMw U0픡$-QhȔZ p@~6(c)xzY݇?QNA?ӷ0x{ߎqL%0YA#/cব,8\1- 2T ;Vlu$B)UwlyXS>8݇͗xtE"Or/ڡαw[=yBRnpSLj-bLODLq$n`(`FFudʒ[gC8C!GصKxԗjS%E,ݧ]e$DZ\֠ $8BzakU>SU3&UP"d\ g=R/|JtGGZZsHHV%kqݻ~t+[k _.sd}`,.УC韯 O)NܻtŘH>Ґ@2ʧ`nxm ȧ>yqwG.ȮΡ*h9lM) q\N}\aÒ%Y-*Q|"v6 P}N.ǿWoP. =_|fmzR]2Q[tjeWIe$rE !S~ ^ \lۧCQR3L?O0via; ۯA_08}5o{6ങ[&~\ | >*`=h6ps/ #3}ȨNGj&hu 샴Pg+rL][c|G8鿙PbZ'Ҽ rn(a`>Ala4rWdzA 6m7=<`uJ烞 nmg{)5fr;CV\&+S61h[`Xj E7+ZW$-+O>$ IBE7Ț}xL%N(:]g6p \E^ܫ[p { H@T/ZNyx?{2=8]Nk&24Pգ}e+cNLk7LB0s:0Y!r +KoPTiMmm8Ilᛟ֐ۈFvaәfMo7G3~҃Q”3S2ȅN6ڷ>_gluDMfk.P"lo7@a`YrM _@a3⣃QZw =#=X4]j 9*|j&HRk:?HFtm>l TPS,R~δېPpWLfibeXuk'W>O! J4o9"gV>Ί~#{1ȁFfP2-7j7Z N$ם扦qOרanDw˖kw2Z R~%YcQ4$vSJk«6|UMc١R~U0򍵩́Ta͗;4|5^l7)v&t ϱAz釨ج_ٰvh\cK>gxr?WRϴ@E჏>nm;&z"0j*DR byiovKbB{=q&(P֚01[S*=5{&?yYs-[qH«z׵?E0ݩU9^㰍L G['s+i`)M"hc'9gE&XŇi6݊߿F#KƱ|TW@'~FU &ow5L"|@ pf*EZ9KY,v?P7N h@`5 vvW*Cލ"<*`_e,Öa/ڪ<'`^0}izӔHЃd|ndhAKa+Oc0._T_>ٚutS_fc9 cgNm,9.o/XZlbfYlRYpcV?s]כ󄜻i^EI-ID}%O×%qj ܣ)_'8oȽnvv|ŐOys?6ME_lbGh{m*z8ᎺQE# dĽ*88M hf}H-5ɸ4kBK3@|lCih7_^Q|r]mS ծ@%XzF AsQ)ho ,~04reb^Dx:^@tx/iO\{<o>G]PLs1luA'ƪ\LPS#aFa}Z[h"7י0UUf7[ל7t߹gC86@g"Ƚvũd`uV>ib"1?EI(3Pn\V@wg 8N}^+'SOwl0XiA,ZS1GC;)?g)#}^1wjO?#s+P=wKaAQ}~#d×縂a^hf& {<{[:.zg`9gџ}z`JDU1׏.gu.\e WC'%SO(/Y˂Ӄhi,L+<}s>܅NΓ y_W+d;3z5<`5|ܥϕI鲮T91Tf[>E6M ;wx+ܜX7q"0vTݮ:G .?uMl>SK]t ,O8Mn^^' Qۘ8 jC9b߈Kcٳ&JlT~1W^@r,|~»Dwx0c.iNo,UPߗZ&6o+hs\zNl'Px2}$c979fI#PR J0f.+cƂѷ`-e̤ӠޒA<d6c4x5sٯ8S0+qc y)/0&wχjgGL|Թ?w.YQNzal@!Fd9ф|2W+(@GlC NJ-[QY|>rOݠ$ z iJT2Г༔ע.=uVYqnaO:n\?KvrzfF#SEMFR*#?HOpqvs'S&nzZL`QkwwςkSD?Py>Zezݤ`ྟ؟&Y L"C5Y=<4=Ꮜj2SS1z3_9TOC!?_^ Nl88H|nhHpyfy_UWsEC^0*}pXy}y:),{g9۫\u"IHWa>1Tn7a%K+W_<9L$|̜ yTލgz!ktid.'[\BoX^j&Mڄo7OP^itSO64~7.7 97$gYd8gj%%wU.,Ԇ?ó.~F.v.:B+= pVX G!8- f̀c)HW NfzKG=ăC a)6I͎6}4f^h<|R0Yu!@مbV5ڥepJ~/qQTEz^dґ@?9O:s8qq['saPDuJ(]Yiq/wPyGLmI@ lUE:A| d~e ";8zdc/sgL ĸ{ $|?Yxʪ;l#=O "ͺۨ_ըQ%=~Oͅ Sk[)$͑eCTX^Cg+ +sbs$zN)jZ'ob(#'I t+T}x4ѱƱd+6t*=RrzRYgQ6bpBr!:<^gR@@Hyfz߭t Eg~9,'!;*2Ud>+J ]PyX?:烾8;:94yw;poYt}o hVՂLrU2_J-K%%(y6*[$. uHN+r22h9>9آ Ťϋ/]9#+`3`•ʫJxn곏ي]wh8Yz/B~D[;puYJ*4?V9znl WtWnd~4 \ifO4ZlD1{lZm[yH{ cU|/ s*|<+lFZVds+Y΋nu$9T]kmc1apüRudvOO~SS?U_Ddӿ`$ SG0 K;g}(.Ȓ#"( ޢ5R?,Ï[XdQP}[LSبl{-gF͞?g RX6;t^2r8@䛐 *; ͍E;-("͠l\Jy-|fM/l7WKbOqR~!v!1RR*ίpqq1[j97,IoAsZ@k@W ooaneO_TR )+H,1A\[}ǩyo:1~# ίL7?v,bP< O/|8NOЩ|zkN}ѡH#^x![DhϿt[`\rg9ѝ?~G*ps'O%:W45X`%i6GE)r=-{B kkfzf$T#26櫒vL<]i{ 4M…%Djd;ͅ\o_\%&'@a>R( $ MӲlѹZBqwKnGS:̕1wLu0khQO6j?dF`pHUB Ť4v|K-rd"F_ަyg~_\Jgl-5 Ooz GԽj. :Do:nvm[i9ehV+pg?8eǘn&a o6)ɺ@\y@1zgbI(Õ7.ʟV2y]ڿQAihLGe\ʯ}3{y;wU8" (Rj#ͣA &PvbzJ(U~oK[*_$-WQC _VUӚ)QJ2x@fɧ B>n89L Иtx]V.}>8 h^J}sl"Q^+3̷ɭi*R:f\{dTJ1߃2\eK\߭-@xA_Fʦ'c'aƒ!}l3SF|x6bz>쟰DED!<ν48Ld>*Z2ڭӓZ-G+lb/ltQաh ,n9htrU*2J頰u 2-'5}.o=\Nrt8?HZ΁MS(83Ϫ0kx"ɎU=ḥoG0#Rt`Xݵτ"݄5ڥ Uw>8?̣t/Al-D֌B{20FԔy`>5]zxOCKm@%ţVu'}<3vo_Q) K(m ֗ ⻃2iӥQE#GTبhppB+I-}/ӅOFX( 5B1$#dZG9?BCAe47h=& =Kqms8Γ6޿ )^`[>FиEe_J/$XQ)yp} JO4jwf5qfk`Y.'[1Hce ҭjDJ9'f:<֧75\w|zG\V7aښY3Q6T1곽v~&6h@(k)כOg*kۆ%…GvlGG|`łhr'6 cnlK3N/= DX of1؛b_΄/ܻ'*Gs*⨞1|hX}⟮Mt?zsD_9vOT/higob1qm5MO L#i'g).H}o9xnӡx8L-$MsJ⃢)D^C:gQY̶eqpuT|!N P$'xmM^z}n)_)&KSl>uSHkLhOUrH/lr:< 8 KxGU婁x 1zbpl7GlBёr@M #V;-?̑a^I)dZf3lP Sn3u-#,sa!鶙o_%y ] x8DrsY~#'|^$ESzqXȀ6>~kK<%u{V=L+áK6%ҋ f$(ى$0񆒒P+9-avCyYdO+\@D`ٮ1ȥ`+T9%5^qo8,p6[5l_ uo@+aÚ [۞X GH*95ʥ$۝NBǵ풤SR& |Eglf+§ayz"3S"jTvs%bUN_ "alH,rK[J0m ցigd"#^]KY[^g!x9Y&w9ڣfJD/Gb0rMu-eF+|$f^KYY`MzJ 0 TN8ô * bV_{eS@rsW 6_Yp͂1y=E„9\aXTӤHxic3ÎD+FgM)}s`E\)=Ӹ5aY*uz9Er{:Aw#.pK NM-rYM2]hD,<<0]Iǔ;\V ІBٛ5vh\Ab邖xr GK^OҌzČf-2Q1fx0<kHxYq&ҁC΄;΀%֣9=P{dDDQ_4R[ ^pS _m{C3&of<_LF{vls ٗL ,4n~SI DRRxaoХ_O>.'A NfY>EP H  t^zz2u[Y&vq`a\Z㭶'ӡCt rU& DrwӍ%`mQvHqt(F'hGNVh.O #<d|ˀ|"Ip+KfӚU85}cz!`x~6~{x\y啯/JSKRl|i}8/&`%L 2zQ'.0VM>+te$ۙ KъW%b[욬+"U Rtq+a7ra` OD<:x~^ŲgZ*^XԿL>dj>wk1Uv~!^@ `}rdjW(GMs'uhg5ZiMf^^!4c{xAjF~GRgaLCQ2KlItc3X0Ȭbb=h0s^Yk7R }'CaO\q w"AUp-r< 6bo^8ec㮒9/>p2EAɯqpAǔ#9jq+Uxa/CEva4;;xP{V?Խ$Kkf=[ak/WUjhU|oÿvHO\+<[\Ok]pArD@2^uNfǁ'5Off*G)OBD^a1 hASz }ՠN`Tsx꺭?Ȉঋd!F쉅QRQOm k*JQ"ݱRs/cיqbsӼUէ!|TQTm4;.ۤ M2o v X4(I3QnZ~٩]P秬`ٽ:yC,(YS-;k@} ol+T~eN|>6lLyr ?Og۵DE}Ut9Efᬛ}F,LƟJblTw$&y&~YkauRt?ّ -[3MIsnX>6 !l&${~u:&yaL1=ȴoT@aƍ:Zq1z9z^ 㿒K J#ám{iog,";v'[_ijk˷r \esc=؟/ua`9Da bg.1T)J4Y*VkյhW7C $NR)рW"yqe8\֏2Pl\TM>87F⻮!U1u{`6_OJXIvQV)y*AQ}^KNBsOF3ߓ:o< 3us!1cЪdL{2o0w*6` cx+nm:p>7aYӆ#j$͘f.|҇6i|6BC1 t' oȉ3jYXZKVX[Kָv\tіӦE>o݁_i h5i_{ى?ݰjn JABd߉NߥMNl/]2+ r{/>60)ѫ NG 8ۃ&Cje\~ek5cr$JS\5`a]EInAqo]7B3a{YT95P3F"\ǟ(޵_C‹n-dBgrG4bzƗC j3Foi5L>R{Ak/ вxR 8m=ᔤگ K~bf, /%R%\Kg P]U{|{;Ipp7-c}о%~S@ﲕ8_ GϪVwƾ1Cbݽþ`k.~<c6_0j^񸽄hZV+x9Z2ڡ{aʐorsu` f f.#{'jt \C s%BuZe{B0's2[ d}Ѫ~IQw~J/t)F`)owĦ?0YB[qD<=Oh \N<(_>ԙ En9Ԅ$KƗeir0׮^k6M Q!-w$ WEjr85@q'Ou̸u36P`&{8o!L0Å~>_2ʈt Cc vKBi8v#) /ҟ7k.X.4*7|1]P l ve~*" *[].d,qE?lKGo)ƚ0vr~*t+ĨJ]7B"\ǰACNuk ^^H•|ޗ[E&m:U} π`1㊤h W/>=LrG\9j>, ЁB"ٸHlkJ]n>`w:&K>g:Obl A r~,;AJ Ҕڇ@ O ՏE#D❙Ԧf%resg}샥&ωVC3.@PycZƗm!@f @@@[}s V> @H{)Oz\H8Mk8mqN>gd﹠OέKW+h ȧvh9c:=6;-m:a#+?|,O/Pa߷O7uyp<<}*bZ~ppnB-+n6&m4DŽX.^1)wQJ'*1C }>ʶ03[Y%OjV?Js뎠>48sT{okc"_BzGR@.w,.4yzF^tm~ @s|ker03m/\N׌cw\`cW/H %>7ےw?0|/1OlrA)k 40 @1Py@:0AN)>`Q e ЁF ' Bp7M&{ Bo7pOBn70HOh IwHMݣ7xIn7ڋu>*ԖT_YCVkA5&W Bj500M&C ń7LtF&$ >0ǭvq-vb ]d^퍍RnTE`X JZ `/3&1z%>r_<4mtq>1F>s'ɷ`dQUuWZܥ)r$0NNM|֯BOj0fC@*eN"`p YvnYZ{\%{R␢'9wőAu9bLJM{(S2^E/amk1sKMt޻0ixݾIw<.I5 s7RE~ 0;#mFIu \m/{h/D&Y0>?a/) hQ}B;h'J%- z l&1tMX xvT;Nc]Uxp &kF]G֮[4k_Fg'A:Ď8PHc{fqjR\ك@x*zo˜(8IONcSnƻ|ROjFg겣a]c&M|<]-Zt?)gP}$:ꓑj~~*duKE0w:{ 2f >pzڴ\)dC*9-{Fثvt|/ =.~(@T>P F><ȓ90G~;E!CXdDo 6V<`N`GJӍ\8]:=?U^='j(ɤF7dod#ސׁd)! >Av?uQli 6^ycZ+j2s_0)hP)V{ v;]=ſ3Y*]G3 d$na;#&GD?V⑵/UA'@2bjSbZ=$^R#H1.=qE_sbKvSh%U !dUi{H NݜFHߩ|RIH:1WK2Bw_Aq^ҙd.Kq=T{g%d IoK by1F.?NWkg@J5B: 8W9ǫ?BpKC,:5SÓ|M yꊖݹJ];D.wY-mctk먲r>4-rաN%er ˦e0fӼ' Nڻ%?as{}n>܋t:kAX1 Kta-S!ukq z䷢4qgBM']#)`ؖ>{bhm2M  5zp>0Bl֓o[n66tAf--:B;~j'-k6B'䆆r\ tE8).jԄњ詭 ͫ]'NY!ϑ]BxZ`Y9_k({E.%^~FXv` yɐ$WrѭP1 ITXH2WH{KFAwMlr?i85|Mp)"5"yf.n#_Ku$ϪSsi[՚>HgIv8?2 DK(!>4TE4Jr?p#,t@Nx7ރ1MTR *,,C< k|]BpgYd/>`,a͒({KG g/{qߡhؼ,o37snר*z5v!\TIM>.O%N~ m`<zt`n%>*;{q~#sGs+>\! fWM߳MdD5ιO;#+N]6~kb\NS&2[iO <-ɵ2I=# hl6DBd[dNrySby6Yˆ*QL??'Cyt*e Nۉ2d{@`OK74O#ۆ(5B*Ii8?Ш2hpfğ "6x;#YeHI?t6G?8\?(y˥So:Rk:!}$ NŎ'|72I&̇1Xغ1F ^t)+SjN9B8O1Wȫ(l%Ì Hig+02 |3DߍdGR'at Dprd n5iOK-c  5gWTL7GC I.oC5^ xP%P<>h;;(.H_t8vHw#ȺK5f~%TJ[CE^e9 #:dV7࿛ѷlBuB{ jlL_D^2l ,\9x%ĢwMar}ʃ3d[XNr$(m HTdq wPz)v>Gvo] O<*Es͗ ;$plqM3AIH*CұJ Cj˚lK>] &RR6UCSy ƢώØMϢ;Bza?2em{>B֛#y<IH&l(1_Qo4 M@1$3DP\5I.%-S'ڗedme!CUI.c3W2D!C`E#^ڟé;Ҕn\1CNPXPB]R(%tC %pyL|UzA_o3Lœ yV:hb܊oR? G =w"[DEԪft1מDK%V7al 58IJ&7q% "ȫe7(9ˀ4k ·wjWGvoFMn2'$7Q.Wh4=&72&M&Hx"Ϯq`Gr`R˯<1Jgg@<s^bw WͤP#x~&T SQ]b@14 wJҐ C "_oa{6āPj7 A/FT:t@4wQк{q?-ȎHuy(oM0l؋:5drl3rtw!aA3 nH|-@=-dʵ-A9:[} pGL@ҭ\.T{npØbv3wʺ"RtUІdr-;Vvzs紘p Rpݭsٷc5*%n@-һȄuWeȧ"pC 2Dz>!&|^Em>D2qg̤x%6xC™} }㕸#9>aY:LʠY u ڗ$=ҍ٬;0*OâB0Y z&ntic9T3˻w%Q(9م{m \D-,2J#i'v0e0 Q}7$KLEz<2#SH/sNi{/ -1yBGXؿ*a!_U8r,o*Y"?}d3L2p:Gd]͙`kW8jU|QIc:a8gaA<[,+Γh.Rm rl2LK'e%|W|@U'M1 "=M@@+p)pޟ}nV׌'p"|UɎ^(,sT+4dyV])x~'`ihA0QY2]P1':b8qҲMu> DFTR[G 8@Up=7&-ռQ<)G& ; z81 2:V3$Әb욚W9d\>QT@j:*@;A 4aZU/Kzz| Ƒ{I"Z<>hl_!Tfgx&"ӊWe=f8O-Xk7{m\9ߎw$na_삪it88blHaLA\|pt8fWgwwOa/d.+R]2IHMЪlʼn_HKQ1ʦj"ێ:6'<!ofQGw-ᅣrHݥf*D1&~͠Ó}Q Jކ ˼~8,]=,яxQIQ tJ)T0;&]cc3Uٴ;?ԬM&ш񳒙E oprN88Ɲ^NDľ܃xp|QYJ? q 8i?"dWWCX4 :#( /$Q4so3Eҥ30 5 %ȁOE,|؃`/77V!ƺ2T V6qâ1[H \.;,`PWt.f3!sI:6FQ[ET2|&g1tqO|[<í1,md3vm|a<;N1A=uÙuPPfs8POK$9CT7Z |;(jz:ZVƞNWWvYpe<>K~ZaåӔs*G%9 ɛ#$+~kf8v([ yǼEy=ߚőJDt$XdW3f&+cvZA3Ό{,q~}JsUASE0z6]ZH3WO M> +^i?ƥFZ%\~(h !F+wW>1:*/sdx $`|}|`Wj8o ղ߾ˆ2/A,ЉlÉG|7TnE܊k L_~?hG  O^2BC#NNOhhif VqO% Gu ~PjspϤ%"o^hJ2`/dGsx^3fٕ\Pyfi7tgu-NE脙3/`BUsLlsohAkÞ"-t trʛލSR9W%5g<)c[~ A8̀'O3K%t5\,3A5aQ$}-VB0ߥ7u{g!09#g$O%޼g J g=ߓ1"t"hbFy'(1L[Ϸ_Q3&'ƛQFs [Q ci kmMIR5"9NaikF  GԎ &#U:[-,7 E Ro(a_vK [VxWag&.cF 2NgcWN&dxq1g3՝NY"AIdMO.5 A6gDjlj֌BP3f+`'Ww[o7[7-*O@q;=kbxd&]q^8d)&P:2`- a* r/Ѝd"6I4@8 Q#wi@U~N©3 l Ü+)<6o_C+P`Kx`0Z%l3" "`@JLȠC.zs֊*UlH'{;7M8odI^&MțfW ?l?!1R*I*ڈ #CsS䄙9P *HnD*0fgÌ $qS_#y(U ™f 6@::ѻa`IQ"a"'ThgajR9q4!_WRD! rCw6'&rOM(i0e]S%PʪAGdZ&gTcTf~4%atdу8fgDOHQLMW AvCW''&N$ 7,ɐ'ȯ84T?iP4Dbvas dXu  YԀ f+e}@ sKghy5֘s3,$D6h]5@옚5 ~Ϻo&RH^ !B\O1 Yɮ'.D*Zik[ϘH49Pa8P5Y20+r1zxEW#><7ID 9Z-$OhǪaʕW$|H5mSh]F;-8EH*U)*9q7m!CU == TS_O!&Y8T>Wub{9?=A{) a~)͜p7#kwtɣ\ VNw"w)]QYX)w8bp)jȯMQ&Mqd6fANs>}&ly:9rc!k?w ߘ]ѫű uisℏ"hS#j gʏpCG3#4-4rmDg6 (g caHaRY]ɫK6_ {t @_PYe:IkvWNU> -%k,ઞQy}]z4V3rƘĪ'oTkTm4sHf$,iKUC?35T.rM,Hw<Qz1} !*,Q> o M_7<U,&P;ׂ. NAekN+jB |?pET 7Q* QD@KaԂ 2<>᫯wj{|Otjݣ4ZvUoN'𪙂> ݆t*e k?<+{9u*\uΠ0zcgW?з^ֵč9U$N*&'^lgL)~!MhR1i :*;(2Xf >e^I1MDf&,' 4 }*^]9>J ؕC>@Tl][2wrzjCR4K&vx$8rmgжJDN~R9M@ASҲI&E*]DQ=m`wdѥ ~&PϥǓ\!蛗Y~D.H=&)Г\.-;"pU/M pzd*"s0UN?0J*鎙t23ʁT6G(}4]Tn7mP`ªTnT"se&fPCéT"k7+]c#p=$æng\+qtKʗ=Ӱ%:SwQ0J9璿[/ot kYb3 *9.`Jzi'=)#7)BB(֙xQ[f<0br93(ߐ,1!%Ž#aSbгe8gf!NHisyrR `SD+3RZ'Y&WWܞ2m`oп7͂9B??? r04o!4Ei`:B䜚K OQgԅZxYf d=/D|TdHT/^ LqL6Ǝjs6+F|ܒIwͦJFM2 h"bjTZ-AIMD@3,wxS(L6$F.Zѹq=QU0rEO[o,$`<F5G|p. %0v[h=0 S{UiS\i4NھI;gB\u*|`>|!|q¿9:t+'5"}@w;8;YC(("0: pCո01koq4gTz~auUi7_ް%E &hnGaHՋ`1 ͚4`dÌ؅1b4,ciL9$hT`A&ǪwCu艠gd1/hW$#;vW#Z~o7exO5 ؇e+VC14BCdD51HDP/n_7FHt0ʊ{ mXjS wq\L=(^%cό$rRԿ+s_6B %fLЄv' -&:kW7|VtKҲٷs05 7Yku@qh8l4fՊbJ0ZG*|&uBb XM_Z6},h z3&Ln7bzkkόT~FJaOwNa_wo $ӗM:)eKRsՔϐEE(|?}{9m[ȷSxzjZg$PR~nβS ]rx6Dsleܒ/==z;Ik  @Iq.ASٵJJN9x&Cz"b2r"4DdKn.;iE(%R{~ ٩=naDGH:A-և?^y[ӋZEEfjAl~A.Ŵ̟T8yT{LܲKH x=ipp\JԼH=@yAL {%37$<Dz#ys3i*F' I{f`yФ字X0]k::mm~$JjWs9߄o^VAL}_/[1sEųyAtf麰0x^d= :ݞG:\F۱)_h得mXur T6Jb-SRH#>\fb}m$Ljlj_2:pHjWs|N‹8m#HX(7Eρ+P|a98;r9mϺVټjYkۓF>*1vk!e~{p7`ԧr-Ygnק\ooO:?m=Ju:l}gr$Z 44KZNU`U4p iLf2˪ @Zanʫz٣6c3#)lI7 6CKdG+ NQ## vQsLF[{+=NO׵SSkҏ$NB(2I5X2Xdo6u> sYQ!xci_Vc;1^nagДmh@IHe4q>n[rqՠ^A#b@d;p4r)=k'ꜛ;Y 0څK U[ otX}YX=Gw}^+fmy {m6X @I/B`l8H|\?H?:hgpg8TR "+,|VZ n`\mٜaChwZ +wG*yj -;|[JPǸsr_r%aLaM `U[ᚘ:.Þ߯/N94xTo!FiV(QJt5]NεSvD.KG֫m-ˇ/ㆤs0"ut7(KFx+o O+W]=_ݍwGjT5 =$v&pe-h mF$Jv^ a$Ԛ]OrYsRܼM ?eL28G/;o] xkwgbn Lfi^bдwfٺ9V 0j/xGxS< }Ahjw i;˃wH_b̡; gJ}HwSuȦSmhUT.:iR_iTYKkY-IQB+Gjֳ9jSdȁXsbA]a+ ߏ_Y݆~!F*vC@nQJnyK;\i 0R^"ط< g W ) g n ,^; f|ow'@Snլ>B \n]aq=-kpb:,fQH~%<[_EEKFv"qB SŘoIqDkf;?R2 Tj£MN26R!D$al$2Nqhݱr$!M 7RC9IT~j'b]v8w* wsp{϶Sp7x3yvsG] б+[-a}WaVZ=}w~S|di~nF' چ#q}I1ܰhEũS;A<FT YH30G^' *j*@O#w+#Bpc=qDX pWRRU /(,Tp$)(x8X^# 6<8%`Yd /`(LSl-0ۤR+L!Nd&L/r{VـJS2ݧ@ҡ)*W S@M c|@W3H~PY6`CMPjH uPs j%"0Ȁws1=jbw0!t\e gu"M#M iz*'WMY<,M;$%L+L:oUp=x;p6`c;v'u+bo afu1,`dqL!]*T6M D3^T Ct0iHh/Z 6b?LK1;6i.4^0,daV~M| &B 3LڧrkݢMVg␇w‚!?EƧcƒvħhP8M;\fr̤ao-Ϧ2=N1Vt.{YgDͿg@p@9Q4d `;O<1 ?;r3c`R35@T)0$bSfD` MKYC1A٪ q鲙} S|u[uGwvR 5 ZQcƃ&&~7-uI4 ңHG"Ú_CHh|H0'Jfh} D<*?TK0j9V@a>x'_3v A$p^vJ3ƚIb4,3z ϘQ:j$зIcsG|cQ_v {!e90{w 'hjn?_OD'X?GԸeFzoS8MY5*0WJoGjVn_Ampm;P&ݼ?dq$ \ yS#7K .5ZР!8&r4 [7z2Fl.WktzWwmUo!]\bD09LXau;NWM +_?։L?s6h[I]44b̂ w :^zp\-w׮i_H\X]` Oޓ,/ Ɯ d(bo 0f ‹NX'F IQ  [gtB0OGB0Zc :rw_ַ(]c{#H,l.,*[/ ܠQwo ].*y3P!wOQ3x~^$;ǘ)&,t[);\!F/ҿOX'i yo4_拺ȹO/sҒJO広,uL1&*@f}P Hu7Y4fjj wM3tؿJS.0gR UǾ!U1"u!&nBLy _rC SgA$1҂CE<.?CBymOM ݽOu $d@{= NƒF6vs !YnSt8]`lU?{7Y[z6N6BIc>t H0?"LzH`]3= n2?wSPH2Y[P(.I|ab "e6Kh`~-[ 0R &L,e17T ka5e$_W%~Ŋ"ɑ (|0H᎚ DhRzLV"$*\rZ=2l9@! HYi4WN֖@Xhwgw6OMC- cj5 / !5FT&ݪퟺw'A$)__jrA\hpAPP;'hDL:V?%-\ 4#g4*ܬQO$/(}ҟ_ 37TI"A޹poBAV`rB{$$ppTl KnE;088;@Wc&`ZdSnaa'ƕ0[ f4Jy7fBo7>'d$ P-10 <*XJ9[9ȓB!ƒ#=T rXUv- bC;uO%qiZ+>$@ &Mq_yj@oS AP- +ͿwM@&l'ROr8^`HZY#'v%;R@MLLfaRٚ1I!!NV91 *rR H~p븹!o|E+ݰ@̄-iY"¸$ ptZUۥwpSp*Ԉ]R 0ruA@^!p)uaF pM)A-35/oK0<~^=5I@X=v>}-0.c… 6@pqK-Syw􃑅h%~g=SA %¦Ǡwq/@~0F>c~0gvڗuʩl}ĩӟNKkFv]XY#迕t=Y]#K/aRRv;>f#4_E3ɰByeanf r󅁤'cebQ}!g@5lVű!Oi+u/4r0Ǯ}'EVHo]B֧bd_ k4/.?loٵ~yP'Dc?J)QڴċxqBG֢tC%S};oj$_ _HS, lce{!7i>Y[ Qal/&L8WF!('@\JUOpVTf|krn 0ſx5:w-m,̯a{vu;%_#ɍHqGm9r1#,.}/V\swcް@n8eVӹ~Rg2͂^&% *ȸ{/ϑ`i#& ;N=h֗D dOl;e0*TƘxBK3ޱtdX+P6͏fCɬ?WjtH?[%əjif5O2gE T—Z\YB Y-X1&p۵uz;63w62iJhJ'52}̈ 7A4TqqX|RLHjR?m?*8yTɈ\[YobQ rg=$8"\rꅘ{~ IJnC6oSe plK:"@84MtދGo8w^'Ge!lѤ$1?;26?u .[|R]z|ŹJ>\&NOθӆUOs˚kRw[7mR 'aųGlrspTFvq^HYx;TjY0c ]x. Q}RLHKPu'@za:r}`[;2vQ/wHF%Ϩ!" s^w%P/r9^*õp" QY}2ѿ>O6"+*nsS%j=.@17<y=#+wl_nBf2)Zk}Z%3֮{Θ6I$.6Kk.Aѥn,ܵqqM~}Ww)~TnΔI08=2@ӽC:GJ$׈5?7/ΰP8mĿ 0e*lX:.*Ng9vrbd凉 '+`6`7I֚B9*8WΌdV.2$Ftc6׏&;:6h\Ė ׵.1S{(Nl4H{IP %Bkkv80>:c@pw5 B|ș )J@޵8+YH&K=aNiH~ L\޵2Rv"x,!P+kV_7Z\6Nee7Ŷ]_tn)ym*-Zvw6D[>3:ճ+<#t\S,ͩ׆z1>ijׅ43UWM XD*Y-&,pO= C #<lsO2A r@s:ٓğKDR1;y jEh-j@`S-"%$C 8Trϼ<_~In}I)+ ۋlLWo9eS=~7oJrhAG/K@u>ho9070=P #svl6\e,p60#g6%Hi ,O~ ?k{DK4=YqyTD~#! m_>wjzn9'q4&0 Á"~PA9V_i^GǢL3Uq2=/GTa9- hgQ찶V&%7,1'؇*Ά& q ve dʎh6V0a["<[_?q.Ȱ{{&|=og ? eb/i}ThHh]X{~Do[?RNsAŲL/(:5骽-m065Jh(E=Rq̠8+:Ȁh-aBe츊[Dq0Z:}=pyA%cS`N6l PuP0|DgqVNtO&_#wz^) I.3d^Pԝ~d(@ Q^jQß +}\7Mȉ{yY?Eq[[D_UH1yEꅫaM{5ZRH^BU'\駍7 L3ʛ/݊u8_jǭqGa\z ɞBO#T{ƬLX63e=#L׌1.p #ؗD/3}|r$8A @ؘ !}N%QCxtI?ȫ 6)i 7l*0wgHZն<吖N(!Z3V3Ml=@^ex 055FSibN9m? ,JnU=uC]"6Mtwnnhiy9ɛ|ru/#tJ'"Pvv?~LӝD^W(s^T [M%v{b@pdY}]#Va>"9?Ĭo.VPσڻ\knmH|% zg¢0 P~>-&>G*?Z7 |8w k< OD%ғF;曎߫˧kn٢+qk|kP=s@܂j6np,)3oWi% ooxמ&ؙJP}.DƑU,1yMw4rYsA`"kORK.6B<{4Ew-{xݶ~׸y)s5i{/ZLëMqr>@tG?.r VQNcڸPhKgt>`zXVש|҆T#?7 gzZ<@Hsj8nѷ,ttKQOehkvםϾq7:2ƾizg=^]EP#'cjpR-D>UǟRޒŐ&rx^>/?Q"V`2kXE>%>2wc Tpٸ|wPK`9d~חg ւ󸀓6 "~!DbD ǝ& n} /7鵔,]Ks ~ %\\XYv}ůTxm>M8TOz?U:M;g+ 2Re(b}2P~ z, ˫MoΎy˄o?C?bQ>023'Dlhjq1+*+0ov ed+fTh}VԶrV0{Go0)- ގQ8E~.Fpt-y  Z õ}v^~^h cc 6$ e RV]_}0 zum]gzjv00e>=Ƞr:nG89qubc=;ك} (e< k_%#l2G9}+m7P]hAy/V3;ZEs=*O6_;gHH 8^x81oZ)󱅦 zG*CgAGTn'̘0`*`!ץpYӞS۸aEZ I ~qHoL1{>QbORy-?vr1TY8У_*4p x;H( aWu7/^.cӜ4D>h%;mS)=DƮ5/\[\t/ #&lPr ivR96~)-`)I۷jT$^~.j~eh%aHm- !do¡I܅5v 42&Jw#*WX2ٖm;]_!%>J9;|E"hIu EhdH!0pdО`ȧ#^r|z;y*I~zyP!cVPaPv{uBTCzhj0;&72t5Bz QfRqvc>XSsyl|r %.j+?O]8.N#Y*zJ ~nkljV}\rj<n  ᭶k7D>Io{ki%ŧ^u`vث}Q>)gbpXz JPi3@((Ll'ќaLP фqz#o;N XO;xۙ-? B8\ C=)_-Wr ib)(rdp&ovG btqS͢LbzAmzܨ7GƬs;[/?ѐ&o<-m 4Yq9ofSm;#7' lmAV,}[_3LRYFhvȩiP2OcjmYLN@[on`XM1 ?:UD3ki) 8a$I.Bߓhtu7}I^U)¾t-ɮvk9tHv@93*GH8f&/יlp:66ʎ~~}4v<\=hhtۜ2Y[;܎.5QCC J 8%!>!T%g6**}ҦӁ5_4ƚXE˷a{!"$O?3Pҳ=4oMMb0Ե;}@@ojmj !/ѰwǬۍYqrK K 5 8B5VMf4KK! -;(zK&$YN9SmSFE3`ڱ׌j.nY - o>;Z[Z/z. c6߅g6{T86 obiyq=[y'v*AjS1ÑGtƴB |N R;J.9;̇ǜTaY;:{qBNjxRKgY6[Q:&S7H=wglN__W他_6'ўY^ +6P짚SÑysQK:vĿX5b_M]< ^CR9\"/]gbs}YJhj\]3Va~} v6μ81d )$t~kɝq/4:q;WA-@6eм9r]mm<VYtAķHl-3Н\щX;(]l9 {.Tc=: W76#G  ]ORxߓ#x#Lyr#hCrlw{6iZ(~m'8C A^wo`0ED޷zm/:^V!h@JUҟ\'{܌Rnv%Iɀnf'gH5r_;?޷e/ _ه ;J)Zүl)y~E6K53H@"A\r~ĮB<4=/k /%r#ؤtx `袛D}m9E{ N Ǖf H%݇–=*9z9|/e`3gum oZ d}Ā"[һPw $Y5Ha%Y{Y@?N^Y¸aD)^ߘrՠ0N p~@/9kN v|@}:#_:ω< mpc(`qk62#~f9srz{nv[J[! )C5sQn_Piv|8(Ɓ3M镦)Ia;l}y6@)ėh~2^\Y01|o'#!V8Z; \_pF:dKpvA??oSBYΑ4!(M@-4֩6ZG/KȻ~OƼ~jպ+yp+kXg=2 .UH:T _.H?E^ ؏om8sϒL}[- 2Kn-_Ƹ˔.׵Aj`Z>L{o\Qs/u?պ{qjX&/y|Tn<=ڳH/>F%)Ʃ}"׃NPn͎ &deBQmͷ5B ޤ08cjwq"Jӹ[ T^"+-u|n-"d9Ţ&kX`g/vGb|tnu`׏vY;(jdCtCIMix 2ua5CÚb.ڗCZժ̈́bZByc>wZ>3C槄>0u<$ב~YDE,e*ޫ鋩[^$d|%gLzY8Ɓ|n9p^SS% Vbi5h0C&0WmBSKBLYFaqŠڝFĭ)߲1JL>|mO͑Հ3%W$fB@ T fgVkJ! g*m,h}~S5\| ~nkTCݴJFz:e.x{{c&+;z?bV[/ m+JRVCߒ`gedr t*Jta+5牿\p瑏pI1gâ(qX-Yu6W_K ̧~-pihʲLآ3+k۪HQ YʸYy_+vH % Jx;~F;}BاЬ "9Y,2԰O@rOߦ1+IquCM" pk;v3s%n^C:3s<гJ6 ؒ!'P_hp|h?0z@F|{b79<<$nHh~ 7OOmŮJ6ϲ s1[](WŐtd{o%~XFO$mx*I; R9%e_9NBM}8#L{$5A 8`xs͘p%0?^߮mF?ֹq ų%1$]ɑ6BR1ؗi6E/>:Z?H5->qlkSξ/0¥6az=Z͟1>BM&¾B?9WYq`e>"X>뭲Fܙrh[-75DL!:]Ofm˿l/a{F V: Fy\B1 eC&u&qrĎ0]C/+}!M"Y7=w39^z/L5ĸ/#K;jV'('犫5R>j%I9tX??q3JP2yݑ ~j?qb;ϩ >uXSp>EOSi9)w{H.u}3&B6:ʔ5d>\#7ׯ]p>niߡ6Ӟq q8%cPu CVAO؞x, uizߥOI/ħo6^"_OXI~}4%k}"1!tSa C.|fj;xf?N%=V ǒ@$'nJ򅗂Z%eNrޟևT{ wHu A1b}7Oxs-Ll(ـƪz۔գ^6G!#T^H>2JlV {$}ʆM/g|oSC=P!kgҭ< L|q%tJ_6ҫޏש3i0XG;%m. H إ2<;y\?D֕zMrG{:;L$}`D.) ña,|@&{_u%nI!Ez|qhv Mja9l%PHy/k{6ղ#{T^ԬjOi7ӈDS܄6H&j6\VdTGpi•+ʬ;V;͛A6 {ОoM>Ny[ZP҆5J'o\]]g- C;ZY˷|~amj })S. }pFuNG _zn y){U uߙܬ)"tנD?NFi]pf닞i'8Lt ޒD4ywMwf5Yړ lv$[|!8Ys.^5^ ]o{,Kw U^xEtB9Nw;?NWO,,/={roCEUt@EVn0w)?Ӄ(ZkM薄ugivYN:Js{08$@vbbOI8@My~;w*{S SVƷºf55ڒ! gnz'Y?u8dPcm4t:"FU#|dC`ms@gTHZloCBygCϒ]g& *ȄHVc#k_un+rZxTB@α?{Xl=@Jg~~A{%zm5=k|>>ij\l7ru|#^#ѦvhlIPg' wpl D9dC/&Kw/^M9o#>Iz GY'MV0.m~+r,)1 1sO q8W2dd8L;]N p+_Ρ`咆ލG@ }9o7gc$rgܙqu~13;JazjKdX6[M ;eg. /; (V9.4wxӏ(]~=R6 P%6]Cme?&Gl\raAe\g1A-) j7Zs70nsb?9ee&yC=}#tgޡ;pO9m{t8HkrDc_/{fm8hr'lCf٘ E@l/4j =6Sv]ZȵG~}HSӜ,z}`/E Aqc>5R-}r!CRoΘQLoa+fP㏇]ƋZCn2+]][xw4R!k^Ooj&B@.eacf$v-;h|-a:sdXtuov}\.۵"#D6 TR*+,\;9΄BB!BB!B!B(BB!B!BB! B(J!)J! BB!B!J! JRBJP!)BP!)JB! J!)JP! BB!(B!B!As!oz@)gev#T2 ,j!Uc5FwT͇)K_@ k~/_qo20bi H@ZCo5 v +:GB(0~qzjް-P삍+!]8(P@m lh?_sYX, ^ΉuuWR^hh_T93(s3z x|s:~u~.}ۛa1(MLd\:m Fp[q2Ԍr %ijm%8;\h݉-7d_ y!jsQb̆pql1 '؈U|ԭϿ88 _>9 1"Wߑ2Qx_#̀պ#{֐yO^/J1ןd&?nj9Zg%K)CD)>.tPQ2%X`VaLP|ZW7Lw>ɻL^}ozD#sV4Ķ;wyͅqg '/f_V ѿi)J-< BG6k,?'9q"VvƘ m8#w#XUW0&֛c쌓t _9W;$*t#.I*:8{Ш4bVm?IH3g;86S0ZXF nDu2۠fN#A0A>Xm&ztThh'/K:п!Y̨[ ,hSHb}Qw"Dx(G诙 5*9:SLLp$`iTZ"]fJeFͧqH~G>FM0`sv?2IU1nKEc<3^k`35Q~t B'u݉ !z H'3$h@}H$%v6K0!Łp(Zé9捔|wXn_bܣc}pԘƢX %v[Y@ [!`n7}KĂZ%-4cwh l ;{TVAI^SijhzSǛOEMLVUV fC%9 S4#tbXޒ>Knr9ŗ/A{\nA$!d'+-0?D`>Jp?&,'Uge<벾2-u:EȿdSdхc{eUNWLsy$*JH`'HBs\<!o\R _hJ0@sE& XT d8;;qQix@]1& ;?Y,װrh53^X1TZ̰8_( (lUL'/,ʴ h>Тdl@JT ДG$¾g#Չ1F;7 HMm1jEh@>8b ~=h/v^l`xs\q=?0&9[>XDXN9QɉgG Z*+.Ëbnۮw7PRQ0F ѭR82Mm6m,O$o&Ng8!J.)2MVU <ʈِ7}'vU;~x.AL&2 ̹;Yu8q L>9hc,@9 Z#.emKii >^ii:1q~.@fثh>vf1ǩ︨+2C~/[>~)d/~>65ȩ;)4$xw%${/ռ"ddpUg\<}$O<1*oV#|O5M}g;AЅ,䫰H>u^~zj0#&=-d\1ߣ--kRpMkV~-Y;PHm!mmybcṂ\=u5cS;&5OORkQ#'lk.NԔ?㴍S‹P& OR4N yQU7f m2 ' CB!_&oaħ+: Gy:5a~{da| pm<4zߤ{'RǨSgʰY /DEa?DhN\׽ιUEa4z8S HQxDRʽ91<5!]n4@^'o3溑f]h팗23< [u+n!`; 3vԐ7';pdfZ=z:SvoO@ Oo5`g0fϧ@g~rUxOV!b65!wMFGǚ%iĉr] + 4T ##6,$n&7tBGlN{PԓUbOVSJAy@{[oτIfzz4FOT%qDt.Kdy[96>hk ڶy AT ]w7 +1 TlO>G#*֞`nKUP}#9KhvjFHxw(CtpOF04Y8KG?5F Oj%~g5xeLd;yCLaD?d:IN;m9D.?i;%v$&ʶ Zh'ݭ`d+HكU92=*M1h9gix $h x>yZ3\[Cvʍ+w;4'' kp89*ekщ֯$Zno@.7y*t@e f%95 eTLPЎM_NBS!`I'Md*=UD1^2hvU*-IFIt^#'jj|74 ??'yY}F'(]$fwǭ^bSo Lo`uV4qhxkpn,ec@7'Ơ';}L/v9Uͻ Ņh4ʷٶ p_ O+XVmj`U[ Q@8n-S!#!TdE^-& a]¦6YR= (VcXWԷ^D{ڮzM0=L]TuPi>w7kKDYL/@oR{:dP%p +XWpG@㈝U<;Z?VfqH#%ثx{BStS(Ly y2..QȐEp:,lCBgcc[oS$dem=K6Л{:fD_S<ʶϫ .h}T r]y54̺|Lj02p]܆Μ T?&-N2춏DKk \̻@N|rPULހՖXL &=\>u?PK-l/j,WL/_ld8̢S)1䒌SBJ5sVD߯̀%"9>d_{>D X"A-9XƯ"CEon#Ʈ 5if ǥj0YY//ͭ0g9e '"[x1GehahWF>ʕ.|%C?"\͋,^h?b\  p@{˂#l1Yƞ߬_%!f2)jNb|ёxw;& V% -q- 9'Z&d3ӹ: \dI0evCԒ'GNg`pw"v npGtGG0mkBz=8et/3F:E|x7kE\nH GzH6FtmcBDyh`8 h P!wLWs g1QRaI,éoM Mz# ^.E E A5OA5@A5ZD,yՖA5Sz >&vP3G/h}wPN"hAGp3x|NbHq<-HwƶbԪmnhQ&v<ؘ9f:EѷYzxw  @Rחìn-<4 y 57hNIMm \Ym{sgT~N9ӿ:餱XV\\0[WgN| Ჸb`) -Zu9rE iC{olms5%I`n5Fa`bmjPtd^޲uK@{[܍m$[z[`_tz;b~yBTBF3EMзSzRA& Ni0a8S&ݦD qЌ2GjrHQ8 O^O|N^Ś&a@3<hkB}(?~Ȏ4\6);01QWt*0к {BdYJzGVtJz!s $N4D{34&} Es`(GOJId &"_?*%DVb!r5egD(C XhP5{d0E=eUF Ѩ[{+s-vfi'@ t]gO4~;33>+9~ &3&zj N:<Pf,wkЏ |`]!:3(fV9c-RRuc @^ȪNWkZmZyl+]&BE@"uKvTWt4ho#p:EԄ-~B{s8RIqh]̭S&lc]Lk6!6z!cФL"8>(aI|EF&$f&p) G=oaH̼"Z*YO䬄`|&ێaUfL{)wh`>$)؍ioj%~A,hM(sfoOX [ﱁ"32aŲinjt؟ C\ ~-SZYL7kZoxr׿c~Xk"_@-G_>H욠M71'.~c&枿 B/ P||`tKhˠ & pD>H|KQQ:!A'K l`1[r+w v{bc˵{ֱL7 wJ "2飠^ @ ,spplS`Uh7@ Ag?Q4ֱK)<#o?ű&j^.GDg87N{oI?? ڃ[(YH?h!N&tG B"ũY籛v;y'h<ϋ[QekF%VGf{ @x$,#5'*؇U2Zz9O&~0Hi` PgP%8(V̌r B*Gqj&*I|O8-{m[!:Gc?~2[qT@a%Bp# a\ 0TΊ\ʠܝ"''n7vXxl]<z[k Wt=MF9 -لdgyM` h7_ފ393}|$v6]4XHc M*R#tW>s*cŌ*F!wɐ=pΆ9-J芒Vx{/P"6+Ewr++8ܳ & ;pWŃCu1?{.wL_e4oѸ!@Ly?o~7H> ^cLtqIC/Q4(yl vxU/}m佂: UX[Xss炙2C4t^?2MBmsLȗ!.6>g"Vh|q|ª> }* JLCbtL_t#~F t;=V r6$Oμ_v(> p,GWCjxo^p.CN9sK@rfDG(vR[n 5lq|1Dhw&@b =_oN/F*I"'#+s ?֓д2?nF#D:.ǂOjc9 9.x=W2X5 ~1Wv.(J椝7ҟ;%%WD/ݩ0t{.3|,J8Z?n4h1$.WK9B.6̇p>PGӅQ@-P xpx6Pwy4 5pzrBTm*YTzf\6s-g`3bO=Lcaު0uM=xtUY#$JV -U6ła zn,( .p?m<_/TKwXߜDS{}uQY6_CiCBNEbqЪk /^4vQS~ɻ#/}2c:3Y xͰ6-EO3@Z˃o Ev hg/N,S]؀r˜o$B{yO&j+ 2КzT}yV̸Θ:c\p0|V=¿ouOg 7Ӱ[3n 9mB q|);y ŹM!)cF;sծy1!CDwFОeIrq0dS~бICRwx=ɟ'}1pÔ_/D^״Ӱ +F^τw Sn$w]'` l5/ :1dnd+S-s8$fx;gf˶`0h=T>COjKmTg#mFj}68+Fw=u}5=w&%YSxp7<E@l^N{FڸK2Bq=w"וJҩ q| Ù/?t1D=Coc=2Gߗ\ 6 (oVyX\?m?ɁPUB#m(ԋs[,oaTj,k 0}r:)fѱݑ~6𹨕onl/uvx1i2/ L#!VJ5i8@Wm4 ]Yу Gjp9m̉{t)DͭD'~J=% 4 'B<$z%t)I8fq{&*߶#/d9E9 (}#B:+2z& 2$1cS$/ּe!v{,MOvHEDMx.^/~\0TR(@+,6Ñř/tUDNU8-,Kӗϔ4<d&7c2#kEi;^:;,A>y>"&A`*Џ=wpQ3NB oSs(y LrF1t| c尮)vJxsxmJ u3ox}UjGh3w"xǀL08H@} XfqB w(bEWIG+5 ʮz ?gvt&}<\ROhzZ{ C6$t+]dMuEt$_P8^٢?-gєl3x ЂG48%%nFAdIE9p%{yd͠cVGw)7s{[nZލ[kv`V|1ܟ tFj!{n,fƓAG8/u@Y^/*my sD(_FFy+PLD};PWLvm!/ٴNЦUUo?]%a+9/]}Z rXZg!H~qVC@#uen~{?MPw5;^1 KAAG+ NJZrhyP/Tmtu5S)_S'Հ@u/,ߡXR^# ,Zk\ /-l]HZW=i͠eҋYBi_vTtk W52~?ݯX"x] g8'젻RMxRSgZ<D莔?.8ufK5AXK$sqʆ TNH #ugX5#c9w2Ax}Z% E>gk'{w\ -]UÎ3?[l><@@S1`QAO}6Ρ0_lol;AYtm狒ռT!+H%Z}ok^]2^`&d7uz Oe>#ti㿣W5eTfŠhͯ%Y6%$CRz,e(1p. ϹpTP}+i3\:E!5[G HDO+}5s~]@J38_PeL("DwץݝR/P77[{08l^ QJ8ڧjN؞=zUitub]AzywpmQ+)];:o%:9O$o9y<= IQ9ruGf9uQƾmiE# `=E^W^6]AQ}bw Ƙ_*Gsp*5[`8.1;JDP@:3_]b1=8V8@1ZA$|!;{f9J8!^>FA!dwX٭=4Tq@Rrw3f;j̅`Oo ;t$kFmd~l1Z_G8R9s[^K޻rm g,Z%1A؇K%HWq  ly6(ǜL47Ŗ|+ܖ!o9PXhooy}]_s)C“u0[$Oxju"œ.=of %_Rhy%چ-dpYoz6fMM˩gz9svޗHTJ囹bEM0qW<=#P%;BLƒ Onm_]ӅH@y;3fXfX2AOy.x\ggy?G,Jql[AJyػ{^| j1`qP1}mW٭UCW1췍fo7Ub×B2)qP`h+UB8aPcuAP zvG[zWەȺ k.À$qȲ8@ ,<֣bE?#l?ǜ~Os$GY؁m[Nf,bLf…V|f@j@Lj# s8ϤsY12wkN9!v奘'g5L iO8ʹLB7|i1UKm>&t1Ow#nyƭǬ~'52+}iEr}u! ّ>x1X",VN^&?+v6fRx/FR GR ~H-:|ݸ?7W7(q-\-քBC*k*7;ݏwQ 䴿U Gk[(GT9OjeMx\OnA 7w7q]*lzqDHC5 WfLHc3h!ϫb:]^*"2 2=E }!\TfNRV"g?י/}ױl^ol6 @v@)1[ \ڰ{AwCe$B ^KLX q`lioA<;WVלQ%܏myP\uℭyBkW|x{* 5[+۰Qb{l/{/ر}b|}d0A%aq8;2 q6@GƹN!oy \mOA>ɗ gUV#tvkgɑiWSړ =wF$>OMnSykNJnȟ-sP". TO=X.kEzw,H6~/bh6 *̚.UD{BP~OCh 4_!\vK>I]K)ԓ巰˝Ӱty9CAJY Uw9V=|U0wl-k$/ +?~5P^1jY>ˀDZ]H[1 6Bo͗{Owj*@=yrJ-y;! ~hjŅAgW%}(]-PFp8dE['.xn8tPL̻ ¸C{½ڧo6f1ho?ck+YN%Z$#1'$ ^UW@kCz:uey+[pDVʇ#ghx]ۘfJ;+}f$&O)̨)oޝ<9kq R@69e~?EjW9d"߾0KIs2 P (2ϟS!wz&>D2r1( ՚KMGӧϋ-Eà,:9EJi 1AV4A4v*#Gi?5x^-BycKR:~7eBvS!2~;M`[{ZV/WçWʁC4i>GU, vy" A%a$_eK~D́FUB Kkv>\or~,f\\'#=o_(/U` Oyu#`x4t\hcZ0g/MKVS{T&ڷ~ Ņ;ި4W*?xglB2Nyu="Di&arT.70-SԦ! k`ot?9~gl.gs\e^ :Cx"p?(}"&|+}lܠփ?愃 G[?=K8Oz=aS~vO%;x?SR+e^O[j\D:YԦEz~~1.<+t #R c]ilh/fI 5t)iz܁ܢ=d_~9ކ\\My{ߣϋX2 w+Sǣ~%=g"V0;p}gam%Xf׮ ٌ0TDw17.Ϣt)CμAt}w#?YAw*V(=Z.qvnBv%1zJ2_$sx|>t{ܴ4-<+˟$7h)'dQ~BXc ,%ZٟTC~DHÎLL'oa/Iyc⫫G9N_I>gCj0 ) pὺggZ1M9WGԗ7Dծdtҋ"%{@X:t\&pr Pn{h Aˋ#1-D8+&:V5IՀ KJ|Edq_]=֌w;w}?jH;audTw;3.)$:8*3g0+Yc*'x#j9SF,d3Y gs0Cˍc>8P$= RG7xl67{/8mSP!u80o wnsr]at|@<1Iv1&CEYKfl6 ,s f#U܆%k%ˇiRJіa1aF4~>=D ݯo a}gpux^.Ô_a%W@x]uU&2+T.J}0>Y Cўc{?C,um0 &dRlM߭V/ʊPZhzhq}R49z`JEhm`J@KQ~2ҹI>lrfme;Xfhu~'D{`=7cm_A/H@--u[ͮI\B ?;vD #VQ2uMB@&bV67Մ[YVd @ ,nX0%۹pDɗ<9D4U/v|p}U~`"=Uq\UB|<7/ͅ Ipl]*v Sb3 C>S7f(('7y+#;sVø&,k~y]}@\o9׼_C6<z3*_,B}QӑEbu}Wcհ-Y7mα3K< FmQ(_t:Mz!_ڢYXcSOEOh/Obylnv'lXgj@J.5QzDtlYo=<&}TKZTZ%n3S&Llt$̲3an-z@?LOڬ$T[QR/p~t-ozRJ?&ʍT`OBd j%|W s}6HȣB4vTBj] "r-\a %P >sp-+!qc~zWLN+k̘{&rCHzih /^?,"ZR &NZ` al>Wxx2$N"f[*;1ta`ńB55vuq)ẅ́0 ~haDld0_~2wcX<>?\COooNWұ Ta ]Xm$õ^ ]76O1ff8m-֝7a_:ӍyV   ܋6!qh!QWeKYxK=: d҈)8v_@5J*aqc[-HУe'WEΩEcnG M˅ ϪwDO#vIF~loُPbzz8{rZitXK%k1̌>?\OT_7ŭG@K2 {6^ yO@Xfe 9Z$O]\f>'tݳ{lۺ/KTlK]ǻYa^'I`,,;mנ~켷u_]e\|\}UHOU~f;kjGa֪Nm]dYJCÀj - 0#"Ơ=4TN\ X™VZB: -1*“ a'Ru>APCKKK@{r84V3s@LS5d+2Ky eV*=Rcv~C縌N܂ҩ[U*зa\pɫ!*OuvLJZ Z@D$Qrd Hb@W2s"X# L#D$qH]f|4ָ* YOTm t" 8~0T4vتs "4h^Wz75-qC'"(o(zՆQ/a!X.`(Fޑb{~9$'cZ c$uI\$Mdj9ʗ ~Kj78]v1gOdoJor ԛeIxyn%ΏxF-EX~ CLk8yOn{w +!#dC}Pn +?@ⴸ#hcfWt9q\Eg2.ൠn6$)9LTR*d,,~gJvp *zNr\8K>Of{i(Hn^O5=D/L6CՄ6;Xf0eijTo>x1Z \R Ta}Oy0  |E|]n)R>5gy|I-w2% MQ$WGUɉ"|k#Gjgz sDћZm"ױ 'H&C63ܥ\8M٭ t wfȱY2}YEfp\cp;DW ZpGE8'o(⿀gdLL@24%%_"8z䈄ÿ_▌FD!MuA al2^4+?}tm~J#>OEjm#VaUeMGb W0Q.1\<ĦuN"6"ZWmvɕ6nEj-+01ڕ6y<wr~s.Տ&$TExMc"PCH#t݅!ݎU\:-uMU`5q|&;{ ̢.*ٌNJi#z^L i9A[ O1] ~pl5,x6kXK&یlڛRV[Z+c| 8-KkuAzdg)5(|o׎Ɵwy 0} 8WyCG2O3q`fdKOiSW/m$L1fcDv ի\vZ//C xBKC%Kzx?Gacc+X_=q*R+HS>w_MMcZ2:Y)GU&rY&'TU!Kq)EI(MՐ6ؿ)k 8sQ Sԏ2g,m4 ?Fk3T`.tN{]= {$u hQ1=t|PaRuMWI0迖rcqtەn2loI/A kd8=!ka$X0U/۞DDR3Ǔsf}}Cuk̊ [- =竽ꤰ9KҀ,0Z,Op(ƝF͓܋CcO U_7bcF2"Y,2Z70C12?-i`P^6H*yAQy5?5%LC9`=VǸ2PH@-T ͞30=בȄ96nŽJ=󛘑LCwQG@]ƓZrrPl +.`~6ޭB=.wO- e#=r/Kn@_ie 'rۘM:^2'5C2CmsQ"1bUڽ++Iֿۍ5zviVe"qWA']׿>و@A{̺7ȟkT8K񹺦z [0)X>/7nu_X@SGʆ_=I܊KRfM P&B_r쭏>wxhj,ΫKAxJralK6}UQG8zNl[}bdV|cq13%'Gɵ EXgѬ (%V?}X_v(|grZ17 Wue2&.b#BɂpKs n嚛>9̙\W,g:>"q􀳮īkNvm.5랚5`͍C.xK'\\OAJ!| .zzuC%CjAYЙ k}ej FH?¢=HJ=;fD IyKPw$ߧ"RZÚ4K&w2,2:lW7]dP f覾}$mQW[6lWW~a<$jgwOvLowɢxF 1Fs"xL'vѽٛ:Y u!#‰%F3Ɨk@>^u84P Ze~&8jUO.(q2Hʢ,$5bͣ0z.nuo? Pna͵޾`)BmC,|ܟdXjs0?]`Rav;!L-Fno7>k6 9YTkO1MyŤ`Jy"i^g+ |es%> fy;c2* plgp8ms*\ LE#* s~A_ClSr*;lj$dJ|mncgk-mhYU/, }d8 o,w"-6ޜ >[$qr7ap V ts.4  luԉrɗVOcw۫>leSΑ[+ML#^*1F(=>*F(}4\im@n<ם.>O061\՛ly_?75e=R}K0J9u34%=,ufGt}p>EOǎdo.hmiM7@ #|džnM"ٽ;;z sK3Cw MxWl V4tȜ>'ƚjfK\;OoAd@9蛲n#Mn8+\31JGhTc?ۋ 4k*ڲc9TVĝwӉղw8L.C7gNP%sx fVnC|r"4}7#3瑆\Go8z@y'xJfLo ^kRMvCs;J:]70^O{]oY!WwUX2tcrCu=+;twgZF;t1=Xpr=6h#KKa`uT/Rt | AO]r) S-EH[0H! Lu9`0\::HpAe|**{pRbʧr >1i2#?0pjQ`ݸUpV5 |Gc-5-VE9qT.,Hl5l8+A&6b1` `-$th#i 85#y4ۥ"_kO5iҩyGG ~R@mX~I]AY*~|zj4؝R&7/^+z]_.sIX׺USaJ`T\s+z,MFv'MDShΑr-y#" 2Zh5wwE>vyb$\aK lwy$`p0^S M}m᪭-&䄞xiAh&j4J֦BLwlzd3΅96-N8[WAa>ʸ&0㷒I ŝ檖k`?pn5zz|:ޏș'&OT˓eNQWG n7A>ՂKWjߜV0:#FҰϊ"_&:7qOyQҜF,ץ"<=3G`y/.JpCîӜߖeZ%1YePSᆿ 9wB   2_,Kٚv6RGET> )JOan)8_:D`0E> kFM>v-IRB{ 4(9`Ҁ>9hz _i%_D'jk}@-R\AV޶i`ޅk,^qcH}M6NZu@T'<($_nW\;+νxo3Ϯ9:#r*jFfB3^&9ڥV-$ l=SjXLI q!@y䋭J=%[qR'5UftB14~1V@χwTU B>]bXnpto8RxoUm2)D)"@6aVm}F)j1.:A.>ozA BJy:ng|BcQ Qtv-NWb QN+CSΣc#μ^8i;ݴ Bo[Fm[&}BݥT&/մ"a@VJ1Zʁ7N+?g˚tG{z'|h~2mh8-'&$HhR pg !SZ. cEVK2iw^RP5l&T_+eU̞V#;F'jocr]G"8?@ZG1?uocwoH~RTxNP@=:ӧa',<` @Km샡Z- /C\.0 MvíW_iQṼυSv{o!4HxQ_z9eZ.'ATALq?z2ppVKOFսHtd12k!͈5燈2~Ϻ7AԦ0O/"WuQv: x\u+m=eŵl">!4 cnII;eKV|%*k>}i3b+J>)siaөPR3qc;c):0[5BI]uoKsd"Q-dpǎ{vpƪ8)Թ O&~YގJȎW58ezCnZ(s+{68$Q}$tD b-/Xv}0Tq '9o5H^/RX7 ^{xtrH@҆)! 7U"gT.4'\򪠷KچZl tZ>-,jJHCY´=7j\LvnV5+&Zowu=% 5B8#?J~.ل!g!;n5,ӈ0&rz<(+'H b{夙#&V]yw$q?AnNQj!bK'JcaH84 T(i`UҦwԾB]op qfxXY3<ԟ:2 {ȓR#sr jŀ,)Ԁ3us  nZ1Ӡ8(l[HK9H .lQxzgWFt^}M{=8A՘[5uɨݏϖpMa\۫?\SHz?6GTI"_ 0_Y}pt7 ~Cw:! /yΑP{ e+Wp]Z=gj֦[1X#A:cT>O>Qr檏.Wo瞣 {L"K'x6H+w|B@*2k$gN`@]Bևp3y/@FM1rdC̐*5XMc08M/m^dF`GAKEo`\M86mXbIeENG)yԞA<lbh4)$jь@ձQQu_wdx(0cX qzF\s9M:-?E2ӒiS;(>rcc-2tD0kd 5'_JXW‹EF[-@йu.Fsf&#LIvp˄Zw:i+"NFH!3D||ӛ D$r=mи@qd 'ۉ cQ>DIy1S>koRſs@^yljC3P7G~zn.u,ҷ9y4Ξa:loCf%L"s:x}(2hcn4|fg0"~h  \|̍%VqU z|BEoL|s+rl'BgA0=-D@{z]Uy^ri>~ϳ[nםs.z9ҜΜD0$\uV6*+m<2F+Fw?}翕?l1* ըk+L&sÁ3b2ZT|U([cM_!+A㤅Ny|D07U9ݶN{8<  Jf.+p֗*rWԌBotPڈ\e6uwtp[hg$'HŅCB%c:#g ._ghPD=`qxWI {y>4E8U5J]Ej&jh> 4-K7omI{@%>oSןi~w-i#yvqθݷ&tEQȫ>DQ'ш?T{:η\Ca,.]Jb K/r3 XFNg^`gTpP.>Q|=6#9s1~BN#{Wl˷d<|Ht _=\ЍKw^r{Δ>c=Ȣ@}ιX/SP *Pr]рt 5)s#/M!ޥ{idL2y ʖ3u gQDQD9z U۪P~0Vx9ߑ9Q^γP6HSf̐ipI' )teR^/3}|8}еv?FD]7>pͽUS}w mWpA).0ZTPye8| : {BrΒ`wG"nFW{7^yTU7'֨UN`_lz@Ȋ VpTjA_7 g1~e (Sl%dGj}L kTC<.aЭgUyb0}coNr=WdTtvnN|umdgʐwne"ˎɴ-Aovw lN0j(foOn{7|pׅ{ ̙Mu=`ES0+*Mwoy ^/ E ׃`?}=v/&" w!>kZ}=B[ιHТP41~Y\lE/-OaðfJyIW{ 3ԷQ-+2ˇ,@rĦ@R EiV\/S&w9y"|<".^hf\CM(9X{wKH-cZvHFG:kbjǮT5<2FSCqsk)M!]nYKOA.x>vI^›ۙa&}t2?,n5` IjXWģV]nrF/$un~h(K|bũ=Cȴ7 G"vJox~W#/Kՠ>ZNjF N&kY`1V4Z.}JMO"IJ {F+r_!Fo&B:;N]]I@(x 1?2 G0j?ȆF k׭8}?Ҽɺ-CxSBVՏ&>RhVlS"z`bwiꏨ9Vat>R8>wKg> ӯXžHO֞J X 7X/s߾K;YtXv7tEbO0F$p4v54AWjm# cU86a@c{ HLTR*p,,]hOu׮8?vJuS;׿<~2d"C]??=/n=>0Wk6q3bod|gm|7mз^-4,A;OKx 4j0huTW/D8`OҦB>LXux+p'+[fj8#6'ݲkb/LgI(bNb|y%yxzU;#$':V61;ԥ8H/@ gY#B0ʔ&naWV7稜i P*rz (+GP`!B^Jw6[sgہP[ڎI[tXs0UNpL?`uqַӕ~?7o^rn`3&1ɵ#*c";VXtfF@;#`?_x0AymãP*̚ AxDf']crǍ郅xmfN@7PGgc* bt nutx3~;^UfFބtoi]Pvt3>_-ۋ$BL{Um?[8l]f~De3-Pupgw ?82lbRmԴ>e#07s,ز)?"B}"^zsB~3~kwV1pKwގ!zx(opI= T8AiE?YH$)w+68 ЬJ̡p"#$\(Mܱ͡W`5. /V=U{rVߊ{HRzLThy۬*S ]/qtWZ,t2d50-42@ W'-Ox;J$|گ0<.[LW4p}2~_^AI[6dP~zp:l>C¦Ƨt(j1გ ILcɵ )mO8 %iݎ\.G*GLĊ UYoUz aW?̠J|)*[{h]D_/{ܔ(ĀϠ 'z34Lr$ؙ$oNZ.f=W\LνF/?<6ݰT&6 Uޯ5KXv< х㫛ݜk 4:j(T4ak$* $ܰ81!f<]$͎HgD[baXZV8/Fc0: ~Mݟdq(i9|~q>Ga4uQlj~ŪҲ4v~;oz}{ ހvt@#l|ˊpk4dE}8Wd%,zaхk^sjդځ89hgr/6ca3>*ӢFLziskZm%!~H;֧{׿Z{>, %bB _l,f %4IRvET~լM .:7^ÂRt#)ܧvSPXÅ*g>*$艁P:b\b䈩:.zrebG 7=S#>d}^P1klv"?WL-?9x;kq`vo[_w~73Q an]+jE}E";t^ܹq_ ^S to)Va2DtmR "۷sbsI8*"ҽ.hwF?,{%O-'㿡S`iǤghhs@g8:֍h͊H2ОqmZɨYw&\$gV-Ub03ZoUx2ќ+Q|Yf:tcf5 AŽ}:LirN2F>% BsQ)WhA}}YZ2Ȧñœ*G+F"rThq5r[aML)(@ɝۏ)/m{97]ε~EeCRnUurStvɪ>ůUKQ,JAO@8Y_GJo3gL(q].uhy~cѶlFX,9D2)q.M9Fz?)g7A?4'AK(ĹTKP8QU:.LM;M%3|0-Z3ǷfE~lytnk{[ޔt^\I ZG垙Tт%|WDzg[!m2GșmK҃g w:/rf VpDVӇ9܈ 8@>ߏꟌﶤŸÖt< su[gɋHIi}HErKPG`sa'\|pyƯO7Nӫ88tqTvYWLfc *>>ָ0CQG$6Gx6 'Qz LK)Wuݰ-ۯNҁG#q= YX\?S rDu0pO?8Vӵ#tdTuoB9{H(~DL$C# v/ StsrI>&oh#*ZdFl 9]$IM蘳.=\ط<23 Wwn[^b W٣IU;Dbu_= 뉻U\dƛrسviӝK~tTc:>F4po#fYu:~q5?0G .hlX䛁-$mYI Odk.Qp""V2Ձs~pяeGuZgRM;vAuڀj^ŒcWbw׈+E sUޗ_$|ٴU*!s:hJP}"rR,O k{Nq^B0⃟SNOstt 'M#蝈GwLOBVd9]+l nl x#=Y'DLWt$N*uw=Qji5ADj%{?Zsƚ*^]?|&Ω+HĮ\G &8|E&ӸHSRb0{ Xؿ k FX/1r#Ϩټ} p 52u[E`i{^F">\fۀ ': ёN='}2T>@{!$O*f Ւ;f2@b7m/Zu4k:("A/R1?, "+ɍƐ+FSmth#To߀zUvF%f)۽Xuս)*Ũt6# ] JljSy3LSZ$hR5c]1 `גU!#d#C4+6Q݋kia ؗ²u&$Jg{Ģ{h2D=tr&N>*n򭓒_?=_3ԅقZI=#S<,\k.ccZT4Xf/!(l`dJsPj*o?zgރ Ë/[vp ۳|q~ J/;ˠUoQx8vݲ052&n5ۉ2]dW>?z `E|Ax;a:y5O##2#!۰qgym %W.NNaVp +RF@G+~9v,wK7 Jck;Z :k-_7]Y7<|Պ"55bi~ ʉτ@^}.cQko-H:`ߙzk L20?o/ϟx8Īڀ6Bz#Y&< Puc_%*{(,HbLG "`Z' .ɝevJLӐ^8.oɻ Y re8(MO*KKȁCFi8EY#~(KUSYvn p I-4?910ͽǟ :DJ[}^wRɄPSy<2;]%*CKL=@k6ẢlN9A{0zƚq$[ߧ!Ӡ*tJ9_'9 \~ p:pB_שfZtGj/M`98}lQX{1>7IG[* W4sE͋/<^xtՓD|'gZm'dtEqdˎIE3iT<<;Rq?™oϱIГWJSMԁU"-f&tSMUNoʜafEvHh"jn@EZ-MךjܢFa/Ԏ  G{׏ro9jڅgn쪄Fo0c~3}My<< aosִv <n@rXTdA-:ƛ>NOѠQdz8iو?^d7)Է3V`t"} ml8kCŢ)^%JuOƕ$9h^e՜ j~pFv2ӶL8"D,K6fr}uQW 藥F uœ<17A]{̀7B_Af`_;@f c՗ Zrs?s L$󠪼ivo[LթUloi&S_Yd!-ꆞJnpu_9}_Sdy:/ema2J z(ױ/S?o7$X؉Wm4$y=/D kmKȉGHf~-/@=1-=ȑxL!HOlxs+ ݘ1/ }d}9b4\UBޕi`*bS=i5CAT ;Ӱ)->8 !"toHqE>bɬPO`L< |_eӀ y f<y&X&ZaB[K#nM5'ep< kA]3IZK|"70B`#t+n3hp.H [r.Dw%+F(߻tx%GvehKIsije_:gP;O٠ qA?Z£FzKஔ#rg!̒ $\P3dՓNMtrD="Vy{7=&bFh?$[fz6՗= TzT7XF\Ur)xt@| Xe ;)rGHer5\o<"fvMDttyYׇjuns+F! ֌p8JYXma:ݻ0x*f")_e!8Gc,#X0HɜHCCDhRGH?^Qb塏!gxLU[NfB,{5@Eace0=gD?Z0NJx8w@n`?hnwd;jvT~C(s m+NI0.!wK>*hk"Du76|zzi\ ;\fhF8Y#5v Hnj?/D^E8P`ăs{[ed硓Y]/?}mW}t:ݾޖs×KFWI#ͳOzs3`h& =zݐ :>rqm A뒧Ƶhȇ LHc-5mOإzOq׮w 2z0Lz{ϲVȟ7]6P}gm%n_3ŸÎ )ǃf*D ò-ٟ5[(c+ɀT# #Zаw{.\g.eCSsO Nď 7:öCΩDE7[$sӂpd2<2timR,A(gc\C#eq_jMOŧ# 4P-6IMaGR|S%Ssľ RLzpfu o,?h_3,Ξ.hu|^[gG }{5>IH+S^~皧E.I5usZz)n_ٗwޑ~ F'::DIxߑsF N_0Kl@j?ܼzD{EUkPIDb5aXqҒ%֊f~1Ý'9.6 PZ~o~%?A|.suΣ0v¦eƃ4,*C{xұ<4~PQtF$9^ABrm7P0i:㦇gBPd>>g{c1j.\|ϚC`}kkhQFFد Wt=RHsJolG}/^o3y!E]U̽2([X6E0`,>-g- ^Æqhb#6|i o4Ocƚum` ϐ\J07*MEɤ> :,t4NcOנFv8=BsufM-۫ nR!eXUx7#I{(OG=0t$xoTi'y6\V?I4μ;MsV2x CXRIxAv:_7Ɂ~&tl|`ыmexfmϪ߶İy2 p2Ita`D|qxߴWk( ?.w81XygKCIVA@@E~T..O?Ɂz( j5=pOO~jkQݽ@64:˸*_I\}]e0[G'6T2Xq~>UazZwR*XSJjx;j3ftN` _ן`1br>z1ZPǀ Į" ʑq`o'z?.ߏYqM-|ı$% +{[6_)-׾'7M'ldQeե4<<ܧݲiKz%#<]y9k.SoɰI q<ɞcȤrW1!^N_mHsl y I @"bHyrθѱ(ƇIt~'j4w#{/UoXWq`/rzix3Q?8~:Ej>0+yNt{8gK\o"N@(b\TtVI}/EXAxFw~bRA/IbE/EL ?GFW/E~ZB5gRjL 'Aa--tX"*1|7 )aF6f;#v GLFlS._3kٔ{׊|:tMA+~ NJ?`u%/ݕ:@ʧOnF-ej5,gI)'q*s!] ] ZIx$eJvwIw,IE@с= <1#XڏEk<_ F)J+E:|;BQO*3EHaEF^"8JlH<+XE[3'iB~Ö?,KN"X7ЛPm|T3HqJ^}:ͧ Jn'n&BQ|@*o30ȪiOGhI\#oު ?-g2ɀz Zas AWkrͥ?ϾǠtCʽ9ɡC0}:º}9!]j?:67P|.DSN>ep`tܠr=Ȩ>:s\AW?FkCҵns!r fh?z@= Js2 HeXVzrl| R@Dr[n$_(AxfwCPx62 ßE$-V)N'd P泳J]+TÅ W^c>w3Șbxh7*'ؗ1CDŽ3HעO/1 T s0[ULEEZ_jK fT Dscf~œ8n=i8ɯEكB1O{;P@Uҏt♆[=5\*ݙR8cnT[Lgy]e]yt*-I.kj WAJm'x߾nW@w -z5a>0(Gcv6~'"L= [ #ͻy[ϰ_ wʗ՝X 2hjWG|;L2)FTVQ\4gmEN?\!LSE-8Y!`#M`eK8x7'`k@Cxr3r 42YCb_WG+. D`G.VS=ҜVws8KÎD.b幮ՌiC{JӧDc.ߺs(uY2UM#9'"τ 2_|ݗ= Ԗmⲉ鉰;:+b#3xG%$3w"LAp10Uz4\;ʽ.خ}O2vB4Ax)8:%׭o&3#:zܱzW~Lydhyi%Or}|'kMw` hVކv5Gீ-ԉ~ٔ[ŮMIIطFobDQœ?*Rތ\nф7\;KFf͕ ȑ(\Dcʜ:^m)TǣY7BS8[vD '%U 1$@e @$Cb3} #~Oܭ;,*?5ΣgpkP 1_I"y)Xw;Ǯe6*%`>G[}_Dl=]muk$ t(<:1l;ͽTH^S&mwZ]ƖǮ+ͫ = rNcSv@fgX@g Y*3َ;1V.j#z@3T>>pM{$~N!m^0ڈ1~6w轺2Rxv|B_`VK3c1\(o+ÉgJ1'HGW{߾}fXM\K>zYY>bUK)sLvq8 r@/T%3v a2- k<<@;g.Ů%ZƄ [q3:b-[ְryz[BYC,gغm7mD0:Azu2+ڼ#7d^y_ |>zcxfWV%ssʵTl9%ҭJW oA}B8'qV:_d|9(Y8T@C1zU0D #22] 2Ey0+, {ٹD-&QpSrX1_to%X-YF}ozزx*nCg1"mV~>q&;?ϧ &wɲs$Ave_lgLߞXcXyEC2 wNKuTtƓ7>UI}$ H|BJOZ>\bxįם'x߭;L֤-YEFct~S&.1;p^>{:IO)B:V tGI9MgmX&O'13d)HR|;rpJff,-M` lc3z(DAu ގCľ@{=RITI9 &Ɩ}|0i&頨+٤<< ߨL6{KD)T ovw~LF1X䢃SnBBYoal,aTťMk@u#@ #3"vj1b"tr?1CÌim{ aSMݐ2z4~Oڦѳ<:wz{Ëc l' ojbj 6 fxyK;hQ >)D>p~<;LwN" W[wt A0˗UƲlIC}n-ۭuCxn< A@~ ;E`Q^15\ kdC$H$GXfZEdiUUkQathAԅiW8Gn0J$;:w%-SfܾKW;1ID,h[ך0:Z^{VE+RUc9*=)  #cLGi%\*&`pug[~mkEŒⴘV 5$kSMr\A͝(8f} B 7RY t@@h ˈH3);={}߫h*,y@j4܈7 H Ycv{MCxP{͆ 7x@eΝD8[mjuOjHhߊV7Cjn/3 ӳ螩5GEr_@1JrIy 93Pޜ1i⇊t&qֵsx9DL> pwxPo]g\x:@m "lM~.vM.6ux]* u @tx(W&d"1U)kOMȓDV՚+)()2X,,gzXie4 ~yX#}Ż>q\'|`ϔۃ}u+;lxɬcczۛ6\WcGD]#$!S،?r 'm ͬBaY2⼯ݝgoLr2M$W?pAf/1֣a s,dT-M 㽼$2IVx{Y2gʜ9T^qe Gcj0DLz jEuM×;Vu.'o÷m?=Jglo< [{W ǬdscWI_ln/rZFkw@0AL5%h 5,넷4 nYBX DMAO 4)l.C޷wѠ lr(0P5t~7ʼnHS>xevgtxW N;/oEϣ8Jow̵stFF{(4V9)׉}1j ֆyi|Y)0@삪vr m|Q wJa(r% )P;(k3k_$N04W=d8C>GWh$iuT= ]|M 4Gzì6\.."xmH%t4@r;%եU`nՊ68%'gSQ%!#wP& i$cEAC*viر$R֞o*e9Ң읧y|"mg17V)(5JC*b5\F4CsE1˳0+ch,-.4@Y:#VizV~Їi sLg6ܩ$Ԗk;bPb?Մ zTkWOho/<η @{W\\9T69$ P[-ReJgCt&z#2tZCM2N{9w˕b~sEe{=2Syj$z/B79 ;rN[y=OxÔ11`en39wAہd j:9 T#pKy!&Y fgu25ce҂gf[V9qxS,!kKxt?G% 2M\oB 05,SX 5'vTDYetMF}Kf;*KLs_<@ F `j gCX@nKr[;d:'볫gP^/<(TSרΌ|ݖJ{J P6'g=WТΤV1r+YI35i=d8"j1șwAqF ߃d[qȒ%d/D$. ;L3w 9Q5<8lA+úڪ/T)RM8eDNԳ 6dv,' ޕ'˟v)\?F g_Åá?Ũm%пt?>]!"Ф\5O#$Cp" #>Ć'kNy\ ) w}%U4nkN'? qyP,3,RD kt̀t}xS6uzA?^|H%;aD2m"^EQPKIPZ }'*gxQ Dϫ\j{0ڒ⇑-r'j:h!v| "[IbA!Ǽ]#}dL:LN&x|ަ~ig YHuM6HTZCQgJ7  ObXԑfY)gi+o=>O@Yь'MM+y5]|Az!A,:bMBPiǟzUo GdQ<14ڜ[չ6qDk p;9E_l7NLznv;}rHaUQj PtJ\ތu``7t #UG&CvHk5 o _G7_xfNʰT,xkBE]=J}EKMxcJA0SB//AE1J9^jDTx?,.(M͕SKH,΍qc !>4jN-GW1~-E3Ng!?&6Ӯ)= 6R85@|/Um@shrUk_uUU(v*nSJ?WsvIX/~5îL`UxC΂B85(1m6zyJI3S)&]诈I֖P`wŌKfl;iуy\7LګR l))u ;4a/l]Ki焏P@4.E /{F|w\|EXm!KobR:m5[o.L;SwH%WZ:n:i6k}}='[D1^<\o2m%{`v _`WԫEX7IKe 1,&T\4$xWlꚓbWnEE,k%)OhUzo+1Cɜ ]<}1V8o3ސB ۻ2gmVPCDA,4ex)y>!GC%&׀j3 d䁉p*`?2u9'|MyeZ,x"?9"W<&'z HqFFTH5$X _VURRY΅Y<20C*aDC 03B|F=>|{L&8͟aoO95O?'cpc;4߼CWk[Z?TW,g[b1L7yvp>w(1y.k*aV,YEc(0rJK8n=O6JC_s,*B@.kRLq4j[8qowLqb=g\W9b2-[eS—WJjfgTTѶ-7$tdZ5|3jl][i~R bt.F'%U$V.@Ց=5Ǘ.&=sHAcqlMx]R&[|Yt}na ڕa1 Z3Jfpg5ҝQSXРӗ_2Ի~,lo^_lb$w[eޜ[hXN59vV|Zw"- %_ ~9{'d bΚ [L(ʁG#zZ!bR- \anUKU*rEZYpw"ҿw !|. 9_6iA9sAG7},ύ[{C6`"-{r7BH ,>qIebjOD%Ʈ&mIwo:SY # v@HJTl81\ܾ&LµRCǣ^t|ߖpJ4hjՋ`qҾ>4d_氋t ))ICWprWF. G; IT!-ΝqGMYX` Mnt~vyE+SE-ծzN,LܬFUY"y'횔Nw8ݤ8 l?S_fp=S\ B,Iagk}W6U{:M5\mVhxGIʼnBR3bOD!YIԕp<_>TLx1ktWL<|9ҡO /6^ktݾSgO߁yoN?OCIN,-͖a7}3|¡gӭ\׷:q`ykLjGaфkic.. ՞vϒIs^fM[.n>YC@My) = /'0F%$iT;)yh0'-]ө1FEGۊCzg2m/э  䮰6*vT4z,ae]%.\xP@(QyI?֝M!I C3sR%uzH^/>R 3XZ;^JXI ``Cr,N9Qtc>-;<]` Ͼ%9oqgnDV97!+b\y7a.D ၚ APiccbbf1t1p1l3DT1P0bbf1D3@ }0,60ϐg20/pg23d zC+=p0epg3 T?/QTOM:T[=DtTa|)%|}0Dv DBoWIm2(Ht0j^ YAQkԪ)5<c\DOU~ڦ~A 9t6~xs)r]T8y4PN<^i4E4.gi)S;}! M[l9S_u\ -ctPg`P*E'pAh2dK#!C C_?Ҿ5`c.[tV&t<ГN3b$ GUv72Q\il<}QPd~;dI.6FjI+7'豼"EV6"/7eZ BؑtˮfqX$6?tf_gʮRׅ`X#qf=bWo}feʚq.3#+6ҵ|6i ;so)<^Fq L H \YxƶEaRa9AM5G.+5]ϴW8GPgTҾ)i a[T|NW:hWfva˙Ohjո^6XťʷFSr?w~F!:32*jgζR"X&-FUçЬbvuf]N3" ) "\z/ Ԫ$ awb1U?i(ZBf e=T]2KOh|&;&;+Sxd/n·}|m*\g󗺌qIG E+sYlqm؜Kx~ݽ=7`R9[hdĺa޴MEqI4 /H\{.F\JΈ#ӎl' Dr6\Y˪)l&U{*7';:+iE?TWFhu~?RZX0WFfbm1.l!q6I|XZ*H.:ۋnrѿۥ8+'_݉Oxk1Hs}7'2Mx-C] 6>Ftn'l[TvtڂگUY쿧pٶm.:Up(0;]+!VKFBXF!8┲_v6b)%>`BYp.%lp,C WW;d?snLX J(}ұTZ] #:eVX3] ~Qܚ# >>ўc9+vvѺ!.= ם<B,|R}:dz*WCH~vuLǵ[eJ~ڗjUev&,UGC%#s7j8$rT%t7\.W&XJI^`l92yy }sށQ/^r Yzn_񶭅פstjm?US! Ng~4\qY:Q)2Ou+ 5 mt d^'Qsڔ*bGjÝ6_uMw1Ҹ><%:\w`',.5I6sm@._`a:^o!7TIcEo–`Xd\X܈E\.ؼ28vRG$*DNǷF` SvҿdG։ {CK* qRfSp5\ChM_XdO{#tU.}S'sWtlw Vm-w4AZZY>'7C~[E~']F]mfUl\ }ܓR]PI ?4m%<-磕K#ƔjSjx^i9zt Qe-O#]fl0vH^,WONcgjl,(Τ'NsHgQyZ.>]7jR0XgQ<*6 x{";#uz6HFam-!Fe \4wFXOg`]f]_fgأ^b6;Vzy;d (fLJ4B$zM3܅8AԷnH-GV> I{pqf爱r0͔Ռx0=6(B2ϞE^cGNe[0~Y[mh=ʴܫn@Lg ̹jY1H^ *RG1Γy%)1. z;**JmIۤ#zY%3Qk3#U^<0J6cԳR{kOpjPQۓpɏR,/x\& o\oÁ܀[8إLb}kO]!s+NѤO~F\::j<ۜgܳBKx. V=,G͉MvzyoNL>6Ӄ<$8\ξ_5Z}WCQ=){opEӍ!!2I#_Dh۴%,9'HI*Gw\kHB[#W{Dl&m-cLuw?QɡŸIuh\Y$^ѕ *?E%bR}e`omn.\T<1zTe)We#q`vx .)moіˁ'OntDTH'RGNH!YK_Sh`Fo4ǝ/QCQ\z^.Ipx]V,*KVq)M0>^il!cЧ趮QڣE窯4Qi>c1&6Kl蘱FhPk]wu7J4NE׬yh/w'aKFy L)I&̧)\!`=6TD(㆝zG-K.(SalLyq>]iܽG&X he0wnK`t+L< *sP64;@JA3ώ3yl ~%:"rprMtxGPvX)Z1Izͭx=DHHƺ[z=׊W ^z"Hc&M«۪FϼGJN̈́07`==?CגХt?^yMIn%0CG:v*@ikbufHpxw5X՞i / eWׁ0bѥHW7^z)lQD`8rZGT~OC5n%D,j`9>  T36 5t~cu2XYTQ.!H4"7XkR3i ppMs}ۛX#n,$FO~8~ϲr¬VS}'šY/8$_bmyB;#%uLv"Wt~.+ ?x{uΞrRV Vgs)1jdHNK6yA=X` 2AӦDĩ>bSTN`[.y~Cb|\=;y^7?~fg3QO)oSZN_nG2{m:+ pW"܋0d!1.DBKD'^~zC{e@ Z~1cv-<:3 *H: Z{]`ڟYMEprlkIXƬY,3\CzG8&d :QyEpz ]iIN;.ȉ]VL}N) Yǿr*CW:cTpX6UMP誢SH{BS1ğH_H:zٻ~_IќshfI\vlyu*)%(TRudr)[(mxܪ7Aw*zHf)M}>GWN\,G^^q>mܥ76оQt:@{w/*oef7WFG%`7U]4l83'vld֥UQ(skw?ctq?`nk/180{4{9y .&@ynRNjusܢIPl,(F:ѨD/; RLQ1vS%^ӹU.сrUNV:,Ԅu㗷y5?k`Wrr6D!Q&m6d9<:E#/=!m-z5z*Tkj2ra8Pf}|LΊiwtkVĒ0Ě>0,sΕX'>4tesNr#O!^* 1if@ PQxtM7惯QNQxԞ[= eygXCn'L؛~JFC38N>Q?Er;nOM탴6yN, (v>$MnYL:z_(N?8J:$CW^l&{6>qx yDms'BZJddgʼ[ Psybu=_fE#姰x 1xq0>uaW3_Ρ*B2a+W5lAwb(M )ug_BVEmHZPMk> 9 pLI5@$%~$EC\x+$ \mI f{ 3# ["4aC~TXg=fg*]anɟuVO۽tvGˤfϩ~Gyk+5M ";λ=r+KQ7RW839nٸe:zd#A\$ɞ!W=m8zPC})C-\L^`t5(58(cnK^\lInIkc1 Wp^Mknz|ؑ>N5Z߿1v(}iDWM9HQ3.U,$tQw]JBrx r# gOmَшȜ1:KBoSyY-͉{Ry@˫'d@1uF"t,˷TŸ6T`h2k9]5m{I.:/̎F:-u~C1s軋*q.4n6/0y-z_x[ragTEn/N &bus\0lOOdSgbO9~H3w'Pt8@c'NgZ$U֪>aX@f|γ~D^.5WO[zm1 v!:Wok"#|c;ac0-퓛TR))*,zCHg,-կ?+&p 렛sJ@/X !;fm;mJ#M^)rɜCqEs67R-bitD=ژN:8L;(q8d=?~ԗD6BY$_Sl3sG $.OtrZdsul>oe5Z;%w3_D}͖Y;@Q~x['GEz7J7WpT6cK9TkB‡Z6WgEINGѧƌ{wGB&QVL:^'t *W}V9T5)w\Z;~j=L}u.H_|"/Pq^׋ZZ<ޘ،9඗ؖL7^%`r۷4q{HgK9mdWz;g sjܛEԎd lf{U8 ?IX "uMjD=LǢާI˘TR yYI gE|gtU򍔎{\N2V>yrGކ:8E_kL.NjT:ξ-899Zsm:Fh Z}EHD;]!YX;iNUo.I1g`^oW>i a.>eUjv+|_ sÏ-騩<~Jj:ө%˔%a]< }_#bEkRR"uqax49z=\MJ~G"mWN:==swNwtO`ֈ.zFFtiyCw9ȱBsyCYEr՝ m:lDkrź{xK$ 6\^VpnYցƛTMPpWL8GI,鶎@IYKʗhΈ5kJ"Ѐ;6NvXڄG5~[:+}ҟ"Aw+?WJXe񲝈P" pi`7ƾ-U/_\V~CijY]xS\]G˳"ShH{[jKs{jЙ5>ݜ<ژ|JI1q=\Cf6:{v)EkYHt7xa2]zz۳݋2[Cvh?ә%9nmYAa3^/3{OqfX|zi]dp_(fUOk`\y -"3Xb$׻mH29.VNU/R'EbUtޫV{'?pp -t]:xP3sR0?-c\"CCwwi5ͥ3fu4~,in?Q-}jW\,-O\[RSuv <5fESgO`IfE:r&s V&~Y7]TNf'%|X ViuYK1;[B%أPhw$gѸHG{讀p[^ilTog][߆G$yn[5I:!5T_-H%{ N6"N%IEWG/^vK]޽!F!W P 'x?Y@@f$`E:nfw~qaZT"Ӿe&$ssˁm? 6>NY?am,>xVj9ٻRr^Vlǧ趹5ȔTy/Y z\8Qs%m"mG:{<-QI w.S c*0~x"Y&&Os̶t3ƪP7Xa֒xC8_/>v i錌p[ + nl4lӈ<us緊M. 3˳'CLCy,4*\7 o:vT f\(p3!vcONS`IdNq4)3C;,<9:u%Фi%o=.WKPdGT{Ǽ1m)2m.ua(=u]P[uVs}ޤ'b6"K;`:=%l}O dUHhN"2Wi!DoeZ0OuvL=3c͉S닏3A(N zux )=S*/r|WoWM 悕 Ğ*B꯳uq\=l_z#t'ZmϪC_%"(^UBߏ]joC&;_Ozδfq K҄ɒ['8-/缿^6N!pvS cC$}Wf #~ށh:ƜBXNd$L =*0^F̀K_qZ%'w-}2=b7_{nR? fb0.WL(PKPLL'vTUF\d2 ` ]ƸchU~Pc%w%M`\w&Y;CWۜREDRl'?_wQקa,[+S.y9LDD#3<{]w:ԦII0 5CKqq;"x+l IBu?$%M`gJpʫ9OAକ&ǎE\~eA@Ed2w=CcEF (~m‚`aQmžCie9,X&buW5ΎV0Z8䥠y@Migjyw`7I"!{8I<⮒c=$aéQÄ5#-Yb@ o377>sg}BC?W8˧\ui~0vx^>Aզ =,mSBt06<=ߚ<з60}k%kfJ(} =Tk1zQivEդP|D\;S ڹWHMZ-X8""vb\-1S?hD1cds G7- ȖXz" f99^2Zsl{HL >W o>Xϭ5mD59Q~7#v-n($d<7y]*;gs8/f0]ި:4'91 oo#ŽHcNҥNrO#T{FӈLJш79IzTe2G"k/>\E gjZmq!HS5 ٺ$NseE~ty{kߠd":Gr,2Ex]==GILL[3ˁMٷ!ćG` QCv6xzN~ 2 EouM6J䃝i?* (!f@ydxI ̀U4>5~M e,;QYCR{Ӝ΄WPO? -3.|_zAy?r!tp$ہM4c\\ߠ7.8E=&ARM~Htw=8^S6ͼqLtSk1t$W)zӉw`ȏJ0|0V^d}?$:cjPG6֟?^LE|&@INʼnPMe.9ͻx>iV=Z.Hݺ&_},SO!nw=&]eӑH2 ZoXlLoѸƝ~ ~_4v]4bx_kp2O"?q^:>g ojiJ>ۃVI"Ҙ}ob=U4/@i8 =.L~m$~+:˹(r fT#)V M1iOKoORFI Ȕ't}jS lu)Dً֒S S61+|C2$ۃqVX0ӆ=ud!ZsP(izqy{sC6,ʥw1tY_ϻu%HK\Lkoyk"v[jn)&Q0qSX׭-;SZPm懍Nˁ'١֍<  n,n, dk>Z҂=;`e|<ϮlDρ/ҜٯV۟ss{X@&MLJ[/Ɓhբ'k56]Dιk OT?#/(qgOU<]\?GE~r5ap=gdE=pWuwBN2b!~;,ض BW(5 G|S`.(kbl5%.ն.QGnű˹X>.\<?3g}A{VlJioȸA鯻=k\6il.?2'xg:7<8N_$~%^=B-!|yTmGq?bТJcnhO^Q˺L;:2'j;){-ن]*EXl-oߧʒ)_Vb.emѶώO.R:no5CR rT{-%HZZLC2C&KzFcst?VeLq69t@.g_^7䰩"[JdX zb q3qUAѹo*\_͔պ{?S.'qďаo9RuJ{VHEn75"23 $uW$ϑ!&,\^Y߀QXqb6z !ňP x;|]sW 6;Dbt#=J+%O۽y˅ܸo)Gg)0yؽ֞N! M!K $Ȍ[oj27Mϔ }&GЭ* _}qfw1?t䨔. MtU:ː;0Fͱŵ6ck.KF_:wn-ЮT'Ɨ Y2ο5-ߨe.鐧вj‹mxMJj]gJ);Yf_<%e8b8_C; ]OۯyE؟jmPڬi" .$1nz/ۺS?䇴a?nos5czt|Z f Vu{m6P%Z *MU5#S! ؙ s__KYsаhrz%F j+ P wU^.OpEW4 _|]LYNZ{:{/k2^\|GE~#ϲ(8B}/A15' Osmig04Jpy 0ӌ[Ys)ڗעco t]{{T&mp#bڍ(*oa3ũ}/D,f̜EenzVSA%v[ECvICjW+ϯBK[e9K&dv*DfOOoK4U BfrD|MHK"[8OΗJ] ĩN:&WP x_un }xIi~j־"_Ϻ>+?MZj[8D^_͋T5ZjgȘ$2ks`aODtaÚ2 $6[͗聼U8Z܁is*4V\OFxV#3?KG_,+ rպTTkwvTl;=r\1gqQg4Jn&PM{Ϛ}ngOk3M߆'i9]CbP!4&[t7=:t:(( $^ ~Ϊ$(ŢUWE7MWMYYvW(RW&ޞ е{xZ-͹F^9sn &qE~eQE}'s&CWUigUS%TK?J(Ǒ53SpB޲Хcc%y,%Z 7r?.?S?#\O  +m9l0}L.WKB'f-O;L;]~ &_:=Qݯ z~*JX8)aTkF:A-1SՋ~Q)~.Fj8S{8L Nm~6>=$ThN't.ll)Nsq񤼃oM:&wƾ% nTFe9,\VtE%zm2"T*0_"5y=5Q{,/y3'`y dyckw\wJ=߄]i=g,0L8Qee%+B(/+Y4ŗۙoëMLk,slNG6W~볳o_:d%rQ}eZE"(xf*ᴮ^LbtrF&dhZ IK"}f%g%vh< %ZT"<Ǝ臧s K0:`[' Y6E#f_$~WNt漸]T, s\RYt^+۝gl Ҝuj\ھa 1Or}^aNt#g]7ic?ځoq( L龕Ovdf!W7s?Ԝң~Q)}Ok8FRY{Κ3 {k~ºg[T,}>;!j~ |mƋuXU7 zqn 겝cRZfQSh#-T_M+ U4B|.26F?;z hӁ8,?k˅7椨iU(߭zQ>^meY<^¿^Kehn7o#=ѷ~OcɀdBG#i]"#ty6lS1[EIU Ͼ$UYÆŭŮ !nt+Q mt%I<4'#9+t=WuImǤtYqpjB=;G[DQÔSMy]Y7"W+(%jhqR q TVʹݎkmFG~} *+N x(I\[ZtPq+3veژBl(.mMdHաbM69;k'b~N$Ko|  K럷mVއih(45л:<#?pk7*ܭ`qUFW$=w %J.o {rHDҴ//L=yKOG7\#& DM= 5Z%xF֦ A5i4mz>T$oϚfFʭ/Ǝm 򸇊NJ+R L Em+ Ts BCDG^h6)zq Uk \u> n K rQ+X?Al=np0~Rvfv[,sjR/ڴIu)Qe:eTr@<Αeet? 7:]rzzҺOX)MCRk9Sy/5ÑWJvD7 |d|mlvREm+'80 R ]>t;5av@$!LT=rJ ע<me2<H?SZcn|Lqtٯ&y"IĞfQZDnG@ѧ+r7V䟇8" bb,uk-zBZvSK+|S^^_cTJr3 \vr?DZW-ՌFeT;FmS-k!w:]sGG-}m6+HSoX4'fĕ%] ?T2W@aalWcJI.5`X88z^ؖb!]''E PÇf꽭^h`7~vFӦpQpSl7Ηii^/gs!>Z hE(xtsP)r(N]Ըp>(i(ɾ}.-à+K?E$*#+D3 G[&~D4LvGqqy> "6Iɗ^뛑f"g>Q.kS5kkf:gMVP%>{N\PGsYzf$NkPLHCɟM&&K޶JFpg9}. 3pBb1։ZButC6fK؀䃼v#[h;yE/$sH"Ȅ}s:( U2/hWr3jܥZ('_e2֘]JA^$PK6{dDr-I`=*z՝o*bc\#WMBZ`Kph;U@"\BMZ]]]*lK X7DO|BImGjȪ8N=W3~$aT]}$I/c{z=FgY+C޸BG_EzҦzGI\+YD?VVAQ~.z=ЉQ6k|.i1"^~0jߺ"̦ hoqȀ-VLԶ'(_ō-Tm4ΗHqΙ嵃{jo܎ }@ gzұ O~vv5dr|5J|\oWv.f$/%>l|/mfhBWPRCG:XlO++!iqqÎJP0 qH!R`*2*!N!XIZM/cd*'S^)^\NآĸF, UFGzGkM3ґ+5dbZ-T㷆D.[BdC^!7ƺGZʯGM4N̂36S3 07W'rzlqS=ZNhq\dXG({mVP*׏ߑoqv˹8Kр$7i'\]HT[W07GjI0FB5AX1Dŗaq^=7^(b97ܺhwǑDJ y}a'*hy6tgL7Kf |bcei1|Sc.o=U#BQ2ʝ847 eM,xuZԄgyCP,b1YS j ml;KDib-جk!HC ] U"L) 9WdC\q@"hJ23c}rzL1Z;aD9|f^jrE`8ro\/=1F^aZCE:~,B)!B"d.e+ Zrس)j 2p~'1S9sr ЖX3)TpA1uIz}I7t_YOaGg²Ѫn}~qPGK[.b#ΙYթѡui~W>XںeDZNǻaI10d"ZUGqޯ&g*u9STᛒ֝Μ|~Q{`Vv% D0l, ^uK~q4N_z#9Qzh|?8KH_`f4W(,sVe~Rj)Eё݉.r;qtH:jK3 Iw4/ހd 6#nuΜ+@tz[2_#/ SckX'qn^8 !B@꾢~% gl* LX"@Q,'3(izSK1>R!d]Ams.zڠg4_*ڄ1J$BCp5RR}'+, ¥ՔC-Zlwl(1m lX Jڹ|Vؒg&kG3;J Gm AVpG^ I~XfDNjvn(+,+$`1Ŭ"|2v Yk@U[dV+A9pm+p\=+yc8m_ fL>Jl8%1}\An<5a&3ȒG4x6ށ_^N<x|B ~Hcc@Z@2o͹o 䤛.(R5&Xg=._LiuU3A8UܙYnfrɦʡ83SHƼQiLQ\QPɢFD it5my@`!3A pC@ |AG PD>p UoUV,7\`(G1e8a|$Eys@~ m@I"7=2U[FquL0%X@?J [oކzWXy | geyv r P M J AG tYr aO ̜t"LɵsPBd[7Al,>yW f;G TE٫9;6^ux 6c+(2rD=a$:4qA*JX >PR\P{JA3{:=v?κ`ᒫq2MybQ#2 hjJ-B4i-ke |(U|ÝNgx3Tu)(tK(= ^"?|KH-֌! Ņ0{{HAZWF-wxzD\iTt:r.4_ j]]X$,ghlT5Y@Ҋw8^£^ ^+X6]<گܨ҄m̸`Y`,:/MJ/AdpMUmh(D8|(,Th Q 4ȇKg"t} UV !D.vA#1g '^ݙXڏ74V@ԕsEu)BP"eMùQ;+Yͪ /E7g"a Y^ }i…K$hBᣢad 6.(a`26H,RSv2VȮiGOB6~E_\ ʾ50lH 0NA! %ƓY 5,j!قRk Br}CRRa0^J m۵1;n|jnf@݃sw&Fr_K[J. Z %F?7`n(_E1 (6k %Ф  \Hq8`z(i;؜V!fl*Yqt4! =Y݉3kBJ p֕t cb˸c! 7).YlBi+`zm8(=kzv'Šp:PvDsC< 3\6Љ:mgˆw^Wn E1kWMoGT| ; Aj/yB8XQʠ +X{i],{n 'XUcGGIG/@A@rpo5&LfHr}TMt}c(,GeK/栧TP$%A$Q7iA&F#00 0CEA2PetK1BfR(?@ DC*#XAMEމ$Ɇ)2>*AiSSi6o* (r:LY}< V)+<UZkq -@O@OXT ;6A5e` g\J?cIb]GܦJpJXlAVvTnQl~ r1ՎZ_WЂ0/ Q>>*H" v8Pya9x ]ZXcv iLqb|!օDGa8!'O%޺gV '5-q6VZ6(Ujxz,hTR,,q?+[gq dt )SahLAC[ippBμ"f~_6/5*:J`NՃF/ap }Pc_D@'P۽Y4>t`}XAfSh@vm梀yu0Y`S꫗Cm}wzdV ^SݱVʐlђSa<ܞHA)|v Ff/\0do| 2҃JoҧRyYՒ*0hxJi81H,⋀)F_;;uBJ t_ЮRs V0|xQdvGci &8fv~$/ב8 Td" siFNΙ<,¿|$DA,a}X@j%PhCv0 G}DB,ȱ3hv@4"T+!@yG ^ %WkfЕҫ@ءFu[d1lFPNU X{wb:!aGAcFm91`=Nn?$Xx@$D/]$W@~6gIJ,>\EVl#Pdc?p Al!Bv}NJ *^TCw"p2e?WB΀3&RsR,$}}c~=P1,5YMt sw@$ Q0į?Cq7%7_kXH,%f\\!Y.CkΨmDzj0J)31 nVSu2IDAI[Q-#CIH7WVQh@ dP{г3kzT.5i]ʹi; r#m]<&St7eD; -P"+FDG˄v$I 8P@*e3$e}hsPP~M[A;(9kg@ͶЄʄ#}:,)VvQJd;U ">) E"d)9m~Mw$ŸxC[bœ%]A>4<-vY B!< sNM`C 'CUlj @Amͩr%QNpYiM kBbЬqD i;EH n_7g8 P'Vr@0;xn?^!4VL=_9IAVå=Br&A܃]ULb;uq$?y}$G TLSF_n~MpB7\\ǙvyERf2kK*UaG+A/_C ǰ!𤢵44xO.T5u- ( ]z j(`9lHrŢzZ em& sʮ6 [#3k]dlpv\+ɳs("9Ra:aXѐc(?hJh4pcWB8E\P|?Ua-;}6`JXkdl6/:CX\ ^2k4C?W^\#tA?9$&7? Ǜl=IDSSXP뒃]oB^$@ğoTW_0J;W%m@R-$=8Yk8h/*g N>РS@2-|P{tᡓV@+Տ8W~xpZrg§eB3lä+ʪAv#Qbʄ?÷)t x+U>Vx‡J&aٿPoY(8r9B:5$|0#AR[u!52.?#W(K,5rߊpW&P%v 9EA7@C!&S&Q.;eI?PwڇqClKQ _FZw Xy.0.b5 E%-5𦛝] ԯb=(fpAͯWqZoY|mUCkFUqڿah˄ NwpD 6A_G};JqNAO$[CG ]A*QpJk/@Nl=抧|"H#[0WO 50 2u%:36Jnl}A԰M9æ(VP =;5]@O7|2`[[S+Mm qXϮ7J 'C@X|h7դm$!O̡!e@5^zlcZҭ1gJlp(QkXd H֭%k$ʶEY0XH @0 Il .XwB $ Nr1ݕ=z5Z :TI" s?BtV 8rUj/@ S a(ιƮlH2Tɻ 8PjaG9:못-GLgLPpAz['EA~9 ƷjܥFBk@#;7 D&Bm\s%"V!S*sP1 &\گ (G9! -FV@w!֯7Qa TsTw~J"7Ho*UrvQ F=, !1U^X/Lㅍ[i]Y 46YUr̓K`YBˏFW0?nP5ՁFo=3崹9u)2Ś0z z <.SMMֿ= Q~2T-D P;~2^# \ q-{'5Y? ЧBܰU6j}Ue Q\fs[2C@|@+Z!S꣛A<̈́ "Pv\HQp\PﮰccUۀMd:`15k4 똚2]+3wl.\u[$,v]VW@DDһC%<0w5O452UfqWl*4pd4!?KY*L3ÍXΦK}g-!ưU)s!TGhW }'#5 fG `}n֖e4=yI+D뉑$tZx#[OMqp wp\bUćwйhH^$}'`Ҡxغֻ]+xՆ^E+Y[Tkuq0u(ENw)w?ZU~\ 3l287T Ct/U߀&Ԥ^;k b5.2*)5)耑 "N8I[Ʌ <æG<|p3T7YPUI΄mo0 ˏy`& ^J-^.У΀~Km|@Y@zvم 59T\hS}*xT  BϪ ]0w&[ `vM7͔#6Rq T39^ 7 35l(JJP OY~/'@ CDRvy aϰ@WDy2m${>NϣRnoĠ? Ymg~qigz&j!CdX(5G!#lKnXRYPV!𨇤y$ QU ks#E(V[drXV ifc,/~Z<aWևC`FR< a,޷+t]@YhCecD& »${m O̢fxW7c4_6г])APS$_T?/:$h#oaj76{G ۡ0EH1~^@NvՁ J1m4a ;n J!m]~jAt(s]x 7*DJ`T dqY%:ȠOеn#؛YtE퍥n|>N@]\?Ӟ!0Kic_J 8টءg4|#SCCڤiء DjJ!"(]mzI\^m䚫{]/*{? `GKlύR[mYˁ!]sШ ^2ȊϡiFjo_5D8t5\`6`iGPޯzZm2&/64F~ >LEs9K^HUJAL&ϫ]oF%s Rt^՛iG&tF"cXI!:dzM MnO5SQ%)[.ʒ]nqmK6hLM);ө8K%p >Z=akV!ﲡN*Wb{s< dS;-{ #>ȇ7JXHg5͎y:!:L t;x |3)THyvhձEQdV.)ߘBp:>j=}hk%/׽aOdzncLpEΈ有oO15ۓD9RѴ3h"b` +'n__?|?4k\:ᶽեr0b@cVb ݖK9(3 C8 X%{a '{;it[yWLcԧ(+(++TӘ#d3싯y/ N$A"0l# i׿Ŭt&s\tJf?/ߥ17fISIR3X`퉫O`Z6f{ T #VFue;?aAުҬWxHV\awP7%)Ltֺ 2|R Jb\Ktw) 2?W36z|#H]lYl@i)QdQ)8`2@G]4>+bD ~֙ɭiuhEjo"kWFGLLhtΟy e􌡿msyc)IVzִ?\7Љ&0#fA` FچBn60̙%]H1 +' 7LpP3n}ϋ!"BZС8Y9 @XYAC+@Xx@'I&r9G4*M=a0Pw2L]YN-μ1D h& X$⃭`Z:4_>xж=2Y; 8XKE68=Z2HnՅFOI\B([a YdsSGF'*[Zk֔lKj!kZVwKЉhn_(OCTR%*,;+"'Wp]ۋ)oU݋3tX_xx\6;J(ҝ3;nݽȶCn UVc*Er&va!%hbl!)\ЬCXj3 ш}" p-d˳~Me<̙8ߺ=oinN:k?<R.MH*<?Ys/ݱEP;o澗rG"2pSq˝ uquJ`9)hHs {~gu&ENߪvAmqC(U'ֶD||0|Wyvg74/Sb}]Oq_.'uu\kuзԭצ4XlDNd^oKI3cHyqJ("||-(04UK`@ڟDB(\8>ԟBgD/Z؊:FDnwNqF(G.N WVB9ڧ1n,msgKCxgp}W_XYgӰtxcEc_Bt H8[nos  ]K9Q7UNҖBE3*ˢ8=31YM0϶s-|omZێR#r6nJvGlEwZPL*s'{ׯ6|䦦6݇~r \mC2AFԊBYt%* |U`I~ 9< c!ȳMϸ+;oyгFf%NhNj\Ծ1+s@{@pW.X=fT.Ͻw1fwl;Į@~یuZF.C}_B$q߿ν7˳ESuKEiVNh޿#xgM/o8+mj`•)Hnյd#ݻ؋+#{E 83ٗ&vkҺ&7r`#Qݝ/s-jƖBv)>#Sn#\ J:4kxx9#d;%ºYėυ9"9C:erhX]ls&׹1(ss[֬]9q uw$1~z&s_ʅafe[;nԬ*s]vGJSN~o? ڮWT>dq%#ƫr ܴorH8U 唕6rMwVpԾCqq/wb%pP'UܠVNYO KjDk8T,).{H*aD%[{3.8 a:q\*K'*~]uV ue7raR`(>@6чLנ.q>0Qup]|"0U u3̅d! >ÕkeBtj%ZRO6l8f~sL!z$pu<PP$P{ ; :7KA1+= :m',ņԧ_GL(>g`D J@ 6LB` V}MF ͸m3iƢ#ڲ{S(롃A9DGl I_qPiltsa֔2JB˃P̒]_ŵ)q5uC|8]@BP4O/X"+5?)Й@hW*qD݇vM:g_F]U4i=H:]θsN6A` e23 L})ax)e`)M%F`NdtRl7ožPAM9{. L};W?{NV}3O[7Ic}w(EH%G(=!'"oަ+9qaz1s3bȔ#V7i PgZRp[j^,!4c(_VPG*#$} @|K ]n ?} Ub=$nI`-a[ù pN+8T">:A5ח!A$x( &2O5ID:hglȤ ywpV__h;idN>B V6p\ 69 L))VCM497dlPq8g(D2U!xw"2f킼@)ׇzeYCogXO7kXHs3W ok-&c# Rp0Y 2*Eu v"&Ueu&t z{(|No{%yw{x8^GXX8U@r A^B SwQ{zTDh{y{(+ŀm;D? C׼_Z}0 ^xpŤc욂&7 c?䞍K[dn]ݷB86Pp]cDzݬÔ{ݔAb /o0pۨ`8½,h1 d; uݽ= w5p`0f怜d M Ӭ6tyYealQp\HG =e Ai3hk#bQdlp+|(gFC `$)DM45!0* T mUy|;z/_ ^ZNbOf>2>@qq13 b"aJFBSyA۶qτ kPnUV}P Zna\ `Jt̫?ApXrF "\ι"0Gʐ­m`[㏬n}1UFm %SV`aF-?^Deŷ4j2X]6Agao#{ɁcӫێSMOp*BD/ԎOVs*pj8 _?zTޕbnh/v.pawe223)[jF`yB)Ș )CtrQ]?r٘Mo3}So_!/Q#ԏRZ-SK-y<B9Wc|P9n uf}maFpXQ1?U-F槼)Nr,Mڱ.'Cj}eN^WQ9J"m!;t ݡG'-p^ƫ=t2ʩvhwg>ČT`]6 -?ϳ.^Eak^&c ~(x 8 ''.VAr8-wVQaK[-!DN bՐg5#8:q5>$g;1.:%*K~* I!ƽ_ ~rF{;YSMu,~/:44 X[qwS} +3e 'tAYqg2? 6S˷F+GR'<ڊ `j JN[) (?jR9aKa`Ҹ;X7 {&s\i;4TL}jӣ}P:=*ƭqK/wgH)8h[8(վc~Bd ' i*ɨr\".+̂(VRάB)N.Bl'v*ɰ\ Z>ih=bi9#ԭԟ{qڧo. 9ڊHGaG[U-`T; | _\ZEC GU\2-F=dgM}1akѕQ-P wH꩘tohȁBqr78MccjQ\mݵM"pUz:-foZgrܽ<[1x}CZ doԣ} *j}zO:7:(xH-=VCsb8DSqIa}FO᛻qjm3 dXSB_Y~;y'-;-ݞ>n626+R<njW͸w{wc-&jXC-mLAFWDmaj?(2\ :ǝʊ>FsYHЩe^*vW>'K͎.,6oCaA_#29]I[OZz+ڒN<3IoOҊ~YotE9D?>CPG:4Ɣ\u^Om 񙴪RF+Bֳr7&F-3x}Y\ c&YϼW_v]SoS&mk ݫb|^k7j[Pwn]v?Z Nnt[]+>G #B- 8tL~e?LkF|yc֨=AES"g)[E~8{< V30iWP2ХK2ԇy1|G9; } [ }9ܔ*Ǖ-W5?BtoϨ=c,:5$|q([.1ꖕD- F<Ht-7}9U(ERT50QZ\P{"ȳ,inx~ [cdjHN<ɨ '**7xshGWv%]U{Ovu*?Р1Bޏւ}Fn9߄Ej;0qb|QaKg1/w1Q`J_&/"d/y0/b;w?X\}!O~&DZ .3?QVo# }+ogfޕ@qK=1Qzw[MST'эVt=RPж`(-8y{ SVDYoyN٣H_~ ${m^Zv' r1r.꺦5F> }J5׷RbQ@ݎdIQv_K ϫTKޗ wc Tu.:*i]Po KĻڣ*BR%NjK;^!LGuAe1.Q9:CQZyh?"KcN LZS55gy3#d~j / =_E)DJTB T`h4: =7F1"73ĶBGI?>[B(p\Kr|\:d/jX9{{٨S|./]ǮѪ 1OVKP+'l:`TY>`류in[ ao/!uq.۸u3~f9NHz=c; `qC V{_Hqq5[qoG>Ji޴Dl|gX'G.8"觟њNUS0g^C}qfM$VW6O`W=lv{- !揓G`q{8/wcvk.3t][:-#gCWbʳn꬧Oj{O3Ыlpe#`~G'OIk,5˄VǒXY E)xN<~_^}A`~.,-z<ǀ:V+MLm{NDXAM)}ѡPyn ;e>=7MNݪ=O/Fgsa;z'L "##DbWE'Rghpx*~Dʛ>Sgx=0_,z}\B̞TGH!na-] kq:yCx+[/Z?|IWcVГj69ܔnjfHSmc5jMrC-6-sڗ9p[oibf/8ۖ-UhQu.FĽ'Wv u`pW-i;%/<>e{.FQL1y%lF໤SV `zsqrRX--p bֶ;QqI:zH Cim`6p?f9ToTi[Hh@nܸVtXlKx!kA~PfEQ "ucxI:{ISMSn=9~[V~O۬m7iL$%%Y/kS'zArPU7" bO`eI1>뚓΍M+مˀhor6~b$V'ZG)7큌.#/9)G)쩶TKbk9^Tm<DVïˡljq"јύjS]$U vV1=]ur:Ud#L!H}E4E={;4,zl]UIK`砫:=GxnԎSvԇ_lӭ7Bƨ rq\ojԷTxżcQɧ]zu"V3?DyeMxmq:W~z\*p^-m@DayW-C1?cvTR)p*,094$tu.;ޥ݁Җ ^0TtZ2,hZ\ˬo4Zm$^>߾RJ E=p14|r=.R^b5>bL{cI9 Hx) IO=kWz}Ptp~U7}N?yd;ŋ깆Yz*mi4ݯ~L>FݩEɀq»9fg%[Zp5FkhSq܆ibPgef>r9s~Xr^y ?f/OkGɞ´)o}gǵ$qe3DdftZa:Q^Mz4>|fS0߿U)VJwNwqD(x]n=K5b{<55U7cck⚃mo=%־"ley[~ѫ>G~z#U}9Gg{q!S7\iٚ0o*p\ɮ˃ %:Ņ9?<ֹI+R Tc}-v.v7^#^0h4:3b5h;tQAVF}./y5 v՟t3}e͂w?V2=# #ѲׅSj\<_eI[iz5,_~[㝪AAo&M.Nz[eS8zaǷ{1՝oicJHQVv';[6o~TMk^{o͞_5ʊ>H7:hTܜ=M[Ԡmq.^-̔m5O%^Oz]Nd#njyv3-313 ۭJM_]џw|iԷC.}mʏJ 3$y&B9Oe5';8"i~k9R)oɜUg+?.}1OK!>0Cיn/yy kԎ{BNjb|Qo8V *ȽaO2<D*B7a󡞯ZL/aWxI~k{3^I/Qw:oJݬ7؎alS!|-QdJd֥ݎ_'2[srxbwshrQu)ܪY1p1?Gg'go2y)([T?Ѯ\x7lhnpc/_ 쵟@RA$m7$]z|-gou+D)uz5c /H t[8{6vg.GuoGè螼;} =һlү{%%N'DKcEy{bhgT}г!%(Fm,jN7g#w}7ԎEW9myE{HOu+ ߴj٘{jEgm9Rئr텞~QZNPbvHK7oIiR} 2vYW7U]!9z uw8INL}gE-CPEAw, !-o:.?}Rm'Jy4+kViv6xb;5ÏA;Y: *-T1 $$ny,yC/ {7LlJ]7펀rΪ`q& =sv4k/d{9zz.ajHU_iыQ8ދh`&Pѫ51:dM0wAE1fR(F 5_mJa1}OҚZ =0Q[t*uTbVemQ}9,ua:~?&^Xۡl:Κy\ktRZ~d\s(nV5Do5嵷Qpf$;::A WD\FF^.|cE"' K&0=|z̯sVm#=? Y/N8#DhH*v}jγKOO-? u*O}ɖ%[ffٗlh07"gKS/h'Z'}sƝqՃa:"F6u7E7}[^`9nKz o\xw oK9VI3OܖdY_'QH=q8ㄿ6-s vң#}aQw=)@$kpKCC0ޕ)nSkp; ҄zJqzrk "7 02>}f3 /!"kިue#-Y=SEpp\=vT>e?=[\_ C:Om7.z&iCd9YV u-|ߎQ ź2*Tά1E ɳ-]-R\ .u#B1j诏X4kd:c:h/Ǟiؓ/ s]Cˤ^3 [1\ ڷ/Isem:dQgo%p8 !Iړ^%*jҝR^CrxpVk![=SNd6*BrMTe+olVE}L =ϪR/pY^3_?Mm򢝑*-q^y60aǏoII)a~up"vGxhQ|'⻁'mvZTZ({dd[8SX ]\m@;ߍ,<~V/I3[?lX*ٮ)9r(Gs-4o+F_ڡT?W]uYN4*x3Md&h' }#O0~!a(>KU-;´ʯKY_rO}p~oIG/dn/ CàVZ%}yR*&Eܼz~{]{>."pQ>uM 3ad. Ij"out6,Ԗ̓p ~@opɹcAeo.7G:9(pj>r?2)(X""ڹ&kPmEz{jMi85E&UryNzES` 剃8jsZ kx;v95 &b"*+ƶj? 4C@V~2gӴuX%8;JXwOoEҍmDgZmx7SJx?CehCcҩ*b*{l9E:{ړ/}$d^yIۍ{]ݾzl Z􋼴U.\. FP,L 3XaqTMZ.弧#{ov.$^Ft,!z|xx4}U\$l^MUGyb~?O!goK-Kxc_𺊭}/Y秌T=[DPӺDNGs?}K, 6Gz'b>e0aF.hEq4Q4D ڗ᭑![9ɷn^R;8C{xD y_cSWxעp.%Y=غ?&C*M<ۦRҐ.vYw,ՖF-4NURzP{jv Si#!YuŊnF>ft®4~TiX[hGqI췚qAd=rjEp?A!1,%/LTI+;[G5JҾϤkӦP>p뤚ts8߶F[1#m IgFm#XmV%Og=Ŧ392XTW,'̀l{h|Q ?Oc8.]1Ac?50TI[p9/A$i=wU7 zylh2q\ê{gZmC@w~C>/莞)Yqss9KŘΑCpPZi#g'^c!J|Ą^t ղ_~rA-ƗA|$ 7dCG:)̻zF}B><-qY7kw6 9RؽF B'K)$TR.#7C?xm_Qy$_/@4AcƸH~-F]p]#ZH|j2 7 {fNm`6úcxSEW⌮j}ԡCn0pxMbʷ^]Af RFWe5r&N@_-ogÐf[5}uPSh?}(e1%?qW5ǝ517ƛcU7~He%.]|, yIMp!YTu 2~^\_V[0hG8d<8f1?J*OZyϛzG[Bpkx?ǣSި<%"y!o}h~ҖSCc?Ό|:.i텤+^jb>y~0^ )Gs֊ï0U =FkhOoV^UhÊ+%"2 WRuԨ~ xXW(=o?]7bJF8/plNz؞&VB*S F6JR-Lm|F .#>p8~O)+ ?5dX9oxQ_Q33̢2xy7<a#GUz>wWzĖBnV(RxZ͌t▻H^B׌[Ex0▋jO֡oQƗG4hc{0U1R;ϤuO]n oÃchoŐ]m LNe̡28gM.}-*6'v51Dät ::ikDƉ:d^(X^FBL[&ҜX`xů=q8r;+|_DqpEʢ[<$o}DS/\B#eR"xcwPb 8ˉ4&HvW>t8# w2GK \=jщ(Lz+u Jly RpПҍ!/,6_@ JZ?ηW_7)g]ȑO6^J>N?q/[->̂}ݐ䡃9,[1b6i{uUD/xβWC4k#+dəP(clj9U^G/8=[tMvF۹3v⣳G:i{yU%į{7Ajӱ#1hh'V㝶A!Hk,[7ֿq gyC' puΪNuOMoKW1A#H u~`L緘D-yQr걓[;-jX@y .\ .̼!<Mf8ٽ 1c)ɁKrDxliaoN;^j=XrvS^,drf)DO$~WBrO~D;#W޻pqȵ[>ZimSUΖoMݼdjr!:}wP/EHvDa4{M}7ˉ5(#;kOnOtm$y!ܞ1Dq39[eBc/}$"#/9ZHvX6Yn_)R'X- s11FN17pmNɣAp&Q? _cBv>q:}m⛃_&=. Å$cbҭOkz+礣1:WöeWvggR/VJ'p;ojRDSD{nNJ{X}M/l qȔ}'P I _&6F VJ( 2 .gV44IL˵pJ cj*d屆)1η<]U`q$~bz_Aeǹt݋|W7g4ʝӮ[c;xFBS8;n{<SԳRVc'T'C~.5uϲ;#Qk %H=*2;r\t BYn$6 &K/twxQ.1${/LZkes+YOڦ7 : 2݃_n/zǀQ <-}'Hz5uV}5! ?-۶|IK u{J?bB]E e-p׺pvٕm1Zc$dC\f E; FV13x7NKs_X^r'OSS=̞;c:}S^g7{Kוg C '||1Z|KOCHJgrc&,涁"OscБGkytvf jE޳ qflF- r6<F?ȅ V|tt>xg^0nmF4`W@D'^WڭV 'V _ŝ٧p;ۢ9#Cڲ&qE!9ɾ-88җP_GESյ&'M pg ,4L p K*hc<4t5[2}F$3bw$_Ω/v]A?4aPȸMl;@] m51rp9*Oab"j ?95[g϶Ff?HXIp]gJ=qAMd8[EeF {cǸa؝Y׾P -vXlB*|II3]Ͻ}BFt2SVo8͑|5+k~­vʻ()a`stv7Kj Rw3e71|5]#3zM:Z|X_"_ˑͤ%:<2yGE?sgX ݛN"ݘᯝa3'!?,HpONx:\D2#1r6WsK^+K]֓6 f R^ vZD#6>Z3*G0]PҥȀQ}{P ׇǮ-a`cPcHc@c8aᅃ5h &^-OBTR);+, /9BAЄ!JBJR! JR)JBJRJ)JR!JR)JR! JR!)BB!J!J)JRJ(JR!)JRIJPB!)JR!)JR)JRB!)JRBAsj^%wvv3C2"}7Emm^+u08UqC&8#*TDN;2/~7~Tx YBduMA͚= x+lƈK=6tFЩ+#G>ȳoվ汶ӪmYŢGLעb{NU_:o^թ< 'cxjBW&A֩%nAsde֜]~.HHcpt,gӺ 5hE'}OImgj)sJ>%hL5WMh5ڑf[`O}f8-o乐D5{)77@Nqv#T;xĀE\ b(F֞ ˜#)V}.3Y8",(Vܦlaɝw'Xg$]P4E L9P9|.c~y$Xfxȵz&cWPzpwRiDns=3hm:>XAAOs/;lg>wެ5g~tvVy:ktkRY`sߞ[Fw-3$ڹ Ŭw$?6@v߂3D(9;ͤSgN0L8xE :A-^K;Q^'pd}9#'*BaҒ\~Zxn->yj6}IǓ;W~xf􇿊]y/^<Y78xi) &ff65{JbGF&.U'KzкQCvzXct'C{ev[1h X#L8 |ұ:V'ܼl۴Ȝq;m=MeU"AWπܫ'E&@?Qђmَ #5u4mk^&4u)Py:-fknN*'{RC]΁8&jmN[lpRzlj 7-J*y>=C^N5QY3nTn^˽O.9dg3,O,˾u}d:,?W&&t DE7hŋ.׿mLFF^7V=,q\GځCY}?,Ap*XY_!r2b83n0~^ l͡t/esERΫ\IPѻt8=H$N6n#:Fq+`x3P%Oȿķ@Wug_ Bz?c(.`V%(ƒg6Z߸m@Alwh9<-B,0VBՖt1mFA9\{ oXݼy%qV8E?UT>2oo; pX^ 4uXGKe=#yAykTgJdbȇc1 Xv^UO# 695BOtվRQT#Wf 2;܇iYΛnƦ8ݺ5Ksܚsxn0IC0g%W>\vs%f9LliŘ=K+yklCځ9't f=*Ps؁\Uk ;p!\#]Σs09gh/io"$k~sY!|zN-+9>;fX}B.D/d5i?ۏ'|L@eX;ZQ&w8LWTX\wDj;YL:Hn-5lTIp޿sc![UoW.rs`JIVjy\rmLƏO̕l `7p ;ss2/1,O ϯ!(#*ʞGm'@M]=%a삧8muz{ӞN%Qr  S+S I_qΟK YH*!zٜJ/P68".Ƞ_ @ǴJ3>CFK<кLL4"U^q㧿:wY؝W}Y=Um>PϿ6ÛRLӻ1BJ 4{$~m[Ϗ*b xTĄRfm<: a4S zN~C ҟ{: tǃ|)Χo !Sp/Ƒ7adS}u!3؃| 4"S) ce0׈D@Hae5%`Uo%Mj /iq\.R>Sof~Dt6z-r%~8V;0>nfă5cmRr-̩ڮ_JFsX6irFñ ^֭q><}m˯ݵvfؼz/਼qN ׎ԗ5:ɽt{f:^;=K 2}f$tl>Rߗ_o(5fmoT-6E2%,PwEN^z?!( 6<@wW+ۥʟNZlK7j2= -w9=$r\9TOקoB'$Ǒ9?E]pliV^)1Q[_7T _= 7cbJg pAR57m1š[v>qZ:/iB֌׉10(cͯqh(mO[-kao- tSS[oA% Zcu @ BVyvS ٽZ( W u7Km!AZe8}5sg9qu> s.V%թ|X> |wVS@ S?;QveIhzY^ .8w'c<im$ &׶?MqsoaSw{W<w\C|VJs}-,]b{I97G1C݅9T`N'A }(^R3I'lxdOQ\oc9WuY[%uR7eg)o0j|#Qy;Cb"ݩK&ΰ 3+'Ȓ4->&(lN\IٺzQx]y~,WB?\ѫ]uTH}mzc9~zu/ovmO&W;-Ȍ¸hH_-//(͕q?')<WЄDFٿS'r [JPfaТ{izthejβ6+L _G2$F։k7i\^qFN'$➊SeF뎏9|6SrJ%PE(]ObA~B?;9B'/v2nυ?Q5袓.-6Aj {^2 nS0? G- 6KP}ų w!'qa:8,v8 gx9K0} JujBR/3,޽܍T }WT,Oӻ.axaߢd7?p(qOỄ w$z]%7|1z͜VyL_[a~ohw˚ q;VN2"p4$M U;}@S}?AJ'W6D1Uu-C@|)>TBX>:}L엩wMfjjmm no:ҨМ7޺v ۙ.\G2WO?QK0v'q+q$I tT5%1}\.7 +VBev\osRFߨ 1cŹ>9{Sjcd+|'~~P;lj1ۊb\m${ꃎ.63xO{;Xv ^Z_c.qb4]jef3v4~&edY2@*!7y\N-$iM.3G i~\E_,;Izz elXsu[IZ(k6s"+}dRTП QՀlMҹ*FI~ҍzIC{t2suw;G Zو薶s';-]/AV[yX')o_H x6 =0wum%]U; Q6S/ne JWGomfsRroVCѰ۩TrƤzPxP$BJE^iR]7_{Eޞ!s`,`a+–K{*m9%_ ®1 U=S?~CEVʺd>N֦tBfׂIO.Yva3m-L;9]'.hn=/MNoд/-$^U<6ՎCuL;_>jd(2zgSjQd~6>d;]!AJͻǢ8I wqZBCS޹w4ۍf(HB;^J{|죴4,;`U8/7ltK*)㍯)٪cvj)TskeH;zrf3u41Ê~0**o_ ZʦlL}B3FNЄ~3ߋ_}FKIm[Ҽ}rdGjuj:׻촿qvK.J (-!$(aK6퀃t, AV+ŠS׆+8*ɕd²]Y,VJ+$ՈU+$*dz߫#z+7jҲ1YVnUfYVmUEdJf+6*͂^VC!EfYVkfYԫ5 %d NV+j:+.Z_c  Ϙ;=Uȝ2? ?Z4?q$Min#?̀.њ@7bUYŬGh%e?f[[ G@Խ(EX5} D-Ɓ(s# ]=Qx.(AP|W*:DF!,K P4 =C;:fT }hp(%a.U|zJNqQjt% <{3m!ޗվ4G|!JG=i?U}ll\KebL&n^ZSigDKS5'rW{G&b mq2vq@Y,/_&0Jϒ:$ ü9f-f/ueoCNI0ׯiG>P ԍ\ifkVv:k $|aѣ8H,HI2y^Dzt4yo+ulKqkt_U":L`4C*Kϯ'K'XPTJDq$AT 7:a h5v  0D&ǘj0N9Z(3gMzxrPoQτlj>`φ 4}qr^t`͛qqd^)cA!w'Bɺ N*Rboc֗|kH#6RUe9DO9NMDAaT֞C[o+r)e*H1Q1}MaTp&)Ù XbP!@K1 o Mc .;r;@r0#& @|*h uG:UZc8xp71[A06b@|B]?hÚM:׌-aY(0``:@D&I6Aja<#kP]a4ROmM+G`QPT Jfg'ac)N9d7zנZp`y'*l;"6,N]fG}JBEU:{&h\Ў):~-NE}}]?@w0`s2o@j\ucP.%Wb IK 6W΀"::HwE/E(;R4/O 5c6E(=F@*\J@TR)G,,Z)Jz"?<29[Q h' qX#D+;#aZH:זRxoֿǰ^fs"44(a[;1W'G)M"P8<Ï+p{AAup%X@Sl&a-w8 W3~*"@gmL9hءK"qCwTcUN$<8P MnXv5HPI}F!ˋ%! >8Ź@^#J(OqQc#M<4Ҥb֟eI\9!X#E:!!Hie J1|_ywg[^p +\ʾo A3z-欞Ĭ 蜁U'8(rufYxvBiPͻ!kn da, Գgف5k^Y"Ma0@3~Ƿ9&Sl`-(5 S/,:}VI,AA@4lG٣>2;& :@ K@WQbY=p:wָ:?F̫(7݃HwUXaϧG]r-9 ,Yt+8'9}P~ 0S֯7:wEwK" tGu ==Hbk 4:2V"³_uy@fכ'QX¼KWqD|sEOEk-禆j/4q;} %|BvoHPnEGL O(6[}% )pT!}.d|uI 2[Xyqpc%w> _$؂de51^MQ`.cHjx XcI7B̎<啿=!d#r FjJ崪 >)<4bl2>OZY;73AgWT8l.~B ן~s +vsXБ# [ PMow]8؜І{ͷ9vfghTJVԌ;oh7"#`iuH-fXdC<0 ueeǭ4݂쐫 K ZB¤ݎG\(Q!́Mbr  Tqf+~2ZsQ#ϲ.ۛ幣믰K133cqCsq`,N]9*W55L@θeGѾpćf_/k-M,⒀< pUgH ^vxG=7V&*Ʋ+V` `J7ZZ[??RN!Ră5b*y{IO@hvֱ;[wsBgh10n_Ŵ}oz2lŨmxL=4R" ӟB>Y s >j'qs&E\Aܟsis# #K:wm'o+ݑOo_|OƢIq)ܝHlzcj1FveX%p܊  V`sɣ^Ɯa4V}0ӯ+L6Ef dris/~7Cg.Fv}yӺ¸->~U@/N&|,lۺP RVD[[l";;!@iݣY'm.K2~^4zulI-Q?zr e4򚥨 r-3q>ȹhjY̊b/vþAF?n˜{O݅Uܠ=N !pȱ l:ie&߈F/4 vLe*" e s:I]@ɷl7nsH9^ 䧧"<ۿxInh{dH\usDI"] ^h&wBuu` hই ڟ@VYSVe V [An+|4E\,FB=m;\\lfG.6M1@Uᝫ >gB3ݚFsHVQۊȄ}'^R0/#]'~bUܵfv#Hb:cX)t:Lo1L9efmL`t?GtStGBTQ-K,SG l Els%crۮHu6yqg*Nz*6P;^EL)'t~Pi(b?ݖk,3#mjR C{΋;za)McexL@'4 8x nQ<$^+NcWŦKoܼQ6}MhޜȥI"jhF:a/0SΔ չIϗAé fz4E4@#0CB m63旮#2_=f<3ŪacNǮHk^L(%R'̙ck{xdZ 5mһ+.Q(M!(#s2p}{C67"']fnf^4fP ֞Ҕt̔S9H;y1Eqg2WgB! #H(A#~sl1C5*h f*§ D9$H4s!й0RĘm8SWyݎ9q[R-FʰZ( . =wD[eݺWʓU1Hk:H9v No aǵk\ =0K}hMZ^7f2qq83+=} 2ư?dlce擀W8xSN_`Dy mV~3ͮO4iY)MzO=h ]w({4׻ s$d`mhpMa.Ylre+.JiGt"|1)"~ ;ʂv,6̴WY芻&}qcL_\.jp-ŋ(CZ64j/QS4͕hk|)4N()]ABrJԭEE>s8Λ*gJ0 ^ScLG^3%]+MmΚgntg ҫMPp-ʨ- q9h& SJV,P%渋nF8tvDﯽwm?9\sa*2qU]}"_sN Q( <;1+0LAy:3U!V ."@9ܨ>$)4a L O ;j'.WTcfucÿ􄰴䥖udZGo]3UMRmŚ|Sm mCy{f4i\H ( 8tl`@|TKnyVf >]yޜ9DIlG+VA"ii%uC.%}iC\Cj/"Z4WڿvD=y]ay"(C1sޟDD{z:ktRh36(/2fTL>؊زR\( Ar앇hAaDW sW$QP*^5G25o=iu(U*g^;kH|UHҼtO=b҆uQFhZQb :i@rvfȟ2 50RjAJWHiF|dnK֌N&VqJ2WSf %D)/DC^l{tUp#v]XGeDa^*R-tY b+}⮛9Ll\w>pe&R9$Gb P!#u3CDLaZ!Tm{Ӧ0Puy$D ٸ@q H~a{WmP;c[f ^ɚ33";M-kkp|QS&"XB>IJΘ}9Jѭ.D0I0z TLcX4ퟗq|,nޤ~ !p5lJ=V6Sͯ9"Gw+B*G00 wyj%7;*|Yeq7L4OQ4XP{'/熡T,],Z`Hf#͂kt~3v4e*x vC=$6tks< zהWo ɋ\wggH=(mcc ^'Y& t-c MPToӨzEÁ䫙 MrnV iNzgBΥ+l[oagi`)J@I874[Be nR|qhJKGm|X@E[n6H,&*}u͌E\,'Tv3c^WkUA2R)$f>DEb|}|Dn{)0%YN,;W,W' e l2٢}X2h[ vF.l<$8yeJuc~7kFP[>^. 8:.Y+I6\Yt39?S_݌S^~>{< U߿+bD*M*~ġYV]u5C^ʗhu _^0uW$W JMa!Na0ڠ<2v;0beb C2U-g3mqbj>^)\1WDcu5iɛ( ]}7 |Á%Pcd!ᚘ h&Gȋ{bMo @15y}duuP\ӼL´t8xzء=1(` Hk0']l >F17V3Yc7U!BMϽR]@oO縊ւR|b ze9$jRqonj#ݍYfM9Rpr`4(P$zlN a&sQU9x۔%<O\ugU `tZ䶨zDFv4Sbɧg!:dT ^ ;5 `>7$`ql(a6CJJMsVRZqD I߿s-qS!s-Γ6sI,:+;7Ug6] R*k(h5WZޢcGT覧k.AZ닐 eь,wpkqn' nqFpīqz2wVrhȄbCPmF[|j#+axE3xi^i0&B܏-&凉Z7WtY>%nfўٵoaݙ~ˍ5HjZ{D٬%^XZ+Jix2e浆W u[V?)&ƻФ?К@l[qgyGo/ n^|jN# :``"Mx8-jߍ8^|\Pb",0l'o 5Y1ljRt|B; 0ԀjXh.lPሉʠ]7@; G> WxTkÝ^Ł,ͩ'if["?oԈYr?7o(2} X.XlscY?<]|k# Ip#jx$jTƠy.d`K$%|pH!1ɟZW1=8[ϋ_`bIn=J>?F;t0ݦAxG ?(V.TԱ) Ėv |9|ڢ-]\hcy*>{;}1ėV<Yx_|<<TZy72)f=t{Xm¡j!Gcp &.X3ЈqQCI-u a:*=\DOCaT^eyrK=)lM=ņ4%STWpǃv %L'kIENѳ}#fQ|]>~$YsXh17wh5D*1PEQ+O~M7a\>9aVeiUYUJg76}*eDd&Bs4+\WV`Fr; \1s}պAU#Q [}?VV $y^y}lT鮯1?MWyt.Ok0!q4zQva!.Cbf;kifeY N. Hτ\؟*cMk ei7'cPimZxafu5ZMr}H4{+j07$+Zq[r,Kj 4~hF Ԥ1Qycv+źI@G w )U\.3vߖQb*{͏!791(lͽ Xܞvo,@L*!sXhO%0i')XօbY<l+)93o<"MnMo_*+w&tM6J@AWtYa<&|?3&6R[_eĊ^ySH4_L.)H_ mL7g4W1U8P@TR),,$]6M=i=좽+K”RD[ΞIJ#T/_Hb xOƔap鋼Xd-J#v=WdCovu\,&1.RaM*y]196Koаdw)GjF !HL]5ί^̓R+*Z*o2ί73y x"5|zjyKެX՜ϫ/.7^q宩N:XZp "ʬH=@/^"EbۏI-B6ࠡʪx39g%]ZHu #UBJ ,ËK:qmON?L_Ѥ_2{},8 I%Rp +Z{l)4m O&`yz*#@A~%D V)n F从_T'ْ@uWe uqӻ1_MUؑ:u3gȒm=goW22NT⤟ШGwHRbH·2" ?Pf YHt0!1dMljM/;$x4eHy6xCk,%5P͛HQLi]I7g}yMݥv6*^ga[}ʹh^Yk#PL*XF5QbN` .:G.ZЌgv nTY,JZ/^swd;NbĂWzqBuVC{(>j ˆЍgi`bxtbG OLQFKhl T-)bֱ*&{-ofAWc&ߛiBP MP6Mh w5=5>԰>UDȥQ<>zí&.ބġVb1wb%ONaAunhhJ&ffKCeS6i[5 7.8W\:FyWQS$$CQW/8v[ ly8WFPr(1Y-G `CTQxRdE:bW=面NbB9bL. Gs|vs9uX20ϕ?]O@֘WcY]'ޝ,ȦRN?_H DTͣ*=Z I٪ b:#S|P65aof,Cdqr|߰Y3{e\O)@4\awg0BO^AMDM^PB ]kA` 5IR| )oD@T58uv2C?bX rw&tqEwGoQw3ϵ{6h:6߰4TK@+J)`:Q\6 ~.ie8-߸ Z&e+-ä 2Ol;2]3?~6Fw=%y )b3xXpJ Sʺҗb6~ҨO=~*A DeV&Du0v,}>9-o6/mrFGsH!lʎrPQr Tu:,cC?)9Y_tDsC_[+>-]oXXݭAMqh _ 8gPRpl(|FYB-Nc!77 ,M zlڣԭG FbC-GM߸ 7\}<5ʹo~B}^pkeۯU߭Ks_ox n#0i (\RS:FI R#{A:+(snr2{@ $tB&P};2/](" Tr=Js_}[/QoU[௤DP,Eè9BaI@#)!o$H{EYi|H7,W/‘tq<1ϛM2xzVh6z+N-hi7^B03`*nQb)eXKEO2IpAyQ'ṕ񂯄I|z9mI/%k &='|2%l'B!:bieV߭Ʈd*s]`ʓR=rv=)#/ҭ,J~))ޗUbU3y 3_ӌJ2oad FDl},O]ŸEpP 2}4~VTx_STFAv%W9KiFlvɶhқr!ƨ ύN`GlG/g} nk %pL$[}Њ^ןy$ZÝ/W@Q18 o“,"R陱yafgj!?\@)>T&@")p_.)*[aw)&'[` 70EgHJ tɮw`)P=|9gj65#($P64l%z!+hkaj>}Z ; b:)DaE ?(*$Tpl&J0b"`͗͝*I'FOOX~8 ח9D|uuKs9Fhf4y5ea83g$60gš5mwFl:ڀfћ[,(!w>'B(gZ3 j(1Q) 12vmcs=ҶEs#8s sljŝuFH g7KźtyK#{hAhy`Ǎ)Fd:7}4a^9V~~i"31߯a;>OVFa4wj%Q[3[1ؑ洃o%YJkPP=pX0$w-]~E$,XDd hLJdp9 &[%bx.'U+3"7-ϙi~T m%[pT67Ixy_ʕ9U*gsƀ'cڿ+:A*~2ƞQjbX[5cO>^)0WU'/dYrsH2Qvgi۝o$5FHo׉UH‘?7~-<%ݗ G>+|DyЬ_J\tSd#2<9!|g^3F} B,>}_[FSƐM_YQ(Pĥc]y=c_mSf Ώ'12Qm`?Fg"wOMRb9l.2~Pt0o.҆.3]W9l# hs^_۠sHv ݉fܯ GœU݋өyp|-,L8BCD菒 ڂ{. Vހv]r I!Cw|G&jlErUtËd]y|ZLl|~/IM?SC7p)oV97*˫}i3#wW4iCF:+DQKAFnɉ=i:@nΌm}2l .h;*N1ͺ=vK7dL.iœgF;Ȫ6$B߲0tcvRl4eu[7y5Q=%a\Fau5nK|Aϵ+0W#6\N }6`\q}S'gX?3 o+ו) &Y^|_7 "+_`i6jA-AFENKm(6VcÅг[KտG%(Fx]Wq_]f3>u˫Aw杔NoɩlhakH})\2֛Gط\!n6/9I&hEM"-/rTc+ Hda^x(^{ǏK6NWcTpTQE3]3aAŸ:UW~xq P%&h/[xuWZNKФ-"Q^x|.g-Jjv$V;72cN ó_[g#UU?fTH G<P:82ק0 0ȓ $$L"({>d#&sm1i D]JRw/a+4*LD0:zwA#8w+V׸QPR|o.1Zd:{pƞU,h{4x @W{3jilW]Nn3{I|SK `ʖŷ9@!)0`I,@'!qrׇ΀@QA i-~eYx+h93[H;p(bj[ kv2v˶}=x}3chYM2Au1 ֣]\ޠVJ`MV^N;9x?龥t! /W Ӈtd+U" AKvՓSc`|l:O\翵ߒr5^8Fh:+rg':εκQmBHt lx(70QVdv6Mئg\cm~暆gIG k!u"g혾-Uen%ɪ7ʒ[pU9yjvj2'ᨶ_ ^߳O?O*LArg怗WXR/ WBpY9R[⭔;S5{aKp&CnH 2O*?;vo[oq 뜼2c`2TwL6ok4^ ꢀD,Rx "@NӎPr$a-HeIRjAUAW^ED$B٠4Xx 7 ʌ]_sM ,KS7Zf-ݒq)-k?9Gu=,f3S|[/6F3u$ihx/:BJ@ [mC8sT6OJT\\n᳏?"Q ta1ub|2+5PG9 ~2?ٟU")/u6(Ms n@^2b ׹} ʴ⢆k)0i_A<+j]>3 tz)a2-北*:CRt ɏҹS } ʮ͖ ,k8a \x\E :rۿvh욪^EHtp%c(a`@*oY?3 8=T5ʃ io-) ́kw"FQ'Fi8]{m5bkQ8&Vt;ЂpBu*!Ŏ:wiGk= wæYÒ"3rDcWv|,U;%h52!"n\?eH*pD&vq y떲umD^ :$94\A;F¶$ WU0g6 v2_ oz-˷i99;ay\=jw Ŀ^G.aw\YT'ܗQcm")yi>'-rׅd0ߧf:;@zM}IoGER"0Xdb5 Ơhe3/,1OV؂l6=onki/Eu ߡBn>G3SɊ#Т!i{zP/WWҼzk%M|cs&!oVw8 ?s-nrt|T$8a5-Y/-:o}b { K L&e*) s'O$O #ۏ~@up ȬsphkPԫsU?wo8o( yVCk7zHg,0RULR$Kor' :9t : bnL>P,`umZңeNDu[ڊ\/ݏ{xIHhn7+;~٣M C5mŽz^a !? ʛ5֦`lQ4^@@Z*Zk#*%Z?ʹyl\Z00D[{D.+ tqcBhl2>HvwlPp7r@(+Mb7]{YVTY`8y/Tίߑ*@SK|f,twzW3MZq'?J􍰚Xzep'jV:}<ܦz^m)E  벬tk iNj]3<·XoowJ>t/sl.۷])Qs cY8 NF[l[lmI =oh$IE( ȱH E&-_ĿK-hH] K u򬆛↽~KG{z/VRPܵ~ ÇRRVቚxWb5gѼР6 "CZ}d{YeVȻ/kFA;'w d.nA':?[RIB9I=\Orf]$ұ&-iHl3~h. e|m?{o6WK1yhP_O+UᲽQsm-RGX}|&eM("kn.h]s=\2Ȓ[N]+7RUv@oI ;aO8otO#s y>D;^<5eN+M:h#RGбo֠~|Z0oqst|4n$t:!|/fA3:HAi$$wyh̓ۺ7!4â`l.g o4ېt 7a)pFde=(Y4A=i7)G J~œOg46ŗʠjm ՗7n~'Qw,K{'k n]f֭"ca=$`yZVj>jly]Ҥ{YTfӑ˘1{xŷ@3%4Agb:@VW_F5on*YeQ ]}Ifno y0)\Î3aP 6#ʯ,tJ,ڮV lg!Mv>쌸$ @qPʷzF٭:*RV8[CH.Ƨ"HX*,b^a)cd"Px.le}$\-1ƿ>ݧG/ZQIN&g)qqR9j'mk\̯\nN(_;-H\nϗ Yc3lZt6r͘_n7)(ȫu~ i;!$ EZ+ oS5߻U*jN H {>} c~5"i#stlQq bs?J'V wnsGE>~A$I>8p R6P˳Wº-&:9q0{զpb@u8d::=;¹\vxDjqPV99/fYTa&Kp/ K83od~I P|z+0eOCh=O#H$ 72}|-)9:jpo$mUo8Me׏]z#FwbﻇDqpP]+.Edle5ןx=JRPL+Z (~K3Du!\%BKsNdЧzaCCl96scC*9´Ĺ꿹cy*c}+:R>1_gS3搒"u7C;/%⥀TR(3*X,$b _172uy_}Y=uI  =C^dL{JSl{7$B)Z܄l"EiMj.) Ӱ%E 7NCl:! ΔS/gso,uPUWS2vןn~O4pZ*ܬAWЊ n[Jilc)IM*Nϔ#Z͑"8C&6f ˃"aɭpܐg 5g@5i3;osjyAo:EBMtg}Ʉ֩ ns bWJ:)IX+%"#Um?.d^hfӱ9W~Fo9WV`jԇnZtژ2)Lb/8))gm@2ͩ:t1umܿͥ_m©"֯#!KBfKߏ.7mjg@rW~57eU6?切iPQxԳ-cQLxSiXqjR3ٮ G,rA͏msNjpUfxopʇV: ;#AbHIhNxykNxjr7M?g\OY:pSm]Q{[ՆMghjL}`N®XnƓBfmYyRCAu6Cc|qo]vxv(e~ܲF$w1NE/47peվѫ6}k ZejVKg4,.kV{#sū}>!Tԙ{G~еz6jojb?eU4h;/nQwYpSHsLP4UN:gy8w,p!H*ķwݹɢzv{" KlW p't.QzjO<Э1_q`&-d)a:^$d`W*|b?l>>*6?'&}yX""VӬ*!>U_}uߪѢ3\+mC!qSjYAvPw,ҌjKRx}󠰈(2WIAz[ HźlWGf˱@juTDN zP `!Ub E9_JeЎ?#q7T?9+ Z=퀲] n'!i-?Opz K*wEG+Wa&;Y\Ww tVɴ Qg6 `l`8(#*uM2q\.P\wiё*|~;6> + ]3!`qi }S'm y pWkm0xR1afF|\7TaمO!HD#ls?1aOxP'EA% I'xnRDDo^Bl-ͻHɴ4HqY(Q{>>L'Uކբ~ݢWђ?-?(ea:Zƹ3Ö|?ݛ t)pni:@@oI?^J婹ϦֆtFҳd=PE&f'{uπe{ kxm!.+Ԭ8{## >Z""K WBpiu$>3R:[_x/Y㲿Sͱ/*مyټ AFЙ]hւ-DlQ__^(Q0Qd rEgq .T-R܊H`Osi M%4?LyW~.8‰5&%zPdoCd[rmTqTkzj9QvOݫߌc|U@Ѿx-nay{A%}#LL?a3낍ϻq9m~[½AӮ@o[niTe]r$tfd5ѹI(uW/#$o'X]ef_ neR-Wjf8X9%W\N ٰ/:]7oc|bՃիqi j6X? w_B=ZHM0-JVWsA֪F+> y*3 "%RZCo H~ÌFNUr0c2y6 8R;="|^Ku! ϬxIh]8suvz6YG:tw",MNvs_i:{(Syk1h$TgM򮠀$ EA9*?xz&]-HKag:>K+F˸() ~9Z%yD1/;VLޅN{Fp?!8folpl周>x7tig@6J>~׮j5_$kp (xtraa&t[OD^!װv8yO$A$ ӱxau%ez@' @&wJ.]*"gU HW/()Ppi$;9Ep btڿM_j##^tQ3/4T잠hh05rZm+Z#Ll$%aYטkg;dcKy5ڕSY5X32G%8)Ɇ<Mb4|exW]-E<Z0ImHR$ QH5 wV-]glekU,]P2)D* [iBzMXNC}x)/-fL 9fZ+P>gk|Ew]6f߰<,$-, r?,EgcTa 忚d~!!`2A*zȑE+A($3{KOft/#4gdJ|bLW @Djoj絎6.p;u_C;1ӾD Qh s {Ӡi(4}d+:֠ZZM +Y􋹨c/8 DZ8f+Zm*弲j8ZFй.8'{Eh!qP<&1C5aLr@^2Wc`ztxһeJ5m߰:C{oXuD%)(ɴ#lw"^h{62 u_姨wejc?'U|瀌<0e{̖CB,S@@HZ%hwJ!p-q0 .f:?i+sm7Х~=W5s*σX99UYz8YQI6p|8W;>}e%Vbfum_( a(2@% ގķ,2$юJk }4'RdznWA7Tut1UY+{lM'̃W?/ٗl KM _m S١dP:s>n *0i(%lʳ$dDpYryN6G6O0R ^ K$%OSk)[l`b.`a<" P Mڧ%yW8x)>?;HY._ʗm7`u;YC'ʮC 5"CjGqXHb1@`uhxwm=|.>i\ `/L qTD6|Ă!T85)-^0,Pa v[4Vqa>`wrUnP6'FcoO*u< )p`rȥg.1w>7jY/*ޮD(Yqm aB#st³pw%r92,`Mgɡ^Db&VI7쭇dBYks}> @|=xm:)쨸7$x)x4qʢ/l.-8iR>v!i/oϢ tƉ72M,0o#4돊q]I9d4^v?r<l];}:IV:nͩ/rK5Csa;{>O:#%`1f982h['F/WUO'rQ֍[ 3/:_/(Ż/Ny9Vp1x󀻲ay'KԪeX·9к2=Ln:$NQ6OgjhyJzöVOo_WF}%XMg]_mor>1ܤ^v~NRӀWYQ:$l03/%Ů͠w5NX;w%fTuSHh|?cAQ(2Ԏÿ6[v߀"v]tڽ uh Ƿ3S[[UT[-6OA*UyEIV#IW/sGMzғ71R=>o=Ӡ<)9kyGn*j96tbSܘE;D2 ($D+2d8S@(Rѣ_􋘮a\pz,z>PɷID1 꿣]/1S|8YocZXcbppZtjg1%5?)v4;@_If?#uuhc@Wbmdd͜7k׮C8~Wg߯${:(5xsW>#jxwQQH'bFvĺHcR֔C=~(8ϝn@]u zN~hbj~ٹ+Xʿ4vWAO5fCyL^RRϓ>ZHF*!5>~eWof0xF-Mug30VȪrG]k *1*zje1%7O4^ژ=j},0HvVe,L_ijra@sϰVZ;lPhHa+Sz9h&tuqӮIkǭdr54UO({%?jFN:0H+K  @1Ǭk WKWY)CJ8 F ` +\:sUM"%DźJrRdZrc#sj'}i\%Ah%Gy$& t^C:d*K{s~bDnH8U8ȋ)Ŀ:clҗCVD8dFjM _EGM֤ƜWm;fR85S1?N`"v۲hv! ) q}d;$ú>ۯ]rHt\!;C[wRW.N#Rs4{eӥ"&O2 )ǚxq|$0݉PFտqyUlhVz GA1N/0ul=gZk^bM&{Rc$di4'o"4YF'ы1Y<6uQY}< A85?Q떿 ,8~ F%_ٷk=1Jԯ Q( >ozߚ/2$f.(FXvzGM]9.{Ն@V 7pߛp״8I#~}vmly#lg\MNv8dX8wldW;нc{HߡBa4kp,/W KɁPlZYT^+k+ [ڴ|e'Q=ݣIny5T8#-`E!~ p߇EO?[P[/`E^GJ߸K0FhbVHӍߓy9>) jS jGJi;[X7H;]i e%>7z#a7fI<6/xVCgc;`#L͹A@qI*McF{PtweSKOJ| ͠.ӈ~q0Mw<&<fdZ̫Vb)ye>$.xӴ3CLד+Awr,+1CM~9{/Ȣhk ǒ/#|@LU kj֌00{a + #OxhEؔh٩!^]*&vre\42 5Y"*aAX4ti)Yn2[ 0?Z?ctS L?!c)'f2Y!.3qJP/y/:ږ[R!Fhu6RzIi((jYYb Pz)õK d=,?$2 $(*d=+YPޱ `2J'g\kgBǣd4l(zJ2-b rVcozW}7#c](eNTrW^?$iAD5hfH#X0EJVtSbo32M?Zpr.{}.`jIZ>wصr#\N_ƭ \4q&͙?_t#,΁@_om %@I@7q12q?|UA:CV-'`*Y2>NxBq ׃nuĔHb=y6g_ T$@CAq{ZJe*Pe KV=l}na &]U_&=[P 6Dk .I0.^)wiƽ<<*Z '0|tNiԤ$ !x[~C>egS|Rb +l rgq5ڟux5^X -u{ x$CsJtY{ĝtza}TR(+~,D(6=n74HvG Bd-vkHf⵷;0>B̓6I߻d9fV(bu}E;q<B# r5 %V\.Ŀmq2:eYO)288~n>VJ5cVzY..A22  Zm =V!f%} 1NVk7$-9n DmJ0Z4JN.C1b^+XG̼BM`ZD_ϔ4rsL:ߦ#$sv*suWeHh壧uI?7t5]8֢v񔾛rdK0^W75NαNn?uxBnm/>QZƅ0g5g5}d|( }nB ~dLK$4 wW쎾G3JWrUn;px1OH ~M?TY~|@Vy[j5Ȳi)$lq9hQ#`ė}0_ :Tu5]ND!ܔTW gkm= !]$'@qv/v#}:AɴA> t׈{{;9h*չNDX~6U6|X7kJ#\nf~a >kVBtBË+j8Bon% =gfN&u 8" zzo"3pgHy.4g{^U7n6ߩuj]lsL?iˀ\|G+u<>yOZt҆'E{N .e:1p\0D'|Z:<~EZ!d#34e2d6#vWDR=A+o\C6dBREYP۝hH?W"e(7yEw; (ω'h'r(w. 8/Ĉ"NG:I.[fIRĉqa#kl.; 9|8;0p;u r9hRJM_HyqA* Z- w htC?̫37D M/|V~o}_=n-m"#xZ!S6[.s'@6ݏ2i<%dL|$ܢWo`;}FR ^N.צ$ T pB@@jfWi{M !!wU-Jau߹{Fle͕KJ*kLWf]+H~w9*\D&bY  Ԯ*?`9Y<4.(>*~%4X>7x*6}/=DٖfOp];{nh2c}CTOZf_.使ʳIV6*#ս{ƘwҌRc9|<;nK 68#iF\I%@U*VW'n.t$/  CNJdʃ9h0ňPoZ3q],i<'&ǧ)SR`@h, Uoӑ:D *Yl>Ϛ> zܬ=ZԬ-UBά+<"ƬVY+u#3EchZ AN.S 7ߺB( 'Q Vc"΁ʩuhQJC@aᣙW6~Ȕ o}<++k(X'T 6SEQ4]\g1ksϋ!qtw#ʼns$J `xOr!9ϦԴd>n_|d FdMA2 ZC[8Ly<%0G>/XJ z>E˪6%N` rI@۵eI`\KDp iLm2_zB?"G W \@)frIU:+,qh9L9`H![WڙRʶ(6CʦQP@r Vso: a/]P u ӗ@v;&$Q쟾sntY`w(LVӠh${gN뭷F UEQxFrqN_^2մGP4C?|>LzCo?<Yn>I DSd;]oQS@M7jPjW Df*Ӗ׾_9z <'oz<:.:\ !~HmbM(J?u~_ zopE3zOM@g;w7iJ?y {'F/4L8rF@0[ò&,@$̰"rŢ:,̏鲤I*}=8#^;W1eȣTBZp$;K:g&5;F@ѡ'5>Ֆ5ɖسmVެL^B;UVKDC8P F TrXņ9 n㪭uՓp3A{;C)Ld-Dž=UwI򏺢Uy6@I;T3~>oT~xa-XKGӴCuR,"  b&$KGR5Tsb@zA(ȔhC ʀáu\RL]S>s;liie, xXҲ?50A~L3o4ӛ_ Z^k;@qgO3oMj1H7B/z WHP %3=:ifgvq=) LWa\[HٰTA&VMЧ3@9+ss+kyw|ic2ol^[֌ _9k1ʛLhEbLA8236B@W&,q>"0.+%GTƒ/ۤr##g'hX;l{ouLov5U]1RAՏ˪+h/V>-Z!Şwc0L>; s:sc@lFJ>bt;"O-9vfp "dT|fI5gM/ /V: TLʗGL#@! I~09 ]WNaRZVL!n;mq{@WV'dco 8x}LipN&Y){3O+-"#L[ccij*亍scgFn3c׋Z2K"5$pD־įTU<v۔}6tsJPC9]gZZI5$^ۂ;AzdP\7{ FAoI#p-7F+?)j൑t ct,n;@^顧stՊCqg_mNe ]}F }?auksDz]S n@kǹ;$@\ukKaP8P_qҗaGݒaWcwT={S CpHj#2gZxw~M0Q,Kj:Þc yrp : @o^κXА~4bmO;L3&YuY 4J<)T3?d$$ &.xW@*kN:9s])tN^GOT.Cjc)NCocTzH͏e?8N#qP#c =967plG ]z0-曀lg<qM0w`+d+hOڄH$@vaEQf\*լ41&{%z/YeNJC1!oC .θdքMsCS+نfu9Rjn>L _tf 9 8fYE]e ]{ƶ r0Fi7nֹ @$qhH饶)TOOrosͤ2!D5Bc.|cy4/οQ=WGewG짩9@=h6Cs(eQ=2OGRIvSrxi@l\UŦ-X ;4MOv͋]YL5@퐆}Ɗ Ae?pE-9)%}`94D0B\+Pt⁰}#9:>r rg?y"9*H)%:+$RIʋOb͆ -?ժg?l}Js[jz/t.n ǏEN/xv4Ԏ`#`h))\΀hQ]<Ĥ\I;涟9ެ  `Ile pP ޭ=rq'K]֩}RfETH@J]]: ɇ q!Q`<>M3.QJ8. @tR3 +D~ez3s7U? Ɣİso-w&6s21t R|Qњsp59P"g^aH U:eg*ɩj@켶-sfW͜h5qp){g 4-̄_MǍ}~u:!XEs(;3"/E`~Yɕ3#D5?Ћ^^.D>pQ7ﮂ5ӳRݛ@ zMϩ[#R6U]+;oJI$3"hFj:\-C٩vrDƓk??ak-<+.$nQæyZ;Tikoc|?Rtqv_%e l" Opk]߽DV| )^e_<;IALlCم֒\|1w,H@EYn v.0 gRDZ098/}|z8Ksʜy.fRBt=G(x :߾%; 4(~ RTm)"*y' Ld# #åSg*[W$+KN5ko9_ٛ lVxWϖu()W~ f_)Q f{5_!GIzc+qzu(owO&b7΁ 74^ hnVRz(m[ʃ"I&Z:9Rc~ r~Kq‹sIPsqgTQ7%oN/S愨y%Q)Wl^ Q/=2 0(~kw6I @,C&?p%^`mC~w^,Uyϗ6W3mŊ|bϚWRvΨ&3D`E5Sb,(+^b=;W 5XA'vbv2o38 vH@EESχ@:mƚ*kp(|pȭRږ_O,Y{@"t8Q8,A-. $([K6ۑ$S%;ka=uڨ'max!g+S{F[.Cysx{>Pl\Rч{vW@4pW"@5&@Z4bt]^ikiSe>(<:; /:zʜ3@S  ^u5N 7Dn@j=&=:>)_`xwXkF#B P6.PÀxjy'b}+*\{xtx Fy@4ҳqe;ldk⻺=VMHCXPx:_%1: l]BCd@ceU=kx@'2*:(`h/G˷_|Vw`E#d=`w@m[Q[#`'>+࣊R=\7l|NPZeiE gRJJL0'UkKV~`R3xYY*($#j>¹ik51"5x) Ly[SjF tTE )1+5hm8ZOfsR5֑^C*t9 S'N7:XiGuϽn.H•w*Nߨ:p-G$fG4 \Nԡp{oD<&/wS/e >*Mܷ6aӱֈV&LS\\mtTvj5x%]%w)=p p0*Rӷ U`:-GxQ6<&"TxJ^W%O݃شvǐɕb]KI͠Ѩkj~X|;? Vw󊞸̮B`~K$;mw\+P^i+NԊ^R`ɬpMbOqI&ѐSnGpgr#!đ"ly}/#KP; N]L7G]n&͎,9bOW]a_ˬ3Wht@ \CEeX;6RaDj{DO'yQ15 dbΒ={#]̟Zp13P̩4c#?%[Ikr+{Xá?:;up>cM6tƲ2^:t.M!~XCXYg=FѬ+>k;&*MsIsMtRmuU-S6y,bTO[G+rݱrV$.+:W}8i3R)L/ XPHu/UX 58rz{lJoտ^٦!~[\ /GSVW uBI<er;pXZVW"N] *z\W #_$b;l5 9Gыy$ eϨD2q(\R p" myw}R)@,h}O"k^Ql[*n> 67c9ϢEy\ Brf_CrU&HWJX-_*of#\_ey,SzX> `CQYξHm2yYPFʸR[޿8 zX.m O~W6 ɤWc֬(U}OVxIv MqAJϢ}`(߄ndRwq djFIG+HtmI}ugKGQUVKЫ\y˞[VL` ?%GB?I7ȺA]1L__^p1;V`&!sCð Dbh)~ zP JoR:lW{ Wl+$BLdf,m-h4T37xNV.+X/w>O l:s𡋖tX6G5m,*f!rl[[ a~b8J [+Jڗo9򸓥bL/]D6QS66)y^F ̭W]?S{_ܕrgT O7rl8^k_yNAy6l-- djû}#@@,ozu5q]{*9ȊQlۭi`@*w zۍig)ڿjR;3,6j]~8׹o@N@21ΩL<_8xr JV3[~qw[MXZ+lVW=V"^g>Ofb6Mk2:/˪/EZ '+"+L.Pm]d791#h~gS^*׻C[@jqyf}ewjH 2Ǟ [Ԯ$k҈(Ho߽تh9|p7ՈewRO,vg;Ig&kQ;HZph#^Cp~H'!I^-~XscS)f68'OoҔ]lH1c+,΍&Z)lMƕu9W7#?^yQWӫ<b>.O ͻ`S<<[/jw q_//ØB #tE;$pyKkS5g%l|}fWT^ ҇;[y+#H\5Nd~D q1* }P@wT=K Xc :ag]wL~,|d4k jki($a͍jJJ3tCTCAyp5@dj۸]k2rȺY#W8PhPab'd'YEVʹVR= 6ɬ_EJֈLm_/Ó7E]16õ/֒PR[JK+߫@Z'7>Vk艐he(Tecђu?(|7|e"h( zVVQz9-3z/'4F[d2T- d- 9TfކN \q&y7x;i3mxϾ)tL^% :Fl줨tgDʱkPZ%f: z `md@5: l@5adSˬ"=09>F;6I惺Z0Wɯ+"E4g W7[k)񋥣ZW' *Ƙ׫ȵP:T!{Y\:YRT|kdaV`7JSx2EUtuq ϴ߀7W,wٍKc p>_eߗ'RR /xE@34p^_J6(pU) j6 P$xH0‹VˡA'HRC  ?C* '=G'ˁSHh2S"S)C"oz_+:aUwW"ID U]3q(N[QDq-b]lݢ _4> \Ėw2CI/kjJQ4WhIVʗo3rk%@$i!wwHctJ47~G48k^(q5iV _)OZ}˗Z=_ >ANfR0JڕroM>#LQkFڭSc5FhbYy"`̀i\Gfp#NrU|>N{a.zxħ7yV|F+9_1ԨeEicL8 iq6%PIKͯ5Yk3 A*PP?Ef%|ˊ+ݩ9dcNo(Ԑc7!|}}oUOϠI| .e^8:LfX}\'$E&.'whWh.9ufiTlR9fC7 e)!-aŞFHA&L7+_7ǘ>tRe's1q~6.'S8k Ft12@ T"k{s2emꋗn6~ i?f`HڛO:83R9J#%N0G˼>fn7Ѧ[}2XӒ0)6~E7 k೾L(C ЄeST] Kdn/a IK>7v~S] {9~<=$d!U.1֑'$^^èʵЃA-U $TN<6n"c@+t/熛oo #D˜ԯ tV[YɼX;HzoAbPIisʳ{gcᴁ;꿓bEI$jU `>^XInS|&@#7QC-`}"\{{ZL&IaEٞUGJtto|h9Z;_ĺRfW 緢('|Z gzLJ_h:|/̫zuᕢ-CJP,݆ Gw[0a5Q!!\cD=!wwLix</+ nۂ.Ҩw1.s+䞷[ 4=syo"]DLVQ #I' -焅lSyK\ehH&uok8 5,^NFظ담frzbM*"c SiwSdZ9]=ݞ%zR}FfOPknۓ\זV8o4 sfJ"O/ {!W/.mת 󿜼vH[/q8ϕbc2zF 5shko,yMc&pp|{h!R4L~otjOșjg@.gQSHCC..M". l}1#?a{#c 'ͷ+R;ݺP禸>8^ 0H qJZߏO P ѱKҟ.Ǻ_"yvoV|'Czh]zhFPt|ސ ("gu)Cqx`ůJϲbT)5P" ӃܰNKU')d^0$ KNlx;RI-TXː|נ8]sk4C"Dy65^-t!";7IsWЁsAJ{"I4NM-T'\"Hh9aKO{;m/DtD]W@%?\vDalp>?kG СCr1a2Yozs'׺ѐ/T:Wr̞{ -zQu[~4"5 d04Οh?eF`>\{Ix3 nك=32 Fc|?ndم&o^տd g=`7xJWN(>&d.α!ڊ&3+K5\ }p~}<Iͥ.,i%:^<&Rqql]<cY )6%\x)/(;l\^5?Պg*l>A{oi?Hc3r1++>,ұ%^ߵK; e;U ԉE7zjn^ch ݵ|VV US.ۅiʴV!<dF*dt_ :/8TF5a)}jtD5k5MEʮQ7 ⳧.oZ {1r@‘g.#({ۓc\]rbn biEaP`b~q}5;F<_N|U?҂>i.Ao?}Nfq t66p]iT!Jk5JC4@g( 'ӀQhي"b=l%' ]Mbc|1t> -z,V2_@lV==EݝB~0aT}LCō^f5΃jON6 @whWV%?ʣ2ZH:,~TA`es3|,AȤڭRe|>`qa tDZROrIF b_\ph8Ag NC蛰ug@5ՔXдnux䵏8X9 9K@ڿU^\ v?fCoYF@}4crj",g}(FCch7Qt޻<x 8C䭿q="Lb$$y_\P۲Q!+hڅ(00u|}O~ I" &y4bF>M A&oCV೟~"k]sV)yx%s~} w7/] T+ ԀZ`xu:CR?7r Ͽ C^zq|Rҏ9^#ˮ=IO`O dL1o2 l4G:i}I}Z:*Fq[-s}CoS,*Sê~u["1B4磽~4m>-7k&sA8D\̍cK%2'ޒÛ"ڃcF.=PerRl?9UCα+t 42bAzdo~*Ƹ5͎I }`f%Y1r8q\_|ƛfm^"gi0 j_1w,bwj=,(WF.Ý:#sf`\X&%I$KҞM+:kc.j.l9 Ϋobwt7 ׏,Ȯ7=.pu6u0k̐nHH rv6n3kΧ'9\1~hrBQB78fw{~㣊τ?˞ŻCwnN{Bq Ɖ^>caxh $ ;!^ZLGőYlW7)Qu66h՝ r+b ϰs@@P0QW} bH>^P k<*/dv(ܺN}|uMdp.oxEH[/5wD\K^uD>*SD`'plY"sTB$CY8=FRYQ*QPLJ_@OVDpe~f&XU*1oU%cmֽ{vزr_h$}cMv@Ps5:E[drYkx!h*aƘ`Nb]ppiOAJ'd` )[HS:$8N`p˽85=;7^ hT (!&JF}tvY4])qc?_Fq7؋,$a>a`g- .^11Bh<IO\h$*iӌęG+kTHD㐕Ԃ^-o 0w8.F8FEJhd$x~tȎ8pq yrl6ɱ98{ؙ}e~ I<Wj}__rhXa(ϟ|.W7".%pFQ(s#M}I$C*03 +pnDt8P|u BtPibGH#bߋgxΙފDzbCaqؘcR(z(Tr0cmxg@1f~g,g UO&m̋ 9O1V M,M'H@SW1_G: mz{ DTY~Aݵ`]jެq]2- t8q =(}TRjzr#FI׻X *0>78lZ٥@i[f1(aا'TJG+=4@1έ{,\|g*r6i"xt%>xUlŮ3AFg8u4cA֊`YXH,FW9) CZŐ䜹Qj x'e^xf{-\*h\tc5˳I$Ef5~08|O\Ѻ]uE$wGʟ7&F;plypPrۍ9y/Gg@p\jk) n}>Eӧe GޏG3%\2%QϑJArvIvx oU}<<:HQ-a\+Nn|9b>a9,C芺Dαytk<єHhF ;|;Qs=|ES0VTyVB@Zlo0EW{Y <^wN,{f99B- *i4ޞlۂ_v$")Rʬ/[ovl~IVۭw/k`'Wu>"HЙ r @L jqsUW)Zl/rMџ#BDE>#. 3I}9&.iYay=mVEuf%`[ƂdTsQ%eMg~[i4xUܭr0,94FjQ@C'BH/ .K|i3߅W"֋zt뫬.xDYs4{%?j#8̣Y~,`>t"^ ~F_r3W&n97㞦u`_ +lh˃!=Q-ur|}3uUi{S~ǙN U+fZMzÓaCD%A딗53"$L?Ӄ1n ^OB^;r?tX.ݺ wնDPOkbͳ%%vB yFl+?lSJtk I85WeAM qw(6@ګC9{4C+|@FpkNaS-@CZxL"gWa}\Vs *}*lqD)atΐHTouXr0冰x?Hpؑg??֢jR]D~ÖH`Y$^= 7ױg Ϯ(bɹe`4Ǵ'XSlG !>/o'飑6$0ēsv۞usvo(9=g.WJilhMn]߼ūvꗓxnmх9M,FуÓ.w9h/w B{v$J2 qҹ>մ/=2:aQEֻ4-"HC["ED cNFl+JR\Nm\r2@b;qhvRT ?rɘ2!ygT ~Ժ I6Xt-lSaB ` RL:/A2$"@/kb΂&I[^maQ=m8u]_=j/w ً@eҧQbk1?9+-=l6E|0]a t-cbr.CU&ţR^,4< G^,AӰJgKa\|&31O=F)TR )q,,$0<#^E8˞[b9+JW:0@RҹkzIx0 P'NQ{!xsA.ِaW*l(%;%;4P#j 0;yI nqzu$}l`{bL®:rytNe f*`ˎ9Bzq -v YvdDY#PhgOQ oP[>c`l]8r`U_p8Ur$ܖ ڏqU}kr}-R?W5o61VYb: 2_ Hugrk[~b ʹgA-{BNM~peS^Nbvr?Hf3ւEo^+"ǫ^{')=86f!]n{}hp9QLk3 ^馆c2淜/8#} ]]QK<+zLM FwpN|mS{~yUr~ ̆h[M JB<];JH#$aFx)+H7|3<ęYҞb2A57,?[r^mohTtI딧ܝ[6)sP^$R Xl=d 288uty| TzV FCuSA "WT7qpA`1˰D߇eWKŇw+!-t"™]&~Hw>(Fhqb%@Qg DT (D\lf8:BoQ&BMniS ;$# ơwR c&n*}|'@@1X{@BڋK|eZ /ioJr?ۣCnЋ!ZrEyȯj0JN{DX?p< D)KqKa7!=)c+x) IoAtD\8zSq?T3:sa{\X{2S!V*v|- p]a@%?'%ᒥ* *DkGyEo4oE%Zd;pFSup =ߛ"߮[{C{ۇZ0*3]'Euu%m<͠3<=!n70.{`[WFZJ46-Լ 36Y %7^elx!qft S`\8ԋ39Cӯ~+¶U'lS~Μ;S;E?}|+Yr=K먖`Tt!#{_5_2!DI6'n$Jiԡ`y1(څ~ˢג)2{l1{,o1Rh 3Z!XEJ*S9+E۫CoYMg31S2(!K۝ɢWtq^W.6]U0-'CcJA]ˁux(Hӭ (+ߜ&sPM PGз][B![d)mp=HrCD{mz+qbz/Eq @hghd2 G3LXcȯg3 C ]i<8D$_p@_y$OuB( 0ogf煁)S+q{@>]m*b"L=qw~KVH̗eۀN J,.H_3r?)TZwtXz(0'%0Ic"b4wr _Z!>I>S`b/+ܞSǙ&.+Q}TE~Gs#v$7C6uz.7PoH&/&TkJ$dV@P$O^; h !EOPS%)8+@4)uBg >Iea6͑ ߛ0){]'kC#ɿoC_ݨgZvf)O|N-ӣ͉cRl=}jQΞD")pl% |R .-] bjT;-)X>'5`t>b=ْ*YDXǧ_`'^OwK:c]dڲM ?+*=O% ?Wg!%#tM.8?ֶi^F9hKL6ܥ9.qgQUlk*f@WsB_mzQk)݆8 ;C>UC_vlYsз $BYNg)~BdoV-F<_Tv7qYY{4sIL0Zc W':! wߡrTx{e%pzl la ueeVAƳ*lE(:4?m+քq H;=>ZY>%11lmԽqn"/ 5AEuFsll/rhdHk,RX)i`X-䍯wUܱ젱oYHfrmŲ}ɿAoA9HH3铈[|.U38'\qRˎ[}lcաRל4mB2!GN%<]nr}m7 PBK$l؃"&l\4\8yBbܚDeU[FY,9;+Zcw~Sǹ &&/=p]vGo#۠-.Vl?!~)'b!IĬ% {#KAݐ]P6_BD O{WGyp x?w[U_rZzvۄ7,SLϿ fB@NeQ>u5J"Q :%z*eɄ4)zG*ǐކyfhz~6 "{CF(F@ tF3X\e^6]SӾs[eNx?~?T~HX;^'FDt2n)=݀eȂtF#߮yNUפC{8(CDHn*'ˊ? Adis':S?P˫߬nc^,#f`;Spv4\~߱!t#<3$'(!=pRKN."DG(udA$Q! E9Wz N"]E0\^>(=؂lI$RbneO[t+$+=!/ŵQN+گ?;"1;J+0u/k8?V¹&[C; m Z!c/Ġr%+GZkn XV82job."ϞVrljqDP+A)ض<@ȍ>WF1*`vN,(_0ݬ>cVC{4mÄ&9w$C)bsg]fV'=DKqg~)/NV_^oǰd `%0ȇll?OvS;?{="WAH`C>5d Y >@>zўTT 5YIqUN}S9zPo7hs4=eH>*%(}'Qpڥˆ. +{Du>\0T0 hID@9ͷ[56{Fۈ"udU1wq 8n F̓j$8`/7|ٟhx|LǛ㨊WOƙf𡀽'^:ۣ@{@FhbHWsjq* AJr$(n,8u:+xOlB:#!T3Ƥ?iY'7GѨu~)t)VEcoƽpL;X˃ &XCB5qcÚ(XL4,WKPBHʰPhhN[v]iSy/98a vUN`(jU8[Ngї=q csk;ݏ?voP(],$Dw: Zt`vBk쵚:3rFn!* )`@IlfƳM%0H:n ֜Ҝh(7Xdc a:t]XXY:x=Z0+i};*/-c.a-lN"x_16iE4qYQ:+YӻY"N?K~Gn6_;,xwze;p` %͍FXs]Jky㬲-yƏo(̆Bǒ/8' ۞Uxظ)Yw6r]X (D({ESБpꭽ YI eN xd:Q4X!^:j] !ՐL+h-eE׭ެGeEW?i. hT}ǻrYHdeͷڗmzl \ԫ˸(EI>~.Au%p8#*C@\"sFanxFZ;N9(U 끝BS\:sXdžCk oN![*AH.Q5V r @^-UBf!įBx/V r6YI9"ceFu(B-U,ӥAE.]iϘ4ҪÓM,{N[Шu/+hݱMucrƄ|ǫMUx|8Sx[H45̊,&Y$RCMѲY΅~wc>o3J$"m.HC q+;XأL^W5h٫0yg.!&&,1#CK`Sa(4*k[ Q1UooxiIXXh|n,BZ5T)- \Ejd th~,6r1 \;E JgVu/G>1yB)Q4N\\ǽ)ӊC-Ь7b&4&{mZo˱"ײ͒DqiMBTi@}BxS ^ a@:j\>ԅte91}w-Dop^ sNl)=gb>ܢYY;""+A!xQF 9nHWs e /^KON#is"Xht qZkE₺Q;c%l 4\NP@=]Cbt\9}N&fЀIưbu$ a`:_CL+gYK=0Ui 33^.@13;Ia*fh qQtaYJ&bM_D@"Ʈ"4h^VHW='8Hx;W"nQ-s){Mo`\s^8AW5{Tz ,S:A@ǣP0-,H¯/ Q='QRi}d6h8Ϟ0 _S-nð!" x+I<*v bդT^X%̇+5J!}N|WEY!JǢvO\yH$ˀ!RnkχܽFs4P8ϙ(z"ŁU%)@f Pt`77}~ac~QXO=G@o9Sh܍~a!7tq.Eep´i "&nsf k2n*(&_ wwZWaq+e{G iBk:̰q9ofH=.d6.ZI / ؁~tG'8 'rX1 FqwV )5Pף>ɞNu\=MbKm _ nVP|ds$/avtaE)HQ[$WuڎI"Ip = Ng/!lQ6@V2M'-^u@mCV`o_`V}Zs:ڧv!K _׃covrAtkvŝ.y #}G6pBL:+zR>p[nN2fAyC)OJ^]w'cI_~ͽx J֬? &w8^4fV79 0jo=дQQ>yu 1;*02rD~r^T=1w٣+|u?[_4e?^KWCɯl^\~H*FTR!'E*U,h#mH3W/Uw:ZwmPi*6UˠJaֆ¡ 4kH W0fhiqHr n4 MRcUw7Z/qX~fm}![דUqeb ߲lGpE '6]֯&Ytk: dI@dۙjĚIjr6[/#1tqcSk.Q}Um:v{hdž?\V]\p3ɘ9E}te %FGO$X& : '0$F7)HHu@)4YJYf>ϼq(uBrU ?aڋ­h(obk/b& S;aP2~\)n3kFYpQmzxEF>n3dmaX 2MR%iNA2 X!y5RZsL+| n~\NqCsF+J(LZi<{߮Ua]6ͱ\oւ D'ZtB%_xu24Xiu ﲵѭMPk%mĩ\`/zPIc&,,Ŕ.~7ەDiDzj&,~W}'=+*? 6BJ&֕CPf'b-r;TT拷 '滀< vchʗH3'cq!"ȪL.Dɽ|QؘR|J$1]u^lcZFD{J![3MnN\q75yb~Gkֺ 5qX4NƬ2 ,;OFeTG̰~saq*<,{|U0bT0՗ںp欄󾎉XK+AI8.fW5{.5*1^8Đ!S\:R8 < ]8&i8gT :L\_]#!ŧH5mP`ܑg{:uGϝ?w(yaF[!^ vJ,Y,g&R(c{AU\G(3_߸j-v t> !K05I'u,O'_g,khHt`Ewz AQ6`E/펃閔)#&BͅQjׅC'.F.Z V LRr|6(8[ߕ]4-BNvԄ#,}XZYG:Btv nl5"PV6 |`1A!ڬ*iݪ2{(Mx>}ݢF5E?m'!va2yXg$A`{⫝̸:oy#K>} W珈6@VkbN-lƻa[YId@,mcu1-u-8j߁ de͝cb` 83R}S>̩B=kHq|S>9jpO]L $"NbH Y@9{.W{w,3#P^FsLaqv{F4>sjEYGżf]FSK.@ŕZu/mH.@$La\v?-5``ա]~\VRKˑhV^g@qR*3ŭcya|~W-i M#EÈkN ga#gzoh L&\3Ĭ0s)8H㰞b~;xݳY4ՀA, YcgO sHG=_dU%&;T a Xh{6Ϡ P>(W^fZ`+VNe+kRGSn'[0NBUnb(iy b 7EdNA~(Bm0N׸@4(#G/ $ HUzc+hayb,9 }]9ȷ k.Ɖe؂]@x?{%'.6)σvUSbu9QD԰,~s*Ev EA}) V . ΩY]F2eItW>\ʵ͜ Cx( 9à[0ћD 2@VZ)mމѶ^D?f݆oD\wN#@%_P3{cuNǠIɌfQ`3ȍ/JEAnU1+os|T%~wKg3` S9[.)1ET{̡o© C\h?3c{OvXFރ tfyjj&OaT5bVk= uk]1MCv_VoK,&O8 )0HLv/A8/yrm_治|M)5E*Tbr,d{*9u;b-‘/g@K?v19=.5m`ީ <0 .ags~&5uK+דkDǃo#t)N簔.J3cr,*X*~[ß[L,>Rdmלjt"zFO"9y~Xl.p)6(=p52Q*ҫ廙ؼDN FZs#\ e0r*捁i w"PREG'˾a+AMsd"0A=y~_팩 C @#EzGZUT+e>B$,⻶o7>B> boJ,NH&BYt[vU'LL _iaFҒSOH'.LZ+&(# ;Ooo_pbvO\_iYU1㊡HJb:o.2M%oaJ!٘rm\p1mMzNV$T9M,)lYBUYZ4۞7 0Q-hwYk%z(ݟDk^:98Ī&-eq> bVoH^ӝk, zP݂q*4)Y dhpX=8LCXB[?c33"5 6Vmmwb;7⢊?cJ7(9"c5/E:eFP˳Xѻ0PU]m^ɨ'{P'[Y%=ÖsQzBi2.;pV-sPGK G| k/Hrl|@Kv ;mjЮmcN)zyr]2eܶV֯Y:e v _"skN g{bpG4AWD˨qo4s04E&Oc Lr ,Vl34M7^(džj& \q t lD2)qN٬p8dc`˔سl%VLtoΎ&1PK&r9\lP=B 榆8N6\J3oٮzUV8-Y6H )$8c;!{yXaysq yʋ4 ]U/M 'jʗF1x58Ʌ|Gbb4~tV`#?ef&: /`G(m QC,UlG⊢-iVAMp LjBs讌˙'ĵ|{^jmrU1 ӡ(9TOB !Qh>P :P[FM$O(rAїh,R`2PQ}'*k1p¶/rWn+M4j'P^kqHVv$0;pmQ~g6[zi88h\=C!* ,o Q[Ub 8 _vd_Xi5: (s_f@U{7/'Xf'z ZFA)`0<!B[ X!~pS;\kFyFafvܱq lKkk `8C5PVsԈ))5~K[l EVe|$?r=L"$p*1V$J7=]Ćg) c>bfe$[wFy<-2@8n<4q(l(lR׳@ Q"ȭ߭Ѯ'aew]R=C,v 2c0N; {D5+/K,ph [@oYpp2nZ[qa5F6[͕x4(#؄VBx=nkx1rqٜTݛgn JJ9t 5cH5`*9='Fl'(eJbWj6@m=o2,aN4yX;HpFC r2y%[D9a0fbلgc<5-/)XxlwAUɚ"-J 9\p !GUa\e{+WڤYBIQph  sYPT7+eD>a+d^ $@9|M8igWZ9WB!"UV⋅<(ZS%Ж9P3͕/l>(\p:ۑ]ˡ݀F|kֵ_!3d g|ޝ6Ā  f-{i{+ 7nJ2Lw S- G\AC,E1(um 5Kmpw\%̻ a|_%a(063z]:GA{eSjGmD`Z20:=%YTinTr4FH_]LqtjzQ{C@aoP?ƈcESiz-nVR hleN_rg_bRjsљlH,T P榎sL  ǻ۟||{#8GUxPZG+f/; /r_J0\9"jl$)+qxZdꛩ'[TwF*/[c4Hم+nU1KGy56Kw_==Z]K~_X+:1p]wznJ}>]8 ,=<Öܢh3Uz s":1 -=DA^lX9'@Z0 ZuX  巅y6j5[U.B~%yT.Hi|È 3}!-00f_=\{t 6Wx o\)!%HJ/y %>7,/8R:gaCA3HFuNȋ]ģ)J*'Y"zƿ@ZyC wkQ {X J޻yq$ _'s+3^p( .ځA' Üi"AvEc[ QV;ip'|R: Oc.6&طVwkSx=ђ/97CQ:hٯ3xcӲXEmlF㰑|b]1ij*Dܳ(_6ڒ*tOu` /B2˪+ L^#o#: 6pHzV:rUWTmw er39;vc-2/^o˽oa`kـ:3MΡ2lԋC e5 g f':`z2 `Jφ<U^]8YHk\$=-Yi!0ⷘ(p_6xI:30 tӀ`ߺ.DVuۋ_.qSl˴GJ]!q4#Jx}ϟ! pt5uMB{ a!]]In.BaX3Ԁ^O\ɱTB?5ZJF- B(j$2xq+ǥx0:lX/[%36kW^VTDx3gKe$Rhx+iϱj@llOɓW`۾!}pG1nuc/ (fpST!_ eU܄Y )cȏxsڪ `# WvgM6,UE?)q!xovs <.4tQbZ;x#>qj] ša3$5[&CpޠrAjX}ܳ|2α7~EȻEӛ90 Nn}i]AJؖjsSn3%K}ٮ<[Ky bhFqwoj=~icկ-(Y̠uGRpZ0ufk*&vb 1c/;exSy<@6]=m>6>0^:?"rN_ R59bv?_H 4)^OU-qM68eT-'E )bh$b6&'G|t?i{4NrFALm=ukqiǭ_K?/ R7]TM{yBSӦumJCF#׼sŋ?w{1cxY nU2~J-g_]~e%@W(/`'eJ@"RPf8'JIyZ^aR *X lȶ'x }8ZOjU]c&-;yݯ`wq;ܪ&,+XʿQu-,Ml[\ o8 ϡJul ñXl*}>GahϤΫaiSMc 3,jo~ϳwc*+?|5JVjz5a_~Ne&4F@V12{Iޥ[S0}n66fj8{3D|=;Ob7o1JRT,|} g.BP7hx5fWSg40;MH19vZ Z |Zim-fxl>ъ]aH˨qKo3=Z`տWP-ԮRO)2u8V"}'Os?L ^T GmK)ہI Q,U7kz$6ej'fgEtL]x[ZJIk" qmֿծA_'Cq@6CV;z@?c}Rb@2c%vm-.މ5km ;oU=P]@ oR`|f=]mf{tE֒~u]Bɱ2vVji?/b2'ܱ\!u2$)3@0TeL~ßu1MH~|kviñvvVmtD33H$ }ω73ò  <\лEcMr XK3óxP WEC%;*4{hhF-p"-Q\__%GL"n wsOupM?_ W"ˬ- ӋB:bW)PH<Hd,gӉ.%}T׮exL@z6=/"m*V2,}X+Qeado| :Qi9o0 4-Hq 5@Pt)O$_eM)_KvPU}y#rq7^:v&q;[/sPFʹP8PiH|c)iKXhA4dYxIڸdsJPcz 7ӧ‘F@'z^e H^/ ].o;2Э(Zqv4x__G Rp^e*@ߙ4vP6OIb}/e@*CU+&u8N >')d@)]{=]Y{o}wKmFOAkL6` ҽ.bT9 _gd;]2tx5qGUP%]hcV?6y:] C2u$w 7dX0ȗ/]viQm(;8Ο򣮞0uGٯҺKDz<2 0S%f5Rg a:>Ü4Q ' CPeX_݅{'[L;}^Oݒj[SVH<AUc&A&ǃ;K* dK,!?cifz=gƺVuxcHF,u*pY,(W DW.fH҃<\^xxqN<]6+ǍWGMؔ[ePo|/^eS73 bzwQ \ OMPl Ι/[-w/bS.ΎԎDi ^HI:6)P+ #6IGي3kd}aC(->FE&}Y;g'<*?TE&J6_\+0=baUZI"cK$Tǂ a,ѻ#G9R@|r9FNlj J?jN+$Q?$'lHYQB.itnԔy!#$2]*ћx;9 *~8;xwM#xE臑$1=X["k{؝Mo|ʣVUG|i0]]{6|m]mIt^ hST0Hp U )茼رqDxrrex ?eSbqՆI9Oon[pcBKlϽoʻoς\ynim`UD7}ŧI{pb9}Jngѽ?JЏO~y1EGrcWҋlc1lÉOKI"YN;k\vҀK^Aa"%>Fg*As9"/rm}kz >- hH`g}l^q6.}uvWVv8qM/v(m#VQ^UVxˮPH5*|)J4uYZu)XHK׮,1>.c Ò܃êEZv>7D<9ח݆r2wwqZmy!Yn]نS]|Ugi޳(lЊdFQGE3y&?@X p% :@A R0 r.2ZZ=I#`OGE{䚪M)!uӑUinh.kIYjr: ??Lcqf!YbofJ)<_ >*C\Pv?v`9aZ2*B&*dHϜ[&RlR޻گRA(d^Fs5wwrKۋ¸iTcԕ8KɃi͇Jd#B#fO),?2eylnx؉N÷qP ke#&c5 ":#,e3"b_;OrZee9pIW+x:i VȬKzpbK7jjyPB5нp X2١U<^K@Ag01"S /(mW2 YWPؾj? ܯjM7'p [3E[(Z`%x̛~., l /mLa9m9@A{|PFIY: ࡠ+DNK΋}+J+#;ʣ1]siK:E.3dͣ6l;=>a VI> 1=‹Җ`rpq]QmFD%8`=]sꬽP {1s|^u֙NYplZ{N_[S:|Wǀ|M[w<$ble&'}ź/{3ss"|CR]]7lq@9eQC S5$"xU L6 >PFC \Bڱm?$x (KoIr7.zY2z‹y{F1Vprt)Y]J`tg]z《Z#LǬC4w'g7uDWn?'`E*n,]Tɹ킍q.aF{Lo3R=OzU@鹾Jk2Ĕzl݋e-,R4l0WP4txDu_վ1/^6O0$X0JR31 u#{v ]< 3p%ޅ F/j_hcI^Dwڜ}uvqMYMrK` bO!TC)xrd!W4547g, wY˭Zvayzt`9l šCiCLӂ:Ӂ h(ݎiAZ j(=,T(O|553r8;&3 #}#\JFnpŌܚQ=)tJh~lI2~7CN~7O2? SҼ ^}ZD_w5}ucLk18(n:B1sX!7%_!G8j5 V?=W(/9{mmป ygѱ~H}=%p#=HT=[pmu^ A!Ѫa9Ar/\Xt41qUJ$mZk:L|+!qK0^*>|ulgFYU`w-*Xv6DO69fPPnœsHӬ\O~xńF;Oj=cú!H~yn1c{=E67X7}!}0S-'.(n_U)޴Ѵ'|=bط/D@ 523O\e:`tij~R{^86RqrsF>b{[(}W0x A |9SǺƀr-z7R+y? F4 Im?"ٷ0#ޚg5BԞQx\@( zwS}ছ4%>eij{E>WjZD'ׯ~~*[kdhho %A!+#̀Mّv./RoBťcx ٱqwS(bP܋lw?tzޟVwCѿ }© !-3ج`9?w{|UܶݤCvq=ZrCQÀOT.:>e \%\Vf >4x1g.)zW'b~Pk멱 8[Є^vT.)5 TwO"gAMFvK YS "?E_lgn^1j{>3֫M̦tp鷨($-0Ӏkig`I+sx}HE ԍkB\.ї䵷DI9Ĺsg:IE*` O< kn+pbQL\vN0EaES+i?n^N[$Yz~kUW,FSν63 nj7<imDjUi~{./[/<ԢofupG69-0퇡t^P) w5+\~H=KAM9ԙ~b=W&%ݿ'A{9]FO-;{cG7z%Co>8W^Kn7_g-(T hkLKװ1l *1çd!=O I>.L^xR<#Hm̞L,XJG/7%|pmMdGZVB/4vH S/b `7bW7=)sw<fz>D \Z[}o\T7g5W֫`j뚆5k}~=A+p7/js`߸ a΍su\(3 X?Bw^-*\My|,CmLLrO& hn㜺J~Sk- (}z7iӘߪ&_-v.d\#Op; ~ח,7_Cxr A,bn(ŷQzaviJ֒Žԑ9_n^D^H"3$nLbݹZ\䳎^߹aоwocPr(>mBOro@@5gȇ+}󗄬wSl~TǁЉ2lׅ$BמlMj8h}o"j<>Ϙ+.?{觎fk/qL`0.=_:]_E.@>+H .I͑v=MI٣K7]fiaH7cw<~ݾ!Z*{7љQ?hu~?`bߜgo#{B)NnjM&A 0X5':DO~].Lƶ ?u>NC2}o_p˃ Vis~MHP;auRآDݾ ZkO ZM"u^]ݢG{n-诗N~w-*t6ӾY]籂m"ʻp UwEх%J~Aq>jr|zX(w11WLX^Q^jvP6(?SaGjS4?d}}?ez^WWAEECi ,)77mK-K6~ˍ(WH\qnEsvŵ̴B*5F~G9Rn֚Ͳ mGP~Q > 1vћX̛m2\~t:0ŐAVy}_W&9WQz.?> ֍]j(RmE&9DNG;nxUASŬ̧Ʈ2~?,' 5G*癡 >%sl/y $-Bd1_)P`z%_X;*ѿOƞB-@*tk$lj\*,> )lQzL'@P)drm[gIj"n[(E/2P4O Pk^5Ϸ a3fՉ;'R+,Ҽ]N ODW^إ˲Tu`S(zzٓkaT~-l'TJ,\UH7j4 e} :B߁AVKA`^}x &OʝWb.ܯN&L˲smi]3mdU>j6жT7 "s/;H $Av 87@8|?3"{NWh)]*(?{&GZí&n1t=y=jSI%p#?1U}~z,ʈg,E,\$p ܈NЭK˧בg6]4><\˅ {ھKǿd88U]oE$ [QA/_?u>qzGq/.%I꿊 dqԩZCKPXЭ}`|nUNT!p aJ  rӌ)[UOOvi Iy{U!,!ޢb|ph-NґEz-F&u 6L|$P\휉 SYf5l,\^f/1GOָǧE̯VhUNK='ҤZ;-ӷKzۜo宥]kn+h9ԑmDX`']NL|,l͚9:oo:aF3#i2~ tҀ Fqγ{UxY*$d *mZLǾ ce.Nh$Zn^~k /Nt;]\(Cl,./A4 !-NCyRIh5h}˽y|xr#KYڸ}c,1-_mWP{;:hif\.]}]ӭ޳u&ƕĮ=Vñ]RF({c"9:|ebp 13AF{,BnZan>B5/vE;Y7Yޮ~v"wU#Hڔ $na6 ws) ˗&6f@Ӱ-ԉ$@X.۟LJWK2:f/8ըS=ƍy*QvtkhJwT}^,, #Z ,<;*|.@\Mq${Y}R<\䬦O>:>xU5COqȴuv2cV8M='.8l֓j@L^|GU`_ /ׇ3Uq6R\A ,tXkSފ! pˈ0vz> ui. c:rXTbh86™y,"sź&Է  4 @.iA w`%v%3VBk/?-` r&^;«z?dt<~1'n%1|tPr~Bu#oc]?N\TvX#JCI5C$$yLC'vzsq ҙ|sw>_ѤPGUXHjv1dM1_@:Wwq ǵ_& #?tn_$𷦣B>C>m_;: ]lLVNm8OJ!hDگ!8<]JqXM\sycyE ;w$ۗ&A%Q״)9iҷ/Zˤ!Yvk lNZo6G6tnWXXpwڣtT5Aq#U;M4bګ֯YG Z/~-j)h>Ht59%XB/ߋR{+!F [@i^-~s `@h|,xyY u~Y+h'P wBW\=66ydքv?xv ܋C'G/ԥ@@ ˻#ćY}WƙlKZwT9D r}ٴu@nmG;Y$6)V%N]liԟII ?iU3Z#*鼘T0TR#*d,,>#CؙTə#{z$^i"^־@i}/z?og閧x*#'X,k}ѯ5T}M@&qu0bhQ^J};_|J/Uj۾J!׳|$"!XI3E\kȨt,FIr?ņ|U 8nq]Ù-Ľ6-t0:=ub$n&T#^P>jކS\趷-tL7݅?|+Tqɧmy~i{Ӵ%,F"qT`CZdG`NsYl3frYa#R\8"%`C!0䟳xHFH*<)զ3Pՠ..ĻЅd<9^tw?2gբw]Y}}a;LʼnoWхBGyxuT%cDVZYvC65DULƁC!4Y[ FKϓvZm/(eo1}нl]6!6Ux| C)Fh[&V&„pz{)ZylUoVX/z+׏Q Wϙ@qV57Om~&VJńMS:=np]*Ϝf3sdz@}:ߚ߁y{?HRm:;2CMG|ok#F;߾ڟNOvSRFn!ص||>iִ!>w2\;{+_!)x6úHVe?NY^>20د;M,mk͟\qZ jƀʇ?%>ύe&˥pz[ _b`Zm Ľw$~;jᾓTG-UuTG8V)An4ݤwuXf&Tmfå籯]VanZ O#t"'xev֕oLP՜k4`!^J:qekk*ZbaV-&o9kM$O1Deq)uҘۦIfxf=4Y%Ϸm׀"ۣrH\"A*N囹 _BQ{|3l;wS^wN9<!jvoYmg&*}o|o<hTnf5cAzIW"nSg~% K.NAgqAoMvT 8M#ݺI>5I9v'cgy sK:迈E;d6}<-Z-]%S|gB>py'm~Q6jyYSq?]~@GNd>Jk;T͹z|&#3g['\z5sl @u ƓK(R2<$lp_!``xYGLV@rQa4[W2JNJt=Gqm4EgMR{aGHXwi~tBowߨO`ꜱs0{䪵ϙ(:dO\Zq}3#,43g\xyʌ 6P `NbӚ%x߷۱vʱEVI2 t~:u{ԩܼq= `;tUҾCAt{{l+{ZX)pJytt(X|U}m| =aӐ__:jD|BTBĀ?LT6=xM5+V:x`nֵ҉f)5뽜s{@+zXeB crt;t}Ǫ-B.ĮKcx/ظq-В\CJ/gt.! }pS}RHӧ4QȖt;-8H{S^w0m|T? F 6x<*rL ma5^u7nO[ 0+!e2p6>U[>[*HΦ~{X_{peO괹::q BjuĭF~S,VA}x")tnNEj:E/Gk]d='[gsA P]ƍ_m=1^5Ɂ'!D)8 G7sIZ}(==??F\AtRcܣsBHD0Mű~݂ GP#1n`u[Eo)=7 Ԣ+o.nX|!hȔ%R3\N,FFCN)s+*^SrZ3ES ~hacJo~˯Uŧ~pE8Y FZ?}i޹y(0&guOiOv7Rn7M:zif)\ ^Foiժyp'RP20rb7l|&kt7 J8O}z&B?i_A}Ҕ'H{~tj { 8w#cWG=ϟ7y:R&8Z[G]eEk_aI[lJ"?>0hRwuAӿ 'w:qD/(ӎ R\f ]ހ3LK6 5)8[#5ߚċ oЖStPs2*IX /UAj kgsbo`x y~Pe 2a.ۏIۚ?=- ^cYJ/{$SrlhKWĸTIk=}I="v߿Yu>KZjI?qg!DFk%ȭ˜hhH+2ozKqp0likDrWQN }N\6+\Wo=??r1~xȪzkyO[.;.j{_5s?RK𼺶|->ׁ|O@,!y;%~aв--mdp7QPŜ0$.N1eaO\:عBϝqB|o8]ݫ?l^iO؃1b:eR'j?||}v58D:(2+6&B$IC/vkyf}Z'ܻ'5Ai <5wLy-2ǭ9+,51'!vYzc9Q>7i3Em:. 'xB`t% /ti9tHEz,uk͍iiWXE(aa2@7ݺ qkS@wvL׀OvZc!s&Rbzz 2$%uz^+@mdf wgzd )>D!JZLg>Co' O7Vd<ԓx&U`ihHNk)j]rl'Wxl:W^v|lGiz3LNH㚧.>Av:eו]%W$}b Bˍ՜G`ΗլjcT|ۅԫ}cMCM|[s=A*qnh̙%ۢ=Uڝo_ ё5 յ!B4z80Ok+p9T4oz>K?”шzªxRxp|Қ@hvOUVg᤹DNsEq>YV~.fC*WFa|F 2{-2|I|EH紦 ~.7@GW1O^ZC4te`mrCɤcg^̇nbZlPywqRn9]Gphjyd<"}i;~M٧xlvzrn兯Ś$Ik5]^^4Q{vl^Qot{k{thFKu0F!f1rR>K=\&ݱ;?[=a5hĿ ;bpXd?5&xh/Ӏ_CHu?s 5AfV]mm?<<ގY6,nlT2]JnM@ܘX*Kt"2'rr_& 6_(x 1x]+p 4@^~fk`vE):,-K֝4L'Y M+RC${{eeGQ笩C^W86j etmdgQR{wV܇}݊-C)U|E>4RI3Ki4@5Mgw ClEBT1TJ6\/Q Xf<;)/Bfw`Sp $b~>ɮ0gl{$9[#ymoLP:ֹmc~$XVβY]ěg.RۤUTNu;y YGZom!. ]JӿRo^Fب&˓ ^g;HD4  0~cnz3Hje@\QqSw9Vs=dŦ7erhW;ҟ;d On$s/Oeuq9cn:ʎI 8y=6ݎH8 i5U  @|P=NWrPܢ=Bh¼WGŠ07WVF=,@ܼaTį'ї0UԉiSNeҵr{+ATErCHZӂU{d6&7UAvxOh%9gw~m} wjY15ϴ4[M Z̫_vAoU`^h&\PmlA{]<d F(e]4pʨvTC5b3K+\q\8hWʐp'o6-EFcqaZHEMViQ"kBWӬS: 4sHdo L^uq"w&+D`2,Q~?Њ6 E誤8BP`}lo^EH[JHd~/ull;z{ra2 ]N"m (0ހuW"Ԁ(UC. ˮX{ШB& p^G@[ Y3fw|^.sz^,ʆEz()-UR@,eI@xu(WK4}\+ѬkT3SX+tV{; /Ƌ]x.]oROOH?f^>m2'J=ec t92pi;I2E)5rŒDv.oo&-uI G )w@ !݃CI=k2~V]"._BF?.@QS(OWo̽٘DZ{H@&4A 2з>1 l*вcT϶>taab~#^xtr$ԜgV6EkL/xtܬd0"+Ax`Z*ۯ>:-P0sa$XË"hRou÷,|=:1Z2ŃR# nhi4߈EEҐ;J2Dk\ mQ$*t ]`'E [,.jI3W)JC9j|/-mlixZoi9;< ϗ~E~UnP2O&fkWV>s!`.@]ʐ%@Ë0ݟĂsQ-4%jpͪ:--mrZ h5AC{.?WQEzpH@'xL4ۀrw&pF;h.1ق {$@S:jy)Y 6S0F^aH!is!=9FiZEѱ{lTio3EK>p9c+0ޥk/g:Sؽ^_YwKDoD7T[Vh5#&,[  :ַ^KRr 2d֗P2 EgvҿQqt K2(M3f?OMkJ?P]Sq^nŦGoazD' 6Bgtċ?Y>Mx}ݔ\Cd0O[=lo'Кb՝W(ȗ|w!n95lSo**m=~Q2sz)Ԙt=4>w"EE31P#X\wȢbȢ~q6Z~`t*={R4k U3n;YD)Ig!`ıSDW ϓ}0:E-3dl$ VWŠ^i}ޱXi^['ɐ_/y^zwb=QCJ{R>@L7M8-V>i~zM]Hn(50f~'ToL|raCi5͉6 H\YTvr~8uǠL]e*U Mj7fҏ$nmZE*&",;"pDK X/s}[X KNc`+\|]q h`ȫJ|GZ,:O&' 6)2M 23P٢Ę&a e2=Dv|)Q[9C8e<%" ӭD4s͕W{IIliO/ЃQ`ݬ/]H /l^C@uhQl4.e,çLam Q;ÚFڹ-I"MJS-*[;Qt "FC;IffJ㥟LjK#2?rO{5:a}Zii]Z.q, W3i(HTNHz d mv 8~pF:R UZ \|FUlKZQVn@n~W?{t9/\%BgA ;:91"`/YI/ccbzL\;1n0m1)Sh*w0؝L@p}iM ؿ ]GS4I1?gL6ÏgR{?c5) JH+EXZXߞ :gx7_wl /"tvLnb) Us7q2&.ho)YZ5!az_(7/:ӷ06{ЭKі7ݏAyyI%c[ӻ=ceC$RPEwR7i];:N2­"pA/gw01dy|+ ,%Eú:ݟZ֑V?DOO՜WQ=1t|dt@>S?ibjzHσN)qyF#@p o&ޭ_ SX M/,OcXudэC5:SgrQ(Pa$)l/&c&rG+Yeb} T1n+.uouS,|J:puuZwTIuT= sܖǜRayQj\\6P*v;y:{AE:p62{O.Z {M3X+enlh:5OFGojцRLRn).⣒_* y-l씶F{NpVTݢ57c|&*R;yɫnNKN.uTo/Wws0#ºb.Iq>QQajO%Ŧ0xaЧQh1O!1Ӡz/O"ܙQeI+w)cumGc{&༬$QB{pOS )et|8l"ި a8WmctZm3G =R_(^M 3n3:?=(7iυP7k죵a|ÂeדylK"oYVߧWKjG4l]Ǚ(uZrCҖR ;vӫ01GK͊2*(X.>Q-+%%NlU.uRÓʆvXA pj5Zos[Z冁 IU]:&Fb4n{|.ԍe:vOrNUY}Io5_x̊b0 n3eHS{ =49..mekLFE:<uS^5rWdd.vW  CP- nxgOww~[FISБC5{.&@hBڐd%gDYf|jWZ_u;`eO`@ᘢ&|7^fX=n4s6['#K7ۻg<6&W+6ζC%x>_;$I:UѯmڢHٵ4OW+p=V 9t~Zh&g[.4'h] m*<8As_`= VXoD#hw~;lm`؋'{cqk:{n' O:۷{}FqY*Xu4C~8^J@8!j{Fbb0~|3fo|ṾqlU&pw[}y$ B4^>CTR#fu_?㴽91Hv8iq}2}|tޚ-dhF'O<7V5=Pm[Zd~ku>I5<4h'|e0ؙ̿拦a.;zvi*% p-;=ɏ㩯O.kl+/coF'MA#6.l-xf?׿;tkN?lqFFEX#E_AAK.Ղ+h̴drY^Ƥf7^啶[S ^bs3:/%ݺ+^(GکCp|[4ʕ#n^"ߜ^X[?o65#s ip4hq ~p)\ ]Z36;6V.c^m Os݌tew7 U߶D=Aqsٵ1a OOS)]rIbJ j66.`PVi˳+g=J‹ˊo&bM{danHZW f+]S9 덥MkO9] fl僵$k_ CZ9WbT]m= 94  } }`xfR: ݅taaX+Ѷ8qDvWϾ}i ˝_Suݓd(2  =Åf0?t}n׵0#9]RÿT~&Y͕nլHǛOxdT4"eT^%DeWX~"V>ԭvvC=|"SԌh:& |5^lA3uKjsM+2 sV-(J7Opz諈0WO{Fzo:ӯgt0 wיz;gYڷ ~7Aos87T˂HKg.rw/Rr: %2, ~Bu6z!!˕]Guġa]/ӻiNXWC+w`lc ,2 n[[67._A>6ֽ[%kFwtHqx{y_kDcae&Q{Nqzԕ; sU?}| hJpշzNBu`5q̱ղTf0%~cHlݐnH$j5O$r8R:񋨜c(![=F')cz-y !;Lvzr21Fm[k+Q~Xdҧ ӳK'Q(xY.UXYWA'P(ߩS2ke 16AyU[6>>Ǯmcc=48;E'k a&ֈ1kHΒyϨeҕwګl|1u,}?#q$ؓ0F)ES<{|VSudO d:4O!s/₨áaJr>is@.ӼҴ R5aVT'қσKot/"h&OW~ yU(zG6D#YTȿAǨu}:._a|E`':Lj iZPbdG^!eEQu4W;sZ|ocg$TT GCJJYmmH긍U7r8)u<3+A%3 |>?"S>]W+AKuțjH%Tqw67u3YueQάK5@>MpY] n[H|禖''ۖRwFiH N[~ʕ #[T}s՟ ts=~/g ':ZQy}qp:zȈ:t9dFy+xlLKNgŸ[͍{/=58oWn y,'8oqϤ$shSJ{q{_a^rM1\·@l>!L2moFǹzx<'4 {nujyNW BQ⑩ j{.g0mGDUv5W(fvވ_Jӳes25)kLVĭ{Fo@X,_)aaTL~q'Q}(Q ^KOepȮ]`G Byk6XCKޓCp(pt>+U*̨D[R78NdTYd 7d &Y,!VӇS'l#\N /uh:]zp#i0-;-: t7Ֆ/Q 5uϩt]unh^>b^(ƏNsqۢkx!|+gAHڌwlB4"͏cMW]*(DJOk,K,~n=Rai5 $]?cg0M3Jk)0b)`QV=IRLgw{3i2L@=)V+fjvZ US!dYLx 꺮zUo'079t΍le/"d: `ߨ6YY '32d_@[ɑHBhSO7#ْ\J (6̱[ĩ|OLpJE 3rsu\'ޗb"Vb$4"ݶ&&]:D@NKYq )E:[ _sjy L3F*e?W}w?{!k?2AUHəIؾ{;␊qr\ ۤfdn"#Y˾'n4x50x%1}^2w@w'ޑ}bj+Z `Dor2keںkڒ\'Ų4Q2ퟟ67M Kto4pLJ+}hjD| ma`(Bt ӺzU_RhCf6=.,5{9gTŴ_^oh}cg X#a"_Cεtwm-#`:m%%ֽCnvYyet;KD~ҒfO7ݔLt4Sr*="Axvm/zbMB!=rz~FH1>mD:B!)^}vS)XZE_vc־Yʕ/ 4duJ/*|N#-1e,on1~wmF/Ab\jcN'cy`߫ITovz!>>ư.bq-uh*E^xeͅB՘?5F7\/'z~>.V~x`T W@gfsf`|*J&ޣw]޴Ax w4&]Qnڒ+u zdh'wvj{*7v⫐:3#ѯ1E?o~?&=_9:s:ImQ4ECìy(#ntG/Ӌ_.XnjNIzK}- رɍq@:J~/5:tPS|52:xMDcb:_(Qj T02H|vX#|2:n)psԒK}ͦ}.6Z1O2PcyھhZ  tzɝrot-Sn}F-'`0˄z8frD]YNڠJf3{Xab|/onW 1_qTr$/ 2I׶ -osFG7ܶNݭt[opQb D/,S%+ZMs[_2h+G*3bXֲ7ER}p<JLVM,KJ7Nn V@'}ך)y渕զe73;N7^MC1)yl\zQ3S翋QwټQ:S~=)̠'rNY fZUbUWY-[7#ޏvxfUPYzf37Re|fg<&WtE3]U5DGMaKn˟#g]d3}YiDkkTR%)j,,3Id?7 &ܵ:EF78--`[`$$C>-׎7T]̍1ےKb@֭f8'e< % =\:P#Ʊjsª HrDȮ7 Pv,e@Tt0%ܬK BZ+''Q˶ev_ExJnEJtRzu (Cy:=>xRPِJج0 v/c8(ʂ{TGtբ[ Bw롥z$e/&Hzjc*D3o}vI>0IřHʪ 船[+nEi ΓЛ7Kdr]gOd^ >BS ȏ|&pI>{hϬL*y!#5 y"NNo91.rcʳӸ0rCK̙M/hJ*TY+vvnA(å1s $oH̔ $D/Eo2j ?ݭjWk]M̮yPWh.۾nW qa,«f,"`杀Gɪ#i-?'/=](Enŕ]m5NϋSQ'+L]8#G^cq^U8\ &7"=cV:Í8NӁ@|}{Ѩ*1Q{M-dD@ s띅gSTE˹\9_cVM xdd(И}GL)< ,#w[+L&SW.޵ؔ{6&VExc"B.xQV=+,-f'|7o'b.:IS b2ۉZZdޑJsjl~@\3Zr&]bm9Dg!mIPI_V>S*󻘾K܏ƧB*RE%(" +м.j)rv9䶻]F c!a{KJB$g?lW+G^S/G*V2KBL]b%"ŔAtxiA;^7P:ͼ"^b Oڟ3\A!y|8 <}D>}p@r<>3t>t"cP'jxp)@@qX :3 I I΅\^j9K19VHwĂtGG{@tڀqz$g{g._c$ E[+X^) M3~+40f^u'ܒ˭I#1E6R 2墔4K{SqfV;Gp\ :BbAy՞ᓭup$ —A晎gh,%_M@?Rp7E;E)`Y %WIJ+c8gj&7˕e/x;"~^,(gձ ERG`k̚vn: nqSוNdSiwqF>PE`F,thG%/!%8mGsȮmY6>J~|Kw9r: UA.pުkI6ѳvOȡo(,2ߑ*e`?.H8b> u*2a֗­7 bS"A5LŐ ̙TU9lB-0xٔ=T tSΪՎ"U2h/>pÇ\+Ң &P-nmW )z!?gۣ "?SǮϐhrxT+K0Q:YU.ng(xuieKٻ~rW Jrn Isݹ -B+Ծ ¾w>JًU\%(Yrtg*JXlِTْL_p d kᾮY)-1Wd軕0h 0Ǔ"{{|PƹxuTğRSIx᎑ӃtP!cr6vXUSk(zDɦX5y"nYp߲CGDy6oVz49=,}m PxL0?HA&ӳʺj¦0bQYj+V"@]hGp8Ey$3NponJX _UuiH8BpBy`aN2*4 /6kMjrKH*bm-0`'rޅ03(wK9C):n4M`0?y^Օmx`n* ߔw@LBweF 9/kw"] ?&#M8ÐS qHd/xq7/y{̞ &aɍHPhMd^PΑ KB XW۪{rM rGᰧ6X[GMt~ V^N w$ZCrX%\ n5(Jlq,V> ~rfo8+U4,-NAQP Dr%P;|.H8L%@*M~R"a>K:2'C":Ui %^2p¢H 1ȟ,C+\ X{"-7\TYWӯ4Jt&b\P30OMD! Y:yI1]Aޚۨbh$pbN3۾BGЩ:̄hAaqF:AXJp 0Q +~6Z-([w5ᾘI>;-pdE(]AdCJ5 ̆nBH^ .eeS҇q/f<\96zY 5FՁ^mWxľC.U"?war OuԌ:'XhcZN*k5MdhX\kS!t*bxY+,@6WZhma6E+dIKg2I[FWiX9MXHf)|?J܃s,(bA~0JݤRu[L:4M$igRz8Z\ hԑ)cr:DohL`#_q p: ޏGc&^]IUicL/qgϟұNdV"H U͍ouM$]?C=2x; C*__i0вq_"vB$NSb4wo*{uzcf[5U֜ͼ r 6W!U^'ӗ re}0*{םZ<{\ѧ5R3EtGvJ-d)Mp0\B.uS5'W9[<7./q(:$u/^,*?@X:@YMx0>Mq+UW#|iiȂa[JX8 }ڥwً֫b~S@CoPp@z+Z̅od_+`UNۤp2o ae5Y>,F< <=/3^V27U6 E:TpKrwKi+Oۖꝝ-8sU?rGKpFIGk$^A.5~`N?^) nL> ҇CV;TNGj*p`r0{_h>+ IC癣 R{Lѳ,ǯV,C >x)|h4ΤīeCyUǞ[qᅬW}&{DIwM>kTi<,E7Q)9 P,&r}DgAGC|aUOϓvRT'<ܬ[PdS#dCİ{ C;/]fDTe a=XRn|55fJV\R}nq4{lx%uӄFC/ qPew< <9mk(2 8hUT] uM5`f#PP@rwsl;yn``۹[}isstaf S!;֛>]2ԎD4no C6cТwSe 6>'= ӍBH݃J>M -,rZNS6nlERiX's'$ ZƔ+٬Jf0)\iLt_\Mp}}%ڦ#M\e~^WMd9Zҕ GNaCTJ' rWWv0d|=N&*ㄺ< o*1fCmyڬ^-m/(G@x%*2ɽtڋjKO4VFVq [0ʤ @&M 2ѺTY|PUtg] /V܏>vw4{jvB+bO'#fGo3IG䔊aWI:kL ɳ:j^.z°͡ !:Q @{e]8M׉l4?br[zjИN̲rXHKU)ҳLQU)tMZI}:v?!- 20;gmHH Himei|'PGNg2tqXgT:`vI؊U".kLVSB7i$PAw/:#U]sK,?T+S9mȚqMl]vV V* 8 kO@$*hW&T${%3:7[t` ͠r"+%Ôwf|Ve6i$ҽ_jIN2$N"pS.ĹsHI!Yϒc@Zk3qs;ZRG:YBx˨9=ߥWvt<@@oKʇ*lô_ɼoj4y@DL_3y`;W0ph!wrhP5S;Ym̵H9gPC'Hx1MYxWYr*`;?# !kh3n*MaHm'wRo8u+Td o2dn–0q' !TPԾ񷌉2˜ެo;/fO6_OA8{jo2oh4۟R+$u#yp֫.{M/!zjm|bK|+5K=g0Io\4[*SXYpc\72Z 2lvOn-kKUs`k]e6wczdX3 .mo_,:GK|$LkPXVoO ^:}ɂKxaju*Rz[{j?31|+<*dU vv؛A'iSeuέ,Uӥhʯ8g' pL}6 h72_wkP]I~UL.fc?$cGYR|$5~'{qNN;GA6 N6~c{sO$w)d+JQK2HO '쀅\ No* D<%5|oS=Id6T3w1Zj(;T9[ZTn,K}By<~B#WzUMFBAh4 ,Ex5YJ,sF5v}fgZE$PǼv| ӯėي5٤ A𯐅*ŪJWqZIri  G+GлW"׽0PZI5alR^^ryP~IOOV(d7XT Jkqpm)qA ș'uSnֶY=j;ЖivlOT!iБ?s hX[*/mi7x^g=^ar| M*u}K,1L#PA2dIS]Tۜ*&]Iw0ȕʻ[-AFSûfq6r|-'zxa0&@oe-|YP*٠mwK;W҂ _Vת?TS}IU[<C:SDo'ap߃ N禾u)o÷5K[Dsu]L3o@Q%AaZf;&B.2#h6ԛ:׬M+&ٕNIƏEGSWҬ;v疯Dw%p/ݲ}Gf˂3*Mh&dx_)*&r|kg/R͈94PeԒ =7PJjcvZiVr$#&f?^lЬA=8Yo[g'Y.P`ٰ3A$ӻbɻhج )BFa=W#+O"X$)ŕBe'$ay$Vu6<eoʋeȏɆ4Δ.@S? N_qe-m/kLU :M$ȧȮ;/9:_of^Ȼ{n1 ;s]Zv~5ʌϭaBZ"fG./"RHU}I"l`{* TR&"{+,ϧ#K9!3YLy|9ӑ)〰Yak՚4byXa3cEA3MgNÕ3y{/"?xO$ eW' _7Lş  j_Z%V턌gn&ElC0pB+sl Z N%H9Q$+q2hUMh7ﲈYJSK)SSR,mnhK6O&]\P{ƞb$,hr^zEqPx@c)57l O)Xv>hm=m*zDPjN݀Zmk{'y 8~hA>&YppOϏ&e C? r|=z(xxxa#c#"͑zXHXaᲣۀ`x؎waYx5HXq#C#SxHmN'lj&Y=GH~5:Ddtt>Gj5>9 C6$@pGm Ot= ](1\*2'ŜF!̕grZd?l]zlI4# _F&vko\"3F 7AQ{FIl4Xrx(!_S9]o;c!##Ft 2QIrVpWx>BEX̀6yCgB6yǽ?Կn>!kŋjX * qRfq`r3WUq`wMOٱ`kM`qL[C.p 2@r48'}o=rOPw$O-A{|`}-m%6xxh|l˻7H >Tށ'vVnW_l;߿XB@>Θ  Cס%P,;8hU:"ÉD, uo ΨHLJSHm[#BvΝl| Y57aXJT$0? YUo7Ɣs!OyVr"7+yq_TTcrHb癇] y_Ʋ7?4uW\I]x_3zxp ?#t^=_cA}09Ƒƾ[J9^䖟=xP}w8}+c';pa؏B`pK-MHgN[mmGMk투wɘk{2= UY,nF#,o6ei$]V1`cmuZ `gXO_:wmgS3@~mx{yP>#5 O}.4!( #nQ+C5C)\,saáuuJhx+FT{=m@̏{AWAVh \l? ?y-I6sAl[տoFrC ŢH9ߑw#/wx BB>sVc}] 9'g<9I_} %ۛ>"9nڭ(8'PBcUUeycI/phat7Y !*]{EӻOuL6Dc]{-iTvT([ÛM:W ! x)S33> vrz/cvIN5vʎ/. :Q?i[ ;y}jȍL6Xj1zy65֮#q^&q4|A) <1ʇ}a8>20cj;>i}}$N`kg*7doy2uyDcBTÔr>%h9V^Y >dWk:H`P\i јDOˆ79*=sM8"B5ܼq/>rؘ*!k˙vbǗ1m[r`;_q'>͐g|X亄9UjAc9UoOUx2S'̲riiΌ8[v./5P+".z, {59钆kdC~''N_c0)*>] ,؋"u?oW)4'$ tDse ^"$aHϗf=Z1't`vNs^gS20*U5]@HVRu0nPXrR +ʱ/[׌\gMDBe#R$UAx՗LOGܑlnHgc;ފ8֝2fښ bzddQG@J,f*TX@)ʣ]Wkh<˘eFb C# e_ぱ[rOV*i[xhAFU6}"z?R*YV [EgR2lr։ħnW2*^NuɫT:^/ P/><VPVw츙J9 WKBR-)J\0I3 VLf 5oЅU&dwV6s) ¼Խ:n6zr&PzRѱk+%`$!%nxWVaj6)c0ɳZOVԤ\p0 ̨n[]jI]d}RU%t]Vg+uV̄xzAܭeEGa;X*O*K2XRsRQ`uq8^lt^&i+SDo9F<26nU,Z)Ȏ֪E" }*ۻ+GTOQiqp9"Ex;YVq:N"}8$WmYm+.n ݼ. b#8IY70 >tYĻ_j0arl *Gt"mgٙ;*;Iy5%H5F G \VZچQ6t26&Hսa%VN<ĢzVyR&DHlY! ,Twag0qi7s'LDŒVLykRq8e\s?x.լ(Q}h@a[-mۤT%]B&eXS'(IFY y@%^=2kc9)!VW/a'HW5PCڬ-fjVԢNfɻW`IFaHeo7+ؑ YIRU#kAs6+82|j'~mʹ]'m^]̘ 2Iy 0Ԧc.b5Z`+ qZ[1G/p=$Fy'v[=j@m2G%O+˵HfO4rqtS\kȟRnM1CF>Dmj!6gF'͐mQcB񳶸iR _6g|chUa>)\ x|\Uż&v|Bggʹ"VI&8HPJ`*#gM*]"Ǘo0ARb@%w82E5AUk ʊ+-b7'T R;/c zĽW.Z1 4+ò)]5ebXT(^ѮTrߩyx=A1wv]J[oWR.B?-eFGQe1&Xf@TG% ~ S zS`y4=`B .c>\Ub0̂=t9]5L1Hn8F-O`# X*ȇ8sͱF\}BlEVdP!#7S+B傀R:\YS!yI#{yj,mBvS%Iʐ Y` E7CGdSRHU%FAZRcĺ䝒:cB8/`U-|7.oJ GDEY7(47Nr|P >( ̀oZP2 T,+'ZV2bq Y;aPt&2^ & q8ay ĬXn HhTo ,ˈR^y ٞfLi @jǠ׷S<'Wի̓\8bk^Ёr9h ")~1*a {/Gɟ;v1r  #Ca$R8-s KVx<|v*Wb!Q`?du)y=rl9f'},-/E)|2c,e.y"䗤v`4dGJmNgB姚瘇ǂ8 xO'DLe }xZjpM}z&2ua;u랣МؼAm]~6'p|+ђ")y x,NX8xa%gK?l uطEf탈~wqcDpυ4D# q0P'1>&=\j*z ƢC9Wz~5zã|8^ʋ1o.Ė!fx00>F|wܴ}0o4~[eN]ň.nt|OaV~6s5f>ړP3L6tm{!Wz/N_#JYć3lK_Ug<9.^齹c7 Qnr} wOkdy:Ixe&4MCu67ylv(AOB|ψJ|2(;şDPuރ  S0i;z;g+X ,: ΋gd~@:6b1_И~83ۯCCV#Xn@@&{]㮂Q vCKƩ<}.&ۭBКЖ4TI_|ȇ䀰`ZƯlak)0!O|7Þ8#Gq!^}=/8fE+BKDἇS4"ȞڞR@x$ 4ћ|F8Hu'NVyP;{TR'%+U,`s6Ѓ 薌ODmVv*Tz:i8pnFQڡdb *?J =P3(Sb?^x)<7B(>n}BHf@8CW3ǽJ* X0b~'a0c[ !E2xz LOt_O`&c*j}—#}xyb.A8|C`Z;]XXF  jo!m^?_Ńe?P\ϔDC9gБ0?nG"EѨrZY͸32܍jp~G FgP8Ā3 6d٣_3+4NTzJЂc*w_AfgfmkjYu?U?n3 ׾i ͏&lwgƣM\Mj47ھS` 4:1y#B&h2$C8C;&J> +Qb V?;6cv腄g#5xm0Ƚ~n@m @tD k 6 ?`x6}Jͺk`1AxڼcGw/]8/Ǐ΀ ;x$:qC+MWyȎ odM _UИxb@`&]n<C_"U5m\[=r ø@oz5mWh\ XUXkh\LhƵ@"?8/k 8 Lq-j~(v\#eZHnQE<! !C@NO㮧|p"sՌii&\RTwC3yP6a`jmM< t89 5ń8O@)ZDlR6943Bi?u䀫DC؏a/Չ$ CŁ]{FGk!#1 bL[k*&2X5H_Sˍ}ܟSY *A2 +CKQ0qx$a6XbfߺߩAd1]{QYG#$spG98!G"@\QB8 2: 6sߨL& % B?-Be^A~̹$~g~|m<&>,VIB!Vt76^@,bBΡ Mcj@TE8!.8I< f8jtq!n @dG&;jGx)1Ed1G I99zG0 w% qaġ@y-2CٿۢmƢC srca4$˧AiP"M 0ҏ#Aǡ@DLG@) Zxm,&)<>Ox35pxܧQL A6G="zJ)?6irp% 8.=j,xHcYƏ+[84655YS|&Hk;||#0CeHS~G6? XI?ng$@kgw;llۭ ]G ,>~F^'XHa!#uáX\$\t<$4tx뵏P<|8ژ}D|dtNO x1_ ayJ}PHt T3\SA5)e^+t[X8Pg?WXW}$sTI>a/g,$W].ń Y }zH$ڐlucVSrFL՝l7X˓VߜOux(,ϫ $5K?Ҵwn:n' 69~0)>,ƃhШiqu4Y''sZyArY?Hؿl3G3KWd:`u%}zSDBggôMŒT6+m墀p*uҿ\*fgn4{6Ab<-/-Vs#Še=/IO3%ըhJWD `t VVucJO6 3jap1 "H{W /ΈIOAʉ'.{cl#Sp5{4XGf0f'2:-wVLӆ4bY* PAfc4x)n,k=g}P9tQ2?CTg;0?`rhx>/e>>u#d?Dڧ; 伩vc/ތ5= r_ˈv+G/Xh|Ou϶:!%!iS0$ްX~8NMcsKfHc#lsk8} d6?Ls8vRĊBj,oj&4 ꜿc\ 1ǭi#h@}zAš#6^бn-@hW x'YZHSʓٓMWs '*Q?UեK߃ [mr4^궻7OgyГqtۈN $H&\UuJ-N.//oz|.iqP}^/[[ nwɚm3_a{LI9zPnseT8^˸Obl~#CZJ:W{,,O5Mgj${hK}NJbǶ k|ẈěUVFB9"TҐnMK%}JY?A+w܍hTbGv~2?vyv\ۯUT_t.p.wk~*x?[ Nφ-5 /P m{ Ȫ|J]R:6.C\~Ʈumk,FerzAek6\wLByf).`Ըj/cVc^o\`ȁSUlq@ lƆ?1V2)hU7%*{(è]kpc9 X?2NLm?Rc.#iڦ/"q,5l4S;2@m#fLFJ`zrFm9]UX8N Ӎ V!gsOy[ V(;1+SK]Rbo?D@ v,>ޣ{ۮAua Pb7O*@hSe3]le8;#C2ƳDBRuhb9} yXj&\2ꬳϫu<R;KSnP"D)]{Uu]tcOVEUgl弉M g}"&tYŚۤ\TI}H쳛zVet0?Kj~ejG$kZNWS`ɞǙtj}-@M^vĄ7ް )Jq7zߑP Nau$p5-@+;%hb1$i~9 OE3XDjeO|R=~[0DcE<4;䕝̋jC%A7?N?jsYrة:mLU^+7wp0ۃ{[(sǔ)v*԰OiHi^߅ϣיawO͹#Koa eHv9?-E Sq f-joR\?Gc@􄥩.77w&KY\LLQosې^Rk,֣ G|Ai.+9ueb{.āvvrflu9r(!H.Sv+vhlU`bcT*zӥ6M0W=Wy\Ffɵ7 Ӛ-F lKU q9R]73fAߒb|)nj;{?bHB 6)$/Q6ڬH .ǘlne{XMxNzE2dhw^EF&(8~Su.,˝8gHc\+z1Os Kx.ݥ$ JheIV=N `->%ʏ4E7d߭\^/*i]6ӽ <×&H|MU2hx!]$3vsU,(l*&krmgx,nk)R'КX9Dmr\=c̓>3Q5Cߍ'DQ=VF'oe8cLF $"94~UBhcs:Cמ_; uZ|=Akm4Jd]LA_7Z% )Nb^ugţ7 /`:>ag6ՎY03T0Ԑ,i̾Ĝvq Bk+Dj$6?n fHݷ [$)~ wn u-qKkI "IfK^7ֻŖuw_=;-UuSjAէ<ƹ]cU 7ݻO+k+P$Fl[\7_/S0jJ)߼ḫ)DV0Knd^FmpuQQGY N=NH!ؤTw *#V%>{8X3k7oUKz I*bWy8Q.O>K(cL0պSEu"XU]$ >8'oC"Eh""kՋD}l92gF7_Ejwt@#nW)(x&1nӑ6DJlg1Smd("X!L>v"GJ3*1d#E$n[{[FKJTTnd%\˹esi:KO$%<Wx;-By*l5XHXIyv<~nk])"lض85v9 =eGg@N^hIR)=i/9B=]+ z$׌clP" {Vէ KU)Q-JB½a&md;C3%VT[l,F[rn,mH{Y[x젥/L. і>.pQFLl~W97_&.Vejo?mͦs|Ĩck _;5HVVenG<w%N%A/'Rvb*Vzg,K$1%_޾C;_z:ǒꘀyl3Fk@]UX*^P2J~E>JNcp` ֐ cu=i2J/-'"Nn-i̭6e@͸i馺GΐbTb4dnbeetNgd^v\n+fnru_jx]hlťWz~ jr#)4&àH^jU&4hK} iur=3w4߭޲M39I[1qC_'u k=3QJY5q;ETiXwD=Pf+/j'3|}[ -e"u\r k+HuZ`m򵊺w͆| n-"ޣWL.16V6aoW'1Jfdicb/ы=o昤:R<٤W}Mc'Kשko },y9m2-lQ x$*!HK{])<\͹Q{ǕqhZ}7ˎTU(h[|$t؃yXo(z:jYn _xk;_.Uu]=mWQrQ0 zuO 5m>~N{am;6pZg{ݹvlto (mij`رU0b[ؗ1ݭݺ[joTK@T'2^tؚJfŐܘ/ /3(rT>#nKbHmIqr9 (sgqes3F 1wcn&~ۜɅ%ʞiI7BI -Q`%>:kyc 9)p{jAkQ)oః[$N -.]b9F( OO@* waU)ݗs6^U.w%H[ּɆ%Pz ,jPqڋe=ykK.9PzjV3w,MN[T-QD$>,*@X?,Ov)pZ#cR$ZCs'ZD5CZ\UNNFn5mոZN|γ:F齲JXZyl; UXS"9 >88n]=tmsq"#Lizʿz̵&z+;.06ҌZru!i%u[b#rMtjGx}Z+qZLF 'z+"My[4Ȓi$1/aoouA:@QS8 LiS;?X{rYNw86Z Ώ<6AтcT!jb50ŀBEajuka50śl67 vkud@։2 Mp>Ǹh#"}rh\QmZ]GG|~~ۯ{ِ Q^Iׯ:xW޾:?ݱ՜vqֽLW4:P4KA{k*:#f~7!ۃ<θpzxᙎύl͏{19F\{|C7?d6p|ʨqPNG^|TR(#&,L>ïPڡ[ϙ`#]>?8r!-p/>X~C}v K5>Ou[ 9Pön >PqSր _aU}g MvGfr5$ [y\(0#v|v;ʎc(LjC12)`7? #jo0gsb3le `mNc`>U>!߄w^;A߸w~ߨwَ8͍v7x W΀At2E!r7*!g*Y;̀{s '{WzeA5} LbsE͙\~x.E2J67> ݹfw{f뽖߅#;YgZA[4Y9.?} $Nf_c0RȼT'b'_mE*s|?p\;9>@Msy )˺1} 8=-)Jd97AHuxMh\r–.K{OJoԇf(6#@@NF2}]d[%~p}Jy|b{os1(9L{!A)H&1>[_- %ʅi Ѳ |}pƮ,P_8̔(せgρڌVTk SY%F:6}7L'5f=]:b8z/b- i{R3Y[* 2cX'pC2?NPv`_S5;E3\rhD.|>2kڇ]vklE'޶2'K$ۏhx#uF?;]^Q ~Ft RQ9ACbIr8"*K4К 3VvwK${N Gm^#IWR/3tjrA fLl=-)c=M-`j6D}{+Nc2HwvCOJvsuH}R&aS_¿_^Uu,Yu#x «cbr&TU/<c+UaVHHGS4pA@ ݇+S.S<> <n\7 M  nW۷U#aKt/]Qؑhgܣ|x/U}ս%^t",)T2_!pttג_gjH}V iݔ>do2XG%Tpo|.O+΢2*k+a4 +K+>"$]1,_:iprsӥs]69LL }(iKf 꾊{bvLF 6]HBQsG_w?¶(JzHm1]O;vY]5w.1:=" ҃!x I vg$7[av y8lPV0ǕӊdI V T-gʜ&e0Hʄ?:IE+5 ϘԮuTjJX`K`fiyCiӐ)Do>\MbSl3ATP!a5T2Dbu <:HZ8=Ԡѽۿ[ޒH%Kgfg ȵv%N?]2 )~@+Eh`Bt <׭wBZՑо w>jCԖ)<*уuXOFJ0 Axk .(FXr9$sQBR^_~]m`Ts alW=jE[)Gq?Ϧ˫?2j]iXVx,ıژ%M*?Pێ:SNp5|BҮW =ͬa~9G.Pz>T2=VXߎnO]kGJn0&c:[W4Gx{'f*eӻn1SVk-;"v"x32X򔾙IͿA]ͩ8`RUM4&~ ^GOi ٚZյL@z"`@vͽJƻb WH//9FMv)y?:hsԖ>o/-_4 hfwxFaN?n[6 y>5LSh b&RoTd8X8喀TO FaX kAP~W+ חB`T(UIj2A-pFhDq$|"m1o j$ism_ bEϷM3#He2,{6&dPӴY6r<KBD|E+8Nɿȼq|,B>[ij!,6gYT9f^tv~ +_~: \+Y`6IҹX;Gl栔\ ~Ϝ((lE:ftSmVm=qTxthܶIh0'EyV,?zOŝWR1U1٩A&&$qq`;kyBI;Ao_}"OpR)RZ!+@Յ ߑ &/PT/wɜ L 2Amkc++S-q ʋcrb  @&׌Yf1VyrJTםTCd't2W6B)*\ p_[pb m4R#UIZ\F3G|3wA)$~D;0 8nt#mm8H-geRօ%.֦%qg 3ASGK8M95 *Jlpʮ,(;i Mx(0u&rj?} )d )/XźJ^A[$0J$T|Ǘ~ + MlMX3`/d13C^әt Ww?C.UvS;db]{)H2'XSHnIw =|BvOjm"nbK Wщ~V ѭl/| Ee)c4\vt.]VZ@!*sqfXOad%`u&tX !\jݺԛMWbg @"G0WY0բ,}IlLʍ>wPНсsoQ$YhX@2A<6=@j &'IPb#Obbz5[ne an!BfnY.c3ی|cj5Oa6ْNZ`\w4$ XckjdHZ\i }h?u@#Q_$,ڱME2h6%ި` a2F־de CJ!ɡ886%'܈ݿEMWTWO)6-fO] "#ݸܐZ Ď!Ԟ[?-{[{p~sJA is#Q} @xXC>GAŝ8-0jRz7_Q jRnǩkZTpt ɮ"* )Έ `~2X ݛ__v;ɦ.LGd# ѝZaTqKn6U{OT׋&֘5,TXe.BK>EN0w{35AZ)-,byRhcGPi6F9Xcc#*~MfF\txiɸ67HT A]IZ_0:g'Q79X:-ecִ{&RZJƖ߷ӗK0k'/^i*~6v-jUAp`,m٫sӠe+Mh3y!N`ay +FقNsk[g@rvд–y\'g׷>7-k#| ZH Rxn&oR\. =Kg71 )I&­cQQw2nM8|SNw* s j2e-Lb~{V TMo#% bL{;t_sjex(vXձ;@(F|9otrwnO5خs @:k~8hޭaCσe_1_S_J݁U,fHNL5}qo۷egPVK$oVѢ̣NJTo/1\ @Fg%(w]⯔3cQi+ eco./7u*8٨Dˀ& e,SˡIC2Y> օ{kK66R!v3Ip9~X0"7<ŠBǮP"ObC$Rh)x>2eM1[,M=Wҗ`?SnjfjotOzZ&IPf(܁/fIB,55\oWdW,i T3n@t 5*\j'  kE17.6| ;POq9:\gn3wx$O;h<΢do8訖|~.Ey)V*NGiLN_kK{ztT{< ڻlZ}4$?}Tyx*0^`q¹lgSirĢ@H*prC6)DKY9K`N'w ds3׻C5:ku(|6m<6CW߁*nSݭ ww[\F`1$ܚwπϜ^nu)4+_25 bbf$&QMLJ2s~ cu{&1"^cS-tLWӓ%؟(B-@0/󚅳YS(YYYӒXGX* 1gK+HC(iŔb` AW)8l3Nk p֩~' CVziNqʋN Ow46l?7!R TڡK nxSoYnmfլג m(ZH}N1ZBسeIe8{#b6ғJTڅVq:RmpAvrڤ6\՚Q51W)~> X4 !%֙=H<ppC>}é~Ƚx"_OELNɰ;ݬMc{lsuc,N=Y!#+k.EZq Z&N-e(6?t8 3Nt*,r}sJ/4曔g@jf^d|ݪשS $YQ. 5Ķh:朥y +TOVL_i_ "yF `QXdLJa{e ɕ/VSxVK3vIm QZPB%?`ڴuY\n2vѼ.gSKJ!V{iS'^r*fk0 :$] gT,qҐ\9{u`RQ";tctE IT`B3C52(NNZ$%^NvtS"'L;iBkO  ˢbL!뻁S/cBpY/v/LJnmF T$i < ϠuǏQ#NfX4| ^RQ^rݪq̻nAyQelCČ.Xؒw*ڬ.h"żaM#ʹ+fV0WP}HBnm.H}`fѬwps)xݧڦ6ih;ÎibTR)!$,J19sAЃB!)JB(J(J JB! B!(J)J J! J(J JB!(B!)JR%)J!)JR)JT)JT)JRB!)JT!)JR)JRB!)JBAsJ%kcƴs=@deDD3D3@؇>HzH< j}`_P/|п/ B|p0_/ Kh0x/h ϭ~  %dcazICj%k8g.zinjb <Mo-W%690ƺt)\>oڶ wW(J'{9gVc7jwmKh8vcdt՞퇻=6v1kDO%qam4] Kp=8L{Z_odÞ*RV(^$QӃ)vFd9XXGӀ8Tr@̅ƒıp]G %T5n9rӣ뭾*'fNV.AvS]7S7j.LYLWAg^Y7(&]ܫwd M|ZX\ati{F> OazcQ}`I%'nvR/~|l#vFA8Oy vȁp~$LkGC5m?LKOQ~KX?g:j@q$*qEclQhj SgO~'V 3!ztd;YHѐY~˹cH9AG3VRhRe"we.6gi9LF;-Fp{Al(ѣXbÎgcDI~@ k 22zHtxp &S$Qr;;qAkXN=M V?yÖo Tlhκ^DN3uܸˇ a9\5΋)TbBղ!WK{^S>tXL(.$b"s Hf.aNt{!nثn3chӓFnCŢimYeuI1<DԢG8At:9K8yS=4lJfQAbiZ ֗yê UoL9+u{{Td-r@3=9we>X odd"SdI9b]l tY_"YVwNKmc "ֲJe紈Kρ>“{v>yjf 6'̀ldc=)/:KvɌc] ɘƣQ2Q.}W8btT#٬Zם)IÉ4~EII=av#T߂j@A(T.qthFQwL̫+JegNV|`X'(éZVM^]lCBW" 9嗢O8jwC@Y=ǚN/%I OOyxeͺOõآd\zcnk-ۯ=/-kxNߺee깢| "oG{n^xF@GL(,N9>vn|.> e6wEꐍw'R0Fw=`e1.Dv]G_^Li 3ذ(o =W0>3WJY̦@}a"JQ*TL1b;$mQp^AZ %%G*(WEsGG[GAStTu׽HJQj1Z^FEཨZ1rNxQ{,~WG gײk$N>TmI%5ƭҕ2k ik`<# UG6V}2y1`sG*Bc]£h9FIvQ'ȒE3Knr2)_^)հi1i-AF Q" br#,"p0uG9SqAASz;:>TEO^aX'AZ瓼Pκ%3Sꏩ#q C5|_Wa%6iXu43 [ĚJeco~.RtA}͖O l=0dp1ƥZ5ch}5<:Rs"-Γ!ևdԼI "4 뺱E>Qڔ>ɐPQ 8.(3L&()I'F`K`ȋJS="t֞ /k&ˇ|h`I)P/85/7oY"mߣ׻7Y02P#6R02iɁ2rlΎc!)eN;LpVl .'Lh#-hPfZ|v`)i0r*ebՐ+ƻz#1yYZ g-q2M5;w>˜RI,$kbiG*w,x||FObg|A MV^u#x aRwkZoS@K߱IG@| *e UW/P=:B\*#aUWh5eU-6ݴ[X־o-D39ImwɇOfYB'AM9:X| 2i`Z`p=Ua}v&a+<-<>E锞^Iʡmm4JK+@qBv%VLW%&i"lhڈ0%.TK1$3#mgLj8 qeHDn?w:|lk8mqNKkdrKJ᣺E( eYLWʀ?ݍۆi^Bxl nw-('5,v%;ࠑ@ xR0#K%Gψ֐DQ8Y`#iqBph\N&B7I>ʎ (CdL 0Muj؅!ex <xdKlDN7I'+;iT[]xd)z'>T }"9a^4!V(H ku |8/ I>0V Uַ3 C^./t 0-6%3q20:Hf{s@$1oc  qn!lyh >d>Wt+J A@8e#l: !=% <θcJG꿹g죑#mBB>A @AP"m@f9@E9Ms5UaR<c` =c][6E,ujoG nQ9No±A}4p)k <lqSя% y6˦vf+sJE1 mO]T_2S{YQyL6?ȍnT|>MGe+{ذ@7VLs_ 5t=VEkz9rեOq n?c0 ڥ"R;T?7omX=+$OۭE&/fM4[g K7ZZڮkC)<ɧ9dXeS(C0:?Bl+ףZ3]Aς-$+ͽ7p}ߨZvDhl|r1Ϭw*%&0@PѺFu4H ޛțd:Ymh"g;+ZQk_/?Ζ#Ur>N#4A|˞"qK.`8kAmFXfʎN9.ʟ E|HCgTOsk5#koR:9(raCØ]_acòCËCƽw.&/[z ;MKi1VۜC!oaZjj /+7 B*&C~BAi+{O2]R3fqzP~O?Iͻ%}d7c繮k`qu=[$* f?2Eg\~3!|7g)GQdGb wO4S[bv1~}-n{P^-qAV|qR9~ec c#7G591uͷ2W>-u[DX"Νű5f#<-eqQhZ/3FJj}$ cCu"?Eѡۊ Ŋ=~ٜ.!l3XꟆ#Nx]g@|̊u-ɧ8^.qE#)SկS6)hdhE5L&E󞴬Ԍ}$ӘU r]9ZMpvLn%5bCiccy cc:<]>՜_NF2.6BK0{~pSfg3U8p 6WW6csdWLH4 |l"[@7$+֑)#,~n;We$7Wlsn/GlsXJm`1r:HbVbH!^<=Mi! ~Fa-C_ }j=u5 #F%t⠍3֋ՊzY-~7E!5.R&.UcqPs~=W nJ!zf涊+=uG2@9Xv,iEo?ubYWbbk9NGf68XH8}"I^񛔹LDHdnMSD橚smQ8=nnZgn̕j?*q2Zs̽lf[w68U$#{Ѽ;wت#Tx5 3˅Z_-z Y`>1$Ba%ԎQ؋r{&\tVKerҹ$ϸ|W{KT9J7'KX2.lMK00K *Z1f`><]ūr1ZV<9&dziNjNp_7f4z?VÈf8X :Ch=ѦJE쥱Ƈk̶1E2@G5䵛io#.{?q%6fJ:CxlmAܲŴ5TQvCϕw:)ֆM;gs9cIG/D|4@,?5e9>\v"@tTI=n[Z1bq-3^cw[Hapf)1ۿ["L;cocϳ۴pi|5dy3 7 5g>m{8`9+;pBgn11%PF<{i!3IՀÙتk(oT5h^}9E=}:i_b\sC3M=+9s܀TR*!% ,N787@yB ^튴c!= _@( ! A $ q-Q%[WhxD=O^mu5:7 p.ZffDv&CTsڴ_,jԡ(_l/!kŁBUpqKV& jq1hVV5j YqtC|@.amhXJ>yo<|}4y^z*GLt7ao)T|ϯGOO6 q=6~>҈Z oHo}ڕ~%I:מ5:آV"{汿tR ?iSR{s6M $/)Mn-a%m|Z`_ReMו؝ã 8BD!$ʅR25Q(Cͬ;n]j#Sm]Dt˪lN' !_6flh=a!]xT+?[uiPl'{t@pf>% z3pOVNz^9S5f=b &vNNJY^Y<ݕ{(XKɫz~O`'K˽[.{6)1P{x)qtִz7=`28z\%e̒#sèS&uX0ިwp~a]w$&%bG}# L<2&<=)S;%$L% `>?&NrZ.Lm'а%FQrv xd<.Kltj=XuN", zsX&RvLXib&ጉ FUiG_>xYaNVݥI$_cLDhVO̗\QρE"L6Q8F,+k5M­kFk.B8M)};-.ZGnr/ W/[S3jY丩V `~=2o\rvy?}2[uZ6B/LIq=Y$[KyXSB.j6]6~CDzPd2x p#G-Ne35fᒭ^ԪFb㑡䲙pH5K~a&*QQev^ȼ'fLwii᧽z~y0i"b%Cw%pd=IA \;{ˣ˥:Zdg)IAkTUQv1L| ܻ(}j h(8M^vb }v#:ZLs(F%ȆSxǕL\Oq&=~d}ky-2snGn\&7d}`eҚ.]ٯn0Zz6 |n"\ bLM9tzC4NrcN KneIT^6+ϽffZ Z7wש5MHhsF( 62`PG&GG&ƚaOͽ.=^!yNAE&UҌѼ}fč˜VT0֙dM! S=EvJ悉/Ukk($bf@ xONCYp"jCFQW<~@S5flTyBf)i&5yCKdZ:>)(SseyFòG&twyna^T!(^rģމE ٕcJ\%5;%x-Ԕ4.+*"brik@?bk*a𩕕$>xC j9L~>2pD<͍CdIΫQcOONHG &FƇPFMg4?ԙCML8OHuQé5fh%uJX2@b:յQܟ3ӟpNxn.[ ;Uр@R16Y0$oa}*?3.arD `*: R P xym|S/_CQ'* `@8J@]#HmW$Yq(&)hQT~I*GvAc"5Y0f~[ܣB8>۠?l ڮY`6[(F)>Na.Xij $QC+aj9'GL:)ҚzTtͱt)>h4!1憏:|5GEQHRGKދ;ɜDɜn+6%bu-YLӓŝԻATod!o+%6V;0jrAY('b֜֋]7g!.aLe#2~x6t t|y1,OP oeF$[3ǽ9]!*^$z~6Z@%*u6- %ti'*A\5[1 JYj}/28#em s+Spֱ@sX Z6~pU1>i[]6v2623%/L0> IwqlhAR_\@RJXj\]3Nrm$5UYꌡFuB+Id)V%czrUC<+Uno|5S)vYuOJOFŔUxԜ6՞T쁜^&;T\0wztz C6GyO6!0eX 5,%-OzqR^TG(K PP<(4 3Ydǂ$W3feW|ɌXq)4-] 0:ňd պt 㲫W:)|.9'ɕ&a>Dty~;f DM[ nh7п9`]KN= 惶']'q}'zz:C tNrN+h|Yo:~{ /9'> *!4'aR3%0lt0v ry*¦-NѶG;EDH>$WUx )nh)Өns(zb8`V5ڥʖUAo^>ׁ GoM:=hF=r :~RBˆ^<`1o?n)BVbL@ )ݜeM`(Mn$!%@q\J=rer9L$ֱ+Ó5he$C| Wy+VA"1d "~pF1\_C 4uʨ' 13ϑl =vP6/j\䫹tZ'dAb Kt@U}pxfBlL51:HP5ZۖQ/RmB#=5Ⱦ4L<Ys;t/DPbU#*^ `(t<ƅg8@ @=FdXIV.3 ^ʒ\p6E1 KKxk5u QX1p5SZ- b⤼[#.xk ![kMkΉ` t&#jC}& mf9Й5uGݝY)<{d7&3!`4$bǣc(2At45\VWtv+P,ֹD [եT۲Z;Ssקqo}o3ԛ@ƹe=qDMfk(9~s ~4vW" x7 ` S|{nR֎y3 .,ꕁU4=(Jâ{|P.%HsU /j,Fs$y!̸wt|{rDf>Q[Npe@WFhz*ۥh>Yh:{WvjPjdopd(xv; D KM}CɎ;ظzc{R%׉w]ۊEJ|[f@A%?;&d&HM]σsL59y:u6(GڗAWZk/^@p)=;԰w7IfօσP|eqewZ]{|tV#uz?Qj޲&b YPyVi#)u{f٭$Ob;yGr݆V Qnhzgތd@WYU"CFrdFt:jL7booD xlMuR3هVr̚Tw"{maӞJjxD7Ad,3NҡG bm85. Y](L9q3Έ"qe\ NBCoN2udC*ڴ ڃ&ˉLjbIu$T݇bS%dvtCǍ. KR3'$FGMug]BK~:Ugj?&DG}mNz0<sjz{Q"y&T,];6ˤc5\ed2̪@V0Ag{fO^ޣx h򈮪Jrv|de~C8ML+&hWv*Ъ풣yσ(=8EG7S*֏*w2i+uЂ{qIe(9$ƒFD"^-=p)7Dݪ-| ܵ;#Zk>F mʦA=ѥz6-0,b{> Ɯڰ{ʬiQPBblRm>2e[2SXS"T{1>j67HGI^%i&;PNx<7 aZN^Aō=Du7;wSW3#Ȟ\JHqG/=EK` >ZGF-,eT5Qċ+="pў=r6>w>)eBզ <:DH 꾁A<7>vr»RY(Az%BLBl;fBptdf;8/ 8qJ?b>k`dt<=v̫Ŧ$Z\D lwGsl9T"sBObY r6м6 k67TOgARE [i~Gh)\ ھ-ob=V@xy W{ⱫXd|t^W)Z̭MΉ^R̥J''Kp&0..X+uXk`VOj5E/'5sBvʡTJ8A >L:J[T/~Ȧ$珦FPR.bQLTP iW+)Ž 3?s..P3aMzd=EU ݯ?fh'[ZŌ7..H%MDqoEG7PwT Gˉ ot\oAK|i ʴKSS^K2h3 F^4?5LTzh5?sms-6C>=2WS?"zS=w{(rPlϨsBKw^6z",=e q3qq_܎:YB J9ٌp# :G5?k[q61#\$qq0L1O6?E}ݱt;haYTַST |쇯ß]|ZY8Ugœ3wЫH9횝/.2ֲJƺvgz鹥/uږw`H;7yd |\&Q[f[e%S`h{B)Q"] ~T*)S!RLv9&:̑w=b &ZhwK6 x,\d\p}lH;a}c2)2+Bٵ?D^B=,1u4BTq{rS+HV7ngzPld{6m*b6\\O\%HP%\K CNy)IJtfi6ɶiaL fá 1/bSI| 'I.%Sz 8eGW4dhz=Ez{_jbMP F3'@TR+(,X,OaGu>Lᗘ |1~W+zTlB7at>95V2c(q4_dYk9N 9/>X2푒V0Rs+` #:ɧ0e3'2}S@V[P/ IzR?spm:e^%xQIcIAvَXq(._` y{^=$*1C΃htk#(|E:Qٴ~d>2?W\DwP`>8l]ٰ4 lmAtuh FF)QcF(cьQuĶ~c@eI{>@S`  V Kbr&g+ ͹ ~mzaŖ5p+hkUCMQj8SanÔv'UȆȋ(>"ԃ7r)G\D~:7G!!$dk&"t mi<Ӏ`l 8 f" &CB*ސz `*ҶVlG>tElSa ¢~C5?jq :kCVhzB2kA>2Qmfp/(8MxFE EmsR_l[s}c~Vq>R?݂\f >}`ũ j,o)ڃ~.haE$@_\@GmH`+^mH(ͧf|rY,L@D\I_ [Vs eq%bO.9$ Q@LC\p<'s5[QVc}8HD!)IBEBNpylJ}@[dr'\Tھ@=ZcN@ *mH5w F0“v!˾8\@ r3;Z|:cGa5x6+tt7[\܌>L+&B*:?Z+[XF$uq?Y0L{?]ټDua3!嵬Y߳ef$<]ŚYN3- IR&Ei -x/R~XCO RA![@wЃd}u):K7Lqfft(cgg8۬R4y,D0#V?&w&@m1vCX0\¡ *c.>j|x\\ Eikiޟѿ{ըS+wӅQR1)\ ت{,%֧diF\vQhJ|=k|! .CH/lcOE*ӽt[Fba^Kq |Y+] V ]6pQg qw,xU!d#8{1m<0zvZz Td[Vn@1}O5d|p@^^Q*Ȧ^U\#OrpYdի¼˂~㵳 įgQɖ-3,Z+ia-0]60q8+9+Gzlyln,=n'WZ& uMd/V[YĶZgEP4t)ȇ H"J1򑘪.Q_nziw6 Z jWyG5OJSւ|ləh8(od2 1r"_ J7SHLL;FJt) -Pm-'T Y,q3)0, zvM-ב7S&ZS˖Ymi)'?j0rDwHգu|4pb&`vZU.sGKA9sޏwq~fghK}V<ґ(<)$ql|t:fF*tR5 3GsGTNbpL'ƨqhi#mhucq!N3AYFA}W.F M\:*$yJԡ=:hh)YdwKlRߴ& 8Om|/giTHMwwp )_9O |t͈v#LWgiZ<{8A#\S24|y5W$phg ծ˝aG+Tʕk++>7N PQF)[H6 de+ld"nZ7}Fo; t?:7b!VSדHyIOKE&ّa{7?d(W)4`D,(9K)MPz(m70w Vz`/^J=+>߹@SrEo4it`k鹺h{`莫sC_q-Oâl~'LJZAVa D I&2Ba.꾼;կ&-A@ aBe]dŮ+~^gp75 ؄bNӌӹJ>=vxIRW7S< n_&NHIaPɠlг̣bB*q4 0+-W>ɟ4JxLBA)@Il e8z5`wAlcv'r3d8x fC.җQ [6ذ4 RAC̝òaHMtAJZ Dxɦ4nWU5&$GL7QNn Q:ǯ b*e ffɌ2gLn2(~[3'Q! IzU#J*ɋ!I6`q涶;ӵL=2^J8˿dZ'\(ݏJvj̄ 2^ J QQ|9(i(jn`ً!<S^|0xn|ȀQ{vwFԶC?vd+FNmmH! Ѱ;lWܰQߙWp`_k~ՀvD1 tIk`0 eop[2O 3p@\^IZ`g0frW.j<KSog+nFOݠA1VCny`! rnAn!y0XTg1T}l m^$M>"7Q>1eWNU 7p"? } 5?iD@Yr!i=/w}޿)h 4}@G4P PGIߵj҅el@hMz ?}AsZ5KQV+l[$0rPi(U٢~(H 1Ւ2Z9@ee4ג#Ͱ 6Sl>1 >k(HIx(ôU؃a-u؅ X(shl!T(=j{,#%=.P@R@c6Soل`xM,:6A XYB˫ D ?BB;Y"Cdn߷,~X R _ncXҖ£˄¿ e 铀jӑl"%6wQ!o-]EaP! rn"'KOòt&ҿWh i6%JmDi0\f /ʡ ?npl Bb)K. V1qGA\pkaˡ !Oەt9zI"PXVUwꜬ4`hAgb~D)??cIꨮʑBV(v^T&ڀ49×䈀4xW 2#`ŤW3R*^wrV+J?n_G#y<@.y?͏o0Jʅ'n 6mXxa"zxDX^R?:'x.GI.+6Tg 6?Q$.:6 ]lldn]$~O*6:'TTs\^|}Aٴ/'-'+@@ sWݰ’/J1`~ a`.~?2Bo]+,3VhWCq֫Q'Oϟ$ ,nex~DEx7#Es;Bejΰ^5 Ef丑Plג ĉu~hy gБۜ@sБr]~ Ů6SXdm+A-ahwkjwmHn'Q5ȖÐ%>5!MG7n'f[6wrZk/%NW lqEmRXteJŰ1D+ys=U`L13h].>}ƃ8!. ^ ~r5Fд0e+0OR;YHܗ.+Hns붮%/y|oPyg%#1,ͻU,oTy8ɸ鞝틫S%K# -J> ؗH#-d;f+\q,…7C$ܾ)z|. z&9a.dҮl>,:;~L׸sU5H=qI.m9V ҙX)ɢ++)ѹh1%kO'Hտ-PVfZt7VhQhvmٱȨƕ%+`"1Dp @fA7M'n44&W-ENHrO{)'[MQ{)Ṣ󑓰vp PvUTn,}&>YihyZDgՂ˯M[dsC"%5VDBdR'!%'XwI$NS[tWVSA ĎFN\_lk9U _[oPSW|bbʟpP>> x*jsw[DM;5٢`0-?BTB@|n,B\ (lhnopq62 e7/466.,FSoe{fOX3{ی2Yka93Ʋv, *'֬&+rj$Hzd,m&S fx`ylؾԼphH6Z얊֪ͣ^i[sTkH!ibd%eEzyxF(is4RNR ; ze-{bl:|k FDx@fXhu61Wck3SXG>WG㋧=Tzm&ii lߥ{{!nD~?y \F~Sȥ@TR,s%-,VC27-_|KCNqqaPc'x8csF "9g.(C]|qL$L31-qEz쮫A 5kD3mvӄ(;D i g (v-1.8.!gBh0ބ3OmbtaG:'݀ YK̎4㼟Nd@a,+Θ`D`fy\p*FGd? 5jz>_0I0!LNO~S 8&į^UZpǐrw[W`fs;D`!0ZixjP': ܄pp8Bs- >||-aJOG`߂J!Ё0 l! uHgٷaHZPJv`^-@PKPKHKH[ W&[ \T0GP/tt-#W&7I L224@-z=P P fݫRD*xkNc&Z ZCzߙ82U uߎGU3*U E>Pnp0`"R7v3Y"$T~&aX灰ow5[I 62~2zbrcUR,)Z U<0׆Q NHTQiVY*4U)EJ1я] 6u)@ͥDs#)V3νOGmJ42+v(}jv4ӻswޚ)JU!FJaq)&ҦC YmqwVI4LCa0V{Rr襫gJ has߮ yEcXio%, iQv:ѯfyլLMF5:BQ 65fF}`kٚ c\5&BO}#COC g8GLsWySiS$1[:1K{UbIx2.u.dc!NrS?U cY~' ?oe,3s`VC)[et" F]Wv-hEj-ơD71ʑz83P+q2E Тڥ%$}*kTX* _CN[s{ 7NpNݭ|c\{.tc/بyjWJ80(eI6MIsx8-8nY*|GޤanO 9!9Cr:yIXm OOeD8;5fHfyS`U*QbMP\$ 26qfDJw2N*NKd-"׎_5AM_ȍ:$}m睁>쯵h2 \5ռ%CiCxUsS΂["QxDP2΀5j1>! kN.J ]BJ_)f<4_v.BcUNaH qUi ~"s1W V2aD7H c8}tsH+kh̨G*2Հײ?ٿTS%>mF.t*e9.5.{n {c8,SHQk;qs T)v^R#%tˊqI)Y/iT:}' #qͭ5kb%C Z gqoo/XsK-tI ͞[|;hi0됅e)c]thh6{&z{y;,]CtY>R_w/#}ΦW}zp$VL,:\>^)MP\"rºaV}oCDғ[)UvRdӪ`ݍ /u]x7 KhΊA2w݈.U_ܬzzt8ܴ_bS}LQ bvT mS6x\9>}^_ ϰ}-ϘGS;G qOX] շR?ȱ+WOйҤcWZ ||L {+f VN@ejZG4 Sɲ v(W/?DC򡁆_5}d,Uc` V߽+jxChwV ]E mR NPF?F@<X?)hmQ@ 'VV23eEcMLb{@ ?6l*Wp%x\+JѠ%R _nc-V ®}4\9mާ h ϥ|!b<'ߛ? kd k !|Y\f}]"R(#_Ƹck%ʊ(8@>6  .n`Փmc#Hxy9:Sa 3b@u G #XBY4FlV\ J)XjF~|ʆEg6z:MYl{3h⯚3)3dhf+~VXp{vmbA珀l;F^2kW[C, C P?˶ vk3fD5p{'_A^u!`+@`qꚆ|6J{r!2^Acr֯,#=;ދsⅱ;:MoSߍ7<6F@,8dO XI'ݟDie,Nτ_̫"ᅊ~V pc,0[ j*4}ⅶï? ̏;݄Q5Qҝ|퀄M>^WagM'ne#S(h9Y_,,ٳ}ZcSbɏ/PiHLwe1E*o#RFͤRM7?Ӟ/9|o^W^6(hS  wcnnK KZsK)ᡠC?{}&ju^=צ'J"a"څUVqͿK!lB E C#A }E>6yWK7BC*=vGI&_F<.r/Uz<>$CNaz-zBq ϖ"<'ظKA\ J閮Tx>_%njeρ*Z3 )ޣ! b3G4Q%vǯ%!imJK{>]nbͣjroQvCGO"hs jYڝ+2G!^GO_|IZjwTL -z)!Uh! ސ2Ү(v.[+u\3k58h8Wr\ ,t?D^.dK N//amG"EIZ|3UɇW0['KdaԽ%!3k"L:A*cR b8S;N <<ϕ=Eazv|x|_viGbK_zWi,XYUNW%"܁j7w:NZz Y{|Fp兟+6z`VW}>?] uq z9=j}*F>tv]/'c{&3.rrttǗSc$~/Ckh3]D6/_,W5-( cֱ<^UM :0S Bߦ*I/׹J>}r4& ,[s%ObX}!""kNQg_X}X£k~>o))%wr k -- gZ&2< {gGIyu_O#ޭ:heG\*]~.Ӻc<v uc7pn.-F>?y o7 ˋGôeE'O3Ag>.vk@+Õx\S}P0~ Kl31/rs]iУu+OmHnK1}a"?=h-ͅ Z1YFA{CI-v:/2'b*jOQ'u;/5*{uOU$ ߭\D2x_g8~@ڹIñ Z[^EE9ߋyI )La+*/j&&[v~WkԽ'U^'yXo0 Z$:γ7n'󹺍QXP~=Hm+/l%Dt錺̧Wyt:Χ??mu%$AST5j \ލ|h $2*a|=ˮU3"~}x~x޼5}i} %rUOp8^j0mm@_l%l^]j^&2UDk}+$L9} K"9^crc[0(jcl #.*HCtD _u7jr3siDJZYye$KlOo97;̴sgt;`чx 2̍g(=)96}}ϗl}<NҊtx'QMAŇ(V~1Qmy{z"zS&\:Sz̞HjQ~V :eN( *r^ kՌ9=akvqzz(y)4[YrL,.]"=7&(RYGV^./iC M'l5H{P,fVG۔R@{(VogJG=:Ofv^4hG{SpLRkDDlN/uö5?zC>ԢN'1ɬֵ$BB 2i CǴd`~)pup`5F}S/;o㑓F:[;$ٞ;4Z 'cf;LVՕvNsouXޖv{_vѡ[-cY8ɦf}_SmX36AԒ ] z+lqo]E\#yi!ݜ_E%vs6emr*:蔰F' 1!-PܗҌxW֢ٔpg.'v#ɹYy˔-Vj9M%4㼢m4޺ WӨKtILuG<)`'|ª=,/2BdjcҶն5y6hgEqxG1d2q&Evnde̟n=ׂAWj9BڃVksV&RL{/MBNKAhwJu-`IebwIFܰ ne ro?K7ѱ5s˅ҏ1zR)gz걟T8fSLl%~z|K(| Ѧ¥K6{^/GIj'V]$Y晫WNRc{nh9N#dԘf~uJk/ZUձlfF=r|%+:Ued3ڪbc鿭5MR=g9AQ௄ ~ D8$s|RPt3?Ĉ@TR-%q,2d1$o"5w_-1a F M!I֭oTpM6;E-+`SRt8y`ߵV]H2m`@{D0/u/\_@l[$0rRIjY$?jAXE+i$hK!Osㄚ=|2h~Sg([ V)iV0`d9`[ nW$rm36s81>1M!sZ7Yz.K@@z?V f x Pb+MRD6[aePq8oOs>^M~qۻ^{}\Z~@&{n)i"2?.!: ȡow:7p-i7Uvci#aP`,˾$UL̗ωNuROCJIwnZZzܼb DOaA.ҥc, :4qJэ^K,iu\@[2m`h_Ў}g5ůOu6GHв"[#G}5gYUcG%1ЋftzG08tۻvfg 06!xE CϞVedZG͔1E!Uvn*bp4;ǿʳ(#"\1Ҽ7g죑#mBB>A j_- %12*|k+ `(G,`G:l *a 4 8pۣFZÑ>@T-2mu5%H"VT 4Ff,C}; a)+^5`70CG@2s9Gnn;W'OI!#Elx6WU!,D;‚ g G N$נ:AYػnIA.|<m 8W?,l͛ͲA坞3mN=.' e H![,oBh)dԼ[GV/)vvAjQc?;x=;,Zk|\6fYH<3MmdZy$G>H;6؛Z]jnXd +r'\z;+c٦M5cƋ)[6|y/@vWmܖ^څqݖ~|nt[N', вII!Xk&=4 a՜I(XOż,IY~x\ t PЏy$3jA]褅,l#C~S͕%!eψ*(bѴ6u 4[E$A5};w'WE<ҒD1X[^ Vބcq8y Aق2ᱳ&eI,:J5d/"8i6tsv,bwTGy<.z/ΫחjPwL-&au~DڽkG NA6 XVX-R4sWkȀs4#F4Jf?Zajks;IfrAWvA9/3zh۵a/'A5`|=!yJiԑroe<Г7|q=1uRlq$gCT|5yI[9H[ėoVRF?P)V(бBþtp-V$`+ 􂏉ӑ:?W8TlvU#?'y> lV(6mcéڐ~Ŕ' Pgb A~sRb)#!ڵ;]QXLͨTH)d[VcGy=1:$}F#6ˊp,Ȅ>x1)vݵ6Y3 >~ʅV|aG_q##cKj4f׶>R}{x9 6W9E{k? |pݜߗ6n ~&  $KW,sqf ][NKEj'7hr]|L-^U6~N}{&rw+9@hZ:mYG?=2 Y5;hY}$ P^cYR@VϹ?ڕsaiLįc;,tC6\1x w v u <t,[^X,:ʆ9@ XRQÆ1T;D5@~&tZ𴒶f8\$}}?uYCXşgAoo|40׵2؃y\8ځ$_}r~{u^ˏyfi:1{Bz}JξT6t3M7g{.+a9cܸn 2=um} .$ Dc.|Ė$϶A=Ut6^gk̖tv72w#f b:w"^[ߟ|ʻur5^7 im. K*D :Y .oU0c%pc`?e6R%;׏VYCK+ki-(T(uum1Rv}SM\OI6ڹ-N% f"-/s+]>1 9?bm.b]OxQIC 232؆mWPŪqim+ۦQeKyCgf/p>o\Ug&^o }ed(@Qpw %( L祵5CFk~f9ÉEL|o&k3kl'&/o%5$9JM%WC N43K%see4=捺35#/jǓ|Öu+ilm[>n%OG5]/_h D0Y*HIL;j{zP"Шz=dQn_>Gnӧ|TZǬc֫u{ńTԺaja?wZӋrYخ?%rY6!^ Xjz1/Hw#$RPg e6_ywr?w~ȃUyt8\As]%줦\ ޻'`͇YfA׿KC׍V)mMq~ޡ=[\l=5rZ6Ȇ){dG;#D7[)Knsmp݄+V֔_X3/a));ާ*-p>,RҫC8\]?qk dt ,(paj=3;]G119i39Qg>^Yf>gம3Ӌ"VBmQ͎'-gσ VSkF~RXlUD??5l#9o%u,8xS6Y,⻐S)'oXp7G%Q_X<'h-,| 6 (fm Op壉y'3|ȧG=+nz-A%M2vVk`~xx~."<>wo3K.tĉ$lV)0Y11/Wg/fomeU[*c(ǪnAah}_ qW26[1}8LSf*Q;py-7 ,&a+4V'N̏>| vWCW9JZXv̭`RUpd1KeKV;=ߤl^; N&ky@ ҧ2E&~TpWQktu9wy~ǫ?(Sm(><Z\} N^aNzTvﺬK%M}=5Xn)'1ڀG-;=PwYZ"K*ї*v|tͩﲒ4bCTs!i|7l N'o"(J?  Ev7~+VJ2R} gD\bnp5>CqЭ1v]e5<6HG]pm$b12R22\$q$9lvWewsI00.(e2fV$HxM O2>1Zgw&%>t*9mucgw{D68AΙCeG):A3iإWEC}{I563+-9:Y< zbͅ=TC|>`Tp޶Q3g8I>˧kyeq e-̵̇Ro-뽌whz=l&3됫nC1_7Mk=CG&sAH/3ФfL_u ݚFXg3u#qЃ|_G:rX$R%6jZ1vu2&y: y!{٩VxXOVĞ韠y|m|./ R7T("lէ_W,CBT\6'1/"#3C×g`!tѭE77KՑl|ׅb Znvt+-w3#ЏOa;gB6(MsCick7Jˏ gezUqn+JR02_/*HYY56HX#6 J|](۵Mz7 { L옗g%^`k7lw;Y8/ǡ0Q|}۾k9ڎwQѓ.k՜wvRʅ8o[Aܢe|rFF^--n?˩zzno'PB'ye)4=4< !Hz<(neQ_6K(gBW3mpp9ᑦ\= Y0q*K$yyqql^wYRJ_>\mS$y6Wx/aݞy)j3*1IXCʧ>P YG&cv>qH/a`\[GӝI!܊,2>ߟi z\?jw| H)]}?G-K_}$VznnϷ_hj fiIUFզ^)'{YO{Iy}ݩ^[N6Y҇|lfJ* U†ϡ߰85[{r ssZz>^cIf)ِ#{~{{JUodJ;4q"6zbsB2:Y Ě1rUaewsEE2/<߃A}vRПIg/co{[| k!//N'TN!m`C@ ǃvL]_s[4[' 0R]PRwj7!BB8hCo O] l )B~33#ڭTl^|TR.(*,DT,X%7ްEc %C7 H}_ϏB&ӂklWJg(Eġ4dLG_k3QD/jͭcN56G5vM "$S<}>At0Ȱ9[zs/?P2 u 1MXN0X bXN`̺ ]pn\Pa~$DQ :Cun*ʼ> )zӁ+'·=6^;fh:+X"ʊtP~  ~C|Xm̵F#:Ih EOeif"2m~oEc]r8^j*? X)m)VI/ѬZ@QPX2BvP-KTlF<Z VX l:|ĬQW^;X6̄hњ:.r)Ԑjۃ`ߪ[ * G49LQ`/RJů"xh]xJP5B `XJ6 N概1A= (rcلaWx/g 9 !'Ζ^Wp=#zJ|wa_k}$q惝fY mhzh]=KTt$@n,wT9"5(p x8pϿfI<-oU^%7.lBA Xv2 n,:(vc?Igkd5r13@ XDz?zHnu#yR}ΒjP4#ُ$z!rb(񆸚u8:PGnT~6GB*+ $WܱK`t}muQ[- 8FaTSSOjSF$ɇ\]/8'%r}#<{Ud.p/O?#KQ~C$g206'ͬGf"IC_*pJao~C;/S~oSst3[2lVw>}6*GG@ktn:u} w~'N 7|(}äб`.7qYKeCqb7vF柍q>ekPO#h}^ƽBݥ Q` M3BJ訰%DZ+W!e|1y_Dfcng056O*7ʯ# dDŽXMM0S!.}/7aŜ=SYNkrDi-NÁ;9jx$;V^#VS¥l4D1|YMם7ˣsb4iExy0v$}K`)c_Ktbc$5nJύԭ |}DvkyȪP3F gyM9%ַ޾6²[H{5k4:Τ<ǒ&)zKccuWgh{ґW>ga7=t?:ܱ( +% Irv\×Ǿc/Ic)K$cncw=YKtŶQ6d ۥ1ctZz?Ssy }ƓGؗ.chaw3>)+g}}95/p_6x{p5;,"Th7|N/貉nuo}dݷHfTRnR eweG:釩Nl#eKWQQ{WR&(m|eΒ'kֱL U7o, ݳxf<+ώ06o=N9/m$1bdmGP)ΤCI~Vچmo utv# wwܝ0%ӋFL.݊x\^|꺞̾]֟I.O̍>_Zݳ#σ=tLVK{o8ճ%^מ\h]5/:䫚/}xP1fxoz3},ٯhqWQݧmResNVk_}gO!IrP4T1r>|:ir˪&a콓{"Gw-?2޷ݗO\':]uMk;vz:<":$5a1O?= ڴD ,hҾQvX_x6>H#p(#MH{~֭J va z&ʵA?m+;Y]V ⥂GǨB`, [taW# GZ Y$siv{$`,`¸Ni0 O~џJ9_Fb=]ۚKO(hA~ܠ FbO~h>l[$0rPi(U٢~(H~Պ!%XM%LjTLw'Y@^4sK9<06>ifd*h~܇A?0]nd Ƚh,!5Xlo˿@\ˮe_b>D:+VCl|l>`Tt x DuϏI><"T5$07le1^ n ([qOQhs}Of^=`}`_O}>*@W __Haz3a}FܡQ;:H8HOI8+?r{S`0w]w{ؿ{ ?-WU\qEr=o1!q8^2c`p+`RL }9K0R**hS(DO7$m^y?VΣ l9ri+}ANUext!gxJ"_h>>,*C&vB X"X]W}8]PCH~Ex"0a߀aYÄp}D!S"( vC>"uN @:6jKW`oϝz_aqʳ 'Vt_W?~cXK?!8#xnП?ϒgJB 9>\p_~m$cgVI>xR՘UH!-]!~P넬*x.bs!ψܘM^5zx+W_=ChjxФ5Pn`c;YaYԈwr}^Mg"|؏e5ƹ8{s/Nw`GLm%_#t}e~ӈ7lM#ZQB*=M})#R9꧑ouX\<~SJvZbVcux%kƦfpul~=- ~5Hg=0Ʀ.vk$KO93ʻRkz:f&#-6Sf?cO_Jdǥ!Ѹ|ݯq R%zƣrbY|icNt-[|9˹˩g/T1}1w4*&yy~IkZKÍ`dY^=Fb)Mnsp8C}OW"aUң'ƟlP +L0:%= iV3˴ T_wZc) OCTһsvh1f:،"5W3cE|IݺsX?kv~ 2x^!{IQOVl6"w;^+/TϡF"'J-͏vV!.SPGTUqx sQZxf y.-o!V($]![ȱJ6SfZqr^?gu sZJiLb34Fw:fɺ)y_n(U8=}DzL ņU(? Ӯ GY ŧ_ '9Qs7:Ux[:YZ^MR6.dMsԬ 9]Lmu]1 hU;ej˄O'% Mzt3^7?X:]4\ A _vϏ}(].ˡ&)gq UUYDᬠ S(w*Q*G}NQ2__瘶À5n:g3z?e.uNR%&AuPz3~ZF !eyf.la3rgq%qhsXiLۙn5bsۄt^doL-\fv {p&,q|Z]TeF$َS[%Hfvu]g1T\4N }wZ05_)K5>9 4ZS~S%S0-֥/tK_Ӹw3phrۿf@{fy_f'& 3ŧm8 *Uct;<`h+9?Au3Py C Qsk]"0Dv 5kn1m2Hbz )S]M~%oWEMqr "H5]JIx&C ;29 +҈?^Eg#b;'itU7ۦ`D qaBmg]$S7y}c!WmcrIOBFaӳ28e=_'u[$̶ߚюvém(Mv_7o=џs`)Do\+ͼɏW'UۨDBɘ$oͷq9V2~b$& YPɩwbkiNNKIsN'i!P ΚpT7JiQG^~X׎^O]oy|H>V(-/e1-5xƾw7Isva bQ;UjXgϷJƚ&9ȏ˿\z1>zFS1;?^*kn{_wٲ+?p6kyp۱аЊZE2m\*o Kq|>*I:# xcNc~̀}wCsIA>;߳A4Dρ{)y'~93mPZ /Ň wm/PfE:Oѹ-h}v9 v/cMlBAҾW ɗ牔xش:m>g9%3N8tX} -3?v*VU _Do{N~ڶo@j0 yǽHm'S/4I*dqn~g}c?ZVo5]O*;u{ 0G_jDɠug"83'rddb3-$5IewMJ eezl `-gvV?6 }:#aժEJPweA8|n^쀌2K`~,dϬO~aѱTtKp<=%oH[R̍˽_M`%_|YQ^DK]lfi8ۑ3)%3fj|w6Ue~H5rN;O7Rw[9$J5`rvCy/qzgǯ l"z͊j*j"o7gz݂hz<1C7Դ''lf|n&LC.cUN9n#wz 5v_tfg70mKdNv>Xj&m zOꋙE3Zwaؓȇm*V:e@[Eʷvv*\*"ʽZrw.ۙ>C2k~GTQ ynD* Egtb"6wJ[6[Kr)<{(Xӓ'dѴ2Rih;#-e3~ FЎv̒ss0`l-- S G&vkHWwiZVρCoye>}UN#_So> wL*"ʿ_Zo٭}I.埛"4>*ekiaM"XG*,qǥcQ +gV Q[9>(F6 uUDu6-&.6;CF9s77Pӷ굩|9W|2~(r^txf'VHw\_MoηE6^.}-'k$ݐW?TVx[Ex8|5vo9 C{_;.$/|Uߔ @prJ>0]"uİZ ;o"2%2ݞ /nσt~H:~HlA YN3Q~;ꖵmGeegxv(XN/ۖsblɋ*7!z&I [rS~0\\@HGA1Náb6DbG]lk;g`1Q#`0ԎG"isAj\:lF]] ذrGfH.Z)xh pvʺ@lw pw?0{GWsuKw~~2DI$_XW]ڂ=n31 ;9+5a~܇ qTR/%),^}n9sAЃB(BB!J!)J)JB!JR!)JR)JR JR!)J!(J!(BB!)J!)JR)JR! JR)JR!)JT)J B!)JR!)JR)JRB!)JBAs9ҔKbֵs׺@fTDD33D)A+gsPJ'Rn¼q5E\~ǿ}5/;IL?莝-C~m7Ƿ~D>۟ u9:.Ax-%uoo,o71Bh4zN=qӛQS .ci<w#\^wUiI/U\ΨJ9W–t{||z\N-buˑRAwF}Mq4̲*(GАEޅ1k`@&}Mն{AA rT w[x=OINJ0KO\"w=>@ [ak2#^6dc{(.XV{M^NmWGI!g(S8즈Ѯ?PrI KWU>tmxŠ}' &Mʘ-ہF߲e#~K4ڎqPiM1  Ͱv|+S;+ ܮٳ `LZ'݋ՠlM dTf I?lkK7Ȥ͓ f Ir<'pfl|;XID 0IKtpv MnAÙ԰}NkC_E*t~ɲfL)wUFZ3q.)_B/ <].Yd2]Gml azx8d9ª2 xMaM6únS| S .lyِd+`f[R"JȖv٨QCm=M5$fwk=?IXB*h3$rHq!AI>Gn#.pH/a9oku똀x`)60c5&>A &""j re-l!dxpԲXr꟠eNKSCj \DfW2ՆD%-~ Qb˃M GȯQ>P" |j%(dZ]E%l= ޗ{h;bdr q)k}gx{uO-UśRQmt -S!Bp#^ع1M cI P-m_ ݆v'?v\8%A. zJ g+$VGԋ[hk/93Lq~yA3x RH|"¸^fk($-;Ws!:y[>,2fQ8 =}P"{pO}?낒OQvk+B-jjks>B۾O^j/_$6j3//3ꎫ/4z<Σd1NO4b%mTiS|;5v|jGWS1DϤW`*dk?~_2w˕;tZ[Un/o߈xTy<=j6HX#n0n4- aқMvGo3uGuʵcvOrE眬,Αtf3VXu,L̂J0 ONIRk"k/]VW[ -/@`:bF~VbkAS.L^3Ӈ#ЏT<|s'SX K2Եv/u31u"o~&;9h\=z $״$ߛdd Q8?DK%^^B2M#aW:j4٭]0Ȧլ13Gb:PR{Q9Ӗ7*n똝NjWVhC}>w6ErJ*5x[wWs77W+}bxNxTע~7gF{ 8CȻe 0e:*G(,Z>D֮N[sWGcÿmV=]ﵹD]Z~o7'(c،@\^H]y!_*:4]պ燗g~i^,Z}iEXlR i #jHu˓* f<_ɠs9:@yu6WVTdàؾd! G6#@387@nы1Sk;##c1r4o57=Vw:;f^mvdgƵc۷yfL('Lp' mN)\{P|B" 2 ULP~;"ՠQ^ >Okxe /+NG0aʏ<6FJJL (]O7nMs'NR7EL ]loXT\S^GN'8>V4(弍,4-| G~YB$DKb.BV2=SO=f DŽ;b0!kvV mʨIfI/[/꣧iB[ nY2\m4"6L͕8R $FBʋ)'Yor.=2woz$:~n#bbQ^'q]P ӥ#~z݋j5KTTicOeHaf)!-^'Id v2q]w+;F\؇;Ώ0{)4D[n\l2u2p/0#ţW!{WyV 5Ce9IzZ~~/6€A])b:U̾77@:lQ}34C",w恛xbxi\}GbZ_[(oF3 m2PWl3rZLsp G/+U\SΊVq7x-]U%ryizq,4ҿehGia'ɲoF^ QqհdXCLSs #q\/趗>{Fp e baF-Oaq'VCVjط]8ܓa*c3eBz5wш/Uw0KDzI 4NIdž-')ՆVX3Ӥ몽okGt=řQ~SkHvZq"n>vn+ PPLS,+ŕb rRad[.ȟyh Q3y -<;l-Tt Äsgwm~,{i?ՅWNCC"` ͓e$C2GS߰l"Z#YzD1 KEO|{F/U?T9fC#7| ~j$s_}oII x4dta!VP]OSgppxM MyIΝ3eV`j\rbQ.~5E+xEnAW]J$ $,xiO fe '! "Trif'ڣͤ 4u-ycNҕ OZQY+ޮrM3DSγZ\qtBt7 \+ 띚e 婞䖦V~) %#dY;/emdN~9y/VpgҔ vqHFvB̅Q'wv5]pd0+`y 2FwƒZfe^Pbuo,׋ysLtxh\#+8&dcj@QETR;a뀋b,.E,Y?̳N2ϹQi_+Rם<ǚГ AohS;|6.87\his?qEwB0ߜT2-dJ\zʡ;1F3ʟ0zpwJc_`mV`|h}?J"'U@V> i+W?+)^Hx[U~y*{?3bw#;xj7|!{x;Wg )#G'! )wcN?a* xS/JlʗmR{ rB*u)= ZĂ`v:c#\Y-L38]-CjW!hQԬ`p97Nyz_o7a~\tӍutOei7Ir,} T+#%kp$q;IΓ=o-꙼$~ B;H(_,v\H!ĴcaAG-f6pb}:=}!K ӝ,hi :\uas@h>XOP@m\!0˥# /B\ŷб@q-tQhᅮ?,CBjbZ(4,]ÚÐ #0y^ !CIg%Æ(Gmh!au 2*yԸVǤQ&M?v*| 0@wcSIMSh"FCiD(H~ @bĭl^5-#g 9A716FD9l^;NcX~>]Y O&nP!Xj}+kh,W^&L0Jx?Tw8^onA`w@p BYuPH34܆ 9 gK,OkobJFk~SخGjE[T:%4z>b~=7?%!8Tf,pU^C͊WtXY>Sjx0|%k/~6A?t %)XSui. ZsL8ptD"@U&:xH5Y_%d6˰ |r5 3=A*zS@XU=v(gլ={3vw4#*htꃋa,ݴE!AR?'rϏ7@7Oڎ oױ>gj#HMt1* Gi~vU99,B>͹lf'O͔dEfa.Ԟ.]\*%-,;6Yŋ("LmTbzp3Gz5o%͌iyZBX>~:5$AXo͙Ͳrpx , izz*nl1p[l}iB}5"ʏrpUӼ>+?8,|t>yM'͋En 9fJ~62S7Ed->m$V܇c2+,Lq=X.}ا v2etuo pqG~zL\WIwTn% RuR*tV5 r]DM!tr+̭u_"?>/nN7Nq :ʥIKFyg~Mhw6fNq q)XsO476gj9 YP}JM+TXy\( 9Nxw#bOIRg bܛAKސRQ㢤v:]}fcw͖L}>VO UX^-'Vl꺚l P!qVGPщn1-#t%xBܹSXTļ=uLV@*Uh[KH䔱=;j"6.<9hߤ @NDDm u711 /wj1::E#O=ZQ|Q5Tt jBL2oQ,+ ]N\dVYBƠ@k(ySoG[,[2ne7A$.,4̟3Ic9=~t}e$m!\V?&R(\+xZ2N !#T1M3-pomz:1'?.iyP}F}92cls=Q!_S@Ja1NݧVR {O,x`ID C`yC?\Zߍm:;;ї BZ`s6 o}cNj87EeBknD7Hhݫ=Rh EiH~Ot'C*c=8 LԨ 0ږ&xP+ ^v,"a+6ȝ R F.[d!̿iAS1F>k0R8TR0,,a+}TKNj gq޾f6)q `2D@ۿGPpi ӷ\NEHpȩLRtlX&A4u7ON҄;x4׈0+ENjxB$dGtfȍ3<-#[+W!FaVWr vYIW"fVUD"k9HXsSJm#Az(0V譴u\KaEsrTeo13{t@:PY|2a{a], vlݽ?vB]b2>3ɚ>}I;pҁQ^s3)lJTT1 Iy%ljKu1<di u_ j\y<|,QIlMXȡݨ28O͙'cdi.YfXcy.Za{;ymTQ\RJGTRd3N㾽-U1sCͯYm`~睠^5BlK3970US#o+*yJ#:$dbz I0j9m 8>3"gmJhAYgz9ny͋Vw@SjѼV\y_fi[ѤU?ܢTӖ<%'vZ]2msB<[.br, FJ±2EOC0¬$`s!%lJVw̰s%2^aJW֬-J4UBUr^X>|&'Nf8pFR^8PN0ёE 03p~;9kUlOs>=Y'~U9| .n^b'E4 Z 6Sf~K0 X 9gjA1 kŊVRTRxpq){ߓz"쑘VɨԳC6ӷW,Dhz8A"kf {M&MT`Kqg|#gZ̤$ ӍTdL:ߌ V `)8dkUϰch wѓAD]`r]=*<*@$  pc>Jg!꺆={|VI7iT-3ڑN1y8vҷ%g}|YM۫k;[&dt.sK†.?_xLR;< ˽:Vc,ې3Gp-3%q KPߍ}^!kq5ufDڗ*NC3=3_ Kigc.nzv;dלn9Mt ʙ(_Ҙz%^;5|9:;jc PLj םnaִQ)6+,_0{rBO7IEc{IVhEd[XxJ b?}ⱅ,S:vk^gGDEZRɟ}~o3Y^ߡ|:2>vYU\!_ֵ:dn /чpbj0vS[0C,zܠ^6c~=G{Mn5yÏWE ،./ّܪ'ݞdvDȨJQ2(M |_5wOVyeMg{}&g"ogcn=OOMQHWʂagm덢#>aޅph+|bݪ=d]Jn[{lcv@7ʰ4!94nv=~v'պYtms"QǷfwƗ乒 l͔vdO֨ԛ][mk L>^02yk̸/zK;Rx6a]NT;\LNe*GBt\nW Sʤ߷.DFk0#{P9uͿM>}gyF}խM"bElm_ uc8Cxs-~n%yGH] 緔rٰq6E!jnSR3mףt1ՆgtT1OxAYѧۻrc$8J鱊!5QFY% J2 5 #E NY&Η*H9BJ(mfe_cl vvobJdeC gAc٬q);^oe1>Zf+{yyˍo-w;sHQTcHJ~J&yYw+,É]JD ̓RGv0|vT08$H#MWf t6>yF[5w8)oo3,˫ NltT y!ˉ~~,U}%-5Jj}!pXd%\^mFtl)L~yey`N?|w]%tIb29='Gy/J:):Ar\]&wImR_'` b~+tޫH:8oh;e WIr uJ(MUt6OYTsKyN9uҷi_ܝ ytBrA'"YtYIkJi$FEylh]!yL9I0z'8` kBsJ펱Zd*oxHp.KjehPBL7Ybah.fezh*%hw2WիW;gdE_w!̪UKs"+*z=cΑ SP@⍧>bo}k1쩘yBO!!I?j9%=ނ>ީ}-j6<,򬓩&MIit>qH@i?M.>$G?Z! m,j?>p_"BDn G#z#?d*gb Q7oAn;UyDvhޛqZ]|XIL{|]cMc^i`ԇZ7ӞXA%kge3R#1(`P;\2ld * "g:.78Ѫj& $j'YSؼߗ/ú~h?ȶI\1-SR@Ubf+"e-chvHmEV Vld.TFwmk{c`/AJdH=eE>,zzV]KD0о7vH(d;+jll.FV[5ž>NăuCr6SkL1Q y[vG#m:[$.1fuZ~!ux,M:T|㤛x^e׿{(˥kwqjۢIfY8|lݏN+ffE1DT ^++ue"vf̴>rٌH"9ȱx,Sh_}}v̱M+arj襷`gwȾ >,̑Yb'nxw͑pHČoyk7*25҆.ˬMcaKE Wu d8j1R!魵Djk"D6)Dl#>%Y`Az[WM4!U̗󢜚uqM*˫6adas2ŊKNj(.a~1d`i%">v,pJ 7Ҿaل4Oi;{YXQ'rv ֶd{d]a>(yON1a,TR%.9h6BG%R}WSvFM{1 .Y g`p rj=FaKWIϓĥ]@+xk큗gި6Zm䎄IMp7\M{Xh , qhw0ExJT[k!$*4 :A! Ypx)|Bw/eQ4L5!Jx+`4"8,p'2ܣ KY*{Ρ*< ~K~S(:)?T?Ԕsvߣ:U_b$(TPkr@]);S\V~`FI&)RR\)Xm~KBhNe~":-L, OI2ZQ4Ȩ6Jv|qziQ "6C}~x:i@2&qx%Xnj-9q #Қi|c?&1[nȯkeewsni1ⲇ@Tυ3{[!?(/eUm<dtvJFZjm5L B }~b"9xe h=FvpwM )j Y Ę_LQ[KD{LiwԒfSҴCgU'U꒘p#2s\QPz8`$`drnME/.Ȱ%n2!CB o_TzfШ:E5oqSLuǗȍ$&!rFvR]5I+S 6MS7Ӻ =JSE4KcnDNPwuk }&\PS0i0Ji1i{HicMFC ڕ Gv%JH}.O_d =~%KU#N!MuRԩTNp}{[-FZ{yDi'iOsU=;S2| @8{e/?Ȩw } PË~50¢GRS;^Q;o$lr$S˻5c*W*¡?ji'OwX>_]W ޾pU@g≖:I241R;X],Tn[ RqP@T>X@0ڛbJ*Ӽ/1.˅^ 60ʇޝJB8YO*>%T[vU]&ri.B)`N2\u;ퟳ5bZ.;Q4\A 5e8G!p*IC̫j#*lBi.?\aRLiKo-1);JU#JZ%)c*»fA=o Q`ȤJ+7!oyFzk;{HfB ҥĮvT%CYAS*?O_PMa)Sa E4P"̔D2=C>VҒP-(tHBE!])-"z•M9LR5aLR*>)RJ g96<%φ?s%ſhq]??8{QUY '| |knRR/:(ΰ+yGXC:[mldkeeˁ+RlLe#W%-rzS)MXdCSLظjz\>õb, ̺SJ晁Ӊg*9L2N~(N7Un'RMa(g霰%ЦEԨ/-cԄzԦL!J*ND#ORTzxaJNl)3X?ÌS RXQ;jdꁑsdF^fu--dMVk/_/[1*TˡO;Oɚ"zNo9D%:%JVz@Y%ӸogiN +miGn~j ݦTr{J01_ngSV@UV0)~,m86ç* rZ*gCVK-)ߩB)EҨE#{I_"R;pRӱSLdPjb?ubX{382Q*oJҩ4zJn)FT8ݭ3.1iu9z:lI6w:M&\NS TR1+,McAgQ86F:H(TUr ~Fo?r8ACj# u>ķBs@@R8!D yчx/$RᲃH/&&iÓ1S p| hÆudRL@Gx)ȑ?" ]8|0?~&%;Z#˧a!~)%Q㬿W'QCDFWC/I߄Hϥ"6&oMZx?P87fkNY!$%ɩ$%G?*‰ICz Kg &LK|"@&\Y</,pnKӿ6}>x G1 R؞%=zp`u' !6xzKӆrzx1@9DN * `.Lӧ訥wP{͑Z ܱ7 WՆ֣bW-x" [0]SVq}z3@j"Q]8ْ!TҚv+ȴ(Ch":S3|Qzl\(P\E*/S8ec&G128O)M2A;_`i%)M@'dE)!Lg)Q=lrUK)n?U?pȧVlI6y1+7ɓ v3JR itQޣݪr78=dJJv):BjM,ܿ(/8\*ҭt0S=r*dN)~,z䩄y=)Saa,aF|9_晡dCvlҒ@bdD2Io nAJ=h L1R?4D? Q"(a(lv*Q!\(iI)%gDQ,%TyIULQ)?+NtTA pw~sH&OBNp,AX(d0^S78Z<0/~"&e)h_DLbQD&*вXH rVLP׏Xq ,0c p;AOҢe* `ߨ6z*ς:8Z&|׎%K͠,piNJoRBqG\nK zcVz\1`2 W!Ŏ@2wON~[4+(WX0TIZMey[l1fu<Ī1L@QKfupÇ V,SXԓH-}IP$"M;YE(#O{TqH%<qC{1bv ޙ4.E&h`T7KXuc,AJ|Po7o3¿tH`8-zpB>ХO2UM.E;IR$R&_Jy\-r(BCWz:>KA)0L}ĉ$NZ Ч̍3ˉU4ISk$!ʢOȕի .hD?O$i@xjW)۫/x }&n%*bɟ#OC[6/ L |㧃M<& J J&%^W풳lPbfRq }UKtĻV6ɼ# ( iR6,xɏAM"4giwTQ*\<;tZm%)_NMF'i)6CO)cM_h^&h YXj[u&itkd4?mtMIAÏn&8&|5k^62h&GhSJK;Zb0}p V| "]P+8IV@Rb7tؘuzdtxY' TUݦx".{i`&,aZRQ:Gi@hV:+xg?]ڊBmM?R(QGRHW,(a&₉>hPj2v "vp_&Je>ߴ5S$|%v@_c)GUro)nMj!LD)6Qk*?qnUCO9 S}qq1{N91j'[@u ;B?_ej;'j ~~S!%c|4(fLbJr'L)ܘ&4 ,M+Ms[MR>i?Ej1}v[o*Wa` gv@]oi3XɤV%ZA'5ץ5eX0dvi|%,[>0VS\dcw>:ΖCcJ86/2 dkpÀ\d68bX6hʶ%+ăS` }bFE>]|I.2B'áJ(?m"b!P9ؓjWBSd6H]"4`JQo Qϗ7gaijNi}(kЕ]k?( -?z&0^\S.|7A&Cz|JȔa'@VR0ϻv_Tc[PT?r\g"C/jF&./U/ jgrVwh//΄@gu8N1K?~Rc2b01z&+:"XbQ/ %?Ԕvb[S|?kq,Qd$Fqgi)LJ.BIGa a!%V%Jf<ј߮ EBj8PU?8rM !e MbDGY49~!CLEd83@>O&p€F:LsArlBD ܟO;}$wH@ІW@x<nl<~ *.cx8LU8c?YR~= h[┖Qb5 %1mCl><^#UԗGECuM<\^MLN ɷd۱ pebk0GH z}<I:ۉ/H!"ibu?%RaQ 3%3t82 ŶL!|%m) 2#\ GNZP22, +68O,o($Æ"YjCvJ &V-;3k..{%Hˡ܁jh` /h@R)܃H ! ^Lx NOqdrv5Lmrj$j Ű܊>RPvֆל1Q : ]凚kТMBFmrtl-jƫx8v`$액`Tlxn~[S;VƷcz s59XT9^@z2 I>t_<5GxzNa6 ]}t_\`ה'Myv= 0#y"_!Iu8‹GD/8׼y2=I۴+)a2^u"쪐}l }>HI*;.ҦWkz9ĺi /8s99 EiQq\ff0БZ^QsonCnE_d7o9P}.%焭W[o!JŃ[qЪHPo^ qfԙyCW| sXLX488(eKYvS>5xabټ~`d+l>w1ۣxwYVGkT375gFZhBU ű+ -42 @<*x:8;XqYVN˨سQ;|Oc:.#M4.{s^ |!+ e3ި)g]܊zez v.+gx#,x)&;Q<8i| y(!&4}YdJYr6.ࡠaG[Mh_^?Ip/u.=,}Hwn;-|W$/+-k1"SEW,=(SBrKdvw)VEW|E隧u@n|6Mٳ7q\!3<,ùQb ;Pf*=ܑ(E>Gj5<^L3׻Α=2=gQB|D77\60zʻ\u;>v80ی hGk{ls+;v6 ٛ*MF$vϣ3* ,fs9em4m!2υrsOzaQbzpUV<|Y^C +^ ?:}{9w>[3B^x!0L=NY봭 ^H!~#V cˮϽr 28}`WmH3jZ wi%"nfZY#jF $^leO,Fc 9EV;ewm'!_K{0UZ( (4K )ECI30OM a%J3sW$ї@VUk+8q 8db* j/Uvc\ovJهBOm_t>=ca]Ol5PT%+*c@7vԎ Γj0fd!yܩ/Vp"uģ\Zz\~-d~!2]>1ϾT_{fLiQuAP KGfrevܹ9ɹs!ǖ;y} l=stê-~* |t܂ B0}k#zŶ<Un߂T3Xr^3ƐX3涙Ge77ZۑgZGŸS6j֍ޜژ;/io nN=jq҅ h_|ĥTc$QЭ{2: ﻏe;r<v Q 8/O䳸76Ǯ&t*zJd."psk7êimAvI~$oܑӜG^ZBsyOԓ)w13b];|m,2$w +„ARS?swY]Sw[f-w%?rP^S}wn.U(!]oEm;.Ws*ĸR*a-]vwԾLEׄMDVG|. 2{r̕4IZMe_+sa`t]%NK*]mdj焳m+\vC)b8ٮ,o_blc~wk[xTW:C*?yX#q\3D[ 9NU_r ӽ0;u8a\9訞#=-&{Sne2p4;sO%v-L^ &B6] a r.޶a"E6uUF8Snt&&ݙ(!\mE>_p2wz~AV95Aۛ҆*mD>'XՎp w %ݕ D;"ͬwK_fM(lY]. Q3iwG (q iwv AQHKnrf~/ (I$%m)CwYӀZl<>_7Q! } yTJ9 =~b2 }Bqpv"0;ECSaEpK& Y3_Q@FM; WP!`&|'MSvKxȰE.~MKd[ &pChSJ>}yh =3KݝewM\cexw ŀ$.;$ I1ՒS:J F h[; Dko4a(zp%VILfԥ56jq{$f{Ԯ?1Ym6tC}5L~n8| s2~g?6o3VjxFj0&,!ůD20͔rS E8ni`$XJ)o9(+F+NwY6%MҊP<2a[ AYD֘Lz-DWO%}l[_Tr^/+NSA&$t'>~̧$P3y=˞Kc(IP!YA{Y*criӐ\̚dC_asQV*T)ŀ?}FX*!X$Q-a,E1/  *ӓPaX6-'q"2ÒDO[KBWewd4cR)%blrl䶨wR8?a-jWd}DjoM&@efFp^(T29>[vqQ7nBlί\!28NxՓ`Psb[)O*]}?gB-9}Jk52gu<(wUEۀI7dg L8l ì@F) }vJ(`}f 6Mr#|0r߻ի!ox`©aN*’{96nTOx xf@D8tPS USIyR(4ir_v%5 ~&ŎlY_ke Cm§np.`\TZ!b36R3,<J$Դ!* ݘ32?tɠN8|BՏWC+!fΚ+ Icݠ#2&gN6pOo .L`̦P[U(,a%)uj| Q/ы IioM$KPRexO{\F:1o#KCWF]CȢV8 6)#Ǧ,%lz35JÅZRFPVOe^wOHc瓒*`Zexp=n$E>PkI%6_Äl惕mF ;cݲ +Ju? zl|#ZcGچ]>A$'4:4TR3'(,lIu<@A3zFKm|+Dn×IܵHYF8ŵ!!$i+^?-۴3 U VlG"tƸke>zt}>yQpb~%|̞F'[x3B66>w7W5s3C\e ]],Ή9i!St:RZ,axݪE_E L"0y3N%l)>CL/ҕ&:{䓔^'嘗ac?]1WoL)$LiK}u)BH4;=|3ڿ=ō+7T >dO j@vz#R ۾y Ve}4W,E9azkezm6M 427<y$$r3S?dD:<#VWb_vz^q)q6Qu*X~Kۚdu LXvovٗy/&1JSR:$x[6: ^G ӌ S,CgHyw1/ux.m ŁR|YV#BYsܐ] gܞx{-j1'8&4Swclm]_ލbw+Goy:'*I>S=)I`Ce4잖^`,.}{z;o}suɪ=,!GIG}.oظ+ %bt;m)ݮmbcWvu.LjAzI~~N!xNAzNXW}SQ5^{K+NS/ &v.YCKr+6}'n=:'22M$:ΙF'IJ8dtu 0MFjqOyIʍp ԻI.^߭u7Z+%=">Z9ҫOҚ,uK^k ~ӽ=aSt*oiilۉ罵[Xc oWc>U۪ s̢f"*{I>?9͓)Ęe~ $5nY\mq.)+* F!jָ_P;> PnveLZy^۽'qCn+M^>uA ˛"̐t(K$}΍B7idקD<?ۥSbEMK͞AY.پ_<\'9_.d5zڽ̾_gg{>nI{w&fmGϮt 7U ГI):-hn2VH=<) B;-r>UM %?eW$g{T_?dz_d[Yۜs7aӳ\E1>>Ҟzg=y%JdzЫU4ǫk(|}gG+{B̻ XfTM{k[.!$Uv]џ쐐O8dq0 NB{9XJ~0^Q je{ 퍩@De>WұdYҭ-_y.t@}iTtc-Y9v\EL {wlf⼟U~9'\EB*)'CW9?drG q[<3>~ MF8~QP ,R> g Ã/ǁLzJGz/08`4f}b +_!쵑KO!tA48(b58L 3 \Ӆp3;n.cxd|죡]4آ ߲brW+/W\fkUq7H0I uS'ʎ(ZpP7v*OQ!j%]^,"0,5DBsIuEOQgT[b;gp}n^[ 2Ќ_hmdGߍ`ǪYEA==k>9|k Ʈ+ϛ蚢D^;5%h2E }m &p*G=orcWvdqs$>AٚjMD܆m6+RC_0rzTni|Qidrl/ C,A*?}֛^?dF4ST<,WzaG!R@`PE'Hifz(Yૢ)(̖Ͼ蚿{oȡi\dvwO:g2i_7W̴BTmNovmc}E+Lt;Y %>Iz~S[ٮNjwA$6? x׼ft&#˞4{f(nG)WHѺ*9ˑGob4s'gs"&Ndz*ih1_7"3|b[&nL${,M}Ϯl\/eH3F9;gW$D>hH2EFfW]"BӿgJz]Olg#Qr9ox?y1e&ՕG{za癒=cRO/vLdKr9/9tlrʮ.n`hk| MZjU?Io7@nkc6DӠua04uW ^TvfQ mS[&ustR?_kzjs;SOY-vKNrpfIPt&w5;+WfSFϠ}[0Qn~Xn8BŜwcJ$Q[19w]r;>+8FeDf7ݵjdhvv!p1o<T_:_)@T7_\].*Och|gzҀ{:gh}]j#LOp_:~LZ^k5pmsu&/S8QVQR?#1ٞ-7c}tM5%Lk~hb_c1m8h k'6ͧH}㥔E1yomk W==-+`S/"+c3Jz/,N~0?CYcvz> ۾We#l:io{ 氶!+̛kheb_{70&Kcȧ|:5Q|y.`Ct~Yo=aq sg2yV+1cD,z׃{Yb\5Y ׯaXٯ9~Am킾N .l<zg"'1(P|-hWpyn:oku{;y\䘶\'pKda¬`~&cl,OۛoQ]n9_{G;@P# >֧Qxh 6IC=l`{`kII2r).dT³.n;]Rǖ;kJ3ͪ~.`Z-]ǚnTR}.<#﷊G^;:ɏɩʫlN#r59^4n>M}>/Y1|mb;xf^!pp{E8z2~>?/oP\f"ugk*޸݋6Hv˯|ǽU|#0e9Sx0Nu/cx]VS@{*SVôAzbX"CaI*~Oc&_Hiw-q$:f{<)QKֹ]j&('iUī74l=I{WP3C+C\E0vls0UWl]u#l,=NTL閸zQsu<7OiP@Ոq0SP?j#t ]6w,8 WnTtĩޖ(Ki12|S:n9wDXbWչY] "IE?$iSP׋kǧÏZWۭ+;he5^ړ{w^@}eecdl4^E"O)k #.}'~[hW՝9scm5ôI݆@9wѕef8%3܎nOh|&S'3s֊xdaݩEVEqFXWW|]Z/2˸K0pp&;{ԃ?ԞH]WwpȞ3 V};ROՑ *Iu0m=UY∊,ZB8mx_gռBf߸0T]]RXƋW?uWm(@-.7 nw.ىOXZYm- ``ߗt`fSѣUIT@0/:l͇ O;}*z%w8N ٍ](_a~=\g*g<6VHzSAɺWHɚEDTf>x_8`P~lp;Y>EIq::Tr9ꚨ.!%wRQX2| I"Њ/q"G <4!k]oh(7*J2>OM&΍׫9xJ[mE-1yнHӼ84}n> -WKI@Ⱡ$Z`:Qm+Tz8-PcfJo:dّ#gSֳxR -gI LRpU;L!"C!}@O;dlJbJj[ JOwL f;Uwib$t3o=' y_-ίC^@=D,pa,r1lH: 6t\9nTN2]Woy>Ѹ%_YJ/Ky/:]z`a#$5FB<(XXObnfjc6/repOTrF$JW״e~ABkU$2]JFN+%y"qKjCb ԣ7l!DX%Gk TIzûѽfN|@kR#cci9YTz.ؖeH$-w,?'=HbHѧ\=lU$tK`hx@9|u{iLTmXҦ.Nl(P^ L[ywW˕+O tnwP/POƛ Rc։Eڻ5+&x(2c(~WaIy̼SlK|UKo{UcAlQZwP[ɩa"[W ^/l 47k ջ9V-+t~z*Ӌaരُi?PcGwmf;c8 *>ެS'ʎ p9FJުOɵ`I)cItH Z|`feofM5*C7go|eaXlNxT/ d,( 7??éD̮!=-8(t_[VkV?F[-xnVOXRo7}HiIUm{Jdp OqrWRg4b*6oO4V\k0ިL섀Goq>nب_ik6kxi36}D \=^ o4Lli-5.,gp 6DV~O4@@f89/JB~+3KO(H8wm>5OF/zxԦrzK1+h*) A~ӀmFRN)J=f ]ɿ}'@wI}T7H+pq78vR-؛~/gZ._ܞ.' Sok** I_T!kwJ+)ۍ` ķ[XԓϣT+v1}WZ*\ A #e&{ mv@ޏ4&g,44ɪ'#) Pg6kf35lAl2TV0R+8 (+L)f+9T.l2*1ͯ fXÊ|Ӣ⒰@W#XكgZ-ò{] &vl5%GJ3`\`)aW!\MGӟ)YiŀTR4(q+,KvqGlޟ7LеvKdV? mt#׾t.6bjicxȽGFa~V8T3H+s6G;a 57$_'<um%tlJO/ (ҷztxs BR_Ͽ!*".)H6u5@}FY~!F:Ƕ7ܞ'.h˾u|SE/uWUz=t/M5Idڹ4vztoǵhg266$Y,?> z\v뤙d|V D:)%CXD[sҒFI7S.tlQ󀁿E$ꢗ:eJ8b}ft?'c$J撁hT@TvܬUKW[7,s OJzRy3rl QX^OK ?nrqJyϕ<<顥]"C}J LZ^]$)*G{n߻WhrNG0b'c:]~ SC[*cT%@Y!RqmZ4V3^VK3/|MXpqjDXrō.QrFNk_ deIc30Y.%p>0)\Tŋ]T>oddlm d4&ŗߐ.f{r]:hQ G W⶯=t]  &{~#+,-[K}dk inEWhE৔ Ao=/T$Q[kך鰈xq[Q]%):ܥRY wUR!K1sY޳k%@I Ty8z+r25/ngINSAF.0-6U _Gih/|ߥ< z1(*p.w#.,0b#f#ٞ|ߢ.5yA K&6<}!<sr^7vSࢹ[1԰{.2ϨI|f1yJvcw|HHq(kY0TG !#Y/iw՗t8D@4ʺ;1u?&n@NpmR}lbHɯy0恨xDE8JO͑/MM{?JlT-$*zFL].DHﴳ^>9Ao;*9*T5[l{Z1=1YOHդƑ74-L;6Cdupk0Hciwwٖh@udut2K\BCSG*=Ɋ7Q0!q|x}mWLF K).`>}XR\q6WWJjQ/X1 `a"8mュx[M7٭(B%=>it7ʫ/Mg3XuL07M3!GuR 7\`U_I,bMʴĎ"I}oru DC(22km^kdJOqA|Ur35k2v -tJIsOdǂ|hDxEǺFRS(X.62swƭ 6J X?QaG"̀~ O{e_i} q7'+JNua`j2⹑KUO~"$n\ Jh rXNcme:1?$fުݸ9L9T\cclٖX\À3`6HyJ?Eڵ(0IOHy,~7>%9qV*Y8n|vtk"R7ֽ$v^BFvGZ߷B_ñ!>} NhTtCQԗW/sL a0h!6nR[zr(LRL_jZWpU6Fuu,Cs2}s,~#ƒ4%af2Ψ"9B!ro_[{qwv R9&y  ~_Pbh8GͶ:A]l)/ uX0YҘ5|9̗*\v[Ɲd_rhU ;Y]z:)\p@IξkFZ(ӒY9it݂C?t m򴓮IvlSȖ7 ^u!N7RQuARFsEMp\c31 l==ӈ{Ct e;(.q- Ll+mTi0mvj|V΍;܍Bq F0x{bZՍHm]Ct̕kHK"o q͗{19d'=vC#JVf!r&[iSvzEFgF Q)v0,&Q :׏ruSR 977I.0E4nt3oƁR^ގ]SD-˲<*swn9.ˠत{$u8Rrmpwv:}m#Ĝ5!esѨaVm ?'\j)e4}3(;kZLF12/<3-p} L;|>Wn܋]΁nG)}A2Ѩ|~]22jgϒ/iow-1Zy\NÕL'=\tڑ'3zr1.)4鯝A5nNJ%yn;>;噧|c?VFE):zq^z̤Lƛ ׺ͤQ0݁l?2!} GJ֜YRH1vCY: oMıOF %4ĚA4ǯz^*^ݏQMМ8/uYg3)@O8*ɏG+'3H`hGZ;ǪDmh{{R,is9-M$M]z!wsN5ѨPSV+CI: VzccG~5Ub]Ѱdv۽߁PU]-V܀Ua<(vPX<ǭb2.^ӊ쪫z5KM 0Qa?gf;09adH0+~X9|1[ާtPR?&8P$z=NX`<R0t=vݠ`={!{臺x{懹X{䇹8z=>N({ᇸA{߇{x݇AanA{lڇCz\=,WUr AY3«F6ENe6( `u6E bHÔ7BKOtpj14_R1(u\ȅt\kͤ2}ڃXiv̜}ocm%ގul dUO@CUԩGdX;rz'Sumywz+oXbk;v-9M]. ~?Θjתg<*nrRX0d-HHHi8^XXXV;fY{bݔ,5%4Š H)37YQiḇrOd\N]'&+.0z~dC22iE/ӆ؍ѕ2#zͻtp[@ jiwvpʞ\,11GKWKY'Ds%l"\g>\ `R<6LMm ŲmSa}|s/-qQμRrF=*8gKu|y<_w 1J> $ _ۓcb8;BDƞpt \EgMp`X9r .]kY0CK9EOy"z{Kp+mX%z%~]6l.y.ȳJv8~G8D*J^}g7Lk˜"lg?8lSF"Syr5C?-.I[37T{O_[6-Pc")U: ߧw{:7hlhq86?3ؼ4ƥ̽Wun` -jHcix]Jwզrb u*nL {/xqϖ2}?>C[C8 6/2ZtupsSo n}+j&%1u2L黋44 %wucݓH-/G 7EJӪ±ő߲Ip ghI3J#;UoYUMT 9.Y>*OX0 K/RsA %3d9GL)oUoI4?Xr'L{mMNR18nnp6W\<,y&}&z1Szeb4R4ko7~s/y)=4p-QVc #^im`l:R}jcLAV`hl?ܼ˃Qr2ih <cSV'&rv}EK%5&L+a!o8{GS䊇{wwoQ!oKbp`xEr|L*^%RXɍ>/͙g=|has^ϸ?<0=Uau r9LrkSt5PSJWJLCi4ݴX:Mq \>+h'V{#8 =/m=,og T*[kJG ?5K'JRih&v SnG! 06U 5%3:s<n5 n SR+F/HԗDrp«w$EfPFk iuWA]ylxxὛQj/{qb 'PpCZ{O4f7`GDVZָA[=VZ؊m;Ǘ.4 cqZXﲀ)l65^|HxmLX*ffHi+2[LqƮ(p-hs`i_BekǢ[˼}wNN2b{%gt7xB}_I,/pJA]wO21NiԾ\ri9x'kܳ|8ewJG{lpYIJtks$ ۴̹Bi- V)>f(ă.#6&1ToWq/CZv"ѧS X{G;RIC>;8yn-wUA̾rxW/ /z[ u} ߥSe*9+Un⋽eޚO +Y+A/Cƙ(xfs<тpa7Nc؍zZDyY\Ŭ<6fS?I7aNd􊩾/8읩RGU¯|^qҖ$]LT`wM3md5G;rlĊYO5l{lʅxlbǴ +F}+͵Tlj {⊇z%>#Q┸H^;N'0v,W"/qIO U㬔>#s8|`:W˼_Qkd4Bi4ԢWfA̳Hz3DyERܕaOys0gssmO@^Qf4Y>N!Mǜ#;881l>FK?dJ^ U419+Y.g7羘qI5Z=.9$j>p~+O*$t-Yl?]q̺|6L.'ǹI:?*:O㱅poJxf8 W85b4\XX֒ӫT<00cQ+D=Q⼯g+y 8GƄ_cs6׷:= +a1z*ц^FN[.m֥ˮA_Fovc]_NHo| u3kPcP@Q:껴ZH+^:]cι5`8̸2xO?G2 h7Jw%Hqx |)K8imwNmSX)އQɃ7sG8wz;4W:v".k8Q|&ҽ,;-=+wًtr$Ȩoh|}5k Ҿ'ϻs^Y$uZKnl#(ܧ3^q۬[vOJbIZzν⇿ 6p,晗oci9'&.Qlj<5Ը@ĵ<Ro0cRzL8(3\λzŢ4 {$f ,/YN䝠yS %hJH.Muشh+z>Oz}~bY{=C +L|فbuWӉUyW86}q 9_,u~R19 +9qԜd: }2uS9UKAbCwZ(wQ/9ϼl~;J:D1\!o~6XBMNSi]ACkaMSJe{qjq.V92OBv~}_#jKDج'r{|n}ݹz7Kz:]Iwجѿm,+w$nBM\`s.b |5Lk30"i}5('*"d>͊Y|W4'LQwCC7JzfxsJZ=$l~\iq9,Gإto.3E6Tʸax%E[2WuM {E#sz}gzN1%V9gpXعדӟ,sR$~fNܱ'78p6PO+sy*O3 9^b3{*h1'`[s֕alZ5 F֛521byfs"a%sz~W#V^2TQۆskv~>!& <Ь['GaܚzXGNKP07VM*1op u5Ȱv>1k`BdQ.qQla4rduy5 GDox ?ۙld~]$28XZ}"$] ϻgs.~(};?cInLֳ&Ȫd55x(]&3h+Ukφt`4?f4*٪̫m.X 4.t 2>诚hXfsӬt٩N23 >&HN(ZiwislN:\2UQ۝%_'_xǵ?[誃4'MNvdvhm G$8 kfl<@hgw jvaV;|vo}rv,e>[?~^.҇Fbn+g_Lk@po^r,6 7LӐ%9?swf㟢?lglv|ekc8@0sՈdvR>˯@絺2b yzIQ |k.){ygmh9|`/LZzLjPr m}徺Ak:c$!Ӽ^QU%?quѨzNg]spo 0]x9,u~u+=tV\3Ҵ`XXxz=a_lb񕳀d3p# e-PJ.v%^Es!e-23 c1Fr_eLUaa}H0TR5+e,,A`9sAЄBBB!JB!(JB!J!(J)JRB! J!(B! BB! JJ)JR! J)JR)JR)JRB!)J!)B)JRB!)J B!Bs*ZV%s=>deDD3D3? O@6׭>_w/̉}9=-9<fk[W:Q>Wo>?0AqϨ=k x{t^*gRmϷ=O;LX|Hߋ帐Q~o3\LJv`^9"j-?jw]|}B[ {7hmӰ5ueQZLYy3ebG$Gs cA/zllewkzMl.=*SňL\Yfxs=,F֜݃ri.Ӻuײxj} |֐Ǿ5Mjն/I3تK-fcct}#>ZʙPל\|'3OuOĊȖ66r} H6#kfnƗ{*x,It"tc7a?n@u?zKcC·5kGwc2X_jbEGӦ r I0} eϏ<*t #t֎`B[5C4k2NI8gifX/ysճgu7J'wc~w>Χ)}^8n<πOgoH〴!ʔ4g2G FQ;̝vRP%X3^4F4=!r.xy+F㾵v1u<63X4A>]K[W(Pux36=g;?0 ԷquBKAt0ps w9KV1˦βn `%z޾6[ ;;}[*6*T"Y\D&<$j #|"ch=E⿅֡d>ۆRg#F%R׈Y;0u)ɜݜr:ȧ+grPec]`rIc0r9:m7i,BqDeSO7-[%j< et VڅBb0#fϧb!mbgs걼iތ+ru26 x^'wkZW7G"Cd%~n%j\Ę=J޴t2~T@] 5"%h@4LTM1D<@Vt dKjX| 'loK0e1!PqWB[,I!ly{TsDꔳg* tmM1&ZdXORٙܣ ^x%U5'$ d]j+B!ʠ+#L_1 VD~y:k%o>(LU5'S{ ɴUDRuA|<F:R>ܘ` ZYN̛;O)1UR1:j*iAw夘mLvkؘsح,{iat2ap@rpPh<|1Rl}_-Lw!zw?ErGզ"|kw=ӜK]l-. [9]$}%8: CS( Vi L0켹L:'Lsxx3ʼn$[Am׊׌!T\1zK /d.ˤ W(O% /:_5U%!z9VM1.+wPZV ZF9\e"IElhɫЀ|f96$iPDP}dP! N:}LrU?'M"Zg%wU҇DgPGΤ|Ycov{u8_iRZqb&s>}ܽƧ)kj#nKYZ8$$/2>lhY dHJ4'U \f)mWDEv2GFwJ#= pv"'E۬q.%EɓIt7t'|Юk| >Q# 4HX,GawJC7ZCB}\[ D^fCqL~ h}ʀjD*QqiRofI^Nr˂E6ǖFVocW*EzZ\ 0d$olCf77o7ˆN0 %˹0Z c[D?VG1 oO,#F9?ڹCVyh:2H+rϘaN|rʼnuV J}j_mԄ㤄+S;(}[h#UG  ,6%D.b Gc1I@MmBQGOHTL}2v4 /81!Ha#'\?L":qJ tQ] QѹosYxk}wv^$h4+1!5 No24bey푲:uh+3ߘhz3ʾ"jsfn5 L8p%| K΂P3^!%:-GnI vRj%wY.FNqKz|l c13kXˬ}*d;,.XuHv>ґzvrRE(ᕖX"9jg]@SnHc.V}Al1||kO]>Yq:>by ?o($-a8q>MrQESQŧy)O\ǫA!hPJ*sn}7^ק6EOS򯹲dun\izyY^lKQO9[Eh%peE uڧNtkg59~V_/? J|2ЈO~g#h0i`Qn'quFFٰ/2cFLn#%5i¡vt;svWUG7?mB#9xX޳=mgN gę | }JRW %.0>I6Dk8;*Zn \H:wQ)d{NfY!#,k%P'>xZ/+mK4|[xP2CPϟb9%9XL1 Θ\ 'F O FIq6}6}f nԝo_ڻQC֤ jގ7ķ 8T&[Baq/ج2%n gm#eӉbN}3b`x8|0T HP~)'{f41<9CB22`r`:YK9P$7jX':3pt_fIWʊѽn:KJE^G} d@nION(th 5E>7??Bh3K;S2)d\u>xO 3~OQyLIjPwÆ[/m%ћ.] {wDZkByo$N1}Jp<|k yv Щm@Lii7aRms3T F  g/9nT{[s0v$zQ >a+\YOFZAٌ0̝jY@`ފN?YjS93|CgWz~^>S\4T7 μ$B]\]KYnM x+(]ZW5*nYvظG67i|ǺonqJUll,Bm{v#9ܵ(tw$@v` ?Wɀ'l3LD6ֳKv|Kvm{nZ>%g3Eg˫qF:CxWOݲgF譊HaN8$85*ϛܰB˯d[f Dw1J]_dwlN}^@էvUmGd7}>-g3^oq71uhkjY>ޚ'lW\瑦FcR7KyB"h%Vɍ$n Wu/'uVS|}JѽT\?[5UXHdPX3/XR_ Y>Y'IJb@Gջ|NhnZ!%*SS"$ o/LԶ~]EMLIDsHqV y+Dc)e{ 3`&.HSa)q#wl,Z9VyJ͌y^[|Ѻ;V@wD ݔ6rR52{<\ҝ7c@=cMqƉadT6Ha`88sΉ!ng -$`E42j9ݕaW!Jld]Ɇ?q{Cuks`z6\-R`cwi*Y$6⦇q Q6$oK rLCqhɥInԺr\,ysK]08$vq(^PʟC[(^A;2bsS%/-c咗>3[:poU^YR}Ux<0 4L1Ht p//ejq7ћ F#FT\tR0 2qhi)CTԏ'34Ǹ ΓUj> tiѐu?\.ۋKSo~-ZFsX5/OYN5l5ь(5B u?*.CԌA%؛pb0N}^KFGy5|X"6hmu41?2$䐅I<`89C{Q#U|WGWkw4'`7M?%G >2WpmW GüEj.P*%j*|WaJ] &g}9RZXt,?lwRյE2$3_S?/Źy RfrZo3-I.ڨ(y%syEeũixSx_p2@tzwɍO 0s1,4 >XF\0#GWIȑV٩#"0ߒ8 &5\^=|Fŀ{ޱI%O[6%:&gítYzߖaϾ"w;JEeG0}ڍbKA0r`X0dF%92h00!tw3y X&:JH  g`­&'^&<58zbe]yxhuugew5d9-;)rd{'}ۧloD8s& dL#9 J! +єS 6V*4!\ []p)vs d'́1Eٻ)KlN$ltSr#&Yt(H{ {l?ޑONݺ]?˭ CyϸL8cf\{:c>EBh8O}u&H§Z}y?u2<vtd neR `_➺X*@f d&yh‼ۅ[dDv8#\j}z{mZzȓ^( %?΢لy%!SBҚxA.ɓ?Q'Aץka1t1g:@Ζd;JE ”qO!У$>z2@4AU0H5:KX=^?AMwPj;񏾱>?}K+6%{s\%t&m5nvVYÕ V (e T!lO2QeGϒ,d wVC(Fw1ΠP:jjHiB9]4g!h@aFHmb<bK #A&f$`R:"d]ɹt&n=`.rhO쬸J+:M?+!{s@ϫꎏ[ߖ)YPM -c_vuk1ۣrXHTWwC\r%sj% ׳qɷVnzT7Y/Lne #"qt!:;8RFxs͢HKYt<>˓meimow,?26trsYBė[2ān31|ٸɇC %ށɁ;LoѾ@ih0aPOUMSsZCj;[Jp9ȋc^snXra)XL[2/W,/yc~9j4Tt%")Lv5 ޫ/mdUcotfQގ-ǵ7u=~n/!}sp,q;HPKG bSn/(Qָs(r 8#Ak:_4elw"m/WOusݯ6Uc雼e!olPwI5{J].Ǎ㧒`;2T7h-5;h[o?:>g"#|&RY 9MXFqijm4vmWKgr$IUtb`c(Vw2uQY[Y+Ris8J[d~~DN)*Fr$#RTZ4_K614 4wiÜq$8`*|^h5%܏5T2*^ fpp5Î`Lkڈ?*q%nj~?krآ햘]o9Z}ɐ,*%72Ì#0M<1>%dOLt㶚Ri11FZb:aZJ.$gJTisNf.ّy<)$l;rCzQt)"=f ?C[уi|F_[ٗ 7޶uW;0I -PD4~V4g͗#ר ,Do~UK5}" }] @hQC$,lF0\x..d MڔC;B2Cm!Z)f-bg2ƒ+370aT*XE)K|Q#7tщĘIYSL%aкhk=ӡ3Ç}u>+rdƎ-j+pN/D92^:qI|NN{3-B?nl9GudZXʌ.w-@Lbz) MfQ8/lDU$L %kG-`t2Ӛ`>()*7UG.v:٧0a1:ʭ6u =/)i7FHk}7r"~`Z7qg%7ɍ09 `v`]f# E5/ rqfD&/:}0jnڹ 3HaKU0Yi.NeÚ.E2N`S˼)8IaJS 5ñvw0PPaMx$-^InHf>)L,kGi|r ⊕YD >LyD*->Rk1'ثj A _ uQTʛ{*մEj1-$M!\$rI)kɄ @*ݍ/kL'zԛU%t/ݶd&ӊЙߋ=ľw; y(;.nYh?Gc%eT)'L>G:5KanY+Ynވ;qFttܾJ8ϳ}gl͟kee ?oz$Ⱥ*+x'aiIKAC̖t ѼߟrK8\(%6'h:xV$E a@,G:#~S?z}Ew{íFrtn%RRM%o&3j$3\(=~Tυ Gٹ#K!瀍k_okY=)__ nd"1&gK&ϵ^K| 6>y!}TR6(*g,+zFS <71WAۃ#YֺЗw缬jQ%o&Вەlr6K܋9{*&N3c()X|g/ܞc]ߩ}dmT˖x4W&ʌ4#l&AV]lL/Vi3VWt\k#"J]䍈yЕQ/Eo9Jͩhc]놸,4btwAlqVt&ۏg;.7|a1vKIPrքUe`3- ?Xģ 3J6ai'NLPђfͪUU\FyS\6B!F,Zk~b|m}ݳjc߽B:-LP-cs7 y;BM ՚RGSt4ѥN%H FF 60 =CqdjnC/:d;\{4~ӷ]Sjvi]B.PT; 82xu d#?EYi=<RnI/+i%9"it>#7صb*.#WAvK))x7Yu.Y芟"^yiԬdc䨴j=4YwO 3 >vr\sr))3]Q%+jo]#c ǖXANs>adc_8[69$!gʌV|[ CL.!tD7;'X3>qC7hRd@y9MEXPYfiy @z\O` _uL\q𛃜iEua˻xƏ7;e`V*)9S!?y?l?[.?g R. o3W!7hs 9-IkR9Äx=jy6f2"'l&/y501G(~̢!}/+`?#שYqpdwȄ|ܙ@8cgٵ>gl2=;^onkc$s+bDSA3ow/ ܔlwZGU]§-7Gv((-d*rF !8I3(~낮{l ò3A`CA4CwїݫIwczfݣa*ą6Q>hgoyN` BYp=HxLIa/Wzm jTǏNR+4JdBstL˰šwt%6 &u"7!&I3=uKbDV$6 gv\ę/l^NWҳ^Ri\ߙy!V %ZgvP'Pa4 PM< =?ylN5|i"A4WnnFtwHp N* z&o(1O<#iu!3$7i_Ɩ}I}~.ܱ8ytR4(*ڌܻo2~<~8ERL8P< WZzkYd.uX{ SWnd8}cͨtzzLmF?b'bPgy~9AA GoRw.UDtO=  㳕D{DŽyXU;3T0{qO;YR>(kj9% & l- lGz]3אQ8OSėh\IXE"WOœ:jRXۤES_8l)xn, .9i! {/A2}uHN*~:0?bԹnL8UJA9of{-b~t m[+q۹#:Wc;L";i{r\sD)^$$t5pE Tԧ0YFX i]Ap˔ʑOWל5%*&lq;aCbndwK4s9N"6JL)P֎)ԳNb^ׁyK'GKu7W]5X`Dl+~=< a SG&4TDx_OU=s'pT7T[' κd;|%mh5&Xޢ_qWѐdD.9@nL*L@Gy-E᭦^ڇP7TA;Ʒ,jӭ{4"pEgN_ū{:PK=}0F!kzfTɋȯA&aIO2ʿkLp|dMKnF3ē{)鈗. T*Hb,2Zn-(h%Б%'d~~kM%nu&l~h:]"{[H%PN^l>~׿[|J> J]oSM#:zA8s93ɑ2>2Fw[Qu^+C8|YoEzc36pٗ3t'6tC)CF}崕>7`^'" 獳O])q5|vPxjZ[!^ˣ×?ނhBg1ax3w&i`m}cK5H#x.ѥeݳh;!rfr= ҁ%.Ә9!Ш>m*Z&+c@ ?ҀTyIcRx#FRYw;*3詭~-FSʕ>ґ XPGyw]r+(e%.:@]ٛd E =-eJjsZZ[#N'x*yL*8ek^|[݃Wu?{b&r+|"ӽ̈XYJ0>ԇL7m w7csyIe@Kp>z1ogur98Iqa&P4DP@`o?,酉O;] ]60A_dsNiTvZUm!gޡƜak3(r5M+D:($cSj6worm:~GJ}ZYeI .}d[ ԲI7Eяt_Uϰ$ˢF}z41 -p59H+3)5zaon9QG]d] Џ0K_3\i)Ŷ}lѭ5NG5IW,zwc-lD6+{,cz1F VXe) O=w:,yCEc]yw Һv{?,Bq?~M%NtHvڀZ/,PPuՕk ;cp7jwte{[M }>D6ps룵R7-{X.n7#kɬCsC9ӯāR1JE@V(-]*p :'[쬦0$Xi^Idϲ ɱW6R6^3]7kMa[RFD^C1}CGU^hq>3\K{7_uB]#i!rwGKa]y|yȐ#/-Q ʃ,6ޝTCJyݓE yK֛b bE|fIǨޏmHA?}MIMYExnִmw3{T=,7""] ΖCyߌ6yX\ 02k|%0$:ZhB'*_YNJ!M1x-;\w|‚f>-ț'miɵ=q+;I՞l+hȠ~Zsd%>{*iiWfw@pvh72"[Vzt K74~1]e2Kz6sIk,1]kn3KK .V"Ϟ?Z|鸞%&6']:Ï8| 3!--6'Ns_#;pGFLA Y=Ǝ]?cW{( % 3ljפ[j>DzmI18p>889Ml$*Z;jpZmq24tYZH`>/om9-S6>37qX9h~g)zҸ~8}{T3C>]i4Ģx$R05D(Y#"1toГiid`>\B[ ўR*pSOJkc}ϛ%SF/N&T!#{D$_K_+?}nbfJͤoJdvIsq}R vIn3y.1;\ Nd77'b= =~d_Y <Ԧ疐t<1 is^m+pPi4ɃNK)0gnU˦@h&9 IߖS'l9YU9Z0Ւ~&!Ϛ@c$%~ La|}ʇ,:3zkșIsf:U .2+|_ԉwgsՓ1zql|XZ[>Ēr͍:\0J[KѬ$XSg$C[`~ȨthUSp } j]-ΰL?1~Z?Ȫ< N8Cy4aAKsNNFd;+>7;>Ԟ&J1"3u+~nIv1690u9sU9}pʓSFa8wtOUZ1)$(^ fi%]]Rӱ3]j|yn5՛g,$0qeL)(3];ڶ +/ڳhq!M TFW˔+л]މVox C(&^$,мDKܴH@2~9@?KѰPd&\ܩ^mR8yLKʌø"vIe#*Z-w*JfћO,5MՎΰn97b xGOZU*_ ]wf<ލ]ŵSҬg r<~Poc4fp+#l:Q}m)dߌ:>CJH&3WIm=a0j]q#]vYEUtp-~/> l&toJMGO&rnBƒKCN=a⬹6[)N)xZO~ hjg~[|@ahb,v./RI6šAZ}v氁L]XtRBp!\nҺi H U|xu7V>.D0I4^{.zL".kVgZ/r_$xĘ*N6{ŊHn8q'x 1̞Twl`:f2J^]-hypm?$ 6g! Kir-S`ٮfY4֗ZӜTM~aIʅ@n؂pguܚUtp]oZ+/NQI8EO'#̓bD9gohLL&O-O.1-9c &cI$,!. Lݔ6V_C*-7eJR3ǬJ k 0$Bg$ ԘNOꑥ.x~Dƞog̐3콙m Йi#mOm!zNFݡ43z(T،^;6A}(Ohtfz(osFWLjݬM}c& ^GgMJ$}aL<+w *Y3}gxPNU0̀,lK4t*:Gs_(e4Vs!Qa\JbqW*8WGѮNW7T з{6Apkke}) DBǍI\BNJ]/]:,EF^5/Sb8_;RQDBYq"}~nxu'@ea\֓1_e۸,.ReO=) g$ESi7a`cKhGQ9.Ch,3Kõ-Pn_bFȀ9QA0 Y"ҜO>@] qBp+M\E(f5vuʽavЍi8-c°Iu+Y xLβ;*U%p]8f5yڜL'{8Q\1>e,%մw6xͱe%FFf&K&:/!i M53Kg ϋ3B: QJt;]sX2)uYw(Cz|7Qg\k=`{9ɿFIфGZ7QI5x\Jcӷ.NGOQsP (I$| ms ҄wKk\Ny'JPYH \8&IXTjOFa. *0QbAZUOiV7So=~MObtV͍8C.Js3r"D7W]0et3l~*DڳjͧƽWwj,>΍=lMҦM\hncs`zvVsUIOCbjoBH_ƅ?w>0D AȩM-)6'bU*lSU1bщ.Ǔ,G'Evi)jcMBH{d#k&BhjzxY0aK6v1heGxLth@d#啵)T KH']X[^Շ/sM|i^PG|sD!;vŬw=KKԾ/Wsn Oo1kr9ЧT;j?D m xhjpc@nb|TKiLTQ^ gQ -/:Zf2w͵وM 2xwyjzjro|?&&QuvwϝA-KBE?to?lXUu/''}@ 92t?89)KYgOW vBXZ%a% \K\ʓթN >j咵qP,Cu7[$s]+Lwt+uQ Q@qs3MH{ {4|lBlBdnkS\~þs[:.~>BQu$~,A<0^@ϔr'LQvxR8"rW6B D&s8FAK.}*U`Lzfwdz`Drx"$/aTAl"U>˱IA|4cBn|^qf|w q⌬xoA9AFNxm(Y3˺qQGF"qK{m" 0EjT]*gmT1L/DihR@14ٚRxY34f?/ph'ĽGA bKX識t|92MFQ؞ eA'|xuV7Cdn\η&bV]yvH=x #`]*`NI2V5ܟvu eIy(ΰ4 +)yHLh|ߏv.adT;Y7Y[,=*p4ړ~2DџVh(Kf;# 0ket7ykC7- G rVkn٣x~4V̜Q uDSBL&S""Y7#f\׺d~J]1=ilL>d7~a3y~]iƎ[HE}~?ŲSu Tyn}*"/8*n/\ %_٣w{W$`OAtnzJɇ@KPeh-'D; m#m=jqGdEMujn]HOƦym9~kB|-Ѓi6_oſAQyoޱ^h.PW*MGyF)>w`$He+F}7I⛺듵Ķok׋s.N6&eUfB?Yl^+dÜ͵Ӝ6҆UL8*mh oynVf=m"v{XIwp8X4VT۝nw\=z?׮A'5d xze7ap'/:4n#j_B Bpl-rcPl ۔J#o}L ]TOkΥTR7 %,S6=D~  3K#G9kOy鵴Re} L)~[ΐp ڈIvs*q:>e6Qԯԕo,ۈ#v%DQ{~>)9XM 4IjKOXEMV"8ٸ;JK!f v2bNp3*$L'A֐}-,Vo^&ƹXfZ[Aԃ0̀G`K#Iyx#ksGԳ\$4u|Iwtn"DG*GҫB#Mw+%6upYw<ʋyfDogꠌSiU?ΎuxoWJ Nۆ ?%Ql4vUQ~ϔZ`Ѹ-'I,T)]r֐Kn]fONhRZpxf~~בiTD6JNioBt훀xz‘A=>YyU<dk}mݳĺC;TAb۸ &~ͩ|QWCq"Ye .gQ31*}͠yyͿiIaJ Lʩ8ɵ}O&0(&=$07 p CK?1"'?YuRzA/Kb3Narŕ3W0c7hu4x$|ryA2z{Gя-"[[Yr ɓ9#\CK~Z_7Ȅ~Dc Ď3[tUCQuWW;}W*DL'%w@l8܇Ȟ ӡo~:G&6[7 eJ~5_/) 4g_YwdDCmn;'V)-~O4V0bp!:ALc "uF\h/q-rގɞ׿ZS,A6ND7XȈ3C q˯(Q-YGVX ifm~ ֜K)~V|_gdC>Q9X<ʼYz+;+,rsnM6W' 5,d1;7ag< *1+k4{Dn:uetUxwE2Eټ}U5_&:z]I=C'&wI|ȌN7PAsh|:l?{q<;wj|/}F 3r> ow!i1ǘWSzs9̧H=Htm0:/ϫRP[|65iHh Զ 0Y,+ŻR!mپv{Vm 5T' G!OPF %m~uV;Ģ's ٳ|l̯U&'W42vWxciiCZhnT;TdFؐC0dU)(OZ~?5uϸ$RƴSRe~{Z?0zgo|^͸- OT;]Gr6-8$f}b+fo&5Lp$|x e'\,k߾8ƛ`+m"QxVqv<0ۖ#mzQ?9g%T&08d'+_59@z[G`\d AM%bTSqMaig3uj[W$ :()  >BВI?`bg : Q;JJȳ}1|Y )+-_g?U_CCY?OOX#a2*S ٥Iظ6"\x, >@D0QfoVWQzK5oU5w V)c0C'KA`$Lu֖pI]*_1HǡG:u;\{ծ$^G!̘[ 缮n)oi!lfV?յw\Zw^e34؂hlS9DeJ8GOҞ.>+} kJ)lNۭ{6ѥcX%]X畞VkA @'AJb?uȲ5`ȉH'. ic'4ՠphYS`YL<4ūgLqeE' /.'uۜG7)WH~̦FzY]KQn2"_HL*> צ"X T9ʹ~~==z!%Gރ MPm-^79B{]ԅR;g2D#}YEfa x<W۽Ϩu8r[lh IX8yN}CF[EvH^!%?L(}lݪ-IcۤJew|I9ȝ˂]@**%x0`}27ܑP)0A"܋WQ dzħ( > t 7ה[wt$I4I+Y'?صK =;_Fߧb^\HFϥWȷqf];RNr诶j7A:֋]2{z.l+yo%O(7' ;I ˾ `+g mǮr@2څD"—=߲,;^Go0YLI$6T~`mʥ#W fzǏ M'I7:Uϥfz|y1PDoΟ'#Du.HJ 6% s' dP|DFz;q<~qnTոm.ͺcVWw%l8 J#eg|ug-9K4M IP8GSRJ&)O̷*[ԓL:8eKxw({(Qw~W] ZTa^PQgeeOޅZN-ȏzo5@/ _Bfc;>Aߟbi۔~=/g/U]O|%;w}z &gk-|xICt"9Ce&f-H; }m|=|٢Y0jdW r'Y q",]b9PiT^)E4sS E_Ψ*|]T-r=R7b~vY>߆"(rKUhY9vNgVg.*ҐKrw t,O &#~F%lu|Pa{|Hd,=ƥ &(_,`_^3v%C̩h|4tZi_U9l_ ;7 d?Q;zƃ7>8gP&Pэ?'IHr0cį|$t!y]V&qYxfG%=;Es-I8Gl@a qIwx~༈01"+yxޞ̣>7=!7WYAb(IvIhT{i(o4X >f=05=)k>K 7X D%- $Pգ|̿ L&qOаAVf6v#{xDZ՝v5nڪ'. /{0 9n>x ;&:k"D)Jim~W vZ/53(qQe}ԏUyO[L*{w_ ?/'uW߀ zŋȭV+v·A^W+֋`؞J?P7ёr0ѱPhhh8(3 h/HcDi%w_蟆o[IB7UvG.?,d8?/f 3S[Yfm 6%y,d\F/_߲0_T/P̕)d@.,jbx(ȈOSXlf4]s慠! 2B&Umb6"3 /\ⷡfwE^=?nXT@Y(P. PBDr;ArHv-K?ݾg0w_!xr_LYWį]eޠ_!A20kq@%=D`  Y X0rbxMv_Mv|eh0QcيI$[Ej BEZSLvٗY yeLw*tyxaB}\r7s3 (Q3 cK.u0 &)*JD73vO4_I5Fŗ]ݴaw1O|(" KÃ>Տ=rc04[64 ȧ'w{q;б;bˋ"S4dT$1m\T q1Ţ#E Fn!nź-)hi(mp2Eǖ[y2q1P0q1x(БЛh hhظ~͚+%ލ0im3 _$Ʋ\ _'v/L)3&뿽0tGbۧUm2ulR_(o n o^?R+Hn!ʐХJ OA^Âh_.߲ '3qF=?w Jㅪ~;4VLV+)$<'_Ne- -(n0_ERj[xUS9<] >" 4],F C9zCX9=﨤rL[=na%o/jl/!߽pEW|+ r&t,~b+ pW~]WEb֢/FG(̙q__ZK#IQث #pü+t.nBok_,[]+FsLXt]}n;]}DgB$-9v夺=> -0sҏ3av!j3i!ەV P$?G#ߞ@YQ|!`LEq J&x mE$ YȘDƓ৆(+eVm1&AP1C$%٤'̳}SS?J#%䃚 SŅ񏙇0(OС_"auuAuu"X/s̤-扈k % [ Jy:tmX6lR[^9zIr91.5c*tkLӷ &sIn o.La=jEHKQrbfr0xdY v4K@17n.F}# " 0tk;[כֿCdiS$3V ҹ!:7hy&\hsgG*9<.ڮUx=Ӫnc铋 eOi(g{7_"QNt\}Ӗ6$뒙]wҙp=uy$ķ Wvht#+q fIۉTGW:Y4ղb<1b1/4-ak4F>λm[<@F i88$FX^' {,[М@#kIv9':8\k[F+N]z8˰u̓V"69^@7+C~kZ[&W]bեN2KD$esxdV}e7hZLjvNE)?0:څ@kƭx=MCVT0h:Z8c|cR-[9om#_ԏ^ӝTFAɒ'M: >Ƿ֯VePs[Byۼ-$er}#\0ٷXL3mE iS9r+z S6Co!V!~D.mwBO;m|t3i-ƀ=^9V()BħZ8y#𕆫xm;?!7|WVF<^d/|=ҥaqӭa[ 2efeդm4,ֱ24Z Bb :1*8'WK\|]`kqρ1puBz`ĨO逑\ knYOr! qf8ӻ*SrŇ(_B1"Kƨ C$KbI] 36HSnܤp_ 0^SƌJg@R[3O)룶fco˻R1d^C>))aHܪ jү zgsreZ3.Jt[N|qe]}9Pt]l}V:l m.l:7dlotER,'B^K7|4ZWy{ʒhFJ/Iu ֑05l%_Y+9?D[R)BvRoIv`Ufb1L9U.;M o89yi1'IYT}v4(qyk08jpZFp.VCG3!&?N/:8g;/vE;e-!Ng?$Q/C7|:F\} +g~Idr)9CEQ'MsOH.gWtS c q,$}abc-`+RFuجrMFQ\71KՎwp0Ku9ح|2, .6T+cTS~)J> @.~TyN gero~`j,V;%W`bz˒kS~`AzV`VFh5Ȝ-^ЫZ3"+F{j׵e+ dKbM/:K8mhR!as1B[Fxwu#ˡ9ssba)$0lg+NEGr&,B[@7ɪu;D0u[4}Uhu /)2aߚjt3ۍ4:c̒4Rd+w nNRnqw?q=‘]TE8- DFcq-6<SՓq@ػjvF5:9zncEWqͻ9njݕx#JBH̆1zֺoa C꒬JPb`fas%a`=w/W+$ .V^.Պm ShH%6cxa$חu؈_?ѿYٲ[Z.d0 i햧 4a$mL:H -r[8=T|vC[P.c_S:D \xm`L&:aJb̌/aKQnڼ-sCGOBY12|h&j)}wa5T2t&KEm;`h6R%gi%)[#%& 1;qz xx7w̿o32w1Aj*jNsKSt\Gƞ ݸ5:BD y{YQdXW/wP+χέaF~~4Q B15Z2U5ƥ i%:0Lѹ +""0&%-by+9w4+8BoK*k$%0<3Ȥ<$FVpezQzM*<;/HQw_cٹvPV Z}LjL*q:,AX vq[NblOy3E"-).<G*c{,O϶~j*R7SXMp6m.* ey[T3w GFW (xDK;^0y_B|a#Smont}Fa a#Q  4>@P uC>^j##nB0DJڥj7ȗhAU$|GJLV}ݑ6^zOrKh XNa/jqRvLjG grM!Пgee/Y-sI4E&qyDV)q5ro"rڂ*qJ}[' ,rLB>͵9.[4bTp^QE_M܂'H?u#\SZݐMٿ+iܭqQcR?eE/ɥ8 ]N}镟T{ ǔ3\J.`=)$R貴h Nrơ_9Z=ʞu6Bxg2qW~Gy~G-iül/w&??('X'OeB8m㷂~on;u|PњӮMڈq13kXFL OWzn[(;2 Կ,3 Ҕ`r5Y9TjIݵ45v8|(Ԍ3Mk^y +˜ (u5.JZ̋\w(N1j RK_zʯ Զ+DQ%GxwyсqF ]Sh犡_ ~`N(hm6UL4I+3z%g k~jRP&?-[x]z}1Io 4$k(G$O&+>~w'赀 ѷ_\lK=~퀮H^ir ƽq)XH{3΀Uk& R2T޿ySLt5:UeaƼ .L1mtZEJDŽUN)m9NGAfW"u5&: ֊ e ҇PSP{i1BOǑDQ y2k"PjHf.M[}=U>#3kqJrJM(-:m -%r8#fzgmϞch-LY'cv1`|AO!T7z#n͹]qy9,&l ^3'eoX40|ƱBݣ5R3Oi[5sNA8+!'B6ik!t#ic4}٩܈S't]C=ۅ&n)VcCF>1&8 nۓuiu  M=Ё= O[:luqfY2x4T EcžHGOt1-OIt&AaNgɸɅNmXTdܺk}ԙIhɃIOvn:ChLyBǜҗQ%G`]&5v`JT[M] >Ovdt-?-@тM"սb"0;daK]4OMGލe ]Lŗs5ڕЉdϿ֧h*rWא1~:y*d+U =ί]z_A.+2Mx!C`4PBsBVW KlOO?h:` y{ ]3ߤ1ҕQ+)^W:Go`Hb!UrmO^Fh!QS\Z~,Sihd%&\nh{zZ)Tu TВ'ߢ!<=^֎8Z጖S=Lq\YMd 9HGBuˢ_t' Ͻ0fYWC"Ǯo*ssL1̑,􇈘l0X혤vϋb:aOG|_N^r^'n2yE]k,WtͅЗf7^'ތl?74J7[$HAќt'Q|=SBY 16"K&&H"heVx(}m:O}qGkb-V |h E)8V;ْ(<l? L(`?ƥ,/WN/hst%A=t>"j.b> q,HOm֣YPO,3%s1Ŭ؟3C8-=y@[G%2y0XӻBrӮAsL0j1Rx9[[Lz*p9C GMy^66]%Af?Ĩ >+0Arz Gg٧i]QWA$\>A={{Գ7&8'k4.]zW * DXj .M4xjrGG#2RzV8V q%^M~$S`#RJSm'K'r1ݬnՓyn鈡Mc11U u"c "ח9vLU啲('l]#y}^5͑sIVok{10%tUxVFJ\#j-(tᰮ/n,JXpKGT;ĆVg4lA|"/VG!oZۧ:@*`*EtND٢F&|֐ѕ驫@3ٛ k`]|:3 aoսBOGx)m9Ȓ`!7O`2)w-䨙ontK ^&дpO a]]~< ݚ`6ڃhPϓ4i`㑪ژ'fF^5$i;z00= W1A*Sַf +P9^A'{g!ތ};sa5!:r==L=Aekuuq}Z6 WDw%~lYr7 |i b19zіrgof8L! 8CI9&a6y! YA[-&{QZ",F:ݮ$7Sq䰶>?g}R0P/oz|?:l&MNp L~S( }7[ua$ ^ir?l}sJ s(.d\$? U#ܾ;ҳ%}B4QbeyNj[a?=mfupd4T$}.|hhGCZDSXzey-3w򴭩vc};4韆H=zlm$l ~ږt/aRTGԒ}OAU(lt #BpYy}p'<9R|}40h&5C ysQy,߭e4b`W]@.r_ Mt]1iAIhcvmF8Yeo";QDE}/MqL*{bGAJk}{7 #a&o#0j.,u [Im-5j 5 HȘ.J /Dz.Lֱ(ߨr|}}_II=iȵfj`PMV/;N u0oTiͷKrۙ4ki2Ee0zzDZL{ծnWoh0z!h'%Æzl!83 ଏ&pKW,䷚UљD| W@{x}( XFO0±+J zkA@h#fdҽɫl8˩W#uB.Cl0Jzo9A,8/ޓZkmGGs| )"PP%r~8۽L4Ť³QCZ1WL+iGZ$;QnWFu}OtZeST'c,γ͕qsx}|ҭr蔺i]%=GO5rnAkw,Y,̡_x3W-->b~z龮JM.[wX+4U/CXU?e9Th:cܠDVz"!g3Mys5Wd]ן:k NQɕN1VithcO=<:9/mKJ*>EIuا)~1{[zӻWaǃݕz@꼔i6vhH:$\T.RwG^Wt,KawԬ!znD&)|!__EO&%={#-) 7'fyvAhsfKD_7̰ܻ׎sxB)]`tCQ靗Rb[G]zZ Al !p7o$R0A ^YO`Ǡ5?"WNrv `2J\rw.:iNƔu$!tt%0 ʃ8k!Y1#J<*E)5bܭ1l. gb/83BfsBܺAByys ڤsCX SSɕAzc'Ε`|rYˉ$ρ.)9]}{GkL-̉g ˇZB$$Rr!ʹhFq;z xZԲ!(ٛ я]KpR)K-hD^*:7;Q'~rz̸ƱKU2dmCn^Xr7t`-g҃^U&]a--MO~F.hf3%Xck1 TUFk` +xt8%DʎܱhEKH~EtD&:D)UYg<=T59KN K*#/}kz}ơ{φfJipF4QXWop5e^E p']Ä4KnҪhr&iCk$ TTa ps؄S\-Qǎ>ha.v}]v㍍F/xs:ss]hCWG[k?&UJN%_|bژ3 c7F[ٲ=~qcò:f{1d[9.p|[wa`8zmdiIL5C.1Qu^FxjGl45TO';Gc"Kb%ya勇^?}#޾c#4yͤ lIϔ!`1Tt?gn$1^LšVӈ"TR9\#,zS1<<723OGhøL 0d:B&TmkUjinl{\RAhD[F^O p <=RAQ-&7OQH$w0\6F0r(:kJeRMieߞb"OмDC)4f<5Ħbz'/tg%q&n9&To>$pnxʮ6hQ$tF}\ л8O='ӏGx[Ԣl gvlu됵֤pfo=7 ,/WҒI #cEVxmX*fO̶I˕7fuX)4t6DӪ9aidqwݏBrsooG[# ܙ*|e׭tGƝX{(J`qxOJܞێ#s)DjUglQńxV]tM.A*q&g'q`w5$w[bi\nFxVhޕ.8g\j]b/axU|uUkHTf_7Ro#~L'@;J=o:"QYY*oJE\ǠzS}<\=6=_=51 E N]HNZ> 6$ NW"SNh JjEoR֯?UmǠ~{cp~"'a*hv;vE;2K\xu $koUc΍ا9ms/MD2u]?]DCD9y.o ƾxidemi9\ba/0yRMPR@t=fv'pP@pw{䢥lM9¼]i;=?vi+i`~87ELTb{{_W1x(|=nLutGNoE*%kL"/'PP( &Y|kjI(UXߏ6`e}p#c7ۋu*8p=g٫r-3JԄj\]Kl7(8:OZ"CʸdzR3@#;JVb L1<ͤR}dDCNo1q3Hx+IbSM ]p &x{K}­xBC Fm|u!)zbPFx,r1ϩ82HCgAୱ*V0@xჴtOK喡ZʨMYwՃ>1ܗCFx L$/)Ae+ @c8\ 3,d9N޳Gwi5$g)5$ ϧ qll@8ڵCV&}/vgՇg6jFRkW. i.i[Bm!x SHue{do>1dfq1>ISv1%o%oq?G]qszC(!{[[=C8O[KxS$&wϘ&I]8h8dL;h\4tۓAQ)|l}0`/;{< Q_ X%yc0(5 ᤣ"a``dh:R?<4L+~-ϐ}}i.M'FKʬѤܶ4S iٛy].TEBvqA&;mWYi~yB'iw$w[љ&0Po-.̜ *8z˿+k1FdeI7nj+X]痲qh,VCdD2\S u8ReM" J): K^1ƶ92be Z@2ImrU"wܹ/xI'5ȏ 9Sim nF+Nh|5lt1TYܚ"b@n@ ܍=p44ht~sOX5"JI 2~yHh>PC¸E`LB2;}7OCv$1[bl*$uG[qrP)&ҁTπJ52_g<GXMI &`BV +i)66~D2K\es+jܓ&9 WCAa|8R Z kxo<"YXzTi $I bY< D:2 f0i&H F }a(\)O "!pKj!1J4Ԙu(Ǟb.`iӍh&rc%:]`lu |cQ˥Q$6ɎHt_/؋ͱ-yr܆C$6q.6gg [>R/SKs !s 7{7GD\ _ߙ9 [-*)NΫ&& ؂~1Ԧ 9U_RO/rݛxa?R"e{hYxڗJmU]f&NuSĹein5ujC} |t\p?$6 "ͦqkp3g}3ty͘cD>]F%Ϭ}W3\4N;,@,0&dK)WFZp_e}N{EHEn#OeL8ŕA*1$Dw3)S)l>PɜN$٠s/*\ӖVy\ uNޙ=X榛A8m{htp_s49}?rqbfоMmՃ~=tDo:~P]͋j8wj9긖8_W#g~pIbA=#Og8 rJ԰o ǁ1@+T_Y[a^5~Hw_%v:_ D@ƋX#Jk@M`gN hR ț78Ɍo@v3Zx2lØF`2AIL!Ջrh-(Γ 9eX6O<ޅ 3`&??_ȩʁ|?G ؂UK}oNB0 6Ϥ|tX?%jn ]UE)b8''5JQ c ^9qg3u,l7Lc-D j 9ͥw[]wҴخ$Y8 %/?A<O?7򘺺ss48vWyx?)V+>`ʡ:5wAwH%I8Ԟx/1h0r^~SVHbmw 5- dp*^P$=92?A|K\8'Xi3Yy>t]C7|c ".Yn̊XM>y9;=ߒw:J/azɐFL@}q҉^ x8\RNCl>)5`r>/ /o'ȟl U.͙,0܆o-Wd-?d7VBS7C"zSaԾ}͜4L4WT0=!NN*\zK9f5Y_u1QUMJOpfi[;s{w~yWw y).`^ |M /Ln/M%N 0gؠ^$t tמ-ə z3f@t0x}^ $P>?TFakȓA?O{ꢚ4iHY;?]lZpe^=B,xO邊-@`\A}SE|^Z3g c 6p3HXooK'<8@aů,`\c ]0agd0 7L|܃X?,+>3NC-&(/@>=.*5(Z(|aPƣ!EYW`vѿǍg"P {kcVB-o~r;ʆД`BIKJowa:i-&[y'q,.&:2* L\aḆ/xVgx̄+4dgź?/ ì l4t6>;bFBFCn?G># x(2OU/eJ:G6R򊙃@,Xj$ŊlV+,+fb!c+bht,.F M?ለ,!b)^+ 4X 6,Qh¿dEXXJ aQb+Q i81c+يBw,S `R6sZLhNoF(7bS8K,?hT?~=-fmDYFĒl6ޖa#4 d0QpDl'x_!fJ p{s|?u</ضB>&*&>O{Jxh%@oD v![3P"#*b TYޯ2/żMgL_v/WQꋳRdj$ ,Nhtr_Ƚ.^WY@ 彸zz"m#]?kX)u˟V_4RAz1Dhiyh#|5.g?6|0̀vB{./ 0O P{=օçu} E[k$Ẃ9# 6.^NC?ԨL+0EKX5^GEPYN _MhÃ8(Ͼ8dٖY|pUs[tղa(ٰFߜ_2ΑM/[Sf&s`H\h:0hBs:RG_=J%K{yy!`y|пƎNNrWqi] &߰|(km-&\ K1OfRﭦ_έ+B[TR:&E*,+fC==[xzy8h-7u $^/o;4|lT/q hc`tߵ1ѿHFF IOmCF L6.Ck]4 \ Zh{y-ݫjtۍ4, 6.+5C1ѱq0h_\٣z .6ufu.0xa:CBEE7FAB"?9ܛPFhJwd\&me)GqBےTT$\|tDOq D`?(؏DEKA*\]A^3/o$ylfEQ:Ogwyړ7[b~n&ɽi8,n/C$MmqꝻ[wOxoXJb#^}܉tBTf1ڋ=7'%f\%V(WNu^5:%\ϿC%^xrZ$&>յPuag$&Ug]*w!e#2%8/F6tkslI?"#>+fh[/܄H034*N(]s] L\x50:ub?kѻWٻg'lWQNHǐȮ&nxil5z,.c>a>ł]W]&(PB ~.D#$my$@!񈁨Mc螸RՇ$U{cr' Z"h ąVQBع}ywn𹽋_M9L%Њ;t_ֹ»߄_)*[^Ay6,A,D>b~2P(jNJ;$Bq"v@ج e4(N>,->-ͣw'烊ߪߋr~}~%.O^rBbEZNb#JN1w7/D''1чr4& |{\w׿ź&K“`lz{Uz0r]r©wíCV$yA8X쵴?24equx4B[_CC%?|wѼo xz+R$ϖNm< GȢ1.&9FERa[ Dlcz>C86wwʏZK.3QTuӔx3i.eIG&=//g'NX 4{RQzI_wOkd|^o /pb4gQhLY<}]FE؎PjVRۈ%wf/ ԻƗxtNl$odߟ.@٥n ؚw8=O29X5$o-xHuԘ(?9Ҋ t&P-#SBj'q[L\aňFF D̹wX`5zTv\a]EXlx?{X:>LLp/BdυԧDe^lC4UVq<;YУ*Zɽ?s\a13;1 tW]~6HQ"gU g$W>#8-U/hi53Ş%0_W HnoJT!3uWruxs< NG-# `SH *2Y?&^5K=%;r'Kk9ةHqR9Tct\[ z. Oԙ]W}6&d}Tfը2^%B ?gpko2.P!5'99S ||OoB`sCnB*(%W7ΒOVDwsVe&XYsVi\N<ǘMܫG}LztM]$ ?|Il?t&u/)E O/_V־gAUSKI lC_n9؃Y}6(M4MT>w< xVh5U/QJ&ȑ9z4DXlcQ 2j=6كsArЩd֛}mӅ/ujB֭G;Lp"6YT;Нjuf ttӏ1{:.O}䩻m;q}gPL:t^29ca fĹβIJ}~8?A$^q_}u N4 ]\)>!*2 "rh=6@/& U?NBI}}=uљZCT)>-D%5a.7] X+9-2Tɉ<doُa;u˷I GSͫu%wz)b :UCΞאD,0{-rދf@o%A,a#.P#rxE$6n5g%jy>`% tcL-0^IoC@vaMx05~XG2<'8K&4~G)De`nbx;MSN\7ց{jEZ_v'3KtH8Q|m~ErxEWhC+(J轞N^W;jթa+˥C\ܐ1C!}~0;D ?/Kge@W?7YxQqM>Wf:Pj%*X \腋.sy:mf\LG:0B{Jb_2 Pl'':b B4F@B ^?7.AЧt=LpRe,;n&eV|2{xX]uC87șTi%7n=ZשwzwÕt-٨X: 2Rجz~!PxֆivN0kz0܈U-B}dІ E/8z7dvluJUCyz烋q54ZU+۟$o UNMQbZ"oHwG)/B^= ?@_E~ohFbknE:?)"9?ՠZs>y.s,LY;92c.ٺsy|d^J' g~yOؖH/D#%Xv%=ML78=Po/CϏH/egoGNb1VΥ5\_:LjU@OxҼxIXN(X6tf#KcK}a?]0Y0oB ?993hզ>~/ڹ@O*v]D"כ8;efO׸̷fxEA}eC|IwNvqfxK] &TgC09 K'C.I}H1+3A G OJ~BXK"njbʼn/'1VOXe^&^ч&F^?Q}<n';./F93A1P޹y9jt_HQd Z sRYs]+~ o,Ed[mt]bj6cI{mw$t]{3&-ì 2Zⅆt`<%BEI}HIŗر8k3rD@0FCO \*v>U6db6#nq{9y=,E@|t2Cʆ%8W^᛿R2g[Ne,rG- sk$MUy) ̭۫}luY^66,-w6};ou{%∸Ioqy."Q%Mi)mWD7H%:OG̕)Z RK0IY#"o,)H-&vT5lJkţꆫ33=O%nF]~mZVL XJšmHѢY\D͞(!z, kSSp|&ǵ [u5_ Hd0\ ˪}4w :AulLxZv, G ϾN_33GƖeI77t%'ҒS hv9gc +8G;MW]`]JN( WzwpyF>LS&\J\rԳo [29(j{/vĻG$ q0.*j\Mn {a/q hTUxxծkP-o+TK'wWN5}MbOȹ5:> `+dicbh?E"BR -I*U$dFNp?Ezvh2*>?sD,GIV~ucֺrxA3wK~/n| wxۥt{ցίEEwg4Ūޘ:k/b7'TXk1+AVؾs>A7T-N|XG Xi8:jCm4rZ5:X$A<ؼvVH} %*ΚA%4A&0e'N`ޤZѱ; 5NG7ߤs]gp;+Xxx-(5ic0ҎqX=y?|߁S b^G9o`/ &xK? Lz|AT?m(n'"H{ȏţD |g0E1XUg*4 @!ijŨ"My]]FQGK^si>[kV>N.Ζ;"xKf.4/ߠ(Mm9x:R"yk[m0Qm](Cb ol4.~|yCK'-(5 ůj'J, .` f"aR25^s۬6$`uA_L8:TVɛ;96wRf*]+ S%Yș8ULͶug9JA#`E-nZP`tUv'z=ncdf~ 2*^w9lކ{b["ȑF #/8h/ςP#|o'FxR>q  zͨ܏)jF21Q ߄ z8\~f4c}b3#^uWM:&iK.ധGQr|"Į51߻+|0C2Ʈ"\A&|TV}w}iuOrG+ٚ}zl(8֚Ȭ93MKՂg\so4(RxvOy|o8,?0c삠h7 i rM]F_e7Bܜ[/_u@HkSUؿ5kU%ˎVHɇ:Oabp*9zraszS 哾, _UV ɻ)ewfVװg[qֺcxz"OW/b0,$xWG~' {4ǖ-,/nΖܱ݉K$1qD MχYϽ6#B48pN9 ~.YFAvJS)C,if~7:y`mzEpO%sU #ޮFtr|`/' oʋ;<3кzgg.{o}^x׃h^'1#ķHtJX~_Ȕ6r N1b9k^KWfd5E^[d=X RK}ra}fwv ."&<c &N1W&kToJt4"VWU%皙2ɽ.Cؿ7+ZF h K'_72(1Nlɽ<9p q2E ?ӿ9m7{G {è_Q;I ҆o!- /2tIԺC~K{p_WJǷbk>c#3,"%(̛n`ŷC P ±q>Kbl/3{Ek,}Fm:4d^Z?۱ҹx,Wfy܊`<: 7bg tMm #7ʨޯd=uW?Ȃq&t*9R`jl!ͽnJa (NӴ]@2 L#4% x\u+r;K]5HTo2NN΁'c%Ǖ[x+ߦ#j7βo"ɩv¾& ɿ{IZW23ͬq}Vl^dz{gb&]]|s,v^{au"a rAyG֥!mT;g%g:zO(*oэ$-ց"SsI&A.6,sզ9!]j103u+$Dž Ůܕ75qҶn:vMfVԷyKl^V K+Sqj0]:m;gVc/mw_:b~($7 >SY#_;g[4X^f$uQ1%+tvqLC7>Ll$4e&:]-q/nYO$BEkgɼh0;J8r0gud_,;.<*x:̽_NZ8,{h~h nùEW-u;ImL đ=%( DgހS;۷mmUv˩bbӉ;0-2Ε-1UNx~{ex7L:ͷ 1NJ.uMbd(揯 YI#^kzN.vP!-$⊳t$A/_^7ã2[ާ krBppDRyD? T0qR> rHewVNx Dg"^Zr-8MuO .A!_mHm퓌tW~ spzXn kN7,OB7Wę>j TWԵw|'Gj0DPNW*0ml٭b7'%/ ĐeG OџD,=jw;4hI4Nw5jtLH7FIWdZlDrߞu0ziCXk}g/3 {r_=\C!cTD[zj Uri~hjܿi<'+@NciSb!w~dEVɧBP&93?ŘbUҦ /p\Br8) ߨPY$2GF:eMb?_@~~Nm*+oh0^ gYi\׉(Mf ;7k7FB5*;\AUmqȃxN[pYsg˪gj@-QiBټkQJt2K۔~$~J'(Pa1uhh#kCnf2zvqFDx>8*徆8S0,k8\ IdLA O3f]hc%wbQ^YH;UCE)6۷D&:%]ÀquΥQ.3艹jUyFh&ʁD^{<+}!꧛ɵR~ľbrsi>zD R¨EImӊW 5p7d>> 3*ƹݞVhVbc "8V8H@ RE$U$p+3ȤDQ~Pk&Mžl'0qV9&/ qqt)8ķ:*[,cT ec88*D kD9q-{Z;4w[7Ϛ/7t 8ȉpqa[*DR& eu33oM>DrͥchȎBst٨}nWIsݽ˝sLWa<߫Gv%3Q[(9~[RmRq(ns1H<|p8ԒXy.jWP*_wç÷Snߕj!GkF+6rL.}ї L ܅>Ւ۔E?e9 1tny#vQaO$(8 ΉJ<#uɑ~[VMy1Р\Z ﱟ7AjU]*6ih?*q<ѡ? >0璦"sv۵%s UBG!\!X#ED<t <[^`UY^z<$5Ң@ w aJ$xו68J*5[ 7+.X T'1*IE;PVB0-o-yUߩ$5pBA(?L/t@Q,+ʙ_84Ѐċ*t@;봿T kP(zңB }¦KQ:!W>TNTjRIQjo)B9"~as_GU Sp?tu}:pj gG&8eOE'X'_ !{ǿF9Wc 48P$sAa:X5^K=p/pR l"$ vRY"5^hTE,#;`^*^ kiH"Wx)m]?H)\",.{ɡ!(?`;AMS<93L5<_GS򩩪_:}51/ǃǦFT6Bb!1K:87}(5[l<(Ioеn:tV.cqaMj07B̾aM7![`ݨ 3W%@6S2蟬wj䅒3' 8H跋yʛM39Ђ|_1/,VԻ%t@rDM>X޺&;v6!H/d\,ˢo5co Ƌo_*kƙ ě2NώxJ;﯈į"k;қ.LNEF:aٰ#&F15 Q -7Ӷ10w؂>yI;;!FҨn;|>/6ʦ" 1.~&niׯ?ydž{oq1vjO3`S;{`.d-.a;p6o8Y)I+ cll;o#dlq:)@2llKZ`/m1fwDR  PQ/sMjd-7߫ ﴠ-ְ@>ܱ9~廱5@"Wޭ__Ix,P@ЇxG8#@Mn(7axX`# ~!sH7_^`i5팍i,ֻʈ"mtwEe,%yy 7pɨ+JӬ|8C6+rK 5KRPHie!wؖ(SXAKfdJ! 勉Auw.O>CNx + 5L4axYo8a/xB]F;'*a>8bb>ג4\ [-l3v Vg8\fws-?RÌq> ycye ;^=g"kb@Fۚ?$yMQpܥ I "k!K\.gˆq&-GbnsI ql)"mKbQNxJжP@.W!ʼQ(Gj3LDZ8аq,Qm*yD*OάJ^${}bc o82IHpxFFMY|+ԓ /(Evʀv9ꄘ|j঻J /[8r;L;;:53Q΃coH[hw:AqCq+ I?A#aꐇr1^%ۃ`UT߈ ru~ܓҤx#uh^ )(W1?.R(YDZ;[|YRRajo2 Pp}GS:qruuh3W;n|_TEѝmrNC6Bu_&}U߹5U֢xzJ`TGoqlq`zeO{STxc~^< wc;HB['>tZ9];uKPQİͶ&9?9& TxYSCgIPxԶ4,/:0{Ir~(цddC9dCe/G20dBwT oWWTZ[G)_̴B瀍Zyɍ`Y19I`65cRszsT=z-VC8P;3xpɏNY!2zޟ*(~!@%).p$L1ă㩼ZN)ͻ|+_eW2~susp'ǥ*|ceIs Y7%b]ڂPw3Ng?)Qw*Nd*U3 "XUe@M,F\U@xRp,Nt 0Ji7Ӡ 2f֞%Lp]S`s+zYhmWf!H ]cfa 6T0NmXpQ`d8O,8 7"&\H-m<2(@ S|N kIW{;yx#lrk`V~w7S{NԩM ҷD0TvG2<_Y赯7z'V>Hq#G=G^/i'LV[oOFMxI]sfPr] NWYlSo41], Ag*wGv -eTxw*}˹~k, ϾeJ>onIYo}ƫF*3}8Z& `߉;Ok@7vӉF(~G{3q@t[DEz3?Lu @ߋm^U}s(xј,Ye:iDD7~ 򢣩?f!h0h=)}}Nr]dؒ@ fSѭnl]s ҋdʤMJ޹z2;ЀZ]89p&(f x-X;Un?T8H#R /2?6?W: Ip8>1S.*E. H :Ƭv~7/seZ??Ad/3 0PO@qN@v:c!JC9߯`1]T96侃H5/$[{3' 0E33Tct!W@?egؼj!x^RK6ڄ%@Wk$ln/;/еT^Ai?ݦRF90,FTde͕R:gOT<0gwD:tXuOHZgGȥL9$~K?p2{xU'>*)^PQ jL1 _%>*;CCUj1,tĐ"o3[dQ. Q ">4^DAactDQ}-gG WY~:E8V+^BSGYRr ~\{/7#5l9kOo(r{'9f/M=xq[ʠ{z8w;cOu$Hw|cTj1:90لT_y_G<)ՂTkg9Ӟ6zP-?%Jy?Wo4l@ D/#ӘVi=}L bb: 0$FAw`yDZ~ x^JYna>+X+{D=yN5'LE40(U. q^b:TEy'$e?mֆYoL`P !hPv   H9 EENxw+3wr:Aes %؊Z>{H(0~Ed5&?iV;w4ȉoH҃&LRÔk4aߝ=$.,!9}9 >;})]d?ƂGCs5ϟg({%ԷCxеXQ0[|w8 q49"% Ɔj fEi m'<[0vw$IV^k5!:Y+E~w>;t{9mҠr8Ѣ 0coлکAb?!3(_Bb[2]7BJ>pn[xATR<"),>PrfEv:{?\tnFVoڴM:|%p7N {i$qs0-1]HѝԮ]yᣍaZhka ;qDNOf ɬ*C"d yIcVלY>Yqe0fy.S4ǥ~&c ɎITnY*WeyԽ`5/M1WeFHȴ-3GFO{ݤ.-/vZN!@qrE\2{MZZ aխ͈ڄ Oo!]$}d#7O ,rӓɊYAό "3|-9GS2S hVCgJo|0S~W6x;/QӖk#"Pe@pݐ3RLt#_uIdJh#??Wݡ-:(1p;:,>Ϩ:JDEil֔y?;Yk8oj({C4) Ip!1P<^*}8 yf_SD2VcR6[7r _SPetFF8./gik᭣ h Oӥ-SU(=Lw[rǢWs'? @4\̜wmZN*R烲'WMkB~1]h9RL/^b<"f 9.X=-)HaP#nhإ"q`.)*6!LFC=//ό;9 w|X)qXz! O%ͳdTG0-m3eV2MY}$ tC[M 5'Q%bZ6X`{6cٗ;rujbvҗp_ `OŸ tWhA@(y:3k 8ϛ(VJ՝P~W@ixޓrC8}3,qCj>TceD0g{ vm|5k &U{mePК|B2/x,bG{07wְiKj`2_س4OjM8B {,@ $Eզf`i(l]g;Qqѡj@:('o׷A3qV1k9 !m/3=Z DQOjPj_M&c_;<ٽ8g?{} R=4{N}\\t]~ol.ל'?E Kj[m ,-S7R> { Y'Q#KP V,P"ǚ2wH2嫀xfUVu;KPcJt r}!?Vo` nt~#8]h{-ax߹/A{ c/ Ke @:PX_HKe 5"Vf eۨWKtI㦲F)k?j#=NkZp LH (,KM%3؊ >(M9-zQ|9Ax8h4Br6j T1E*sAp8D|h7Ǯ0Ɩ&.PǷ U yGUXp|m&ɩ0#zϵ@CTʁ/1UZw^@>r$wP@)]4[9iG.c52k%k)=ں:qnw֓ mmލT1:|N[W4`` ad5#U&ɳ%0 -qkRFe/sHgBǵ<<_` 3@-IW(,j aFjRWt;oЪܐ8ހEU+Ud9ā3\ĭNV G2mdroq+Yg[W0è* PBx 30I~LAԋ|d"EZ@O_Nސ4Q5:xiS-h:T%z5^ñ7٭!R Q_O>psZnaiҩ13p+75NHEKҁ_sc7sI0WTldeW]rLXt[g6FZ!#H F 5]~P/rnRSO+X&ox׶)Y-4iI1kս*%W7q|p.k6SpvΛgaJe(3kw'6?TBDQ5NZƯ?P;Z~~  Ť &M_;@_ Xc/2qƧJ~Y9Z^'FlNB[Ti"' rktf&h`z@[Dy=aZ"k#Sxڅ$ZNP?lz?h-*V8џDNa8\T``-!" c6y z=f$y ހQ9'(g\ؘ;Pϧ$YWn @O[-Ic=2`3=Wϱra0[_Cz?_89Ϭ"QD9YOj&@z.]6Lu%d GxxqAe?I? }tC2u;<^ i0chW1K%dW~J9ڹy,T`#k;LqHRj<:[K9ѡ7jO(=> G\kF%(~W,m:֘-W~Ey^(:N |4/kT% _?t9@ZKح2 g;Rݭ% Լ\e]ORWc'Vh&]sBٛNOڷJ2|07L"'E,wC>γ=aȐ3?:g6piZbHE:;J'E~>R-IOEVv5Cˆ^[kv\|ja{}*zՆ$=6Μ 1GL|:F],Szux|vQ2EiXhI09N$>qx9~fx1W%zX빜]OB0\oFLbjΏHOXvm;[;ꣿ>p-@+p2@XzyX  J,9Mo-{n!#'CcMsfrǫAZPz躷)ZI15lpT+u)u+\vwXKT1K:hi#@6;1QOzŪ,i^Sq%D&w89EFv7jiIEΉo9-r(W d?;;7v_iPN:k`LnF4evLC')[,`{ 'THi2džQ8OVUO[P5h`Z={ǍLJm.͎%S 7D1 fǼxD0`$Z޵]HO(ӊ=3jE^Ovƺ5nGt9alZa{MC||Ybݒ%f0X J+c /\*OXwu>Oޞs-AR} Whleܷp<^|@mWyJv@#m|MÎQrwوy4>NCޣiJZ9 +M>8|%=EdQa4)>J}kxr*WF`6\ P1R.;~.49c2Uˑ=X~#ץqap41@9@;ugp>rśc4VG.J^GO^,1/~.ɤnOѾNd9j;߷y`~U173܉km5ê@L\ҿ?-BBNʔPKп89s S1꽲,7/WkY1 ;o8Tl8( 0ž8O g{9h^hGd{H9e'UK+P>4yܵ>W C1J' O_zѥ7QY5JUFgDk7kE_:>3np I]՞ZΚxop7A6-Po @y69P5dr@䫟&lˎYn~g%);pIenc?!B&P@|LkzE9zh3l %c .- [OR3;?wV/]_6>={D$N(0n4ԑ 4T:wM"Hy@)8O7AQGd^ -b LPc*_{ qlV@cťyWjQqKbWw a-Bfhȿ 14/ǵ ]Gp_{M# ߢ 8JXv.Y YkXl{DVK8}WEa1؟|7Vu+P;}?"q[hm[D%ivғ3e ?gJŪ|BSq_q'rU~Z fI(i>[- A˪~ƨ++>YgC DnS: ["NGEDy,dRcG,cZZ= 1C~) HX6,nW֩*SdD~UJ/MvQnswpG(Zd4ΐY0x']hZoi@AX?4sl_!|ư.f0_&xba19Bl9n_gx8Po{sv'V'Aw )=w-@EtaUr`Vl{dɜ); "OvaXHr>O3X/kad%Wp|lh~ɂ exiՋ"%PLh( v {$Yq큎HsR*Y#EKDۏ-L( сsGZw`>;ߧBmc9s<RONYl#0&źuۋ+O[9Vf|sI\%~}jߔ"bO*O7o9ՁtB%,Ό5-7T =cɢ2RÉq0B~x} Ա77$ONgY>]7w`rхOivu+ocli^`mf[gy 4Ƒ{0trޝLl~zQPARQ**V(?Iӽ~1kņek7R:)b̓iV[yE9 ĠSvPv݁/5_803G$?쥓_xAWi0 .w܆KL _nFGqO{։Ymd+jm!gx:` _ t)y1ٙɏPT2iw3Il 2l,,s~ƉL R]h!"=E?=xl8Ҵ{)Zc<~?;hmD32!S xlgwpCV\!?(U |kE.E"@(?D  Yދob88k-bUʼnk7ܚ 7;8Ku,fd٭ ~HȬ`Li==Z}]I҂VNp*Ŭ:0[\ rs̔>-c )KwX?0'RROElhq v0!4e_Uמ;I;dzo׭GG)7JiҿEw%N/J@ +[DTaX+ʯ"TTR=*3,,{y\6r7jF8@~Pw $3|Yr_^+e<`n~ n/{ })5yWyѾbcSO܊>L!u?[;{ 3Y5 z0qWxU*nj-ykPAXʥP(I7|GdrR9َ&w$u-0dX<3h"JiCsEC+3 j'Bg8k7FFeJ_/s9dQLo@Bħ$xTQW dQ\.;mN:&mn:1gPɧUbNa.mNFrw#$(Aw(RH?u[ S.X*e#7O>D:h󃃖J߇kki44uT(LtԡwK RC e NSGZHM=,0e܋mE/)v {"r`q6j4;"hyU|v5:"UCxx)RN.XX,؈r;sO~iZl}~gӳ"E2Xs[yF.t $9^qF;9eG<$p=[ 3d89󹣞v@j0k )Ad5zXshV| +)d#ť Z$V?ow҄?iԯ7dplq/ޱגI#H6o"qhf&66(>fBh.+}t(J~`Qڌ,k)ꨒ3Cxd. nZIe16Z4HX,3S;0)tR' _+-.ܞ,L0ag(oHTPUu5XH@a5N[EO oJD6Bj "€lzp$={!r9Lw<~bD x%ztqUhns׎7Wm>&2 M\7iTd49V+o8g(! 7Dl *T|xrHecCpӀ(`C{\Y%W{z/AG*P<ݫq%E},h@X NTЎN8 5fk"UC#:JGii杷%0B]?h`ak`j|0@oA^]ꔉIܰƔ/0Tѕ|ׂ_^~ߣGjVnK>cUuwffds8~Xߚr&DUO57{;{7;֌t@wǹoh76+xl4ĠDz -:}oohwV='gLF[Rw,)f?ԩ(hp#AxgF F1Wf3z8Gcy&H!v*Rk51ҭ~7mZ e-ϣܾ8: |1`pc4<x^j™%~.NM_+RsUT6H1`` ym)JH; !%Jᬌ>bWrBO;@aDb4jĆކY:{A+(\xd-mրqyɀ Rθ-|[lxy-Z0=N:B-s,H吝Ye$c)7Ip; iv~Aqp= Dȿ}?g -Q@k{F,VP=@ߚO 6Rpo HI%2>[h-,|BQnc8ˡq]TG߶B}lQn%^vWD9)9K; ft>-t.*S&sԎ $ 7eT51'ҀS=ZNuO011Ӳs6mGVONieU &~VԘQnq'Q1]m3;(iÛ'eX<¦^,-u2nZ6۳qVB ;S]+ޥTgnDVڠ0?*-ɡe/ 4΍šRY1!c ZWPG OFiE8߷~/c6Hjx._H\bޘ;"P0̤z&׻=G_SG2PndGE IH\2iĥlŷi1gc߈2gZTb`z ޤ(Na`|s@} EՔ{ÛS@:3F=Xq[];/z]PF$^ pe0$4?p~+m;tM='+.ud)DKCfVVPo{:^ z+z=j1ݪaÅ خC J,Q1 -4A^m)H1!hfy`ivGIoV{}T;@N,L`8J܀i`(S{<_P9^hJD CBtSj0QGM]<#i;h[q15W_ŲR0*iљOrfqu23C/1vZϙ=_'9]k.}^c Sd `Ầ}q0.;9zZ}e$'[# $DVjD4&X5AedOTXAnӛĪw$2*+Nvh/kAe5X@c ^CD(q a|lDhԭ0ei[ke V+#z_|ݹᔭG&'5Df |m;%ƹfr{]yVmk4z:TL1dUߒ]:>`pPAiMkҠ#'*8dc XIŨ 9l|kam=Ĝ)px(K+wy:1=Y{6\LOuHhnlSfk|\"=:Zk=@Lu{CsVtxbN&=\ @P;;\;_UEdMWWmPIQ.ӮDp Y?V>,|s.-'Hg;J IzlChλrbf \7yi 1!LH$LPl!`f8>g_?`OR3nKKY怂vDJ:,"-p_J̈́za@WTkCXs{A:DoAw_/LP~vlM٩WZ#OqBo9`Wv#PC({uMZꝨvȾ vĄi*u 8Dw&َ%ޜk=y.Zljc2ssz lxgT#ƥHg@ '@ †No3,lprM~fǭswAP{vʼnS6}A!ߴ:y26_ K" ?+sOh[jn&eL &qGeↁ5+G^+tral>"PuT k0܇ 绽D>NB;T_NSiq'Q җݒ k1Mڤu $mYPg5ȡ| |N{C8<=ax)WG2>Pz/E6n|mq?-6%58Q fq?3٫{'x/s.7C:xc& C]!7FrdF"~5m1 }=XtT8T0< Ş^^KP`uvXqsԨ6V3Jsf(8g@V{Ƣ7Nw/O&mՃFiҰ*ۓ%L֓5e9ur':i&B|"+.,u 1RfJo1lTfqK5ӳj9)HgJݥL)sdEF ſ wsc:f;A-ui?8#AׅREe=73ݣPglg8KLEY-THn ~~ΗXkSLCq<8V2b驚jLQ5i):9`.}:f`OELj5%CYb#9hq (AyU#܆bӜߤܔA҂2SΊ-}⢆Zv C7͸ʹu[ TIs_~1f9b:Y)/M4^aXp2 ftD.pbuc_zPM~<юF F7z0I@r4z]jVfPX}y/x&F:*ʲ;˘~38A'I_X=|O-U=-K}Nu.oĊpb@ƴ9#L`ׁzA:#w9yL1]m3/+tMFRL^גCGf3x&e19_x2ժlF~lmꭀ9ۮ^fD+PŹQ%4'M twIO̳yHÛɪ| < %|buDP)`kS=, )Tw]XWGaiG⬀Ѩs# (ߩ,mPʲ]c u8ځy=[uiT_@'xs/X;R0|94KLkhʃ#׫ѿ1~y)k]\vg.(r ϴ=ݯQ(4f~ĝC%8 Vt~).UFy%3<ۧ6p=e=7(fXG#;~o[Cy(=?>8/<>Bǽ~#yFˎ;P̑J<3xXC,R(⺂+7ܚi|;4Z W@S (9d.L:SCs=_o̊rhygQ^7d̈́2W{]׸X`$VQTCVBSV(aúBmO^5 }ΘmE"âOE6 c/w4.#} 1+2_yTm[N*x*e\IX-K#l1ē8gi7b3s53#r/6%y"%%hTR>*],,>b[80irrS,͗ܕDe^S=`^O";cJw>T X`$NE|l#L6bύJ_ ī=C#&m&Pe%t8ix&~a-0J\0ǟKk U>Cq~c깬ۉd/>ʚ8yS,$$ijX_Lh6G^"d M'OpEd8Q>%xZ^ BF,7.6om_Tg闰FRܾoeHss5+nBꕕG`]_O˗lJrm=$)Pfz[\ԏ!uk-~}Lε=?2ѵ-7ru2 q|)A·6s;p ~<=^+R)1QLuIq+6pOdTP#k3Q}|_Q c..O3# S/6rύG9SE#Գ>ZVlmU(t]`6^sCACycJӘypm xqCt3+kP>%ǹ@Ʃ+79<|_oO*,tgAN谤^9XawȚD0ٸzFvYcΝ{e!Q$x ~so>o6nHxp{cad /+ύwW)Z)vT-S"=3z]V ~>cN_y۸ۣݮ@X`|+)F:o9s;U:&vNS WMɋxˏ'SOMNpH' l  9;) ֑}0rg5-4EǂN} {"F&|X7P)$Vn/M.j&߷:XhZѣ*Jwlݩ% w#-r\O;b%`~J)ފ]tױ밦߿QH!ȉs8ZdNJ-wAj Pa  ޏ rȫV(9[%,PbbAA[o?cVPURʣyԴ ]~ 92"H $ch70U_%Iv)C;֮`>V6qJ C\z\gC[ɕ8mO Oc$A.jt)GlHrF7=2*~IVڳ~.`Hxy9|!k ,?lwdt2&+hƟnw* i w|gd$>InW;C8%(1^84fǙB.Z !s֏gI=BwIWS3d߲nԚ珳wΈ[2 /3e刹)գV$Wm$ ߷T@hh/ =ދ+zsH)n(@!qdh^^O!^4jK_M\a]hx~,et]x;8q河hp S ^k 6b8EZEXf߶^F3s4t3r(o?mfQlCRԴgfH8]L߷ق_99* s!A}G$\F~hGs)zv+d6RSu7) Z?[Vg_?g?ϟ|r1]voO/a?;[2tjv{ͯ0.5ic$dWEDgrp^lKOYKup:٧1 VQ^q[H\TWΦA*tH 7(=GRhaB_'ˍH‚ /C3(]K))WlI[+Q%>k *:YmZbF7f`\8VҨNNWVs6\4}mk/ʠe5qCzD0k}:<ߘMrt +ٳ*joFI~?P'DQ1 @]]'Z,V gMɹ_C-e54>u%Fd_] |hell0ߟWBƤApO;HS-|@a4^N:(4M0e 5SErHmc9xizNYCJޮ jVD8P1,jJsƼ'Ud oަz$#UΉo P[']G"tRF0cNO]ab<2Bg9. sa1STh*i'7WJ$o:3(jjt5 ! i"0^?Ԯܓݣp_[]B4kJPPn;,X~Dx({`IꃰWg|. xbkǼj/g{ ZܽrU. CqDe0MX(/˘ԾxBx⣋ (Mfۆ;ț IPRZ9/Gbf۞,f86'Dy6%{H9 )`J֍?ܝ/y9@v˪PFćWuy0^׳W)aBKEwΡ OF01:a/Bϯ8hG*4APa/#,tohbO a?k-`2W6Gos_űMtk0ɝ/}u}+ΐ.)LgBI|AgU%RS%c$qr|Ng|J8Td8^=?ri.Kbhdߌwf\ivg2. b jSo'@^߄1{Ҝ<Ҏp8b߬DqpBȉ^ : DLGGs #nX<sd9,w ukAzSgju\ǥCˮJo(7=@?iI;@&$Usݡf-VRz<4bm=)fFlO;G̾٣It%eTnc!%#pY#l 㓝; m wp8C嫯dEU;gS[oh-q@O_s9VL]u1+cؼ̐ ޡԈ Yukew-z驦ftEӲt*ŋFZi:ꛬ~ڊ*mn ScY^X_[pRƤzKTaU.hX,_X>dΛ:Wi֓{YN:ƴ+41Mbrao QLECcĝ]pjzKP% 2TӚ|nk10x/˭kE—MF}"5xicEs2!S RbĀ8H=dZ wxWyb_\@8tXIQ6!ug `H0$ܴr=bgCV7_QcXVI'{s<'pE~8L% p#jq^^b$7_4Sy#_}ZpX7T~J9VA u`/Pf:Ϻao3+ZAԺiCP4ml+Ⳋ٩Ť}s^GPJ+ڃyǢ9*{{ @:b1E2Jtosy@۫2Q"rsfGNoRFMߦߢWvu'_nYOY'([*)@3H ֺ[1[{RDMI"&?toL myV+@?+۾@pmA.DО:OYɖd;c/>gC9a2CyP{CGF^Xݛi$Y ` 撔 ~O*0Z)1AY9 e2OM\r0 lG\ /}%Skd@(BspP 9Mxe`^]A4Jc'C#A8<" qlԇ/5Aq?xMP CD;Vxg$nNy[l{ %gF4gk[$M/m? >^܃_J;.m; b쩌&{$b?2NS}2zorAk_<$ak}\ 9k6Bo {!(Ǚe"?ZIeyBW@Jʼ Ik5,Cfϩq1= J$Aobz -Ԅ{o7gDk$(d' AGkZ) ҝΐ(vn]EvqXz {&vHi~ɯC-vF9f z K=@b]"c'/nlH<*GF|@CyZax1Ȯw>kYY. lHU4`F-ʛ{yy<4I]?Jo%Fp(`B_cOOz,YswDB N9lFeCzCؤV+6fޣ{Pl"[){:[hh4jϭ"њćZ+:#S)0}4\ {(sRjÜ &z;xk"{ Du^叾}<#2O_[':9Ml%9:T3eu}VC&~+&A%q/c]C(d Hc8L"8ؙ=ɕϹ-oֲmX֍`XWh9v IM:e9 L ŎLOӛnpe^t`g{s*5)2_O,˶$.Ϙ dQrOz]-?8>j dޛ9@T4> DBo#i۴Oqdړa.N3xt9?@z#1>v]\??a` Ʃ=2Zd ]A/H#i {VgOUN^zhCh^85qIqm9mivUkWo.JFj5iޣǨBv: S`mKIF6/r#!.ޠblNM0w;MD$E>ٗ!HU=EE/^ekkPvmXEpRá%x_dFIStY߀Ȣ$n~ZEi. ӿܻ,D\2Vd a+tAYf֓m~ȿ}+X7h76)YwN\uL;p+Z!XTȘ+th22719x#̸FyC{'dd6`ņT Ud%s:Jjt<c{s7-Ue4A|2s@u~1N\K7˄d8-[u.;#e6%\gn{4~Qsh\fXMx$MM n(b,``Mj'Dzh# (Syl"_~@ѕ : >pbY<_7Hpƿ;=-W4h]ڇ/ňDnKMFtu``ȈFpp蠴 ɹP, AM,pu:K%p j7p"1,g@A>R ܩ > `h0ipy8cO4~-:rsmyJ{)!/0' oN"`?Ta N"ɒitZ^̓ Txtl=Y2NaQ"VVIcr5X.(4V )<\y͈rU:3&AEq!g~@K~RGy3^f4mIfՊҝbNU{sCcnvgCh09 Ytci\TgƮx]ſkr[?.3(2=ʈ} c[֏`Vv{h֥y-fnh<՘?Հ#ctxbkzv^ףrul!zUճ"hVhFVVc,feET 4yΌFw_}: 9;Wwұ&R>.oV3UJNO=0c؏A{jHhM>T._EBG Iz E>t Du [1'-v$a>G,mL>Y-b!T]֞nWmNRԩFY4ϼt 9+vh PD A@ hfEì%z!T:RGZ٭icZh3e'D@uy`#e"[)T˰nqg'0ڢHQ(x¯wEr=q(IvƁhypIL@Wqz2n\~y 3ow; 9\ǬhpEkȢsө&Na䔹o}}\k7kA2Y4XcAe"iãlF[| V*ω){nrZמ5#ag-5;W~?YsgbF]Y[ĖG* Ƿl}7Sa_':x2~ٶ֞p}Ux/6U9t'=$pr>›0E4x4M|WsΊ a=xe,f\A7]y'$,1꒾zXݔ .)?.ON̨ߨLX+C] Wv#)tPLx O-@LQ$QCT\xuv d_>p:V:Ȫs)74mb둹ܻ32ĒrL{~FPPyl5j:>֙3P mC/U!*iޘulxU%'&X!vO=Nj[@IHۉ)8`|ߐy_8(rxhڏeʊ_Ω),mPZ׿S;ee9g,>NI$hM\`(kJū7BSyXܢ{L"p=r4Cwĩ{,G)CgE ee]Rg̉`2~{W rF=sv ̣SuSO$)~/}ZfO?__Aę?Ԉ!/Sj򞵴v>@RʛQ  N'mMޘ tRkt^MG$}H̗ܡȫsDi粫/vKxǘ-6{>]2¸KjǢN~v+cYtsvIت9uprMžp/'W~~1Q*Q+}Mf4,h<~f;L SOa[ǵVV9?<B('|(9\n,d=+/3KGX{{:Sӟ{3O^O.x;NR-u>KQJ==ϩJB0ӳ̴VTav )PLLdő"hvV&\<} {*WO}Aԓg\#y^,I3 *yxu(=9[¸;Ɉ+u{<7Nώ7}V9X۠T"ݻ.q?nhQS|ulv%MH:i/!1y(QE2S>O(8eB^' BœGQ9QëDz"1[+lLݩVLA$ǃl@=NKr[=[#th$.l󶱗yb%31B.7d?u yԒX{6}m69$f2;^2o3pt(,vXnzXzʻ XZ _@y,a@ƒ]'9 ܠ;Vsgp߭4Ê|!&>Ū}i3~z3 \D,F/a{F|c#Xnج Y|ZOXOףQ@eh/%UzB**B=pp`P@0 0DDDDG#xBi f&&B&%%;b4 {DDGh"D"@#D ,A,HD@D8G`"# u:a ?fҢ BfiˍTֆn7l th&+nzUfS6!}ө?eG)Zb+[JE R~Áppw0, 4O 8}tqXy!M]=ڝq0gK,8{VQDK#qmT,<|ʯ6Ӳ¡ntAAt#*ȯ|)om+ā:\8760d:t(k5OQ a-y~m/F"*-€A;-0n#gb^ܣ:G=f$3->٘d/ S՛5kٖizA-(FT 2܈C%3\W%)V0Y]X BXc&+4eidoMqfiQH!sI^,cO+oX D֒X[^3#K)coC7TvHa(͒~p8]3󩨹ܐ?7#ֹ|+cHK5uߝOo ao|kHKCCk.g~-熥#k0Ł2bkҴ zb?E~w@ǐL34|"6B8,<Қ: {X7#7~1೥1t@Oo\>`ڴDy|Ma EFߗդݬD[  \86tLp8V2L䢴aSt^ )`^%di_x&PlfW64 &|h?X5@/lխOqђߌ? ctdǚu|GLvg,$x;Dq&bw'"DrrG퇄 HҶ@+|?C]؃DA\]n) N]qKKzAV* Uhә)Ig{M~ٸ" `vܳƪ)7"kL!9Y u_8LZϘ;{}Qgb>Z͗ ]~:i?"/')s&% iЍczΥ) u=;hZxh/9d6b5薷ݲ˜%bHoyɑoG6w)]Q=W맷i@;r^al8JUHVMDp3>1,#a &4qF`AýGyAt)5h@jSY Ư/%!)=ogsWӎh]x4:=cPB n|K&l黤A3F|Imnu| Nt}M3?m,w3Vj@!?jPa$E{ oyԆ4tjcћk2sč@k?z_w[b[^vSX_UMmo3;_gWjJ0Ml5D?FD;Qp^w5Z)鯁:JDKgVET:p4RTJCvBL%:~} F/?j7tbERࡱ'O~T˹|HLȓCߘ!$r*4s\׍T-T#9sN>Z,p#5ՋJӳ ZHN*ϩn-Ej2εfk\(5y3fЩ jcoa?WʀWq%Ap)Nd[<MNƧ̬"ןwg\hV6nF~y REn%;W;ܜn @㮤Jk91!2qm` ?:G#d?:B'Hbl c'Kss ɖPt[0FKƹWK.lg/y65`A3 H}@q[iW* +:1Ãk[We@xڞoQG/ͦ{r^6ه;}[p4, kۻ$6I)s-wM{`um^sp縍-pfp2QD>LەuՖcx$_tk./1֟aq|PUn`SI|)5.cR/ZZG17 u޵eW-2 J sKg̯tIk0 L+`ω ZQ80_P@ȚylTOI>^<$ܣ{4-)dWԃ/c5NX8ə0Ӆ`L/iR"wJzȅђjRhs6xÞC"Go<\5=2,Pc56Z+aJ?ƿ ʚ6D: %6Ċ=1<*Kr;Z8I,lQ6so oraojk\)ov%N#ΨS]C~4wuj2QdJSJOn2v(i>0ؒ:HYױn0䚹P5DA5㼊5Lmd7K|2'Bb&w 7fž[Q}k==z6t@.TU3 +L@K=}e Ō:߷o_1pٱ_v֛>"B ߙ̄k.;K\XHݤd C ٜnX ($=iC:b5 S%@rz}!{L> f(oܕbfwarbDt6}郸@mO'U5 X ~9l~ >^OL`SZeJ]ޛxn#F|0O oGXp,%E#kG I0~i) _TZoȃv~ju@ѻ @EK O"]+^D*l3%xTdGJ؞kpe*`d@WEKsjK"bJalAQ_[[I<0Xӕq q^M/0_2$kO Iu>ܙjǮ3یmc4sߦy?8ݿxY $HZ^fbpc1)kx;TKzbpu2H+#:P#3s5`9׀%GFdqyz$W'#~.fw>WQI2ru/i]:'eb_lư$`*$<\ʜa{vٓ g*=}y,8X,f8[7 ϡ0 q]0;9Ѿض^9i: z  =5U!mߋen!<G.\E꽀K.K_&r%6͓s%Om|=TCFW-*^fx4N;x +51%/ou< L:`-&YlrٕhR2GunqZ1\(!"m5u1N)yY6FQ.l~W(ܫ_Z Yl׫I7bJH={$Hd7Ȩ a Nz+%-^="};2 Fw-Z-‰lPsFyD'yxPJ1ʀFzދJHZDo>Slg7q}Nqz>`9Â[^ 0e_u }~#2Ewфj=A:O8ݲTRgKЫ|^Ƃ%{ 8ҵ~p:U}vw4>Q6jR 7zq7R6։&g.K*țQgQӪwˉ8oCUZN7g4>Jq=D;}1`Y>+z79WG ]^4G ZZkA39HT/^zUjl}v7 B(ٓyo%ӕ #uTuzٮٻ@}, oaR*sѯFcղA \P[{(gPkp?' HDkh# 7,~A?[_cgʪhA{BۮO +G2\_kS~ʟx>\.waA0#Hd'x^`ԝf-mh=UhX5a8{,q mOɑ#DF6$ċ k;%B14n" +/Hc_Df'R;Q\Z Jy0{rn`t*m,43.|ru~0~m-lViGwܤ GߥtISlTjcоecbzh>a"bXcQsbKf&k@|ܕ)'=w%9]LϰhiQa(e z,ہCw\$u*UrxUsz$f\qo0@|jl5].PWV CMo7XBkHMv"^ pan7ގQ ;gS%+8>-3dK񓺽ap}CbZ=·n6$Y6s$P };:ގ 'O!mA|(1?BBjF]?!M_TpK$08dH{NiWx/+33_`lᬫ!_^2y{r<yynhowѓ3&1Ab]sՍn}Zxω-]c ^@NHYF<3~/z[Ns;M6p`!KOD9XS,p%7HF7'2Y2P|~W/!R To%H,Wt0bzwJ9MGتrFDRL>&f/ FiK8H'rWM1Hm9 ! ͐/War 0>*/J 4MI|"DM)7FPPT s8+/^TSFXZ^klX78V,HLq LP2KƁ) EZ0rTyY݊s {wLanQ|(|dL*5n)wKpl 9bEў*2{#\m3'0SX52Ŋ aۑeJg!HAlMPV#xG0kբ{XI@~}(}#n`gy54[_-lb$T %ܶH  ;<z>RQ8W.vtgP{/(\UKQ+}qzX qtYG Y5X4\;M"[yFnrqэ@Oly\&`"p(UNfD8L DK9m|%l d Oxmq%b7BLPq n$[A!Ottٵ6LCkR|̸4ڰN×jm_6)_wvOv_[:6۳ mMN{ioTꏇ;w_bȶp+Jt@IŃVyOtaYXXs>i6Ll)9g٘ 6}W$7+VPIv"v @b$]uHW^L* ϦtqJ2%1/4̯9@TM_)|< nc6l6]R O] 7W3JO7t 21OT !f` dRִϏqT _}f5qag^GDZl烮*'`_kֈŅRpŇHK 7\rۡk~9z~G2ݯGh&QeҚcA<{]n+ ǹ$)-B?gvYQ*DJ̈́ƈ0pW=3kqė,L9%9JtIP"ĀfӗŠYU8[~_K-$K#uM\-љu-Kqv C ?d3ĎA$=N?ML)Z ^\%Pq%iʥO`][8K#Mڜ,:_&  @Qe=iO6%V 渚3Bo"TAx~mg00M4 ī?|ai Uh;SĒX9=[J)̽Pqjv uu*B@bⷓ ldkXνydcj U\qܱ.SHFWyvSAMCa7x2OfZ4R3C9.YɌ%^tm:nu/絮P B/s:u;a?rcJuuShGr)bVyuX8Yz䩐 EΒ}@t=)XAARsE%bӒ޾ؐOC!bb{+ yPbwPi|pWQBw0$c)K<|-4o`YKWXîSu3 Em":N5^b/0TR@+,,OLؙAЄBJ!JJ!B!(J)JRJJ!B!BP!(J!(BP!)BP% BB(JR!(B(JR!JB!J%(BBR%(BR!J!BP BP%(BB9r`r@p#T2/wHyzAp\CL$Qx9ʼng^`gM7;y w> $%>__$84 /62Pxv_nԞsrnH3t-|o%5&̘Zt3[3Hp+кI^Jly])[~6W^NkIks\.}t%w)Z"Keeҵ65q.2Rˬ}>=kC/{|w gGԉugJj Ijhxߪ8#2ZҞZtD z3=עWvHa(jctx˴oΗ!~Y3hsin0eJO/[\4Gx;q`YjaH]*ӁBWcoq~B{7GkqtYr)ITSo Q:?rK(`pd{}t1G\ZѬ2kƄθGWlGX]|nt `>8U" U},<*#&=~bIqimcm7$m5aevLY"s3ӕxo,|t?Ox>7$ҷ%=Qbx·ךx2()Q;Q2q1Y#={(eλaoTy=lCVIy6H~#1"S'^K<*mTmt{ 9>#eFF]9aϞ*lZ}N'R*guiZH)E$v%)Xc8GZ%kG;ιJkQK_# 7˯,\QVI hJ9 3Ac,C3' 26jy#Pdz0^q뫡q>Io~->kA6p|B!|R^R >#?y䡞15T>ǦPӜ¡ΩāaY8vOCn=GQ>WY nlHFdEį>:͉0\ Z3̭=vT (`Mۂ ]9,7{ﮭ v%: /-Qt*B{>u:ẘ'jEaqSXS܎mt eq97]${zpӁ#z:noUA+YC÷#9>0)r r3nTKvv^X/rg1.K=\}qrFfW+Y/uth*MET)Z4KVi$E[ͼB6cV#aд-nW)n좧(~@ݪ>Wi=/ƏN8Q_?b[ p; DApߢ'M+Q|XeUj\Y4-FW5% )O5—SSWËdzW ?$ ]6B~Qi5k? yA o^vT ' {V*u&ƒ:ŢT_HV.:HAû[ڮ4(r@0F3z.޲{;ٜ<]_߶sҐoh ΊnsPx[H$„TILB}E澋a &8Q˜%HhЈ?HtxHM+H_ɜۢT BJsI@;ziC @lX&cߢ*2<4&l3Kk\odݡ>q7v͡@HAc[bfuώqogs-{u(G&{iCӞp⹅h, auOE;:l6x_=ٴ™2#,.3(U}y"̹?ϝ?6$]}%%}f%upjXUX9.G;4%m.u8 $0҂b8u=ƚaj_g}P? %g>uq}y<LdL=ώN6*Hןj.yu~YK^!Kb٪5=ȺK {eZwZ69oiž+ϑZ2e:],- .ﵰ݇&B:p8TF ݹ" SB 9Ӫ&u&[ |lƑ;PB y2hEŎ{I&|if)Ml3VZXb̨9]K) c΅VaE0)X9AEܓoQ( XM#L?L ݅CSo$_'!~L|1sZ/r>UÌ#+H獦؛8 sj+z4HS=&v/Mɫ1<3i{p&҈*簨#ˣQd31O91>Z_]A7̹׆y[ H!ws!}V ʟyWhMUЉ'}W+י"m4ogVֈ)į\ j/r$ۆ<oTbe贳0 Tu]'ANi꺟+سX*0ww0NlҶ|MVJ/CPN@{v<ó gk@?Nj$Zyy[ùJ~~P1T0~:͊۹bͻ-8=@zkGK8d:&b0jb$^4pG 2dMp6ӕJh:mT٥~{W ; ,,_[jTAk8_"ht}bJ ޢK3w@,6g˳<)[]f4h\k}ęqIoVyϷ>slQR8bl;2^tĹoy8gkIc%}bQk5x -g0!Jﬕ3ҭB˙?XSgE\f<>'mHM7o^{8,ߙ8&( X𕖝ӎ}]/p7 W.}OD]\ޠ`D>ihiqǟ^|Ɲ pXX0*V`[8*_ĵ~,x[/|ִCj9iL d:hi EpTl;_]$kץWGR8x^QG{S'Խd'JmE( 77b3M- g4UoLAxL|# āEQqySJ6SQA,2}BԷq^#mp4OZ5e=lynj~4M=w@0SylMQvV8ėajHҮusyc]&_i<^_eyfqۙ/7?޿ς$*6]όÇ0xy$Nu$JkHvHJе =i{w6oUKʨDZr$SKxԲ lqnlD]:rk%Z|.g,{ΙzzCT}3`[СԷ'Zs<6*΍:sR\ȷkVZurGA Tl-Wn=]tɰ~Y˹䬯jC:$v(d 6m[F`1"PU7lqϋFqt!}x}mf>d|m|\\<ЦHkۧǟ_7;F3(TyiwG&v%Y+#5=uo n*VX/qDǎ8WX~s{Sr`}Od|ԟ0J,WbouبgFqBz f ϙPGڇiq |lg/"|D:_ិU7M6bVrifSHWY.{{y:U\K\)S? ϳ6ߖ121 iςJ(iK|V jC9ck2;De|Z8s-oH6O_,Qd3MkO۳9=d ~Y-<&oM$}Y:R}t)ôf6 ~Zw+3~\%U\~(N5v?w L9vtR'{إ &ދÏu[8w 2@|ݶu<%8'wW 2yw>x$k( cJHZye-2,!VS$?U_e :rŖmm'b jv*5 :X-E.g7df=t]]9!6=+pp΢mPo$9 5qߞo M:?l B?wc`ɰW3!3fo(n{LE8mT*V֎!l@ M9c' r/3%&ǒ?XKCj84n F8hjay2sgmM/Qz:ʵ(l)*I1 d0&4i>q9_8%=_1#˂kMOK(2fn͖+~n77;is(UBk øRNW4o~%=˖MWtvlR3jg1T-3+?2it5EyB0#өy ,ۉMTd.#r$E ʭ/CoL՛狈x>g, X|~0x698W5qɼR ,wD瀮'zaRUGi#/īs j?=rⴙֲtda!LS5t$}6~ ycХtiDvgXйp@܄7璿ZNu(uӔ xޖ0)юo}>m, 1}G n_X*>w<v )-k*pwK!HuZB'[@YI7<(_!65yݷy+iUl'\ɛ6SQ;>l;bZ}FןAMsZ(Xj_xlBXW7y͢ wT>Rw,F~3="*ҷxZ7IiO0b;'G9p2ytuI_.?ul([S8Gs% 3L= nsts>؁v-5XP.#3lHӕd~EE q0xE[F˳Ǽ_LL^EGԵjzw@ўzi,j]"'}=c%lq ED_vYV51 HȅQ§D[ *>:hFՐܐ'<-8^慃ú&KWzP5LlƁ+L>Qyunٕ(͸#[>TR꯷Gͽ>b7 憫VbF &V>ЛunoJhƒ7u-jS8|>c1x^H48pft}r{*(ldJ6fxQxA޶P5%wJks@oc7pwP;SMWoDuuBgegاj)1\ჯ]9Lm y[fMEpl  a"zTH(iZDkJ^KfưMEofwPe[{fIIkr7<8VxAi?ፅ/\ xi61z!F(Ir.YT< fseVY,~ٌ*+"=t2H5G1G51[EƖ2sZӀKlNx'aΐGlJѲ"M%94YcCGCf\bH aD Lg,o )2v];9L3Vp46R_.B e4*NuIFm1el_n[~w>/O 3mϰhw!0Xgk]oξPuujPlxv?] CZkLLX]"i-;{usȨ"b.[Xx#TDAbyL(cwWclPvʦ~>YkO?d##]mg1ہ S<˽̪ƞ5G@B6sjZ ~0*jRMMBODtrFIHTi3mo-p PPzT3J[Qz/r+n*StTz/C\%o MF7ϟr ِ 5B-rFhEV[Ke9O%SeZvv_:Omn/;Q sButkj}[}IouG^v9މ闼ʗ}8}K2E sD F8lċdu;Րȋ2LC)j'RyHvNn` va-<-!sh۴xKkkk$QP5qtvDƇYɊjLn\<U;:jhC!ԍ=N̻Ys_y VZ&yNO &}].==$*'O3hJr4uB=[ l~V#1GܙY Q fbrc|tX׽Cq :~S hA:'p!# (5}h32}U- &)?WL3M)nJzjgf Nn>) YWִeĪl PJ肧qv@wֆ NOѫxĘ9ly>pI96gKNW; 2;:_XqcR-S :Vg hb3}~uV& sRǰwky7]w}Vq4#QhdngqC^PsP6?eB]͙>`+H3Q*@#uhd'[_b{IvȵrG#6Sl;|IB6 @TRA*b,,й1 &!=CnOpHbpE5ŏGv<>(D4zvE# B9oAYJ͛OA_AiXߞ2?OCg,<-ɮ_A@?kc0rkP7'QQ̬L!f[@ϥ떋_gg KPgF:_.N8< ÃL ?;;es4UIzroa!ER&my:' koq"Yw1$NLKy򻱛|~#pL QDzsʜ @H6BGX$b'9VWN5Zzv3+EfLMGE35x?]. ]Z)5|P~\i~sԐVr _MU]YLRAHٴ@-ֿ"t)V/Y]jϜ{QmO3e$xJ]P2#NC$|Pl24\0aOvSU0iD~,lpכ1Oz;a6O~ M}*KZWz5-EsBiM|5e=[stm5E󄖦IN75>͓N7mZ?|BPJc|*h2ȧ/Y\{6qgS{ƜiP22<#TQR΋<v=xpu:d8?s&d˦'U|:j_،~̙3LfƸ":Y"EiJldZ!Tsue[S_#vMZqVwιO6}=%6aP 3/lm4ɜg,P;^$Ɯ[hkTz$ hhdUإmkpl+ЀauH(p }y6E6ƮKGE`lB"Y"f *{~"^dxggt4;doPd<3;Ko~NUg 1Uqwk6b3jtiU8nv$4w߄E\x-0`qTM,0M-wS86l' mX^AJS$˶ ^zs]3JqIx흲?0re b__R'C]ZڽcձGbt%0|vIVLZ"֝GؿQL3 ݫ&'.yS(l;B5*p5ukgTOvdDWfP>)pNb,MVtp!y3vad0{n! $EH0S2  ;)V1+1ƄFŏ!Gvip lɸ2y7;,͜e.>Î}'a5L-23TR>7w7ɸE-ȉ^6>rk|kƟQkk~b-7Ԝ /`T3QTHNG#¸у[A@o%e.C 'B1#?;ie-=Y_M]Œ*}8B4S迾}=Zҕc[{qiၐtg,8.ۀwgڢ f=4/wȷKwMXu^#} ~fцQF~6 a58a&l42it|/t5Ko?fKQV!_(X~Q\m1u+Ÿ@PEQSX ф\C.(n`E{5Zݼ1CF zkEF!sI(P›]Vj ׫_cz`)~)Z`1(  dFwiws{mnØ)}]> `WZ88W2]Xl[ [\}YE^4 E9"q5B Mp]I,) eNpZ\?~<;cOKK> HFX5p}δe2X,披osf>uDb-#`Ǭs`y%1WꪉJ$|EIװ1$շ> :7Lo)_G5GaBOc'.Nug7H-y A흍鶾WxLWr>CźAX*\<6 }9H~ħ5ʡ\ _ß_ļZ{y}9ƣL}3X|#?_l'"<PT=/5lۇI?^3:أ^((_X`AD :Vc. Mof")W]2q0|׮|OClTBSѰ jy5Hb u1d={ͬC@E)mP)F2APr[Cld@$/#{5.Ҷh|[ŽJDŰTݵfLZUœ IDTV|hi%eL_7.CzBHr*m5=U}#J9q nO/șg?*l0#L%d|i=of$rh~S\|ߗ:ʱ^ $S棷6mMC-BnXhFL/769ֈ.@a*0~_+>?Q8:modkkpކ>ɢSNfz;/TgmC= zt$b_.^jݩ0.MRVtWFC+t`dNv|IEso~`420Hiʩ=b;:n'bR4N~KMliZ%;xhܽ 9&F(^կsYh{GPuI)=.#|o^]K.~΄Gԫ"nkkȣ;Bl h7I%ߴi ?_nr헚.)~UjfRT;UHp4ޅ=B>NzE(.uHt.GkCXyE!b)T}yD2LN4zlN ùv\k> ;fSV~jtݞֹcwjy9b+@D9 ٹT~}h'$3˧=Q_H9Gւ$3Hj^5*F;ڛGjo$y9SdH>6N 2|S88j?xGu$"?wzr:'W}<г(CDH|LWR}:Y}(3-.뽉anǘt\8`OSWr'a Lm.!gD70Ǯ}9ek94=<.#;^ﮠ=45`-H_QB:;UVVbeN怿>?ē7sMjbt/a񴏵LUTeX$HQUm<](WBmΡK̥ky 878.Fu&ҵƞv*jK/-aQ]h%?-9₊uYínlxvpl;F)QK=kPz=]'w:u;gH+X)\}= ZO|˚J{.2]'Hjsz&Ldo8DyUUDCH Q}Va։ !Jk?v*~c\}eyo`1*x{ OYrn_gGےwճ^:ʜh\Wu2P)=7X$G^:nE'Qvwo76会7S-$4=4GRgJeŹ\_|3nȋXMQ9M[U!6\$p&!G55 Wv/l7h0zc|챹]~s$3=$X!ܚ7/;*ίLIHAjh{W!㪁P{G~%wWZdk9 &**תA} Sn6Gul`++we퇃&Ca$3 ۞Xt[RB6APr5 #" %/tW| BхoiD1"JY *\Wl gٔAkZDvq3Ǒl> ff*NmԦi,KwmYF>-"Kr}h_yV$tYiJ<|FLz>w`~U{_݊5W\9clւ3~ϮQU^6~_斓BfjZ$8{vW{)=DPB`M0CAp d#D7ТQ_$ӵ9-~>!CKT~\.l]'Q`~6~y--#[_D1QOFҨV7P98hpX;p, +s?T9} W龨KZ' >k=gŬn"}vgt(; eZ0f+DڂGGuf+\+RY{c^vRsY渇@K]#<'XWb{ `;Y}u)%Ti9 ̕!i.2yPV2\K2Xz7w̠@i׾ 9u% o|Iܨ)o {Їdq;qq\>#[R ۝ݴAQhq+L{s^T~Di@E)76$,05 GhtGou|==Ǽ+ /AѶz!3g>|6"FoJ:>e%L]ډO㜻/׍:ՊIG s/jk)9Kw=Vi؞w6HMwNk波$.V-ܻ&oTZn}0A?!o6`|.?KQꤑ_APh-ZC ̃)pYkmr5jmn0pO7>_M~\\{Gr;zoV}?$ >mW?k\y[z8Jl;z:U>g G<<7?pU8Lӡ !8 2'D6>cQmr|6UyJxKƠ2ۄppܡa‡`2ߙ))$٘_TWK@cSrPj0U8MJ=#Uz:>8>amG3l_#ge/STwkEB;>^Em3cCH]>1pvHb?g~iweYrb%b( y-ooNg"9]"3,kY(-(nz\Gg) epHO(؟S/Ԗ =?g^_6N@=fGeo*n _& x.cX`?`uH(?,'$?jpŸW[z.#=wytbWnkWH>3E|f}OjL"y]7Fm#?h^||D[ β] \`;CBo`kn`\;d3OxSgB80004:X^zrP5Ao^XcoVz  ᤂ;sߙ,"H0qU4'ߝ^_c_$Q,<ˆ{+]Xzz2<il=p%/.&ikEOM=L|\eϨ Ƥ!ݒw &-0HM޸c[gUMYP|Jfr`iy9{$^A.i}s`$>xT"NAKc>ⴑKN~WGG6em%uΆTo|ZLߜ‘Yц?'4=a{ea Vʅ{7%ͳi~DwaOFہefi:=~?xS4Q mk 5 Ai׾yPr޹NayAKTe B80Dt}TM/qBO-Ď>vb9,ں2[EeS"8ۤ}dB{\Y=[,E6ɤѫZ,VhҐk=c w4?F!7}*[ m "y="6,Hg$B󾄡\`!:zLL}ξ4FI[Rx>HTJ3NK`.TLl_~=~3rlG`a^)h3Fn5Ѷ \^ߗ !/j[< h쭞tWF=[XFKs|yzH%M.Iɜ eЀ6C7k=6#%xZ ?#Lqal& kPk7S,qҺ"LF]{֘ P;}-wpdH:}}|WS%h{Lv8:RR'|Ω)Uҩbt{gMsz?:M ^&+ Yܤ$bYZZ}Kry? a }6wHTUT3*粎@4k tǠM? '/ir8B[; p-%c$hھW h |RVNJön-,ԱWis3<Z0z-x§b hO p=rVfqhDF}J(1zy@xN,k^ ]o*Ht'\|,J@[fxt)`{@XC~x݌hEd(6'YOyQ3[כ\TRB(*y,'T 6?,=0 B%>,ݩ/O>FJ=|,t̹t =P9BMH~1MqwWyb$Jja`f78j5¯L(sc<΅ƠaPb|22QuxAAy`my^K`rDtt,(#͂>Ιx8޳UU_K4 F\)z$uxtBc2QW{>6:;܁AEy'Vpz2U_Famɏm*1 EJyG=S>k)HƢڄL4n(Ź߸m4z4dOBY ^Al&PGqʀ7,8P8$: +mDuaӢ!тS *\IElv )g+;vԗru*cf9̯MY8"^cv]v89|bDj <# 9+\iiL!;w>a0 A#Y&qWy~ī $P[4fȯx+cWg /Kk Wp?aAd܉d_dP/ oM~7^Y7iؖ*#BScUAHߕ \yg _;-A{ MWLe^HG_dՔ%16 ₤?+~YPZ=' ^ێ)/ƒBF/_FGjǑ0{ؤ#&{EjVnfw{}/<oƠ^jJ)R~4LM6|<}yVh5#̄W&Ηr39^Ї|{1ܿQ5w45MTJ'Qsh<5~]kK!X}ET5%{5Z1E|/5xmtrR%bS9d9%as B2)Mm,7|rX4n\1Z}mMv/d+B|" E=d69'Ff0Z'>Oo,4o_b?^F\U\.Y= goƏfua&xp45o>8"Dr9jmy0VKlY0-HB B.{E>wE0*-ef`(b?!nAy8__ŁNԠaO3#1ƽ!X~ʦ`;/?KݵFNE"xЅd W78g,4a=o9r†*R ѫBKQ6 L sOz/t32\| í#E~9~4΀FL\s$>G e@(QCCf~zIdC  >T7v"EKn '9{6qe[虡4Y9a1p6@w;CwPz|n^?BB:6$bulSG΃5WIvopɮ4`1@nõw'gJf$'C ,n $. ;7XOyU'6[qnt7F5]vhhlI᮷:+o[ΛrЃ5u~9އU{uGMyML%-HIp@=ŋ/{e2|K)~ BȰw=E@- Mή`-.iږ6 %gqD8n|{8^|;oB>юYsF;rGfa!Ichl7$bPoeayxpGDtmg㝺\Encp [ 4Xޏ[ur.]&d.S<>YGyu:[483*~T k0t>/Qӵ?uY9b\#r]H}oV?e8鮶8%3xjŽTOS%-"P#Y&!~B $H~|y0})g|#fT2m N#^u 9N4 oQ4OkIHd,J7f ]6npc4c_Rsk+~!a(yoԺgQXZ/@ORl@VN?L&׸!1ZC0\55np N+_/70FWy:ƅ S@~WKx#F/1Bd>E#Ry%S`_j$ce%O=5H7 tF]yx8ˬR!DZT?% bUB5/kfk&WKM)жJum7➩.|ݣng~hgjgE\`HD3֡L+SKb5 #A_8)Z(aFܱ*i<F\<ͽW4޾_L-ҬBͷ9H{'SJ淝߹Y},r_+!#u*pEA);4HWn[7 0Ƽ@Vbl:y?g,9P#ql| Iń;Jr<]z{EQ*4^A ȟ&#JnG~\ɀ%tb"A>kiY#(B`YڸIz}w_< U p\Tc @^/Y;U٩νᩴ]M5*r6.qK8ԙRrxY^&HZrLJp@hf% Lz_zay{rodCú ֑jJK8O6=ݑL[ raG)0S+ma?# Uָ۸Fߚ(cœԊolv$Hp!{݄łNM~n@w,jZo~}Cstʏށ,p\X(l++.hO`cG$h$QjNs}ZɊ,J{.qb#RLoH[y6P \`ҴL}M ɆK֪ZȰaUhkTuh+ɟZ-}x[:^g_(s_.q/VnUdFG,΀h-9{Jr&CjǨyz@v.`՜ q czb P|-e?'K/@7ݟg 73/gz/=Kz(e\7RZ dO+bXUXe"̡wn8yGR6h5]ܮ`E~@Q S~ć.|ˣ\=k(Ï4)xΙ&lXS*حzW]KUJ3h l4jh$9Ѿ%ayi0mU \Ō^SBPZRMw;pa2^:k/~5U>NFqZMʫV4\rR!zi`-:?i.T~R_I?qc~AC9.[XTS:-V GXy͔  a~}.#- qg dCy!\#)+?M2;.1vIT!awRN$wĕ+}2P11'oftuk7Ed1u )܎'ʥd)а,wܢA|Y5j 6-!w81>Ӻ\wno'=,y_ B4`juNnT/7꺶̘֒[rF%th~K]-tl%UMv_N[G[})I\睴r?g>sp;(p0|tj7)=XQ"x˄ o(%P&ejRg#ntxۖϗ]G[:$cf$Pkijs+ l}G8TfLw%O[vOw d7n=Ԗgn;_E ԩRN% t1@8.=#kkW:s3uLQ~YS\[9sscP`#9u!{,R|P>^.6}fMG6mvCI_m~49m1yH%o2;>+*C;ŀ,so/[X#;OO\tQ vQ-Wwa֕<mi{D/zO3_48!A|0 "iIBƊ$c*Jfqj贆MkSߌXmmw; dF~B& t^a6.W8"c*Өצs;Q+_:[]&# -=!-v@:Sό},h`F?AaUϠ(IJǫh~ [c$2VR[ӡ8ual% 'y44gZx%}5cDJ@`'>W.(mnt(+om Ò;.Tptc ש0+vatjNUdYBvDO7ڻU=ֻuuo wڕ*I]T-Z=]e ] <'!$"uIlQ]q7N 6WW^_ZP,vd'Ơ*w;f¶b;w7;H.tn}6E.І3PH,r&h,9 s /Q/kZ@;1[38p 7E,A6K?%i! rWl9XXzTzQ-3"iγnݹ+`6F ckS㨟G#)f M'D.}Z6; *u(,)FoA̝˂a~f7`\tga =ݗ zR2r ^`>%"N⹥S6;}+^ղQ 9'ѸS9 B)t< \Psyp1ޯMåt N ldE&P]ӡPv%Q8k̮hs=R ]sBb mXɮlY:qEqSvMy6)3E3sv# (ޞ@OIP~W}EΡl=CjA}N;ļ4h>忽mre1i18Yuh/?<},9OƜ :^r#ݡx{`{=Ny Vn^ m£-=ҵAnG?NРkP&M> {$7dѭk^|zx{3x굟` ƯBgʞxDKXo~4rP*Н^8Cgʥyϩs[yվx:.P+;JzdkݖɳC\ЅHq?6\sҬ YyiZEAš |Ոv"Vӧ~S")H@Wr4߮s[̛kƶpz86==j|H]o$ooO1_#7.$ FΨUg= pUMUXZ.E+oq).c6c~Gj}xbS@Cz7);ٟf;fE5#/!`M`;hӸkIs r|b6;ִ~TǺ kڄq k20]Lǽ*l Sv5XZQgk}w{5@mf%Y꛵xșW9xLyo;|#BiO'7e^*X\8B]BQTQE%&Mt ghzOS'Ä].2q. s`VC#}/ q61;}sd sM02y8Ns $D~@hГzq#P2`lzyN9Me 'cDm<3=dhD,RןڑOE ЗD_95(zF5n_QO4EKCK,nN}|*!+rj/[K/|nL*yƻ0Θ"±J+ (mLUѾ󵨗Z~~섍8\gKo,I5ʣr=i)+LLv, ƩV&2!`59ˆ#]ջ.y=;%q2il|U ''4x>Gٟ:xѯTEcj⸄ r4cL#16SrMM <[]N#lw%mBY@OpV2hz \X1Fk$| }JDBYs~h&IВPŶKtP6pYމycq$7{he$=c/73iG&ސQX 9c`G\+\)҅5CEW1P4P!%ۭQazImxFͭ>T`OBC`V+a9} ]MW;Qx8op:ή #8-7QiGz34٘2 nV˿K֮hțXPt}G^(yWr dHxǵ+RrC?/-!.n<c3 ^Nk0kXL"$cJ˝St8Kot|~~Xn 1tb mk86ޛauij+ChIl~q `쟓8&B6+&{0#L S[2lOc[0pӮ(xH) 05v \CpЄU`| &9í>Sp[8oe{l:q'#Ld6 2嶺'ȩŕ{\`' z98fa^GHpwTap~;8 (F'r*N8m|ۋlW?ѝX_c9>V]^5nKֈ` tJ`xvg7TiF~XUo6-0Hu^^}'U"7̞]wP?C"?3[狋qr=(O;} oHj(3\ L7 "bɄ1|'*o.38&vCf-ywcwĬg.Eؽ%&TJ?I9۔Ɉ5:E _F,6Iw͓ %9%}b1R4%+£xg\TyObSKт{jqC ņL:Qq}PRagvUm`'zo! =K !S$9겚o80Ђ "4 ZR &`'/-/O\\SW=zyP-^L9 WyFFkn|n. &YHѨkK:]* ! Wo*3Єpn`NmS L%g1#b=X O \rPkӃ|@jӊɂa_69[!BG_3m9j*`ա=YH"H԰W=z9>y rS"r Ĩ0>s^&+Fm}}k4Z?@^Pu=y4:%iZٸP<\VVYrWkFuuGʖ{S`.WG?H9W?r=IDfa4Jhe<Db‚ Ӈ {:<)"`tڇ!*`,$r"Ә.GHHY(I %,*csb;M:qP}FX*mz~g&Lpt .Gzyįݪi a-/\۲fY{ _܀.jxIZ蒖5k=Jp#{~vYnݣy@[!:A7ߵj$nk\wE;xK+CE~ rrnΖ#{K H6"u3_x~W\` }5Y:t΍/҅]lTlO6`a+}W1)>Q"op1?8zVɒr>Rpԕ:!$|(-A4XAJqK'=P V8PJ*Je,¹꽢u4īBcgsV#y{JfA-syaN_H[1ZaHt[-M:3nct+V 9v}-'Aq'i[iV/1u6 gL,1_]cd;ɶw65]`ٻwy%d_kcԍe#0ኯI-xf"I>jgHNҌԥ=saWL>>fccc.Kȧϑ\(Sbz6b$AY|2@}g dX[Ъ-D'NR\Qqras+6J=m~agMˡ( ;ZN{GDs|OE5;TF b*Zrn7^Ea»O>,KsyeZ}VP y6G=tԮT&ah\Tev0^4a1+Ib ^;֨Tn^'_ձ?IJA]ADQ&‡KKK'd8S=< :/Jk#n Hץc GyG*{J/̩l~B2%˶cqfSg(<+Tj{ƽ^ť?HʙX}N5SN1b v|XL1cM~r@N{ wA;\b{(^>Dc\z*- lt1<&-sQ J'fd0M櫟~U3Pb.K}<לqK*aI5)oA˩S14ߊY"C-5d-9VN;Ah%'tYQIʕ@w:$&df&qhaG FEI{v<St"a&|gLf *3g ~\ )&/hA4JDj$L}MsB ?veA.{[9/-)9@s~ەR[g< vۥrX~_{QBl~ ;iDby$B|/Z{21iC!O jaNFHC {%H܆3Pl(k*v{x1K|Pa\X[{$1)3a[+(#&d>'YUk+ ʬZ)j*TMeᾩ"NElcl7tDKwNAMC')7i d= T'\pFq#(90<(3c},]_t3'rb}s:@7ؔkگ Ɖ-`c@\/-QZN_ xIxGW49ɚ5v 5̔3qu.G52уXOÍK.]CPd=s)їMq.ApR{Ў:7V9i-J<^Btμ\B ^p8I^1(gNPU?'{ش)j l_:%4*3$1/WQ4^ZǬr^ĉ?WA1@J]s'ڹ-{}sVse{:D~&қ&! d1耔EޗՒ)plc;/KtLN0$H:\G(AwhDF,ݦoX0We9KkkI!z;<{.?̏X5,kx7)mmO/)АK#[d|<[7CnZ<[kgv7zUNtTX4z4"q{05*}|d/M&0 >=uQG"L;hIV\=dlUuwa=>iBZbbosmH"ջ99J"Ţ&K#cW1?u/c>,q+ [c(GgWgQ_RJPn7K*G= |7l H>yΟ?Lх39KMqA@'`sTdSDpB% @rRWao|M-1fjo0oh 7"s0҇xr3u/7H>;I#4FaeTz[Ӝ/[PdZKNIwh%[cfIXEncDϐpju$=~뎒ĘD PrbO ^ Sa B/w5'iό 2 3aj|fD =ls0>AQ_}&q50tK7$k/`GHqlMH e4ΑSi}amX;+Q]`qLbSo? S302U۲ P%V4>d=H x¦vw ~~Vt}w*D&(iޝiFb'I(F~>t^uf;=r!g1V~ *',籋D e-)? =_"Z#x(0HM$-FD4- h49v5ivh{h .BdtؔKNܵazWHFk%4 Xe m?4 i#պ2ð1D l0r,yN]zD˟V#qW_lcX:Fc_<[ ,.8x({uf$ta L ,n@$@IަOe4GY/V\mn}Ampl{Jut2e4@%gJc>V'R/z$Nꍺە*j<tT/ǃ-ű)p97|jb:Z6x<RAi.)%eNđ vDm%21HB$!YZ*rqmԋb{$5"{fh*@3h_7r6C_|3\ӘM)Ru7cU)ǚd$b&=tLߝO[r 7KE#EitA05 }gw= ȁ@a&xBbS6XﲉZk) }'iARGGpf X{H~cԳB-;l qS|})L;#-RgWxE .XQROcGAc Y~3'OJe3lo-\R˜ph Lz6̆Qb/|;\ `\O[׃oaWDDj*p淐k{ 53W2xB9sqGd(_ߎ&e5*SŌirUgbBE [ #k;@]%/OaRNήDX eb0Sig3& IbY1+Y!c"Ʌ)РcWRD;9|}RbΗΗೝ&N@ ~'#]ƳW近vL'ѕC2qV{ƝpC`P" NPbL30A!BV=jzח,h^P0NEURmH G,R~TpޓJA 0W3a0ݟ3h:Q/ HM lDj[G9P?ɅO ϪaTR{oq;Ħp{2Ͳ$&~bxy ny@!W8Bao-GpQBBU%x-LL$ӝO^ ~I~3. ^LӨ-9G }6ͥM*J]kQ;y'rIoYy¹VoP?Oxdd;h+Rjsҙ.}`+HEBMR=H娔sY$V5pt uSSWη,|LLȭii;9Qr$%T4PPT46]@[,D6Ovw0j? |"Ð( aYNT 뷾'8-?j,`jAQ}<2X%{H2cGqEG4QՂ3߽6c؇Ġ9ٻ2| TiW~tf=ƼWh 1Yn/"8u;T"g0}ZgPvqLsIe&Ȱ&mV*5V .a~8"P+$CHtO0>SVaރN(s|QØޯyJ "Ro=MfLgcAAi K$I6,&I 4>;Bx ח뒱V`pd5C6 mFx䛹j䏛AMyoFXw:ȌE|V)#!b F2S3t,SdVѐ#JR pw ~{:ևKVFza: L{Qb܇EdוL&$8"]{b5^GoGERob+ոLwBpS$Ħb;uVJ)Ko;R7_g$@Fbw8]iu[_FѺ)-qԺ0WYUN6eӛ7 y6DO{^σV-*k7QV)cmT^ZӇS` 4_&q$L`l}g{nfhz[nR 99=-a2vM3o)goٰ d]`͚ҋ- .h|ƹ5M6:j|mc`y|C8U͓pO<$RX>`3Ҏ|N8Y7,o@OLo>蓡 \Nx4na [\ ~"4"8? C[-&Zu~ 6MPݺ~.H6@`[57p-4,2cbMwi Xr_8 =Kg9ݹ}T;Q_b^ g*ux/g~#R~Hy0nglg"|F%B4ɉE8Pa'#;]kup\)s!"o(-M͒8c[g"o AQ|KjysSv=)1uu ؛05JXu6|<%x.0{㫛>Bb3-/e @l0*+p]3!/]S>fE)O룶$mwdhiwPߛ`q?jL 8&m!aϊ5MR->ͅIC(ai .Wa9@ɍ <جG5Ϲ|.</ē<%3XDTt\܏) ˛3#Q%A_iӥϗr/ GL*͑A9; {#?hnX9p\lWn/,X [e/r|gWѠ瞇Rh柔ݽt嚯-"PsKA{mN1~E){8@)-|$TJ[69CFݡQJo-n8u5ufίXA i? ?A;[)5=?񹚼#kϛG,;-+?k,0r ρdos saO~빫CTnQ4<U |Nj Ɲ ]`3T} h4_$3Ů:"ڛ~Kymuc7F$Z#KCr_HsWzx">AwPy|&%-aԴ![z[;e]Y Cl!u4Nx/ ׄgÇm \Zevֿ#X7 kJB6er_.@}ߡbh̽ln2;o Ӧo;ϲ:GK8_e|T棉ad ciخ6&nliU!y% "LakSmr9sT=>49uh[F=u#I幉S$_,jo"X#"HίRL-na;t႑Y_8&0ll`-Ź.uT _RZn*$75KsFRӟ$苌[3= ~?h}7ѱH{eAhRr阺z[.x#ӳƘ6+pl펿 ~@e9Y(}\7R.^}pX h|Dw}5<;˴WJ# S~k3q_]m51\\K֮#yCY}.?T=TYG4_@eL&($ SN5ߞ0fxΰN3`&C6';8-oFDk#np>JFl38?9'~*U ΈhYnώî94o w3EHLP]g!s13}۩*{Hey^7Z݃kvo1:*hB] [ls1\@I zzHdwck zkx M.w6 bkVoSjomui/m?dUOww~k!0.ߺ-R48An (P/7~ז(E]9{L3\ -ަ.썅;6a- 9eŕ/ַUVRqAxKVpoOՃ.;N@xAS3 @uI!!eD`0>[gLN9zlXi8h,Oop:fށG<#eDu|3_j@BFCz=ڃܶҟǨFk@{1b  &,6' omKXU/NPߕ>PFU U 1;Lz 4q`CZtm5"lgw0o u!ܟɠ,uv&;8PmWhApt=`-s `'"BrmaO]$xeu/cOvIBTN+l."TOy&WMKub ::t>f]vƌ_c9X`-.W?5E V/LTuN-9Ȅ\< kДz V2 m#خnw)BKz~2p^HUoBe#t8Cߟ-LHZGIK?XK}?iHS@{2Ҍ9'] ^gegHfS0RNfiq0+W} ̹#? EX92tKt˴Q۫\fq7*$AiO@a\J >m_9d$5w?4|zˢHܷ)[]^Dj BMG$c(\H-]Y}=3u{e>q'9ٜI}X`]!ӴHn@bE_I]3ON>hmvػ?N[[bLd,ˆ>g6}Xg)/6,ežev&k&Yd̻{Y\dzQh7s@<$4[/$_+Va,jrդH;G|4v$m'_sFqB( vC0~sHM E_\c-&%PK6h˹3Ҩ< nPj6!G|/jEE'k(3RBp]I#WDT V]\ɸjT'7/sZY $ @\IfeW^W֖l}l)$ Ue~V(pk2^`JJ- -hQ /ggYU|syWvtRAED>2e78XR,'(0IhUI#'i_F{ 79ҼWx J6N;Ƶ7#H. ;e]7'8a dž~|.N[QCs?&_8PE6@@O 晭1N0L5b /i# ]T"4  q\LM'xӨHwdz~.2zi[g3+BFnntg{fɑg~* pٖJ׮_DHT4 vtQaQqqϐ'`"Y۪7|JivghFA`3m{IP}&8/ÿ +;e~lAgw+A-> d^ :i=axږFIJ1J(WNۄ.62-~[淉2@x9+`+}4p!@}5oĬggإJ}o,V U"8&S597np@]/T~eH b (#b+yG8t7ϫ䢎1/֢;} ƛtpBϣHV+#,aМ~FZvx,8lHCd{rkwVqASc? Q^ܸ=#WgTw3k`ml|}sDwpKc;|>qX^I҃Uot5c0jc}\ζ1bi 9ܡh9=ߩ|#q("Ƨѡjc;ֹ}yn f@`w-aNU3= T(BWxE}dnlŇ1JkJ^7, J:}!&Dמ` IRL (KQQOEie:wǪwIo̧ٖD"Q)T<!9(CyVY?v' =d/g٣hأc150c `̰Y}w>;VQY꾀`yRE(99!b16kAoGLVd;]ą#Xgĵk} G:r[e2j&5.qJ P%uR^4a6#<0bs[\ 1#W a@+ 2.!tL>F-rrYⰖvG]WR'iW*hAt`q\SyixFhě yуUnoodŸa_v5+']\CWc(KMl:ji!C)j NHu/塀,@Ba<6zEz2ċMya}9Eqi!aPk%7x8ֵBREA>C 4B+MrVl+J5nOc%5i5@qt-dWof黊cX}{Z$3LlDR[!b~9+7ÕNG9>_yi$fhj-%pp 3q$eα!_GS=s;R€KP!6kFUW)eI}bC,SkW3D|XX7>ZgU_=jcjwuc=-/_Co i~ I}S m%DL3([hƏ x/dyؕH^7r;T($AxX7N> rX;1tTqsWP55b Rrz\X?HsK:Wþ{pfzץwxE#wKE ,P^B5O]_2cEMIemڀAyW}0@%ԧ+؊5{4-'*lEjM_. x?L#CtQƋ2 %Ptњ@ u~T{Ux8NpڄIKZ;5QFQaeg~kIX~m)}" yIMOpͤdDviôZo$ܤ]foc3i]Yu`ޥ8q*2x1P0lw Ք~S`&A(laG"B-w+]p| '5ƥRo\Ixs7dɆl gf8k)Q!F)Rm ^]v./pTRE*,,~х9ЄBB!BJB!)JP! JJBR!B!(BP!)BR!(B!)BR!BB!)JR!)J%)J!JB! BP%(B BR! B!(JP%(BJ!BB9rmj@IvR4C j+C\dˬBL% ^p+& Z-,6QG?`YR16qfYQMx)2Y)cٞMaluhĩZaIdvdrf-P%Zl\'XMyo\N>iQqBZP~4x Uyӂ?TMg:u0~rlV WnO9݊-S;n*Ehн¦UU0ؠ#c_G:Gm/@b?M%*FCÕ;@<:m'}8?䉬K^pvs; %4\_Im\!HaX2 OM3[zZ6Dz( {+f@jlF?ܗڝ /QrCȂ'7MuST:~Bƞj1VfRzYc!㜦KĒLooG>or^@m _<(B5'*Q!6]3 A2UI7i@tŅzx;.( ]R$~2W}_1L؎t0.\hafIj)s{7m܈06w2@оk_؜芿}ymg˃|{8gس0 $(rP|~ Z/07ngwuwa4u5x_i0bT+n~(FshZPWᗓ1}A.cɧb>Q*qU~v?c^F]2,Z?Wi`kP%r^n% pbTnT2i'̜ߟ#͠r3|9K>nN}bܓfDz8A P{To"Q2tj##9Fsƥѫ.tƢ_n}:rty 86sh_LWXM UZ)Ѻ^;Աw!;>hۧ]'eb4.JK".AmdgD)?8 6Ý*mwB^KB]J `h :Ll2uYMJ2Ƿ+ίHQh+_ &ZN 3Smp@]i;o7X?FcTxJͣ`558<?rl6ZS[Y+_+fA#ٱ?W!p x `<E?V g6Yw@xn ~ZaѹپCڪ0WLZˮ:v꨷ H4 2 Z}5~#[.v^3pJOKda-p[);tOc@=ډIES y: #\nl!x9.*'H*ȱb(߳ma: 0"tK`X 1L2`T)X嵔v;mJfM{Ω{+5KvGoVd800]vR.7^X"4iʒY߬gjt7e"3U!ɭT5P)}净:gVgiKvh*lۨ&,jO |ğ MA]ϙCn*U4Q-<9ƸNStSOo/gkFGw۰@ͦ&Cbrg _eLj?&M8*Cw]0Pb*Sbr_ʍnwbǑ)~xNz^P`U6gz3a[F`=QOm&4\5Xn;J`=ejPsOIo۽ޤNjSR*1q L X^Ю(5t"(MBINg6r!J\me[,:±~?9wiT:4ˡx. +!mZȡP?\qU~UIkR9HU4U9o_hV׏o槪\լ._?zl?xq40t fkM4!,t[dNlAuu g!HJ=qbdFOG4 <1_EJ;O`Nr:1Ik q%LyJ*&Lpdǂ Qnv2޻ g̫hrM:)-,mh# Wď.cGBsa3 4SW%3ߵoplifr<_0EkpэĀo5:Hvx-!7,(7'p52Lx)X* e BjA@X!%M)u\1uSR--e [`H-9$̂&b~#o~?署a=0|+9{}dV% =CтE*w̏fXp2fO]۝l1-СGO9 3plby hp]澿oCWO_xH9M7 =trtUթH'SZwRTq53HmwP1n!q)eYuۻXhLZD,WyԺX}1$u lB,ck+n L#_DvWG{-U~Sj!{ͷ88Uv$*/?*2`^ݎ!Ws'R3v"б:F aPs '@_'jl˸v 7o&4ԓ5zl4C~,}y7>(ކ*gn΃ IIa_i}8R܍F`s#@ HspEmxYbjE ”+{پ5euco^=(E$ϻL֍ζ3oDB%KYJK.0dbڥT9Q5b_Qa}}7lZ_|b(^ˆN uoAĕ1WdOeyG}ێn** ϱ+&tl_-A޳=TP3_8&?)Ai5^iK.=NZ}hq3BOSWLo1}d;[;\^Yic$Gyᶻ}b: Ec0.9+;4u YElzj dbR?:͘:)n9٧Ɲ&-,q j<璽5ΓGKbeW'Ǖ,Tr61Q\!k&(GWWSwZm C' CҚ?sv-:$y9\wzÍi Z[mU/k]{4Ÿϭ@)2cǽ _qܦr \MՄT #50c*Ґ5=WOCIYm< (;`8W͇zytN:\93j|obfadM(E9Z~ ۅTiK"[. |I]CŌB = 16b2^icX`HJއˎw pF G"Dz5 ˿'kކ~9;>5*N:}i}Dbxt[;ި6&j÷[+8$)M}=|N͙J͈/]S8NPF45,Y[w̑5tx#I:BJB'#ardxH:} K=]a0־ i|+HF;7^v~a1Zr'?OD9)1 А}Vjw){Xk&=>TzR8u:6xC6Knk~!X -'Z8 I\_?Ů: g! mSJ$irБ+)909g*0&E+'XGsJ}u7sk.P-dNo~RPXk6WāY+Yʾm Ra>%mn+cE*YR_]fZN_8aĚzעZM)j6cu>~*\PѢ'0`R_zrBETBjax ctb Xdmy`&~ vh"FtU`t݀S.H#Xbz%YՑ)1JUqb$G/7?&RĂL5Fn_/$1qgy*khdEлGo dhFIyYa70y|BmmeWpo A0W 2<'CB:(nsH8}LOKݐ2/?:wR!]OR=r&j>R3F\TT!{KQ+낋z{38!xs^_EtiM20Xmzt}maJ0p{߱"60QL̵F-=4Rd3jV7=k4F4 ^$)-2` Zw0&xcz2.I$.o\}Lmm&k Y8Cn؆SccCTXɦU˘"i=(}1ࠆ0樱!! O/ e[Dv]hb^N5eO7%bWQ&i@=S ?50Z _;RFM( t|9X-X޹H;\?=0m "W@劘lp P25gQ3CӔ%YOAKPzf֦S= ek=)1!yu*eHqyMBPl)T?mx9;*9} ڈwf*-0V|^,ZLG7m\2g}^x9VVG磄O?FP`օ2?+\+ÎiP8IN*Vf7t c`dQZZ?ۮT$׷tǵddw_P~sҋ]6?k̓>8>p\A^|6%JȱaC&m{41p0Pp Ń:N%ARtbH!=1b|o fȳ>tZ!l6~@=ǰHvBQ1}~{?+Φ=j_͗/6x.ʠʐaԃ򨡕y!`86j[=]5mBm//\VUIZm͹92uT ?A&-31?]n.4c*s 8Xa4j#S2ՑZ'-9g3gHJop-AY> l8Qp޵}h`}H[DMR=K]/Q8}Jd~~ ]> KGZQK;OvI/p;zYT>̭/e<-ߧgNH]y44R5dqtHț%GhS`tb % afg)X6xbgcb)ݶf%mz%J"a91s5zCuؙcpwDQt6ti38%24}Yg+R}sӉÿNQf#3 m:Wld52g .kQ~΍ln=,H#SGTRF)0+d,~`Ó?-h`fE@a^?kD_56d _h7F}MJ&?,5Q2VW*Ic[ij&hQ*K_7}3)~ًe8iq1y8-NsM(x.g +r[G N!1FLQi9\H0+ ~lS[ uzC7w{e}j{eO6a`a)d:{顈FԎN'>$SDTYk?K FҢR8|@΂g en19%ecL@~eRilY 'A M9~aQ{S2 `Fy*µH<og~{ ONo ~E˚W3 MhQ~_u\`UВ֫c4Cr5-`*Q3LbL& !Ct=kuXRؽV _Eڠ+}~V mG}:VV.`S9ղ2z:x,q:&0a,Y:F_ <[[:QCb` :3f(s٤>jcSEML72"@`K0J|pHFFy'POCڨ}ymG7:Wojcff|jn{q3H%aϡFKV`ڜ IfO?}7 E008rOւ,J|rB7 u/bVkk<ۇqģ}Vljw-yJq立\8 ݠL)dLi6/I 6hj>4-=BK'VI?.qYsb%vJXT}>Ii# Daq*@ ߤՊƉH6~3EWO#>c ̀4g fjIbS)#ac?҂ȡ:$%k$>mf+ieqNKz(4FRfm%8vka-v *Wni@|i< AP'!zWdKӋrq`w|a~,/pጄ>ib g>Fďi)0O!m-)bpi;[<Ŝw!"e} gTN(HimQm8~xhл`Pϣ?5:β5U 9H;4rn%%)g!}9JZqh쉑@MI(o4n.n&6ԕ,!v.EK#ߧFD%Ȋ8? a!m:>x6m,6 j} i y儦ǒ)yӌ\IϢ#x~z<ڢž<~o#A8Z榇"[*}bղoml"zcsF.ʼnrlU90 ?PɾSO}XڏrϸB^10 l%.Cj՜9`hTAْ0/ćgm~ݧZ Dl?ٿÛSG60P m%(g(խ [:^u\usL4XhIӋZֽt]Gս^iF+jR>v^d1!UHk?j m x]r?rdfHV ]:pa迱F`<<plaT)z+fzi{c~,o-2+sĠt/=^nON_]L\PO aTAYO Û&},w{I,TI/DIC$d6KX;F06[,rĀ_a$/+}wDxA "`Լd{@8u_dפ?"\qlik?n:kG[Djww#CJYW{TeA 87+mzwORqòGu LZx馤I0o}DE,H3S orz+dV(N2rTm!~$]b^YEojZaN ,I#"#{x瀫F/Ww [ZEVlfw@U3۲gЙ4Dޯoaȴyf'PyA pA0?)9j?r~GIm95P+1pl#NqmM#fb3o(N)}e Y-3Nng~}-&ݠ>&C )hp$xַ[+5e{+ĘS8QտvMJ-N~VʩR,{ЭI0/FJR;8܌ Y lvJcTL U: TxA1 qO ^w8N7qw~ >#kj raDw;ڶ 6l7ohJ$}b\D+Ϸa{q1P=mtWB7eX9δpzokR)$rn*ږTJ]=U2أ˒g{Iσu`X,#iZ~K@6$(s$rѨP&9U6pd~S?{Zڸg뙓nԁp@+x2IjD 2&1fzI.VOtQ&&KU_ye|} <}k EϽ }+֯kF"3DY';L(^MQ'b` 0AFNK ~s/^ `Eh6>K,ˁC 'KV>]&_psۋӐ*L{MN\,9mmLc4fs⸖Uc@c{ޢVw*?yǥuWST!D)`8_oZ+CL})GZlt3^ spcao?GԮQWlqdF2,7<\FZp,? ]?ʉFNZQێ*tj^]_}o[~"=7{BQKE5\1|kS5l/"V9D-ΆM>Nj2ww.Dn~a}i,% o@͕woqˤU|)J%Gtî7H %ѡJ/w+>ojQ>Z˧#.ގ:CsC H]:6=²P_`PKi&WUJ#VLÇ+;KH/fBxkd& uE8I(P,zI BAx uW7&Zb%Cs~ڇ#12?C h.T"\y7 ƾR}&ap#it=TZlLs#[gy}Сu/%ˉD7 sT*W]^ErVr%Q:)CV]xWŌۣ8r*:wNɱIQ4S֢No%/ ϖ-RDЧ̇[+5ʒ>%mHeX yQR?|Q/)ѠUz#/D//m!~]W&1hsv=!F%RaKO؛lE3o@wqRyŻ%5[S>ug'{$\2^V/;|NS:18%$ܦP~hsXsyvAf|L/22V]Ja-|-Fh)V>qɷ\o; JSBD@72kIKM+(7H(_H% ^ZYG|Ǡ4ޮk׎=@ $7;\a C1^*f0lg+; Xܑ\^ 7CĽcv Ҵ-wжX< LG="[N6U ;fnRUbW=?۟BMk4S|,Iǩ,|y'ݲi{EMr7exyg*5z=e-Fk7%y`((k1큇2q;xJB<]JN~}0YH+2'S kL'KUwj2jǫSdo+^X%8SyM4Oyo grG6{:/a<ד Hxw`'yuTNoR>, v1ϻ8ZTF<Řu:1o$|=e׏KFzx^.fcEߟK<} t1QH(*| XGsjv >X7<.3(?U X5w[P3x~Q#ReAzc]d\y- E^BgGyl͚43"^In*ߟ Z*UN}@PRzjxSoaȘ_˚>bѠi<5L:Tra9vCP'6D\tUK`_zv׊:V$ &uAVY#ci2|-#/FQ9&_?o:7dV\LӞգ`K Lyp;Kx(| Ԥ+[Ue*d+31Nw?D,% U1_16$c|(uʀƆ/cQzYJ=)Sra l!]b

G|†#c]^iӘ L@=^wk*u,ҏX!dCZ5)Ӳ(gT=㎵Hop*#O/&,0?qæ8AqdNHܰK ?D6h=a\o_&gU\ %,6w<<-li:j^^~RNJ"gg73#܆]'SҪWPR|}zW~~T۳a\?矀nΈ]֕JQXSY/*F tKQqouSZ8T Kž8,W93LL4> tݟUsT}KRǒ_6Opm%$ͱ?[N4vG %gWZfD҃˭sl:֫U]O8l׷XYl^kǏ+7'[6hRIGp;媅At($DOΜ9(.>sCM^_KᛙQcã^'5Z Ǧ?ʲwڧ_#sk6ڬ\a,I(ƙ2 '{SoSp/n0~wg2˵>1?=Z^L%W eUlI+LfP6󇧻fIwm 5P!ʋ̒xO us]hj`! :SO a|T jf^Ng/V0 oo9S๵֦ 6Ov—&Dz>ahX/jUse}hw9ڷubt)p@ DpAҏ>4 kk1 +6 m˻`꒫ gώl "h}=z39Z;1 riiӘ>J=E:MWgߥg~'wuQWMAR5c>-v,XJ-dLAeVmQ}hsב`bn'{~b3N/=;j<}Q~1֡sx p:,p,grSq(S%bBc]2&a1b{ QMi> .p6ϵ\C|&H%c-ѼTbd\pDۍ}[p(:~7%1c`}E{U)/]5jI:ǖ2?-V/l(< %&~n?LVw]w2eо0KN1oỉ.K9~ZԽCl,.qgx484TK8~*/"ߗ0>+Gmϸ=LmjVߓ5 sfkm8KNS7и=JEz|6z)yC@q1=td\oWldEJHmDT֢Q%I"uW1PXeJ*o[n 90@7t,Xq-P>f~*lJ/NKA)[ս W^Y~ş037m(Yx 38OB=Ȧ}rZv?_*xr!ȝkskwvD JgE7=,smҥT',g֭-B Q5i>`#!}rf~0k{#-LY`9/`bweoJ#`0g7}Qk~DkbiOm2X>2i&oh9 CEm~xϘE: Gmξ"ߵC6!0Չ\Fk49˲u{ƦE}˘/.lhۊ^'[HsB1kz=c16 t9:ZC홲y\fɇ+dk:I_ PjF.eRoF7u_":r@1” 8xLX1a?;9Nͱr^ N.)^0ub;آ\qR}]q**bs5lV(Bt*ϫH H/qq6Bz @xkH&r Dm֠EuWY*TRG)<+,tgA4nA-ʮt̞Aړg7zAZϛ?Pj2EgKnX3M 0U1μ^yx;(&&E[AޤN M1Rs*~L?DSw wFr] oqr-TDh; z2i!Lʢ_4Bh<bo]aBd`: dq?jH5b$†==%4RϙI[GgՄiͻbXB!y>"U wT~8)UyU]S`+MqԾEȀ~ƸLCSR?Saā3rCA1mu'y/I6}&҆mIQ}68a׍ (e6h%`mG5]vuMM%G9#v0 gF?K=AJDx0N fŨaGTF]}{wvOI:rY+?1Fߛ= L-30s ؃tSm}/Mo6$Ԟ*>2ڞRr@׬i N;@ 8lf!$-kŞQ>N?q/HUU+`=r9Ϭ_EE %.Ȉ,L{nlQ<61T>ZBH~)u5kBv\] >tW01н{1ӹܝ|v5A?RX\T{P=]Vqlc;੍y4JDpcz\ÔXpf+'w٥]jt棙u >Ϭ5.-i-R.Gis(YcS~yo`M9oˮAhhwL9huOIpBo]%;WْHE*ϣ޼{J'` Νf+~6I 4ɭw2XyYLWxߊܭ Cּ(KZL/uyO/ n[v iYlĉWq11. ΨO4[)VA0]ǎk@mMa?AR/jrjA^G!yuX<[# 0-18`4gvu8-uɘyi8u1%= O)ƾNj c3;X_ʼnf!$AN:ZW1[([θJV[X̰6-4n۾R^ud"1R~´49Gfc cF m{- <]WSBuA03fm胷/(N wA81-鏙'! IH7vʷ6z]Pc?IDm#:LO%I]XuVzkuCs0tFxbejiw砜Z!] ~)pa0qE%lSrQ1@ C ]syIJ Z㯢n\J.]bgC5ST0^Ku_ۘ| :ZrBUק~ BAz엖I7X9-| pdEyZJmu84.6d2رh\ovoyKU3żAz&Lr&?ZQu n3u_Xi$s;@6ty/ULe#ZokPzOn'CY ?t,3!M7կ̇n&/ҿ~8!ټ&5|L[oerm#|L\ Ntǧ_f)Owq3AS~H<1d> cJo`'ThݺV.U~voJm{SvA4@Z[/nd\()S ޮQkxlA|ѷVrϓ|6961P󽋃.*OTiady4].ޑ9;L ds q]GJt7I[cF0L6>$I. 6}hj濊,rz3J@lr-ߥ'i 'O򜢈v绲Ze8IƘ8/rY0'?$]Qb<ӑ(v`AbmU`is9d!3K uN<”Kc/gEkkT@ďoAL>/@}_vPaMreB-!{پ.uK*8(0LWsGb]!>t6+8,KKfok {DvvOGZSO?<6c&w8 QW.tUpqCDB\OtK./sM .jgʃ/1BX Y&+d+ gׁ]$s3įHo~8)? a.cĿڲɄoQsRFu,hNG .)_hAw^Csc4JNHOk&n&ז! z܎ڙ/T–\yGWuS U睓BkgWmF-wq~KEŴ~X4d@7q;GɎT/KہZ( y81`$SH!+?ٝNI,polpݎpvӓ~7\'LĭPo pl3?>N5yÆatC9ɂkQ+ u?@ #@.z'v(S׎Oñܼ"}!4ۭiv?XAJeK+nJA:s(vreӒ1#jbFo\n&_, f[F˴*J޵8 ;[|lOJ]ա5; BZdQ&O\3M]9=0k%̑ym:6#4ʿNJgӾKw6ɅH;%4 h<8 ?6@FT&_{pL欷ǰRP*4PRXLi5O=EY37]j܄r1 :|{궐[~=˹0z | o@>UH$R%vWIx<-Ɯ;~5P lTSw!f% 9ٷZU $nDL$*/mznjdJSތlB&vv7WAs;.S=!X B#[1<:ոbY_zPŐjm^Wo~(3Z`qժ\=?`K^hw+327tiw|$G#×Aq\<'r?+.+N+XpW '_օ +5& L-Gw',F=9=יL[/rxӒP*Nf3 E_9>̓ OFwv؁Z^66jzZ/ RnL1{ !P_{<D)+!f"Hn5W_Vi!nguxxNd_3ɻ`Ɂ1a~vÀj3wC1_s{?VF75ffʢ7OK;rzn !ሱmGlǵM%`D *Ɣ#QDŽ8ɀǦG9gsCd-R9 A G^{sjAM̋>1 9+Z\Ěn"7z7 ~1wfNeVko//kbۡ9 N١{?)Bcw>wY~ni@5 #|܄! F)Ԥ¿7uqwୂ{0) 8n.vگ`@#AE gQDyD骏H06ףg"VNLJD(`n9"/h8%A?>xH4͚W9D\s M7¦i~hg2'I7cm?/j:M-̏ǭ&Zh$dU(iim3>!wc{U(12ͪp-G:(OK پij%uݿ0\Jάѯ Q jQYy_mSEs4-46'|E%dK!jPt Bs:͠t/qZdu 8 ,2z5zotyޮb40VQn$Yc^({{n3oؒu4#g6YMsz\uc/&ܮW{9w(>!|f+ vf0wE~XG?AL3㜛>=?!593PTS?2pAHT,Ռ_h\Aב ei2yTs*1ʈeC2PLS)Yxe;2NLSZX֬?r\UUC*Hʣ&xVH]3G-XBٓ#&$)1/絆Gb(?&ls9 gN3y!B2f.57~-LFuH@&Ntc['^S:CS8θdR=eȌ(˜_a/O (`ΘiuXb;֫6\ɟz/1v0a ;! [vr)4S@٧N 7ʑP 0I+}'HwSHu7NEIO"Z1482aFn[]@r eЇ'$0ņF*yćD䎁q{ g6^4kLRs_ph]s t/Jnm, . PAX8~h{^Ahs̀33DʢUCIY#\NIk}JqY!}wP]@]p ;³MEҙ˺w-|݆13*vZy\yg)<{\K0 Cm-"_)&Ԗw&sbL Ј./ԝ~ٝqr*xpߩg6Wy+541z\׃X>g$[ѥ.akʚ]悍3ՎQ/@wi#{@o*.!@ߓ!f0FdTw+9z.!QbcB ?ُ#!K'M tYx!)l!qTZx T`^1zm,#HUTIqQ!4#Dl4{=0342 40$*JiT]Y !2hIxnujގյ &h~r,Ma7t!5ٯ/["B$3Bηٙ;,Pdž:Fog-]kӧ1]q 0J_#?t> t $g:)!,dwai;m7PàG"&N KݛB$$fT±};=v+"d!iUWa5Y;A莠bMTx|Ӽ=;ffzV66&p:uo4_K1U̠5943G5P!mĎQD}i̫?(d/\,۴u"3)6bpAyA\lQa{N7\Q=.cǪ30RML{璵 /y UT- [ d:WNo !*AD50-ECtsf{*.gQXC|3xHqQup'D~w+RFa_cvXE8!!=$3mv#>%Nq7\_W?Imru~eo2P7ٶx4_ŽrHPe9@cڏ@P*%Gnw@W_  B>L>} }oCOFc E ĺ9!i0͜<5[`5lnswBΎyyC=T-RV֛)?, Nstc^=im_&̈d/rŸiº"UXbBN?4?-QɴɈo@P"|YTDPp{$ \::`A *:x1IA'2a X0}  (w.N‡OtA*yP9u|3/3?OCteLÑv?q?.jMx[#(XL#a;p+g'T+0Uٟ['X3]fxqpaEjeO[հqJY'ԷĬܰ@EaM'@xa "=οa,;hZ, fɇQΌ,<3mҝW/C'ASۦuR4pmu_*BSy<H5Lx[;Dl;H)w7x"tmvXsWHJ߆Mc[B4tRjjjb`W=ǻg!.H]۝u6hh&ݝ{g#SaRDɛz_G2mm,:vΣdq յPh~9R'Qǩ6׃˂ij < &~oabjM&aP}v_] L✪|eJ4g^CӶL8EAZ#YMպq#rq1݇" ֢YJkO-؀?D9SMt9g7?E =Gb aȉA, S'H!p {u6+yp$Zc&}Jt'fA>9,J$P8TV)QGl@^끗?cc~j ƭPA6@sAgMC%RɧVA/Uudcꯛu"R` ǕҒV,A/F'48覆 9ɛJu'zբ?u\q(_r~_ϑ[;Q~ rТ Tʿh˿fZӻ +yExl*fr5Tt֝^Fو"F+QXL5FT  o,4ruX{ݓ2;"72M0#n_> >/}A3}ͤF~ZG+MP6@D211 &NxǾs]ja"4/8$z_ISY~ Y;/{5)ҷY#+mWBI ]%A*#E_ Eg>pD+%\(CtMkUIz–9JSbˮDrv8<]e/ M:nrceQĢS&YUdӾP%QwN7qr H_S_`HKݻ-T)Qcؽv 7g۷(}Y:2zlĬTѩLX^EWݥqh& >t?狼pw @cϿglCZu5<M+4*,8*{[{xU+2Sjg5Βe&#Htڝ5͕UYĶt(2˙P6akwÚ>Iv]:dͦhz^o@wIFYKspl~2OȰDΖ</7HN鸘JUxoBM2+{`DEfhB,=vz_շG_mA19pd7=T)k ^??}piDa_NmuKr͹d_pLO pl,o>K*IGEqq,b6`Â;լY><!3fmеՓE)3?^W JT_O @={C"vMw qH W@\MPAŠ0J(R!&ɋ>Kr҂Wc1\V77-ش+!S5>JߖGsq6wMmP>vDڝ^Xzma\qĥ.Ֆ(nOUgl8;/"mVJihL!0O6Wڦ9Jq !cjn{v=1&/aͽ?$f;Ed/2|sgh0!->K^4]?@NqkU`qo8ëx=Ŋ7_eBQXh@7׹̕f{c[,ðy@ذ'&#QeikbeF *cT&?$AVz& KǴHc#^Wt]-ή5r/蔩'/0|inNg! ngi, )\E*!!#>@ZIE5rcߜ^i-@QK$n^{q~5ַCߕu&7y%Іh%b2G#J8.%ή]/`Sb}oI}L(=~@ Yf!a#,D?|7absB چT\Swq_FsZ*FcXIɀX)&G+ۢH [;idl/T vCkd,?NJd'Ҡ:%}O8h)9 S  䋢JA(ATٞf0h| [Oݭ!%lV{NQ9Q;Q'NŇr4OyGw)!ʡ$̤7Bn/<O|+! ޘcb[fr*;yŃs}tkQ y@0ގ'[ޏHҲ0(J aF|VtkV!>;-3Ug4d\1kWAo4܉,h{N1C~7fMg[0Nsp;amRhP2Lyސ5˧bRD *iO=c题Zx/f@H> ,Xڕ7+1QrLX FO8 jRENf颤8i48 Mg5ib$c7" [QL s>JC 4x\[OlM*lALuN } =Og[--:Qg* _9ӂm j`)) \_x̺y:ǔ sD>y!ag'>̊|`my@j7 k^%C? L0ϋ'U4hKŮ9a}@;m={}7_N:i%D]Ԑ]xpTGMvu-)*p˯9iyW\a ض(^^ޚINBvb+:DMoLKҽ\2O!5xg^44YeEm.8>(Tu}flь6CY:(&֞z.  Bd$GqĈONor=怔.ފg'GßZO nx=Vxfi",\/y]Sz2!TθC7ϾoKu{~} Nvpg{m5Jc9o^VɒLN*cjȜjH u%}q" vkv['SC`%pٌ{,dh6 L ÷@7i( k͐r䘴!`GR՗~*^1SB]zd FaP݊8 fAq.=PuoyCk1]+-҅`xl:( x 1s4/薤\8kZAQq8DKHkvtd&  ~ԭJ t>~=P5Gp~x%:EBJ.ayXa'R:4H.f-=r+mE W9?Ge 6+'o \6XmZ55=96 4$^ޚImz3'?_A/:t1_B1>;L?8 '7xOYV.Z*̪ {?)1b'b')ŗ*/a*~ۺVR_vF>O ROY =ԗ[+bͩ(@C\VXK' ׸ Nt_ ˊP싂1X(Ӗ{﨟/ }?A͹Y h}#le߇a؎)5&Ƒ]F>D@<H~>W p;GtjZۈ F.8A\Lq ҇坎rKAFgv{ce`*% 9m:ɤ3vM@~ QPXE~*]92?Xua8b"=n ;''ʓ`PC)"CM|ʠl n,5O+y꟏0<^_i+D"p]|xRgI٪U4ۋ?'h9iDnM7`C1}?'q=u^oƸ'&sZ om9׼Oif  $OBnү6M| 6z%DDM\{M=7OM^}U{L`)#B#@ΚMx[hR_ou/c#tД7s-q$pabZR(~פ{sXǬ=x]?7/ġIN YqCsOh~ϕ3C~hhE0%dc㺣7 &q/+:ޘh6߂0(h q5,\uzƊotI[] MDWӪN0QMrr 충z+) \}Vϼ!; 啯MZx #sl̓g޻x6&qE.ĩɘ?hzqd,ǘ4csXÝ>=+t/U8"旚ßsa=WٲЩ [t{U>± X"[Ӳ#7"R5Ecu5c)#ε_r/pDΉMmfva g}0hi$Z}]az oOĥw@=-;˷Q ''-e Kajbʺ?gf2 0e!q~{f+Ȇu&/H oFjҖ6>dY.;a)r?<><&hpHHw"GvSs+gz4= ?߹4vDg /ծEOdh{`xN)Ҷ\H>avC翸j9LR"R(~R_w5DޡR9LQгbDrgCp0lC~ ]̞ў#AY9]_F{u76H6ٻ&Mb죒iw'ht)bwIfi٫3lTlT= [~[[F SQ{…sM=MzH [YǴ,4Ed~hCpnX[xc:W3X`p`_ Z􂮗΂`f +ߒU$`5fkɍg}#^B> $`Uo[{ϑR1҄qf2Ce)o\=97wm0޵ ECiSebZ PCY>{EE -[7)3JYkqOk?Uޛ,޶䈮Co笛oOR5Dw i0)caOJ|Qߊ@ET91jZӂ rJlEQR[81@c%^qHewaB4HBvA.cͫlJpAvF k8ow37%h }7Eְg)8.߸B~M\Ptwyl .ÓF&e(>DFi\zeqTH4̱<.a=?o$9lW(sPti 7b^n࿺V M8qz:ϗn룢T#^<8?/:l t_VɯDfQx5<[z7L6O&١x7>_ .'NȟiW܃^Nni4چ<^hHk9tK|{9 61z2q+H3ufOQZ}&SBXx7XHU~WGVy%O\赬NOܽ12[t?0W]MAh!h5qU/K}P>@@׽=%QO< }msT2`w}67o@,*Rh"K@,˼pYᘓPz<}7db3|3@/=YUů?W܍A5e@0`tWZS3[1>B.Lorr>DtXsnj3Ԉ l,(N\X= KR4O "+:X5XF+9;G*+<"[x4^ cq >g,Ǭ6WZIܠn׵w|nH,bx_|?ҏ)8JR6e=r8k$J3O|y(}4LU:uh#-S- BYuEQ!Xߊ&P-#x EH٢s1}D1-a*R_=jǶ~iPùef5aJ-r^O̸iRrTosIdFTy;3FZ>{`'nj9n7l҂sp楣gWZطW W-;0KHyD Mmj9u6QG@ \YSBO8QF3k#Q/ x纾&ꄢ06 |?{xTt :RtBԪ;,;?69UVROwԃ=7YwUV:tUm\%fjͷ.VbY5jHF%t7'Uy i'no: ;|ZSʤxɳE#}4:-Q W-qy̓]GBtxS}K,ܬX_XƦVd!s_ZH^:Ia6wŠj?4lr.D9&wニ׺c+>g>uWObdI Y!讓U1d7Nb4}J|-bYxzܤmx$5&=:1}=q > ,Sǝfp,NvܙlkVM`bH2f虻؏} '˸7.v-R A!ets( |=2^rsf't޿\?b{û2`|h .~D,g}$#p-,w%UHa^d棶 8g5,jv^W}Z633՟*^˪wH}u60[גl ,'W tx|$`a{ZZWx s%6b!mBDc "XK #U$ӹR`ʑ" cWka€0¾Z򛒥l1?G(ZbflZl-3aZʞR緑Ҥ1a_W~q$79|@0ek8,qIɱF#C2 :l Tp|qy "M!쮨1t=CtT;$cv4uRBx9@.-IX7VLwawƉ[{4x~4[U㳆4X~6ɦi97gON6YJ=cHi bD#_{{M-FRكq>C;dM<'tCĄ_A;3Ɣ h'ғ%?.Dωwfz Ows`2b]]2CKӌjtxz4Q>Ci2/6Z;'2npodը(Zx4&m)|P!/F&#ƢlQD¯KYt?mo.o AC^7sXvP_e) Y;Ѽ$YMWF'k|E3`.S66H='< k{W`c# -̘w5s9V247jуF\ ~`0@"v;to'`۪Ċ"m%i+9MVMEU6 уi?>ƙ~8>(%!CYjy92[rXI 滝aVs86s:Do-zU&WO9V$7HU_ r\ՃP`K_c?VHߨV)v&e,vh×'_ 9yA3Xpqo[>hQ뼜4 L~_)y3x)VFߓQ'H6򻅻PDIsb83Tп\8-(GnegNQn'F&<Vc>vJ\2bewux3?Iqb}&}V3YDS&7ۿII{؉"BQ=iR9(:y^V%&:D|.׭ bͫ>W~rv8 ’+WF_aqژޫ}烋4t`8&> ´M(SͬxΖWʳ0k rGoT B Ĺ`5_).wH?[\qjF^v(y݀r:1кAܸGf֞ecde#is&v~쨦wf7Ҁc;Y%)E9TÔۣTqoZlZJ:Qm򡢞j(~Iq&m[Ѣ['بU+qB! 64[op) THT~3@y1 ? G}0Xh{ҧ( |.p;bш7S^VH9_!LWzzc9<L &bJXC!L`HbEf+!4Nj@"ʶ<ѩ+3bW۳{J$Z -;ݿa7?sD Ub"1v *j+8ZXy_~FEVWPR0/ m_6lҷݘ?Oɿ }3vxkMJ9/EB D\@u!#X)J(=V\H<}d9w)|".<Q*z\O8=FN{m۝q^z#Ví~iXյx<8t#`zys#6W!2,63c[YI"NsϿAѻϟS y뻩Lͣt+_2 `l#u=u޵ٟ (S.# #A[&ڬpSbSϺrR|0ci䄁4L\vlVb`)I r{D *fGJI ƹ{ Ynl0`x?Jf Y4_y滸67_5=ӧB ⫻1]NrR//KֶI]G/:D׹"W_~@E8{Mw|`lqPg.zzȰԒځ}LvlԼx;|=v6<2PJ+|?>! DƱ87EnulhK|ڣWb;\ԓ֑jDHkѺv<4@|JiH#^<Ʃh z}kjO7 #@\v لGRQw %@81Z]5CDР-LFs_0W$$oxmנ#TdUd|2 qj>^]=tt gO@P(~=<>on]³aY 7b8ʤr4 e-aƦq6C& &PT߅%Rke'Abq[z.3$6#MZ .+IJoY7z9wUmnR&͉.ZWi g6Xmpkt@+yV: »_ߚ]s[YcکF2 *T*QKdzd/}".t|G #v(O{_+QmfęǮKlft6mw LXI`G.3]_\)1.|SJ S1՟`+eLLy ): EqȣP/ nvob\iMNO(|=Ubz Hz>F;F[ԅh Ol a $t-{:=|'X{#tU3p{c[fT+i7Dp'1M؎)#^y4Ogv_nV2}^_z4Nǰs'Ym 0h} H_<NY4'U~) yn_{?$gX )ed w91V |OPi]Tb܂&2+'r"Zod@ح^mn^xSikRQUCN&_jUּ%|rZ֪$Ns+S+-xz}23* @aOv"ϫf1;7z/Y9wlq?2G$'vو*UK'c=HaCh[gtwgt{ӼS5iB;r kZ <X/ (*[j.\;!s7Rkao~s'tS/pƁ2^*Ɲepҭ4X_SN w+niZ]aeӛ<Ot翠YbuE{37ԭ&X|erxrJ]WdoE2j_(25LwC Y@!D+}㶟FSzxrw9ƾA-ވN 6P8ťH5>LF`7Hߣ^ythI%f_vw ԇ%K7gO!ڍ/88\ ~_^&lkvS6p5b_~1ftW뵞\}%RѨ+LaOwN"^!ΎOo--_J-w6T+{c_gO xL}g!&Kᐒ >c'NLb"P/cd?3+#b@0{l4C08|T 6~hzNJvɰc&dC/nl;pox0zDT[IEJ|OfA{];41k*qŰ>oV#(AQPSWt!'pP`jdh\:#Q3?7 fLx /xӅo{CRC%yPM VMrZnOH.C3]۵6z:x^e p5 & 4&` #'V]v[]6Uuߣ]p!&ɕ yh 8B3MSBNnG싹)w.ؒ)Ip%[諳8xJl=jG@wcY|2*) ܯ-xU :4U F'u>ELߋ:G@nHnCz{=Up*FMBh$ L=?3 WU$Q^}HQ92=״HGkĞ&^"Q.67)t#RsmR']i%%uͼfՓ#oW.Do ~{w hU\G3Uo 5T$3O1(>Uk󾢢W%܎7br `WSTT^F:%_ HJ#[4b5pq"gZyj@XOUpީpN :/`gE{"vNQ,/U oGN=ݤ+X9,tj@Ce7HM~w7MkqmD$^ {6O|M"#LՕ8I[\^D*Q/"(I(sWּݡUbC䑅jw;e>}Ӹ7A4.a<.?q0G@c_'"$)roB!]hf"LlyQHS}(;@ͪC@8;63 Z7;ZP h16 'GD'N?c'Cn3EoAuO yXCԏ?m86Lbw ibx*CVqYMHZ?DS%l^Y4bx;FJ&st3|ڃCLf*D|oiu޳d" tB g*Qy{M_g7y7&? me jKyy. |G˨O=@r?ǜT8L>u~澫٪ V mc #^۝zzz:od++4&~"`%?K APX}$4 $Vxt,jy3Uӣ5%g'Ao5 d/CG .$%'d;dt.)M "$\sBH)B`iik -C"S/ڇ|<##ΩW{kUz.\'P!GP;{VTPX3ʞXDgJ+ߡ $س6%2|M3J}7 GPif%^=ɏ :^{.I6n8<|ފĤYvQNT3Exmĵ?)X$``W0h&@cvVK6);#~-e6-&-N ,{n />J{9Xkϩ'5U$giT/exfG5Bka%ƓƮPd#ʥ{#n^`.8vkKl+lY~| qe@OX}L<8 ,h/V0Yx9 L^ᦏL0o9>j5rS7&lߌ@xs>AY-Z,Fq7rVιR,4xr8kQS%o7_d 1uPJK+q&wqI ?S8y?Wy~΍oCbxΩ>9/`{keQ_O4Pxp;72+ꌯ4ҩDžU_RC ` Fa+?peD?Ϟq" Q!sBǏ-WmI䛵WWOw|93i# p{ܿb,DQTS c7RCmaإ߸%ڮH\ |#@ZEܯ> R& -3i Lb* rh{c .q6S9Mh=Ktӫ1GU`rDx%4xj^`B-[\t> M 5OBpڪ9 (4(djMoϥCy؇otn!6b|FHOsR&}̸ޓ 1ߖi37,n6Ƞf¦9b'Oq|;*.wU>j^bOM]Nɵ@1ٺDdwL)V8~'^,%X~cPb062~G;uE#x>L[k%h*F5uT8$]WDmJC<:g,9p>I( ް 饂 y O3i ܻ3EX˚̥GO֏&8~k~Di0m gMGrEN=|PNw0pC":ʋՃ`[8%8[?qÆv] ءk C /=hpj|㸤]G`x?yн~sǪ'Si5e7ٻ7++gszpd`|4=3cJ 4QDVtPӿiז+*jj+wz{ff8uA3km8RK9WmB,p@^xMx%M[#: Pu/]83x?46cHrba=hszF5˶nU0ۼn%7y 1:6S?d`.xAycds7bh;g*Kct˜_\p߹[z2ƘoUD55fL`.j<ɤ/,lUU\5fpFAN0& ,uO*w*rwm] = C0zʹm$w}Yn/#&+fkᎳ)ydv _7 R(D`V/¿p&v {l_&yW N &QN570Q1-)tŗiKNcM6!-5JTQb#B {{bay!q]=]ӈIuJמV8gv.eqR!Q؄<ݾԷ&]LmҮ xA _ H_L_Xl#|C-.'M':o] Z{#%Ғf xV假Cќ7VM ~h5{W~͓ͱø5 i1ZSGP __IҦ#7",~/m)>߁&yçla_ih6yŝ{[jnGm/DRMHCԄ<$/DU/c}OJ#L=dYs0:SD1I?c4Î)R{{|u]\Tio׌V 4$õS.^4b:l9`Gt=[AXӴB:}_ 7o8 9CObk?=WK:R|#]ܡ\ VH93HA`l0SW絊o)Bg\Ϗϝ7Q_Jieao0?mm/(Ո\)(DTQZ ʅpb6"4nn1?G#R${:@ xN!rqw'qWק{FETRJ*Y*,cT9sBJ!(BBBR!)JP BB!(J!(J!(B!JR!J!)BP!BB!(JR!(J!)JRJ(B!)JR!)BPB!(JR!J! BP BR!(BB9s!b\{ bXP\7_&RMme<60<{B~)O-;?*$TGwnz<O I|A XuUMΧSrpݳ#,q3ǚ%5ʪzϢC*e qr6r)7N=H7֜XB;/*q$%FTWv+;} 4&VUP5Ȫa=2N\'WZɒ@?Ɲ2EYmX7c֞-oW8{R_oEK>b0/LJnCrI8Nu~ #OX?A7.\ȝ=ΰF-o&N&8 iy? oVy O <:ǖtAAx@Ыgڂ$tl=gaI>>kk1no9ccA%B{&*­B] }A[} vg#g[x..ꟿL7ӮhQ=dT=a`nӤ~NtɿhZG10 }<~s͇EqE=@Q69EyAAVChF GACܫy[`~2V3J3I={t7hA@XӏFGlN&4Oز- MꈷZVOh&0xP(H!kwn-v]'}<p8;bʹr\_>?>/#?:Ƣ\&E^Bn4z+2xI?u+M <2?Q/s ׍ezu~pRopp?ZA*<8ro)pޥQ|mB$—ej8N=]$ jMN%d" CTa;|譈bYf`z=Q;#eђ> "P4 L5q(EFLDm248&N m(i7GAnvBh,crtLHblFȻ7I {AGtZ&x NjK*T'ʯ卢rCkOkZlۜMeepGuR&9B$GT/Z{{5J p ʍ1-f)]:ЊV0hP`F L(J3iÜm-  l| 'T\O&wS mJ{I4:B1"'=+r'j(9X O/lXΌBż?oVlݛfA@J֮Np{IGfӛ )$-Y#hCTW{t4Tas&StY J:`N'fӕP!C2knXt"U c^9^ Dd:aӏ@ۓ3͞?W-ZeaY+8 V%f}z,h顶V s 5>n`#4^)ǰ)Yy裺?fnދ(Clsc̑ޖ`^gn93d?Φ$gZ$qȇ%V>wyLtZ*q4V[vx 7[S?zV[-cas.po%oG߀.=.\44f6&>3;71q~dS{)6#eU"wA1ɏGwHKdG(θbtGءj7)\"/F%vAѮM}3:vtYmnfs1bIz׼YHTkuE>; Նоcc_(YaKCԳ=yH4cS ko$81<.O+2ƒPSl]erU_>\ M _^h- 1 f_Ko:qy͒ '9HA?rqu頻qEyy: .,3a>¼ Wk̤AMdt(3ap ݚxW CWqi/¹IlZd' Sk]o*|ZѢą6`Y-R;ʻ훓KohNPYr_FlmWٞdsv#!]0A&{꽽چ'*3|ͩn#lF~TBoҚov(EAzcvӈ & 3*Oѐm˿MҎad;D6a0;)P:ڏڲhG RK^ep%B%7>ֲu.g?;2`mg@kH %=to4Lu8ΝN;*jdv,/CW񇣋n7O[c&s N5M̊~#]UIMEGyYNj^O0'wDƚK#66 gqpVv[Vy_^@y]6^N&f=3g_ntnMG8c?B Mg6;` Wc-765) 9{ӓ7OΒb}ؖV4{OXR]796~k.>.˫ک b(wX201P:z1N%8y oڨ7ؿycʠ\×eRNrDpX|ELmfܯguW5;/zy};QsŁ,k=)4 ]?%؊jpDz``K΍8YvJںl QgS=|n]%>?ǽ1\0̽Ϸx^p$3%ǧ`19QbwJX4{u8SGFhxr" pq[pÏpe@֬5՞M.PIj`B7+X1b* Av#$XCNU8_P H>j~EI:hԞEAR\L8::x#8XNwT~Smy ٰ`L^wڽO37m2|jljjϏlgC" $%u*p& ~  ~F&J#%a2=QŘ\7 i* .slpg'J)u0&rH!x8Z@(+[I ;ĎQ;;JL,Ǭof'u.n[9Aaw:I;LG+Af 7rn@qCM`6d7<\v̺8b_#n@3'2k@G+ָ2F#<_zV qwUÍN(kV]ܳ4-=x}GdX}Aߕ˧mTG?\P~0fTŽ9 ffs='e>d^W#9##@[ p"dL=CNۏ 2aHꘀX^8W*4A)3KO4Y:[_Td0;V淝j{X{(|c?+: ł vx?5ԱnnRJC"ĉ)gFK:C.ϨTEķ5!_3UIͷYGY<~zctSUas*Q4 2WM4y?TY4_}NM|ԷIXhdG(__և7S͡Z|%X;s8f:V ǧ re}ynKvޅLѷq ?IE{y ud,vj.h6~w!~: {J q,Hr]K3~JC qKn{.\Vk;]!VoCgU 2`^Q90u0Ctۘ'M s8wÑ }))X5߹pRwk5ƫ^չb& \xYl" xp8I_35# -ϓ @ЃАA]  D2Ǥ%"d3P Ǜ7Oa]]H5Jztm~1(&RCo$]Ê;.@LS"+(Ν5~^B̢i\IT1Im<gze /.o@sҀh&"ë;S7ślb v.cؚQXH_1غu/[Jyq-z3T,S`|_B:6]x>L&d a;Jm*M[zŨ(& " }jZFt&ݜ \ 1BN=!Y%SV{˶Ґs)'W[Gf?aPodJC9BS9GwvPV[Ms8^o q##=mCp,8,-ORpdTMvg}mʗJH;: |bd̏y$UoWW H ??Rn3_hp';beքPYae .e9 ɖ@U$78n(mv1rlN|r>'#wQۤ!MzVAIݢ?Ҫ~HOs3JMrZ%;{ʳqZ.ٌh%HXBX|q5 e%QߚI{Gu[U|p1n# R慵]=A$Yu1a $I &-C.vB/q$2 =Ome46Ir|(cd9DÀѼE}=68Nq>.wvhßaKFxVOW6 kNﭧ/Q߻^c ;z/KϜ d/j)-Ґ2I?' .މ5r;~X4N;`n.Q& n]V i|̅JcFGo9/W:솹ZNaͬz iBMfj4oOnnHB@~z` [|K,KNx\_8aW Qk0I=?4dU}I5is;c(@b?| 'eM#!W OI^RaQ0Ett%mkGHr#I>XCvRhW aQUK 3Hw9hSFPk㪹^t|i똬Jtƶ@V pH d+A7*>а;Sѳ=J7Kbށl; NrR\ ,?ƺ$D"OΚQ# {;;'3\D:9zBR{gVwSG4W!>'A}r$QE3NKmf8۹[@HϸŬ TE qq=L AU'cEI]̓F-À ¶uF7FS x2p-W-QK~3 t,>DSd 7&FPO LP'N+jGkg 7gvB3ˮCߤ`v9zr]މ뜻y^'۬7Pt8qTZTo:Xݏ Ԯ{?(7u4&5$\l2!q1%V̪4&&LlWt\ۭ)~ ~?\(Q"H_ǡ)2GXi XkxUJ2ERY >Oz1m:O$NfK\"7V;u3iu.tfB]à"=_:Y|_?%T_aaWh 0'mqC<یøۮ33p(_Xp Q;ib'w@<ɍcP,`}!2h6i.H/~V4Nҳ}68O/½\HM`?BlBˁENMq^WEufPsJLmA։uuफ़ą'P;b/?ppXfKڄn `i*4Y<Зo-ص0clWH3͢\ Vjn*353Ō`Y*`md]/Ó&xy,슬g&x[ۦBɀVq'ܦmiQTRK*U,,z7e#=ߗ@ph?ܜXiF_ `2GQf0Mf5ix9(QvW!L \Wf8/oۨ鶻g"|14zH6MۊR(K? ;F\E8 d &+JxW-_T#H2Eʪ0j"|`;.:! GL~1rm>Ƚ7h/H}Ɍk1\7LkW=D N%<[ϪJ8KėcΖIFEὗ&l&JBpLs䫇I&-_DLem6eyUnK`P%>n%(<+-$xjM^%p5ښWLUvLf>?nWaֿ=Ib^\~A/k;kL9#πҪ0 #zo˕|u?$^_aǛL.@ML|TO_琾Ë8tF&6 H $Bت)"D₾rŰ`rNW9j}$hDсy][C>44hI&HWyUVii `N|xSxcʻ/0߭Q8Ư9P0 ocğv高!R߁q8˺Q6_ٺ{H57_9?[;Ph=U%r)=9A_=#'P! B %jO8s> r,fcGwwޅju\|L12AJXa"ұ e>g1\oFwy->w!qOis2Y /%ۜFط~{ ~fcgWB[kn %5q6pte#}IשPiޏ(WQ{Hwɱo 9ފ۬+ ;'d|cӕjOzG%^ /}B.4r ;`Lk)6"B~>7mpP$}\}⼤1QvN{(9f9{OD~쑕9|7veWo K6Mh-Ɠ ՀXg`=$/+]ⷿ=_z#ͻs :о2! RdyDQ${[rb1|s»;_9P٢v-i|)|\he֭dIP^j It(;%U˳ycs=7Ys ~.OI"DmoW^s#_C9xQz8BpmUːXjlnod}t(vH@ǏsDP5lD{!,^Vv1@<\{2z}U7 rCWz 8z` ʰa7k`h~%G_q/KGͿqVTMU+&6\臊[^ Kl:?ʤɰ)C!>q0c2T^%Ҡ+‹WCDXaW6C!.Xs2aidk~n?uƺ<[yT.#9vjucf9`-,bC#+q]h\ r{]RTe d.Fci=+v.tϦ&د?PQCB@RoD)ʧG.O{BI@Ior߇@p pgIGr)?`OcW֊uz'߱Jja^m?WO9d6cRZZհx4iƪ"%Ա9ԑSoF3 fm~Rw[ ģ9oK㔙NIB8te#|QNVO* j@Vc ДBnQ[WF 2[=wauWFd*4+49w>f`O ,W+ 4_`Д%F{Fnz׭|loˉGM̢!2-[tO?##ط<:Hpk;X^̈́T}3L^W+Dgr6=Xfɽ|!+Ϛc mhS;`~>~];ZޤM2 MU5w)DZ)kk I{"'Z+OD^7jx|D*zz;8=#FϚ9d$*Y26bz$O6*Rqmgm%̖Ԧ MX]GcZ^eS1a ݯ׸??]tz⬋4k TV/}Zw1zXYv^]2WySID}? /!oMjA韊]"22Epãp ŕ@k@53宏k([nP#^[ƍA7h&'xIb{/o7=ڂxN5==u_SR=r{yxη0*|Wl7ꑭ}-CwJϮ^}>48L.;Z6PXiiA)F4$p~"ȟٻl^ϦL;i>MMC>1CF]AUK E{]fO0~gm~ym9ժᅳѓpMN?FNm:jYt˟-+Z{zKss]U{q(4cgqih0ՄDrkybd!OqB_T&cɳtk/xAdyϸH2~(->.#l)s(jAOzy/o_bc#)њHZG֯ z\ߟ7L&6]+AK'V]?dxzEi/df~|g n4DŽ_|$ Q<1)xYXgrdG[k.%P"?TZ+N1 p;O?KsC&:$צ/*斾,qYQ"ryoYrG8.|~){rSQ8QIR`A`\4 ?LA2rZM)(_S9ia kF07%_Aɇ?llE>i}a1{ʜz>U 6^~xaO!Tɦ{&ohv{K:ƹ^GvܥgfS:^t6Pco (.?qQDM@.{n56%߇[^Ƅ=}~#)yPtDhu^E8+zP#/_K-*Gvk'" 8HQzH{.GkO$1aH_ Rۨr2vf!%؊$GH7.(γSɌ S -dž z;'Ivoc3y]蘏' C5m EcH4P#C{o3FnHd7%[/cx7{{Z7=gY^_(G6 }b8403wc;<{wkexo \\Ny?]!0fh0RyA Fk_r1-dWR Ǥ ̓zÆ165N5sЦW'օFH};Jγr:"^b%P54 O XcԲ+m;=X{c4o-=$\Q̊D59A9%ԩҺM4%ؗӛ(9mޭM뤏TIZr)ܟx2DK2]N@:[ԂqD'7ًۅo& ȱ`/Le3WT]>ZmsN*"A}4%z>iqE1ԯÐ[uynb&Eϰn&aNYF]vIDr:3ffe(`RkVk:% G(l;)U )}!l>}mٞ<-x|ޠ/4|󙘧t(x|fa5XnI--u|nX:k/wuIRsY6dfJDR'W*u1 F[5x@j /4Xs̠eKdHW*R35&D(F]̒œ;;_`H0Wb<{l}\5Ƀyx0`[gP5cZYO$ {OIE€o{I?yZn Ck^yZ AyRs~ˇ)n :j~aױwrц_pu>#'f{Tgہ v6c'@~gl][HIeKc϶])+YZ&&kuc5,^d\/¼V h mF'"uJm[!w5$ [w m0UmtY Adɡk/ק}|w#jn-<0f٩`W''5,{˖E[n?yi00"jGpO@8_Ϭ+@J']L8>$9  m=g@W/2\Ӟ0PfN%တWh7`RtpZgaSb≮I|禚xL'=FEÍD󲮍4֟!܃yy7=TbfO^7Z}&ǔ]O"Q8AbeY,Os5"h3Ł1f-?<=;'5vhpiA08󤕸j]*ܜ)sSSh  oMNQa+R$3#&oLƸU.|}U n0q* uxht˟V~3D7 [\/qK5 CpŇ&!2/'Eb+|r.7C*iɩC.ܟ7Edh-i6b,4Owy }:%Ԛt韈I&WCmqYhj)y{4ӟ۽GrA'ӲX:84I`ǯ݇v8k' aOE6= ߵ:tU Ap i4uZ= l!j~:\덜j b18t j36Ꟈz5~Gؽ1H"M6X{w.L])> ȥpd6s4Mg^4v1 &>zч+`ڕ+sa*;Q W.Q胮jk$L| 'AQk#F!zUZ BZj~G AU棓?~HD) ybRn7[˱O[3f"5}[笏HA( ]zd 9n{J]탲./׏22תzX Cn oI|_I}wVmsb֣̊7=\vi ?bSnjBbQ}88Aa"qݭh(7~tNAo$Bɷ:WGŵanu#Q2sXf4;lB^iؤ OUDm4EO"DD~#xȶ9KCm9n$]~۹,<_zAm']ə[3w6ugsy#=Cק~ndcرSIꇌM@<؂͜k\d}=Lxom.o}0G7nB` Q|RdjoS\_"l`kUD<{ §&xƇ e']=5a(J*/Ð".{!W.ʛ|FI,nPxt6UVeT6\cq98ayir_S A2%B>!HOPQwIEsU!fg3o<#NRiu,"HĒMGjy>1IWxʎM_O!v$6{s4AX7쫄qZn, I01pk<*ԝDU4TF##m2\V)ȸt́rq,-k8p}1#Y5= Q!.OUfn6IӃ>?AT(B_WɶY.hKRA̕CUB Op-^KNGr; .Ι-UOX=[xuP7׼όP'$/@uJ[Bs̓w 0{ A(؝3n-W_edKk CmGn?xYF]% ~k%,3LU\l#N)\#D=7^!D D~cd:Ǵ`뽟Ö}Ky%7(MփР=m+F$;3޺}.\ir-և|z&<NָT4ġ؊֌9(LT^reG珦]忇? P}kuNK1ا38Z=,nm褩]P!%QѝŶNN+r_S8Y G6;WzzO(gKpfꜯ|`?1S*h|6&.GN =8;7ԣd gr61N6/2H D e; m=]uykqx! P -AdSAKE'=1j`_oY~'\亨{ՇYKG[ԬC #oIuEF"5B?;7mh&VQ@$Ɗ:xh[r.˫=`NEh&.i/th(;tz2d9?wJs ^!*NS+>Y?]8zx"DW#R9< ̝x̒Yw2A&us3_>˄HYq4oHMK~@D[`5E0)0''e0vQ8>VmF/"x BMqҫ!`ީ`!CZ=t)g'PPJ0Mz3QsdcHmrʕ$tzD,n>P}67SCy4hX@2w{)x&=0vo&eqmY"0QNptzYPY?9z])Y[+#W̪KyCrHP%J`7O|*n#76^I;q,ec[^o8D"5Ywxye% Q J+HAuy{iPǮ'P+P N04)YT`Q(E+dz/ժLKުM.4eО_ˤ!H7o!Jb MWim +d)$cOh)Ӝ7"͚ %T0x/n4*_E WWKRP/[,Ue}BEC"QMKDrʜHoiC{^\XzoR!wdF<IB 2-3NPF! J "рF|/+UKo@Ў{(.Q J2 13@8pi`Bp,?9Zyc0}+Q`Ar)et'bcRKg'rdڨ. 2Ys jCͨTHC50ht0,IP!Á][ LB-<0O>(r"FiΓZ,ccc0pQO?X٦^l\ p`.pA4/H w&yp싃%}r!PS>yE%ڭNB1MlwSs!.,};_ʻu(Rw!ˀ?sfi8 !)~gOhyO+#]v{[sWBlpHC ڿ>.,Oejh˴m3I]{ivn'k!؝v'Ԏ'kbXivim6M~knNקq;\r Nhq?-mӵ|M6[M_i-?}in ڬ}Oy=^"/G1nϪp ! ʕ[DM1;؏inz4]#nd@_5!,zU_=Ϲ1ǃK g DHE'[1S#9 =˯w~7g!nTU߄r42cų ,+>))ydXl^2܀ _W[>GCFƩ3[eBJ@8w` M(^q~cy@G"%n5MOZϑb6y|EvJsc6HL)w@p.&͔)s[=-ͦ A@E5+Ps qAVCnGqɐ 'A*!ˍS0Vz 5L r-Dߣ԰?/mai=r$lW| 4ѼKPؙ'c ϯ5 !fx^_گlrǣP4VHvȲ}}idރn%ILȇh^:(-yY,O\S7*'[{*B.8^w`?D% " ~J>DJfz<+FϵuPEQހl+9n @ zHYGpEj]Oj&'F!BLxwb6T~aD=U,3E]bB^;P(y(|6Ϛwf6fֵ.dہD,eRsmW ] E?,PUld^.1򴾀c᧺z нMb?IlT@䩁m^%QYb W昚~JǢ,+ގ ̈́v.I2@W n@҅퐲bItlLO֖hEҍ:D].sëWl[eS W+Á#ɭ3`Bgݛ=\;(gj«vq+E# ye^K9-jZ?w Flv&B '4O pJ_IyB&L>UwE&KGZWiI̳K=D@JMjAtDcA,y$DI za1{^ݺ7)ZfP/9tiiEmSnq".`bCX9ڞ3Z:V{@ܸcJ~WqSkv .O]5'v{$8ZQ^x\(ѝdRP 9ruqT{" wIpbŻ{ÙƷgZ*HYbwԑ]?24'\Z\-P_{$p{z|WN]G]C9]߳dɬװG Y1AF)LdX)ۈ:QS'#?Sp \pFKbh4.n2{vynij6Bh RqYE ؕ{U/tK}uJda4/L}icbNiG# zjMD(xZs\eZbrKvv96W>=Rz%X;5h6|;ᏍC)7z7 Xnit_!^#fɆ:0[O/}R*{XwCilOr46-񛬼wQaWn 戢eκCF a!+.ZЬq jvJx|cW$.h[!> }q/ o^ڢ}hޛ'җSRj#jw!ubl|<X"fetzbbvoτWF|*A&.pl\1}lr.G,/6`VYyR6K_5\exlԌܒ!Cہ,dr#RvW&' |?M\WegLY#) EǴ:݄W K ! g fP/'ߓѶ#C\WʗbuuGzpzm0eu{(z$Fvzg06o 0 -0x҈B'HƊ(N)e>FC+ǑBrOP 7Ezqocu\zU\!Yd$+W{ ;YWf2_ j{ $q2^rG\Qdk O76CCP'9 ܒ;Kb8OZi/1;K&+*2 /N3X"%LZ,URQ6ppvLm^֗uk $=cmT^wؿ>#P-4"`,,Nm9D5&0pskKȽ%bx_/=xid2ef4O?Br1ٟJt7iUӥH7FM .sV> 4|^+ۈA@ʑ\yE7Lz9Qp%i-h]A$鵈ǝSٙgIA_{8SbK檉wKsR .:1D325>nb|&x =̖br.K$۲U & 9]Kw!QVbb'Ltzu;iԧJ7j;~NsJ<3j-'Zӊ}1&ef./eR_DF1$O<}Q,ҘNAA=['?q.J?+P\rIlbyqsʹp+ߘ7 putpt j#uܡ>v^#![rxtc;:Dƕd [vES:lM\+=@5a<~x_\Љe;J :bAoxSQԈd?j}oXnh95@iYu٪>Ozv3$] j&n6x'Մ3.ѐ6@iS+]3S/rx_^LglJ^e M|ر>e)s-ȃJ2quq XBYq 15+ăda Kʀ ?ãG,JHpw֬fގjZ-AWY]Rr?swzzЦ>w&=N2bJX4ecNYÔ2׉智Q;nx}&9 GOTbaBrdz8;@:Ύ}~ZcpŁ`fYT(W.8zWZDjy7#>w@a1Xݿ?7cHp8#yл{Ԟj6PM@*Y1R}n:6 5nOFA6*!>BGj!x-E Jkj* ~ru^Di `'لch…0rMLPu&xg kGV4z<-W"Gt|^/?#a)p1 B_c(d҈|L\(%"ߪu֟ s` 4iy?PsncƊ1'ocbr~Bpҩ熃e,D`Q2PH5X*Ewb^Ux>>D?ZoLYPsd<=h? ΋'a ɿ[%ub~?qģou?{3~F dɽDT\<}QZwpPra0t"ZW.@tAFX56N'v];EI[(# w<<Ρ% 3Pǟgi-)fKs_-KigfA /TB//\C+mv7OV/   Oǫ؄c|`q('v&|U䱒džj Ft0*?Ό:zέNW{Wd_зGI届bd}yP*2P\Ʈ!9Gea-ƔҮ2G=jL+RZuO'Ge^2R* d'e")A#ƈCՖMe1%2+Nu}y'(B˛[=Lʀj oI^q6xO0ğ?4g]4 Fo}S`$_IMFSͺÁ5=~x-cF (B*sa$Nj?Aqv%FZQGh3•m,ExжagAG4Ȝ4B̖(OM?ʖ)EWՃKN` VYۻEceD:} o<-oyȏ>f>;B.4Jk4@Lŏuaj tF8 ߔ"hW#zŧp`1Tog.d~/"KJ'ש3gwMv_ǭ' } @(]QX~7ovʘ!3rFa׽RSWjCyAh}#'PLwiMl3yn.Wׇzx|:tzQ}-QPU5S  O$ǷHV&`ȧ(6o N897,#*@l+=`V\Kp>}ﺜ-!*HbyŤ웨ez\)Ms6'kЪ֟Zp~q"QE>07z)I~&oZ0*nM(]#-}ORMX05)OG- ݵ76i&x'd6/f{oa LJ+R +, ޓ=k{ ;tvm{}D_[;WTܺ7μР9=P3.,\g \RBmOl)/ȮR$ 6ѩÐc%lĨˁc8Ia2/WwHsF+$b[Jr?Fġ־XVaK'7_h3O8J{Eq k_}~De.D>k9'HLuaUCPBhJ;ׇ`mܷYBe@\¿֕ /C::|/_]rOTi5; :`2X`fd H;A|ʩؼ, K|ȇ-:yJ9T|EGng%m@pbF|`,,tf]2ߦ@eR |(c80)nP{ڰ?}1cE z<뻱D`A,'\|POuI>H\yɫXT|wG,Z}ob ޡZg>@w ;KԞT)YGS  |O]{?}=/ݜ?WMA"hj?EDABփ8Sk}#7:"O^wHq#9v8s(G^ls{0bl3:l P ,RoI.a{m=Iz*s(7}'7*flAc!?d=3߼y`ucuDVZ}zh=[Įqnoc -#-W@T 㾻9kҽ Qf#p=]-L2;܋KJ2|]ExDYe/ND!S0$ko`|Τ0$4S 7u*Kj1 \VOCNOsr K&Q?6)C#5o0/_Ͳ 6!.ˀ *Sxu'>J݈VjwS*wmhq}(+5٪{ڔB4\;.FvAz;Ŭj&0ƣ4l`{@4Ҏk{v"?n؆*e_덓 -ώ|W up˕eQR"]?cyW.^\¸OADK̻X&XE٨w-ԵN!5I8<^_*i <|o4jgޞ;B˩C›_\ID ==MHӡnhuw! >5zO-|U,~b^;9$wvV! S3ޗ~:#ӞU7&Xlb5?NVNyt u8k_}jP3AP0M6kIpC .k—xIxSDZ&F6aآj`֪\߄n|<< O_Yio6/,,UYe~*ef>w 2C"ؔg=.5;%9-ENR' Ҡi/<%@p_Y<H3Y,&5;ă:+WO#[>rF7 O ~s[".C~77H6?>Zn61&b\e,~ ?Ķ^`pmۮS8AdfOA (|-uz9h.Z |~d}@T ePq ()c)|9$2nM"ZPōNevS |zL|6_ e6>5C k4]<5SoG. +ѰgAOn>1 xD ј${r[F  僘|>'H S7gC! Z6%tӞV sמgXcTabU{UPeZ$!LvG@O:M;(s?}Uܝb&u3klks=upg4c̑bӖ2ZVu(dT|wՕs-"G4}@E3`=ňn,`6ǹ=_oUWE0.]ݷ%gKJ8z/`j/GhJ'&"]O?ŷ4rP<}*BPݘmF=t8{S$Zcq{σL>&rGw93''lMGP.) Ja{eyI5u+oth3i `ب kqbowY1ݑ9z!i/k)#Jȓm͏`,=3Z<? b=#yWXvs4(Vs \%hp?Dz ~#}~P ?bYٔ䎻|TRN*f,,"W/@>T b"8^{KO҇f̘*$mZ 3R0ًO>k?t"\{C"}F=;Ц1O/'8o9˺>E42vۥ""h]7OJ dUٲ}lL~h R߰qNTx-Twr߽GiK>p0qdσ8-v|pwX7OYrԅ( yl7"I:q *Ie IΪ_QfE5ߧ[ ].]pER\?;s/Egj@3[-Pp>0龪hl3ujp2D hZ .ࡤ?ݬy.;pkzE*'?ݿgf7_tpt}I1e$exqe"0K`Yl*_d;a᐀.AoQ~2zuDa)oyoɕ e~Y1&\/Pd&A|G@zk"AømVx=INa< lQC7M2=]P1D]ߠ|:P#˫~nLOS㈪U4e/,\˯\aeڏ۳ "4أˉOuuѢ)UHAb !W]#׋ V{ɪܨZL="B=uN=xUDriJdX3,ac!:6+jbE۹> ?ۣ2۔ }~r"G^O1O;]*I)ww64$t?nw4(CgX̘!k3_7]@ӡNjYgP,.I/kG5g]6Pf`ʈ&=M TАIKbQf{! k+^-z8Q_nHxh.:8O91K1#^# d0|U:CEU@2?s8eHU@9`724/Bu%[z4OPˋʼGXGXY޸pBy+Z:~築UDJj!#yiz1|_ /ڠf睊wr8b[ʯ[ Oem&ElYS,Y+)Pԧ1(~RX "mZ`QT s}MZ?=}[|9ǍcK )dfUl i?FYQWI[7UCE>SybA+7x!x?qb:sS+8ǩi>Q};ix =Y082l/TG>)IeQ`:w;gVV3il$هza~>ǥmˮS @s>by }*@Ò.(lG#>{j"-W*42)oEW**z#tiZ fǞk{h8T |KHձCvF#zBI!,Lˠ3̂UZr_ Ezpɸ7 +ڋOʨX֍{G03ݗJ f^/b<;۴;&ɔ"yKh,7n=Agj!i_{)Cq.'-a/v]*aBo€+dD 6Ba`UAoX2QL\>rnA`E' G~iY?+VݟpC) Z.i0,Vo8m%SΔ5AG (8d^6=\:ߙ"T!>%$*Rh`އp@ *tu#DL~OPhzب JMwW,o|Ao!(5刲Ɨ[s^)߹$qmp-,>5WAUD1'K =yow\xީVgXL7!SlQ׫U[>lob$ZJG GfT^# ]0)m;Y>*b:)penvƜl];p*b'i,O\wܙ ʸ NdL:НF,4j͘dH+d CEsqPzONFU8{~w`mz/Ǚc۔dDXeVXnWax2cE/ڊBBeϋXTɸcs_]1nM[3&=Q/?0+5v !kbKp-Ew~TƘtAA?D?vUW =w>oy$xs<rLC 5~A̰ MBh| q銟>QHnp;8kN 3\[&/Tf-´C@d')_hkvyw8p1;'Kx Q {`ㇼ}¥z>Z@nf lT2 Jޑ?J! LX nTww ˝G^M.խ[8mm ua㌤װ,X: ~|'#WD}YAftp,,n s7DZ0i.kn io'n>'SU[]VךR}y_rfEݰ*B(o|4y7[>`lL]QWu^ńAzCi ۳ꐒ}:o}vー5ɷ?)N4I޸Q-Q^HGoһVk?g_+IcÇvz7i:'1/'V \at` |p`r)+T]'u*6ifՏ'mcmƺOI츈yx_T=%XCUDQD&!l!? G}YCު7ux좹|8|,MXfs >9n#\_nF(9{/#{ʋp m;oE-?@pv@p`XxZS/cj&la͝pβ777E8 Ht^gSb`N[<*4BzUTZIZ>4F'Ol|5j7ף5@ ss7e[tk41M{xXv'Uպdsͧ*O|xF,yj'N&UTW/k R4Rs^/encՄQ\}?ē_(.&|v怯tIU`% k/o wИ%wcP_ua "sv"y{d(12kY;UHAc7דfgz37 Cct4~__Ky"}t_h4k Iɤ!& Ӿyxb6?Z{"O3F)j{^[9h`EO'Q5hhm֬wr:ǝ@rfُ,_Z c[8df9_pxVg8_p ly/ 3w5_CCDЪCKǪ֚{5/Ŋ>얈u8 /J/Bʹʍ:ä};K˂ P}`!.v;=BGRjusH",9 *frCf-i!kurˮe `A KjrgÄ񫺡(j 졷V{<HȎOa9G6?G墍b`"u\Q^A~Bwp%䠣! @}mFF&l?X'/y>Nɖ޵므5߯>?&33dIk mMaYC2pSM$"_ܞ\A&Nmog'7}AeDA )<Zp;} I;/aKe)ɸ\Hxr*+ω6QJﮮcwptWۄCr%! z\G}POj1t֫YE5cVqr!KGMݸgipGd 6ISU3XŸZsXyjZJ!mdݝW3oZ#& l2H==us-_6nߢ^"|;WX:ԞqԮj,1z)([pêJHϥFMG ,qo[ZJ+씄sd7ժ7dͩ/;B&-Pn3>7n|_<= XpYKR%R4\f|ldQc nOU(% p 9qokBan/?]\w9a^ G-vK #St~?RyDL@ߵU#lZH4 aotHc1.¢cˈ*'@&׀irNEץ=sޒYp 9RjROP~*I֒o>@RJj7x1!b^/ ݚSH2:9QP%VB S'$ }݉G<#FXm7ҧ)԰h-00`ԟ.0b^ʙh467^:ˇ߄b! w/A&A7* SzAōRQ5ދ\sW[-8H.>}vD*N|{oe$資 _RIL_``C ;ԲPF+iu:RxN+aWjlW"wU+iƍ#3xNLTB{=&ŗ@o/J%#czuS7_yuFЃF|Be#t@Z9i'ٸ1])}Ѫ-lOt1yQW%'݃xꂬ|W' h^xO3u$瞐^j '`JRCz!pFG5;F|V/,UDZ 5VF+L@6vO1Ď\f6jg`".dUsqϛ5/8Hxܴ|EďMu!HEwN% N#MY|WBx>45C_ʊ2k2c=32XƭE _WK8y1DKVaTp yKR|* HrW_ cT^;gpnFA`]T8ΖB~? Tj'π}KT=.k%e3W򻫓X3$RFL"i&e)E(#v>vᤰ\ ƨ䕆h7PbR*֔FsTX{GkEFbɫݪ243G x[A [fOKl!N;kQUU*2~ET t)) 9ϵ3K9R#ɺ  G(L":ĖZ+8f)l PgԸI`U%|36ÁT=lEU6JD""DZCf[gQA+yi9#1g@BF:^k+.?ʼn4i}y & !O.De=@qYE\W|WbQXƣcso8I7uŶd> (zݵeS=7!-LMXF,R!~R0||N"c(*~CriF]qBcAT^-,z8,ḧ?T0kӧ{ր^#܌?wl>C yǬ_= 6 @xKVw8_aDzAc\E"P՜oRl`J쐔*. Ypvf4-Φso7aw!Ҋpqݷm=۱aq=|t9 :0I%1^ aa蕠7쨷䄇ڗ MnӨT;hV+ZPУ"l,ʵ PY^ЄsZM0&m]p]&}R̭j'S L*\ia˗Ն2iC4asM\zZUCO1B5E k>(!yGO.{KuL h| SU@$ -^x5>GMơ;p ΝWᕾnn.40o9R,7nyXX) ]7Tjqɂ!>hP7MO'lW[,TEh2/ftS'oQt~-Xy]!;t̽K/H(Er"fLDž)qCܱX*ĆFVMk@ 2#lY~==ML@gdvg|z:VKΈ>7a#{E^4-9A-SĿ^}H^~GM'ЅOS"Hjf|ֈIۡK*=Dip3і -Q &3Wcƍ= IwZZ^HGRy*$NT(InB0VQva>à5m @*W|O rFwTNoxՇc7H Jtb._A \"ݑZNVeWA1>M(dwRu²&cc@E1_TW6R ll.F׫MO]b,nҟU-";gW؆n!q_u{. *rMQ15vj^>8% %r݉}[]F5羾 6j(VB7JrݎrL'%]T+27} kA>\>M+粨h{7}ã2snzWӁ!µŦjs{ /6] ;4~Ec@=sR{gN}1ƥkDwE]>s 77/z|Q ώæ+] pk5E&Mƾ ;]0O +ȡ͇lT}rەȻ='(ny g/ ''>P{XW"#a oxݳET =0r Qj~xƛ^2si8*ӓߘzʽEr|4VwҀ$o:@=ߓ1"`C`c}ZкCtmgՆ09ee=O᫪`h4~^*s y1:F'ȩ/,\Xk2Ft2s]=yڽhpqY\!TRO*_,,vM~ixMz-KIYhWXBb+V%wg--yvhxVnlւdrs{CsBE\~&fɓOʼ5؈˂rgy;56W(QEG;kVrAa\1 \fܗGl|:@.}+¶qv\![@Uw/z;(%!}O CYrր[ 1Eŋ'ٔ7+gO"Ů[:3#/+w,8|MqꝮS:˶}EaeZw=tEՔ'sBL5K!!;b5j -~?[mI'9/+')J6yѵm^!}R[9Q# ͻs52ݙπ,N+tXN&@:Gq:]Tke* xk_S|s!hS$#$[JֽCشZ/\8@_TG B?zZHio{nI]YsOH̩2\6vPC{k2D)3֏%Ҍ%X;bd)IoW]A~v/ ?k@u`co{ i p=/s.!]a;?iWOݟNNHJFHպYr/ö>R+,# *u6 |/ǿRҟ/nW&l+e\qN[k+d@WuX^N kr8dy0bd Sٳ"$dJ,lA$$ZOq _ ecUi&DD, cfrOX[cD&J|O'gkHQR(yfz[p#"x11\?8;1熰Y1q?vaQN6$ #> ?~N,8]7NabnCvt*;hTwx55N|$m1FPDӈ%g"vD헏V- ZK. K>o)kݬ]a]Qюk(C|6.ȗ V+tZ=<ϥUj-Ƅ:FiY:(߳ǶzM/^eW"׿_?=mr[<EcAUIC>1+By٩{}@qI2L-]u .V|C'ΜyXg j&xh+ۃs| ?oS9M[8JxWוJt P]9Lj|w>Gގ%'.^a hB\i+$Pal+yۣ&=4yFI94-FN7owZԂqҴ+~^Qe'fXNJa)y;M4Pw Z7:~²Qn]xz enCAmYޫ?m,Ecb6/jQ/#eHcHF= B+ndGzB15X-T伫\֕vtbQ?Q7ər\*ǜOSvN4杸QP~x]  Wxn˱F8:ޏAu0 vTn-O XTliEpsK8h`'9HS/ũ*tUCpG]O44¡;Iz)@A&#'I)09NvIR{į9pׯIKTrF  "h݇j LMXsxP>ZH\,ZPX'&픪=D u *!Y1c+nܐ>o[aJ8 .cD `K\|#%SJYL*ay-)aW_0rl*GT=U̧ m%"G:1ϼg.6{ȡc:ݓ ~(DmC0:o:{O۰Εkxݮ"\ xz(GnM"،79ԋ;Æ7F!7q}shF `rhr?HW>?DR;0 4!hɝ$}?P{/CA7w賴`]KDo' :/2Sȅb6p?}Z3.<#Y"Iu)O|XFLM]k~} \ORXSPnaIg1n]ZbkН+q1lX7A<%[ iQ7D+ gj>M19 X ?/5jn%T.(Hѱ^n=.OɔXI? bI :h&e2V{_.)\sTA<Ɇfyzei9i;HfC}fp>سbdfk^mjQ|˰X{XSs C̘-c;q"o1_vcrQh qL/P(5V&NZ+bTR^Qe* uc-?}yj$m,K>Xf*CgS Is\c!埙g-)j[IIEd 梊HWY| |+2lpK 1qU߲Zy@ &u_m(Gv=hRe\~βϺ{<H譝1H7>nZK)01J +cz2KWqw"LQu'/2++"exJ8Rm<{g2*)SE%h/1]_3 "N; {&yxF\k$贑m}w$BX 9Ymr,w6S**k|#l@RVvD|jS=LӱaA#Z!sj5斳/mkcm/@ t3ռO(6[V4Ñ=vQ*d( {dc_ p_snn5TE~O"{?<'QcW]md=4Ov$l XFOʴ $0'󧶪}7o!Ssleɴ:}[wlL:xTiQ:fq'@k-²h!I(2S͞(2/E܁3@{M#SBȏ![/(5.O|\&< Y"L[˧½*ځc.hIYn 9hbؔ:vV[> ;[8dX-e~{{X-=QyXs .+ iVwv' M:_aGt\w_ĝ=SW;[`B㛁! ]$/H(W@M^6r29gCa= yϸfd+`>]kZ2dR8'\xу~ʼnQR(j@pu21\ns@aS ۱?m|k4PUvBO+UwDg% ǡnXMO}P :9T4_)F^j*_Tࣘ>n -~7u{%9դV8MWW+w8jzsS/Q$gBృA ~{/z/ųBʢ8?b1]%i"y.:1x4ZN|-?@bZQb7aF/ijJ'h /(g\B&d% s.Eh{X(z-]d5Q5󺟖o/!żx(T$".H2p$\k+H"z&8]> Ǖѽ>! J9C$Mg?V^/1_L_@t ['Dhp??[ݸ~ I]><:h'T4,i{[9SXvIؚw?V%S~6tDƩ>H֥ |oYwq{z C?[+r[lwOi)ɇu!xԨq> s]0ձOUPwc G 0hη?xےf O3gbcS!hRS ۮt'BTUMp9sH96l||~H:{F) .Xld'%$KWjN qpeدשT_OZu8qZ\Q4B.A⥳ӠM4!~_IAZ@foEcGK?{ʋU>Jȗ)6+T t!u *7?88%9[oP lX;(6bL};0.p +_?T-6m\R&\wTf)A+e(n4o!Dؙԉ'Q}{#,zm:pSɮc3D[pYz^r޼~퀀>ňiw88<%#s3oljy-}ݓ'=6!=$wdIݰkiDO{`(_6o"#-񔈤ǿJLW ˽ .Rc^*ȾloD@Oϐ& ^=Q5 #O\`H,n"Ǭd;ljY7*EPpN!6ZBQ@]df_oe4$((9|2^PGȕ2"0滏%Baճ,~n6(*: ,~jq\& }ߋ4A. c }p .$aΓ+AĤs2]b L9=Fk;v-!acQ@KK0m0:g%Xl~ϭܳ ;L`# W[Ղ[d-mM2r^LRq`/+DqO{rW%|ʡy8ÈǵmJ|f£Vm=};;OEG0/?0?kfKN??ԏ &Y!DJޗx]ҡ ͺZN SP?GfSrhEɤX|)pELHjWQ{hS/ч̥jr`u~ ɄX_c8wW>5;[v[zz!^NJ"Zyw|y.0}~O_Dң`Kb\|Ә2R|JV%t\=:_~N.frG`lQP7 &ajRWڦIQSI_|})zHXh?XkzK,r$ŏ(6\ɾyFCxnLWgh^g'/߻}HEE]upM,䅛a'FvT:䘈cO4G$7kw8ϼlN?PaS%lK~< )$g)PLl2-WnyU;W:< }evq2E~#T<ϐb>d?8GbѤYub7,{lu &>/E5̆ftbZ;N݉Y9ŞWqwcءߎ{cՍ%Y쥅Jv]H>Bkj뻭̊ d xbX#zgQz LD}auCNLuy;%OȓKp֠{A^W?Mʴ+5AGEG۵"4MߓoyI(2:=_hj&5WЬs5^c5Vr8n&F3Xd?T[R;{!׾OȢ~/yྋ< fD?SA"FQ r죃 gt5\C@3,H2i^p}'OBO;^Hc!pw>-2Y5]YMʹӤ-=,?I_53s 4ɕB, Wm?S9-n3-yUYĤH\Lo[qJ`+A@1ogz87x^RY^[Yg?&1!4fim\0Et+}MRh_O1]$w{i`h5@6:+yOnPƂB)hDc)UivEdmR}><^&ik3hm(譯7%?\A|&6&s! o~N>_oN_WJV ŷSQw ?Wg7;y %A hԊ*.]-=L[S#Z ԭ?1= 3q~Vr-†pz!:b''LXԧ-ln8lpqmHϻ Q0 %LjZ.[Ģ #2'ؕtv^.0~S>}*~m,,2|m`}[$\5Dxӈ5TO${mjŕ>d!g[iqѮL4hT^6юRR(J-vodC9`W0H<: 4 :m.OA'jOf_P-rxhX_puc UJ>1B#ng7ZbL:_3[2~r5r]^?A& ;QnfSd-'D./Z?KYjAS;#G/ydL1S۶vīm!=!ŎS]ufnM0:vn^b<'Xt'; 2%\;ՠ>gnJ3G ΍&8up(fȘPM?3y?̟>?O????ϟy??ϟ??'<3??O>I??Ny||??C3'?????????????g|????s?|g?yg????|ϟ???'?'????9????sϟ>?'Oy?4uYl??93??>?ϟ?y3???O?y?????9?93???<<3O???<9ϓ???9?~O??g?~?ϞNO'Cɟϓsϟ9?g'??|?ϙ?'?3|?'?????yϟ?g?9?|?gg??>|~sy?|?Cs|??N̟?3g???>sg?L??3O?3y???>3ϟ?'33?~||g???O?|gg~gg?ϟ?g>sϓ9?L><??g??<~?<?'3??g?XYw??gϟ?|?s??y??2gg???????ɟ??s>|?9???3?? ?s|???93???????<O?fss??>?~g??'g???~g???3g?3??ϟ??s Yy???s?9ϟϟ9<?|???9??|>~Ϝ?yg?3???f3>??''???|?'????$??'>'?'9??9?9|y'|??|@O?<|??>3s??&~3???????<~r'??s~???'???s3ϟ??ϙ?9?|'?N<??Y~???O??'<?????O???9?????|''~?y???3>????s?????9??93?ϟ?y3???O?y????????<<3O???<9ϓ???9?~O??Cg?<3'?9gy?s?~'?y??9y>?>O???3?9?y|'s?<9O?Ϟ|9?~?g?3???zY T?y??<>yIg9<3??>|?gg??>|~s?'???f??'O>?>s3<?L??3O???s???ɟ???y<????y?9g??s<=Y ]&gO??|ys??g9?>~gO?~????|gg~gg??ϟ?>sϓ9?L><??g??<~?<?'&Y Z???y??r??gϟ?|?s??y??2g~?9~y?yO?g?'O<s's????O̓?$??9~?>???|||9??=Y O33y?99ϟy???3s<'?????~<'s???????g??ϟ????9?O?ɟ??>?9??'??'?y??y??9??39gsϟ'??|?ssO<3'??3???yϟd~?yϟ??3???~??O@1Y H?'?????>Ny?<N??~?Oys3?3ϟg???>s?>9?ssy|~???9?s'???~O9????'??|ϟ?|?II?D<<O?<|??>3s??&~3???9??<~r'??s~???'???s3ϟ??ϙ?9*YA???|'???3?sO?s???????9>??s????9<'??$?????ϟy??ϟ??'<3@?????~?|9>s~?9ϟϟs??????3?g?'?????9?????g>s|~|???~sO3kYF?g9?<???~g?|y?>3?'g?OO??3??ϓs?>g?y???'??|<3????gyϟ?|'Oɟϓsϟ9?g'??|?ϙ?'?3|?'???ϟsO'gL?Oy????ϟ???>yϟ?g?9?O??|y??<>yIg9<3??>|?gg??>|~s?>s3<9?s~??$3y???>3ϟ?'3Y'y3?~~gO?~????|?3ϓ?9??>L??93????'??s?C~?<?'3??g?ϟN???????f????g?????$s???y?~?93>y?ϟ????$???9?f~?????'~????'|?'3yy>??ϟ??><?3<'y<~>g?>3|>|?????|???|?fg???|?ssO?9???3????s?9ϟϟ9<?|???9??|>~?|ϟϟ~'?3??g?<~O???|?'????$??'???<<O?<|??>332g>????9??<~r'??s~???'???sY?|?II???|'???3?sO?s???????'O??>?s????9<'??$?????ϟy?93ϟ??ϙ?9?|'?N<???????3OI????O???3?g?'|?yO9ϟy~'?O?D|~|???~sO3?33O9>?s?9???r??s~rs?rs??'|?'?????|?Y?9?~||?>s$??????3>I????s~~~~s?|9?~?g?3??????s|???>?'???f??'O>?>s3<9?s~??$3y???>i Y#'~yy?????g??O?9??g?ϙ?y???>y?|?9O|?????????>?'?<>?~?ϟ????'??O@3ϟ?'33?~||g???O?|gsϓ9?L|Y$33??ɟy??????y??r??gϟ?|?s~s?9?>~y&>|?O??~|?y??~?'??????ɟ??~?9~y?yO?g??~???O?NY-?s??9?f~??y332?'????'|?'3yy>?y??3'??ϟ9?????9?ϟ???ϟ?'?ϟ?pY*???ϟ?rg&|??Or>??Oys3?3ϟg???>s?>9?ssyOϟ|?????|ϟ??>O9?s?|??O????9??~O39???gg3Y?9???ϟ????39???9?????<?9???????9>?3y?̟>?Oϟs???'???s3ϟ??ϙ?9?|'?N<???????3Oϟs??????3?g?'|?yO9ϟy~'?????3?>s9O̜??'?3~gO?y9?'?9??3~ϟ???O?s?g?sLy?????<|@y?'??9??y?y9?????39??<g?<3'?9gy?sg'??>gO?3??9?y|'s?<9SY1??~>O?9?~||?>s$??????3>I??C>?9ɟϟ??y?yϟ'??>?~?3????|0|??N̟?3g???>sg?L??3O???s???Y6'??s??|ϟg~gg?ϟ?g3??>OY ?Oy????d3??ɟy??????y??r??gϟ????|3?~s?9?>~y&>|?O??~|?y??~?'???@?9??>L??93?~?9~y?<~g???~???O????|||9???'??'?y??y??9?|>|?????|???|?fg????????9>3'??3???yY"?9???3????sϟ??'|sgg3|ϟϟ~'?3??g?<~O???|?Bg??'g???~g???3g?3??ϟ??s???????????????ϟ?|ɟ??<?y?y#jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTUU*UUUtTUWҪUU]UUURUUU]UU]RꪪuҪWUUUUU]UUUUWUUUUUUwUUtUUjUUUUtUUrҪuUUUUUUURUUUT]UU\uUʾUWʪUUUUrꪪUU]U)URRUUUUU%UTUUUUUWUUUUU*.UUUUVUU]UjUUUU]U*UU*UW*uUU]URUW]UTUUUJUU]jU*U.ꪪUU]UUUUPpatool-1.4/tests/data/t.flac.flac000066400000000000000000001415041221117163600167320ustar00rootroot00000000000000fLaC"i BzbܷH2ĺJ( reference libFLAC 1.2.1 20070917,ɨ????C~w?_ϧ?ϟ.?OO~~s?gϟ_|y77y_כv̟{Oo??$?o߿_?g/s7o?}y}9{~gߧ?w9'?>32ӷ9[|??_wgw{zɨ?@gߟ|wy5??_;?=?o?y?y:}??;>z~?yl?r?ߓg{_ɟO?_9?_?f?_?7}}?yL?'?/'ɾ}?O?Y???s_w{ߧ=vɨ???{}ϓ?՜?oߟy77:ϟ??_|O~<Οsw9/??Nߗ|9?|_k??ys?O?7?~y?}߿O??s|=?Ϸz矟?>?gߧM?{:}3_?瓟?;7??_߿oL}}~i;?y9>sid?~|?>{4???>e{1ɨ??3?? ;'/{?~w?ys̟d͗?{ϧ}y|owogߜs<{?g%y}??O{xg?>g?S9~^sy_Ο=?wݝ,~۟?Ooə???g?Lo̟??}O~y? ɨ??;ww?׶?o??{~ϻs?s???wOo>/?{/w??ӓ?~ɟ;??=ӟ?9?=w?gߧN\g?|ϟlw??3Gɨ?????g3se)9?>o?}w<?g_|g>|??~?o%?{?o~?s?}O?_;wIܟI{:?3?=|s;??Ϲg?;{w󻿙9??|O?w/|߻gw\.{9~{6׀&vɨ????C~w?_ϧ?ϟ.?OO~~s?gϟ_|y77y_כv̟{Oo??$?o߿_?g/s7o?}y}9{~gߧ?w9'?>32ӷ9[|??_wgw{ɨ ?@gߟ|wy5??_;?=?o?y?y:}??;>z~?yl?r?ߓg{_ɟO?_9?_?f?_?7}}?yL?'?/'ɾ}?O?Y???s_w{ߧ=Sɨ ???{}ϓ?՜?oߟy77:ϟ??_|O~<Οsw9/??Nߗ|9?|_k??ys?O?7?~y?}߿O??s|=?Ϸz矟?>?gߧM?{:}3_?瓟?;7??_߿oL}}~i;?y9>sid?~|?>{4???>e{ ɨ ??3?? ;'/{?~w?ys̟d͗?{ϧ}y|owogߜs<{?g%y}??O{xg?>g?S9~^sy_Ο=?wݝ,~۟?Ooə???g?Lo̟??}O~y?=*ɨ??;ww?׶?o??{~ϻs?s???wOo>/?{/w??ӓ?~ɟ;??=ӟ?9?=w?gߧN\g?|ϟlw??3Iuɨ?????g3se)9?>o?}w<?g_|g>|??~?o%?{?o~?s?}O?_;wIܟI{:?3?=|s;??Ϲg?;{w󻿙9??|O?w/|߻gw\.{9~{6׀:ɨ????C~w?_ϧ?ϟ.?OO~~s?gϟ_|y77y_כv̟{Oo??$?o߿_?g/s7o?}y}9{~gߧ?w9'?>32ӷ9[|??_wgw{ɨ?@gߟ|wy5??_;?=?o?y?y:}??;>z~?yl?r?ߓg{_ɟO?_9?_?f?_?7}}?yL?'?/'ɾ}?O?Y???s_w{ߧ=f<ɨ???{}ϓ?՜?oߟy77:ϟ??_|O~<Οsw9/??Nߗ|9?|_k??ys?O?7?~y?}߿O??s|=?Ϸz矟?>?gߧM?{:}3_?瓟?;7??_߿oL}}~i;?y9>sid?~|?>{4???>e{4ɨ??3?? ;'/{?~w?ys̟d͗?{ϧ}y|owogߜs<{?g%y}??O{xg?>g?S9~^sy_Ο=?wݝ,~۟?Ooə???g?Lo̟??}O~y?QJɨ??;ww?׶?o??{~ϻs?s???wOo>/?{/w??ӓ?~ɟ;??=ӟ?9?=w?gߧN\g?|ϟlw??3#ɨ?????g3se)9?>o?}w<?g_|g>|??~?o%?{?o~?s?}O?_;wIܟI{:?3?=|s;??Ϲg?;{w󻿙9??|O?w/|߻gw\.{9~{6׀ ɨ????C~w?_ϧ?ϟ.?OO~~s?gϟ_|y77y_כv̟{Oo??$?o߿_?g/s7o?}y}9{~gߧ?w9'?>32ӷ9[|??_wgw{ɨ?@gߟ|wy5??_;?=?o?y?y:}??;>z~?yl?r?ߓg{_ɟO?_9?_?f?_?7}}?yL?'?/'ɾ}?O?Y???s_w{ߧ=ɨ???{}ϓ?՜?oߟy77:ϟ??_|O~<Οsw9/??Nߗ|9?|_k??ys?O?7?~y?}߿O??s|=?Ϸz矟?>?gߧM?{:}3_?瓟?;7??_߿oL}}~i;?y9>sid?~|?>{4???>e{ɨ??3?? ;'/{?~w?ys̟d͗?{ϧ}y|owogߜs<{?g%y}??O{xg?>g?S9~^sy_Ο=?wݝ,~۟?Ooə???g?Lo̟??}O~y?iɨ??;ww?׶?o??{~ϻs?s???wOo>/?{/w??ӓ?~ɟ;??=ӟ?9?=w?gߧN\g?|ϟlw??3ɨ?????g3se)9?>o?}w<?g_|g>|??~?o%?{?o~?s?}O?_;wIܟI{:?3?=|s;??Ϲg?;{w󻿙9??|O?w/|߻gw\.{9~{6׀٧ɨ m????C~w?_ϧ?ϟ.?OO~~s?gϟ_|y77y_כv̟{Oo??$?o߿_?g/s7o?}y}9{~gߧ?w9'?>32ӷ9[|??_wgw{5ɨ!j?@gߟ|wy5??_;?=?o?y?y:}??;>z~?yl?r?ߓg{_ɟO?_9?_?f?_?7}}?yL?'?/'ɾ}?O?Y???s_w{ߧ=ɨ"c???{}ϓ?՜?oߟy77:ϟ??_|O~<Οsw9/??Nߗ|9?|_k??ys?O?7?~y?}߿O??s|=?Ϸz矟?>?gߧM?{:}3_?瓟?;7??_߿oL}}~i;?y9>sid?~|?>{4???>e{:ɨ%v??3?? ;'/{?~w?ys̟d͗?{ϧ}y|owogߜs<{?g%y}??O{xg?>g?S9~^sy_Ο=?wݝ,~۟?Ooə???g?Lo̟??}O~y?󟉊ɨ&??;ww?׶?o??{~ϻs?s???wOo>/?{/w??ӓ?~ɟ;??=ӟ?9?=w?gߧN\g?|ϟlw??3܊y' }jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURUUUUUUUUJUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURUUUUUUUUUUUUUUUUUUUUUUUUURUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUTUWUUUJUUUURRUUUJUJUuUuUUUW-j]UWTUUUUUUUuU)UUJRUU*TU+ꪩRU*]W}]UUJUU]uTWW*TTUUJRUUUʪJUUU*)UUUJUTUUUUUU]\U.U*U]RJUUWUUJUJUTUUUUUUTURUJU]UUUUUUUJJUUuUUUuUjꪪ.UWUUUU]UURUUUUUJꪪURUUUUꪥUUUUTUWUuuUUUUUURU]*UJUTUUUJ*WU*UUUUUUu^WUUuUU*UUUUUTJ]UURUUUU*ꪪꪪꪮUTUWUuUUUuUUUUUU*UZUTUWRUUUUU]R.WUUUURUUUUU]UUUUJ*UUUUUUJUUuUҪꪪUUU%UJ]VU*UWRUUW]**UTUT몪UJW*UUUUTUҪUUJ patool-1.4/tests/data/t.flac.foo000066400000000000000000001433301221117163600166070ustar00rootroot00000000000000fLaC"y+ BzbܷH2ĺJ,Yk?O?s???????9>?3y?̟>?O????ϟy??ϟ??'<3??O>I??Ny||??C3'?????????????g|????s?|g?yg????|ϟ???'?'????9????sϟ>?'Oy?4uYl??93??>?ϟ?y3???O?y?????9?93???<<3O???<9ϓ???9?~O??g?~?ϞNO'Cɟϓsϟ9?g'??|?ϙ?'?3|?'?????yϟ?g?9?|?gg??>|~sy?|?Cs|??N̟?3g???>sg?L??3O?3y???>3ϟ?'33?~||g???O?|gg~gg?ϟ?g>sϓ9?L><??g??<~?<?'3??g?XYw??gϟ?|?s??y??2gg???????ɟ??s>|?9???3?? ?s|???93???????<O?fss??>?~g??'g???~g???3g?3??ϟ??s Yy???s?9ϟϟ9<?|???9??|>~Ϝ?yg?3???f3>??''???|?'????$??'>'?'9??9?9|y'|??|@O?<|??>3s??&~3???????<~r'??s~???'???s3ϟ??ϙ?9?|'?N<??Y~???O??'<?????O???9?????|''~?y???3>????s?????9??93?ϟ?y3???O?y????????<<3O???<9ϓ???9?~O??Cg?<3'?9gy?s?~'?y??9y>?>O???3?9?y|'s?<9O?Ϟ|9?~?g?3???zY T?y??<>yIg9<3??>|?gg??>|~s?'???f??'O>?>s3<?L??3O???s???ɟ???y<????y?9g??s<=Y ]&gO??|ys??g9?>~gO?~????|gg~gg??ϟ?>sϓ9?L><??g??<~?<?'&Y Z???y??r??gϟ?|?s??y??2g~?9~y?yO?g?'O<s's????O̓?$??9~?>???|||9??=Y O33y?99ϟy???3s<'?????~<'s???????g??ϟ????9?O?ɟ??>?9??'??'?y??y??9??39gsϟ'??|?ssO<3'??3???yϟd~?yϟ??3???~??O@1Y H?'?????>Ny?<N??~?Oys3?3ϟg???>s?>9?ssy|~???9?s'???~O9????'??|ϟ?|?II?D<<O?<|??>3s??&~3???9??<~r'??s~???'???s3ϟ??ϙ?9*YA???|'???3?sO?s???????9>??s????9<'??$?????ϟy??ϟ??'<3@?????~?|9>s~?9ϟϟs??????3?g?'?????9?????g>s|~|???~sO3kYF?g9?<???~g?|y?>3?'g?OO??3??ϓs?>g?y???'??|<3????gyϟ?|'Oɟϓsϟ9?g'??|?ϙ?'?3|?'???ϟsO'gL?Oy????ϟ???>yϟ?g?9?O??|y??<>yIg9<3??>|?gg??>|~s?>s3<9?s~??$3y???>3ϟ?'3Y'y3?~~gO?~????|?3ϓ?9??>L??93????'??s?C~?<?'3??g?ϟN???????f????g?????$s???y?~?93>y?ϟ????$???9?f~?????'~????'|?'3yy>??ϟ??><?3<'y<~>g?>3|>|?????|???|?fg???|?ssO?9???3????s?9ϟϟ9<?|???9??|>~?|ϟϟ~'?3??g?<~O???|?'????$??'???<<O?<|??>332g>????9??<~r'??s~???'???sY?|?II???|'???3?sO?s???????'O??>?s????9<'??$?????ϟy?93ϟ??ϙ?9?|'?N<???????3OI????O???3?g?'|?yO9ϟy~'?O?D|~|???~sO3?33O9>?s?9???r??s~rs?rs??'|?'?????|?Y?9?~||?>s$??????3>I????s~~~~s?|9?~?g?3??????s|???>?'???f??'O>?>s3<9?s~??$3y???>i Y#'~yy?????g??O?9??g?ϙ?y???>y?|?9O|?????????>?'?<>?~?ϟ????'??O@3ϟ?'33?~||g???O?|gsϓ9?L|Y$33??ɟy??????y??r??gϟ?|?s~s?9?>~y&>|?O??~|?y??~?'??????ɟ??~?9~y?yO?g??~???O?NY-?s??9?f~??y332?'????'|?'3yy>?y??3'??ϟ9?????9?ϟ???ϟ?'?ϟ?pY*???ϟ?rg&|??Or>??Oys3?3ϟg???>s?>9?ssyOϟ|?????|ϟ??>O9?s?|??O????9??~O39???gg3Y?9???ϟ????39???9?????<?9???????9>?3y?̟>?Oϟs???'???s3ϟ??ϙ?9?|'?N<???????3Oϟs??????3?g?'|?yO9ϟy~'?????3?>s9O̜??'?3~gO?y9?'?9??3~ϟ???O?s?g?sLy?????<|@y?'??9??y?y9?????39??<g?<3'?9gy?sg'??>gO?3??9?y|'s?<9SY1??~>O?9?~||?>s$??????3>I??C>?9ɟϟ??y?yϟ'??>?~?3????|0|??N̟?3g???>sg?L??3O???s???Y6'??s??|ϟg~gg?ϟ?g3??>OY ?Oy????d3??ɟy??????y??r??gϟ????|3?~s?9?>~y&>|?O??~|?y??~?'???@?9??>L??93?~?9~y?<~g???~???O????|||9???'??'?y??y??9?|>|?????|???|?fg????????9>3'??3???yY"?9???3????sϟ??'|sgg3|ϟϟ~'?3??g?<~O???|?Bg??'g???~g???3g?3??ϟ??s???????????????ϟ?|ɟ??<?y?y#jUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTUU*UUUtTUWҪUU]UUURUUU]UU]RꪪuҪWUUUUU]UUUUWUUUUUUwUUtUUjUUUUtUUrҪuUUUUUUURUUUT]UU\uUʾUWʪUUUUrꪪUU]U)URRUUUUU%UTUUUUUWUUUUU*.UUUUVUU]UjUUUU]U*UU*UW*uUU]URUW]UTUUUJUU]jU*U.ꪪUU]UUUUPpatool-1.4/tests/data/t.flac.wav000066400000000000000000023654541221117163600166400ustar00rootroot00000000000000RIFF$ WAVEfmt Ddata patool-1.4/tests/data/t.iso000066400000000000000000013400001221117163600157040ustar00rootroot00000000000000CD001LINUX CDROM "q 0 GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM 2013022713492300201302271349230000000000000000002013022713492300 CD001LINUX CDROM %/E"q 0 GENISOIMAGE ISO 9660_HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE 2013022713492300201302271349230000000000000000002013022713492300 CD001TTttq 0SPRRPX$mAAmTFq 0q /9q 0CE fq 1RRPX$mAAmTFq 1q 1q 1lq 0TRRNMtPX$mAAmTFq 0q 0q 0fq 0RRPX$mAAmTFq 0q 0q 0fq 0RRPX$mAAmTFq 0q /9q 0v!!q 0T.TXT;1RRNM t.txtPX$$$TFq 0q 0q 0"q 0"q 1$q 0t"q 0"q 0,!!q 0 t.txtER TRRIP_1991ATHE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICSPLEASE CONTACT DISC PUBLISHER FOR SPECIFICATION SOURCE. SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION.42patool-1.4/tests/data/t.iso.foo000066400000000000000000013400001221117163600164660ustar00rootroot00000000000000CD001LINUX CDROM "q 0 GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM 2013022713492300201302271349230000000000000000002013022713492300 CD001LINUX CDROM %/E"q 0 GENISOIMAGE ISO 9660_HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE 2013022713492300201302271349230000000000000000002013022713492300 CD001TTttq 0SPRRPX$mAAmTFq 0q /9q 0CE fq 1RRPX$mAAmTFq 1q 1q 1lq 0TRRNMtPX$mAAmTFq 0q 0q 0fq 0RRPX$mAAmTFq 0q 0q 0fq 0RRPX$mAAmTFq 0q /9q 0v!!q 0T.TXT;1RRNM t.txtPX$$$TFq 0q 0q 0"q 0"q 1$q 0t"q 0"q 0,!!q 0 t.txtER TRRIP_1991ATHE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICSPLEASE CONTACT DISC PUBLISHER FOR SPECIFICATION SOURCE. SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION.42patool-1.4/tests/data/t.jar000066400000000000000000000006771221117163600157020ustar00rootroot00000000000000PK T< META-INF/PK T<k:((META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.98 PK <>S<t/PK >S<1)t/t.txt31PK T< META-INF/PK T<k:(('META-INF/MANIFEST.MFPK <>S<t/PK >S<1)t/t.txtPKpatool-1.4/tests/data/t.jar.foo000066400000000000000000000006771221117163600164640ustar00rootroot00000000000000PK T< META-INF/PK T<k:((META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.98 PK <>S<t/PK >S<1)t/t.txt31PK T< META-INF/PK T<k:(('META-INF/MANIFEST.MFPK <>S<t/PK >S<1)t/t.txtPKpatool-1.4/tests/data/t.lha000066400000000000000000000001561221117163600156620ustar00rootroot00000000000000.-lhd-<>S< UPAQtT4~K-lh0->S< t.txtUPQtTZ4~K42patool-1.4/tests/data/t.lha.foo000066400000000000000000000001561221117163600164440ustar00rootroot00000000000000.-lhd-<>S< UPAQtT4~K-lh0->S< t.txtUPQtTZ4~K42patool-1.4/tests/data/t.lzh000066400000000000000000000001571221117163600157140ustar00rootroot00000000000000.-lhd-<>S< UPAQtT4~Ke-lh0->S< t.txtԩUPQtTZ4~K42 patool-1.4/tests/data/t.rar000066400000000000000000000001561221117163600157020ustar00rootroot00000000000000Rar!ϐs lt ' $2>S<3t\t.txt Ğ6Zct!<>S<0At={@patool-1.4/tests/data/t.rar.foo000066400000000000000000000001561221117163600164640ustar00rootroot00000000000000Rar!ϐs lt ' $2>S<3t\t.txt Ğ6Zct!<>S<0At={@patool-1.4/tests/data/t.rpm000066400000000000000000000240601221117163600157140ustar00rootroot00000000000000glusterfs-client-2.0.6-2.fc12>t  DH`pJ™֝HW̺ugZ'OԢd1Ɓ8*@t7O 2BeF}>n:ۼ%QٴFrR:| )=Xxؓ-x3פ*Òj;LpDq #tqUbG?rs i vu3Hh߇[ec[p ~TS㵋1s2کW,Zץ  6ҶXM'cQ_@O{6>gD&3^Ir@ag{ؚsAQԱBo7?bΉ~ļeP261~\gG잛߿t끒HМ?R[r u& a Z𬔬j.}dܒzzSsO1d6i6#hl] a|=}tƕzkEhInEFÇ2Y`LNR)2ڶBis̽08a1c655dae712fcf640bf97c0439f5168eac5c8"ȉJ™֝HW̺'Zq0gw~=ݫV(q+ G%Ky1<gqfq< HY_rP.8.$ ki4ScSx ZnȌ@Id)6_CK{蓵`m 7{ 5*=_ja8IJsKyV;DFq,G0ML l,i|;[Yf(3\ʟ$v&\|lm9:vw8_BH?VzR]@>^ :2a Z3R̥pMH1#I{ޫg*TFb˴9`@IlvEC$fz\)8Sk6l|1H j}JiPewq=e$1-lv|5;'f#ЮW[A.hrjD N*0!swFڲh5O%ӂΜ}gs$H`43]_]E.7hLoKI(0ȽM]fJ>9x?hd  1$(DHM\c r     0P("8(9: vGHIXY\]^b0defltuvwDxPy\dCglusterfs-client2.0.62.fc12GlusterFS ClientGlusterFS is a clustered file-system capable of scaling to several peta-bytes. It aggregates various storage bricks over Infiniband RDMA or TCP/IP interconnect into one large parallel network file system. GlusterFS is one of the most sophisticated file system in terms of features and extensibility. It borrows a powerful concept called Translators from GNU Hurd kernel. Much of the code in GlusterFS is in userspace and easily manageable. This package provides the FUSE based GlusterFS client.Jx86-6.fedora.phx.redhat.comKojiFedora ProjectGPLv3+Fedora ProjectApplications/Filehttp://www.gluster.org/linuxi686I#JJ3Zf1635224f5d446e31c426e5da936b9657c63a7c359f2e82789fbc98ec1c439217507641ee21064549da9def6b3a0efaaf6f45bdb3b1ff1b5a0ad25c192ee5d705d417e84fea3cf4f39fdd2c7e8a780ba255e861abdf3d14e699395101a423efdrootrootrootrootrootrootglusterfs-2.0.6-2.fc12.src.rpmconfig(glusterfs-client)glusterfs-clientglusterfs-client(x86-32)@    /bin/shconfig(glusterfs-client)fuseglusterfs-commonrpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)2.0.6-2.fc122.0.6-2.fc123.0.4-14.6.0-14.0-15.2-14.7.1J$J@JmJ0JJ@IA@III@I@IU@IU@H4@H-w@H$ 2.0.6-2Matthias Saou 2.0.6-1Matthias Saou 2.0.4-1Matthias Saou 2.0.1-2Matthias Saou 2.0.1-1Matthias Saou 2.0.0-1Matthias Saou 2.0.0-0.3.rc8Matthias Saou 2.0.0-0.2.rc8Matthias Saou 2.0.0-0.2.rc7Matthias Saou 2.0.0-0.1.rc7Fedora Release Engineering Matthias Saou 2.0.0-0.1.rc1Matthias Saou 1.3.12-1Matthias Saou 1.3.10-1Matthias Saou 1.3.9-1Matthias Saou 1.3.8-1Matthias Saou 1.3.8-0.10Matthias Saou 1.3.8-0.9Matthias Saou 1.3.8-0.8Matthias Saou 1.3.8-0.7Matthias Saou 1.3.8-0.6Matthias Saou 1.3.8-0.5Matthias Saou 1.3.8-0.4Matthias Saou 1.3.8-0.3Matthias Saou 1.3.8-0.1Matthias Saou 1.3.7-6Matthias Saou 1.3.7-4Matthias Saou 1.3.7-3Matthias Saou 1.3.7-1Matt Paine - 1.3.pre7Matt Paine - 1.3.pre6- Rebuilt with new fuse- Update to 2.0.6. - No longer default to disable the client on RHEL5 (#522192). - Update spec file URLs.- Update to 2.0.4.- Remove libglusterfs/src/y.tab.c to fix koji F11/devel builds.- Update to 2.0.1.- Update to 2.0.0 final.- Move glusterfsd to common, since the client has a symlink to it.- Update to 2.0.0rc8.- Update glusterfsd init script to the new style init. - Update files to match the new default vol file names. - Include logrotate for glusterfsd, use a pid file by default. - Include logrotate for glusterfs, using killall for lack of anything better.- Update to 2.0.0rc7. - Rename "libs" to "common" and move the binary, man page and log dir there.- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild- Update to 2.0.0rc1. - Include new libglusterfsclient.h.- Update to 1.3.12. - Remove no longer needed ocreat patch.- Update to 1.3.10. - Remove mount patch, it's been included upstream now.- Update to 1.3.9.- Update to 1.3.8 final.- Include short patch to include fixes from latest TLA 751.- Update to 1.3.8pre6. - Include glusterfs binary in both the client and server packages, now that glusterfsd is a symlink to it instead of a separate binary.- Add python version check and disable bindings for version < 2.4.- Add --without client rpmbuild option, make it the default for RHEL (no fuse). (I hope "rhel" is the proper default macro name, couldn't find it...)- Add --without ibverbs rpmbuild option to the package.- Update to current TLA again, patch-636 which fixes the known segfaults.- Downgrade to glusterfs--mainline--2.5--patch-628 which is more stable.- Update to current TLA snapshot. - Include umount.glusterfs wrapper script (really needed? dunno). - Include patch to mount wrapper to avoid multiple identical mounts.- Update to current TLA snapshot, which includes "volume-name=" fstab option.- Re-add the /var/log/glusterfs directory in the client sub-package (required). - Include custom patch to support vol= in fstab for -n glusterfs client option.- Re-enable libibverbs. - Check and update License field to GPLv3+. - Add glusterfs-common obsoletes, to provide upgrade path from old packages. - Include patch to add mode to O_CREATE opens.- Remove Makefile* files from examples. - Include RHEL/Fedora type init script, since the included ones don't do.- Major spec file cleanup. - Add misssing %clean section. - Fix ldconfig calls (weren't set for the proper sub-package).- Added support to build rpm without ibverbs support (use --without ibverbs switch)- Initial spec file   fH]2.0.6-2.fc122.0.6-2.fc122.0.6-2.fc12glusterfsmount.glusterfsumount.glusterfs/etc/logrotate.d//sbin/-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tablescpioxz7i686-redhat-linux-gnuASCII textPOSIX shell script text executabledirectoryRR?p7zXZ !GX:CU] c!b$+F>qN.DI(} ΅xXZ Ų2X4 +"\:߀'uKMxf4 Bh9k07LM iZp\|!wϏK.W}D,wN?ԭP> t]Hw֥Sy F^VjH%!򯋽9[T+g'b2b\BH S(-o{k!WuU7Qd!.oq"L噽^x|3[>UF˙('% Vr`_.aNypyF\Q?t^ 8ۜh/vE39! 6I_5wVm  96dBŃ'6$BXҹrܐ[@ _hH$Mz'g ^Zr&sI!I.B0h>)-ȶv9[U̇#5+'͏pL,Iݼz'*E6Z}QĮ1(X8 ukoz_Ԫh' Ɣt.iot gAέ244oV $ɪ03lm{-\nMb isWP}n/1ȚUdU;Sj_㗃͞`! n6iñۢ~,{k)Κ𤦆1:SXוhGsIZvyhrt_+(0T$4{x4&$f*a+ly?D*up i9 =i#|a%\I}e,&iȣ@rr); %{+ɣcNz?vL\wJmE(.'p\I8B n eU7CTr)? Ǎuե-=7Yb_ah<f6NPO?KP*tBP臭3l\{bjUgEʥ[ 9WCOR 1Q1xHR"'PO?LDJ@qCO &D`]aݓ^J=4ۭ>樾ㄈ%SޱaNNGk.#-s *} yUCIr>"40ds͙ЌyaI22x^1©VV*6R47eY/:eB-_ !(w`S@td!!Y0boξ#1 vq&A^ԊDBo#,bG /K YZpatool-1.4/tests/data/t.rpm.foo000066400000000000000000000240601221117163600164760ustar00rootroot00000000000000glusterfs-client-2.0.6-2.fc12>t  DH`pJ™֝HW̺ugZ'OԢd1Ɓ8*@t7O 2BeF}>n:ۼ%QٴFrR:| )=Xxؓ-x3פ*Òj;LpDq #tqUbG?rs i vu3Hh߇[ec[p ~TS㵋1s2کW,Zץ  6ҶXM'cQ_@O{6>gD&3^Ir@ag{ؚsAQԱBo7?bΉ~ļeP261~\gG잛߿t끒HМ?R[r u& a Z𬔬j.}dܒzzSsO1d6i6#hl] a|=}tƕzkEhInEFÇ2Y`LNR)2ڶBis̽08a1c655dae712fcf640bf97c0439f5168eac5c8"ȉJ™֝HW̺'Zq0gw~=ݫV(q+ G%Ky1<gqfq< HY_rP.8.$ ki4ScSx ZnȌ@Id)6_CK{蓵`m 7{ 5*=_ja8IJsKyV;DFq,G0ML l,i|;[Yf(3\ʟ$v&\|lm9:vw8_BH?VzR]@>^ :2a Z3R̥pMH1#I{ޫg*TFb˴9`@IlvEC$fz\)8Sk6l|1H j}JiPewq=e$1-lv|5;'f#ЮW[A.hrjD N*0!swFڲh5O%ӂΜ}gs$H`43]_]E.7hLoKI(0ȽM]fJ>9x?hd  1$(DHM\c r     0P("8(9: vGHIXY\]^b0defltuvwDxPy\dCglusterfs-client2.0.62.fc12GlusterFS ClientGlusterFS is a clustered file-system capable of scaling to several peta-bytes. It aggregates various storage bricks over Infiniband RDMA or TCP/IP interconnect into one large parallel network file system. GlusterFS is one of the most sophisticated file system in terms of features and extensibility. It borrows a powerful concept called Translators from GNU Hurd kernel. Much of the code in GlusterFS is in userspace and easily manageable. This package provides the FUSE based GlusterFS client.Jx86-6.fedora.phx.redhat.comKojiFedora ProjectGPLv3+Fedora ProjectApplications/Filehttp://www.gluster.org/linuxi686I#JJ3Zf1635224f5d446e31c426e5da936b9657c63a7c359f2e82789fbc98ec1c439217507641ee21064549da9def6b3a0efaaf6f45bdb3b1ff1b5a0ad25c192ee5d705d417e84fea3cf4f39fdd2c7e8a780ba255e861abdf3d14e699395101a423efdrootrootrootrootrootrootglusterfs-2.0.6-2.fc12.src.rpmconfig(glusterfs-client)glusterfs-clientglusterfs-client(x86-32)@    /bin/shconfig(glusterfs-client)fuseglusterfs-commonrpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)2.0.6-2.fc122.0.6-2.fc123.0.4-14.6.0-14.0-15.2-14.7.1J$J@JmJ0JJ@IA@III@I@IU@IU@H4@H-w@H$ 2.0.6-2Matthias Saou 2.0.6-1Matthias Saou 2.0.4-1Matthias Saou 2.0.1-2Matthias Saou 2.0.1-1Matthias Saou 2.0.0-1Matthias Saou 2.0.0-0.3.rc8Matthias Saou 2.0.0-0.2.rc8Matthias Saou 2.0.0-0.2.rc7Matthias Saou 2.0.0-0.1.rc7Fedora Release Engineering Matthias Saou 2.0.0-0.1.rc1Matthias Saou 1.3.12-1Matthias Saou 1.3.10-1Matthias Saou 1.3.9-1Matthias Saou 1.3.8-1Matthias Saou 1.3.8-0.10Matthias Saou 1.3.8-0.9Matthias Saou 1.3.8-0.8Matthias Saou 1.3.8-0.7Matthias Saou 1.3.8-0.6Matthias Saou 1.3.8-0.5Matthias Saou 1.3.8-0.4Matthias Saou 1.3.8-0.3Matthias Saou 1.3.8-0.1Matthias Saou 1.3.7-6Matthias Saou 1.3.7-4Matthias Saou 1.3.7-3Matthias Saou 1.3.7-1Matt Paine - 1.3.pre7Matt Paine - 1.3.pre6- Rebuilt with new fuse- Update to 2.0.6. - No longer default to disable the client on RHEL5 (#522192). - Update spec file URLs.- Update to 2.0.4.- Remove libglusterfs/src/y.tab.c to fix koji F11/devel builds.- Update to 2.0.1.- Update to 2.0.0 final.- Move glusterfsd to common, since the client has a symlink to it.- Update to 2.0.0rc8.- Update glusterfsd init script to the new style init. - Update files to match the new default vol file names. - Include logrotate for glusterfsd, use a pid file by default. - Include logrotate for glusterfs, using killall for lack of anything better.- Update to 2.0.0rc7. - Rename "libs" to "common" and move the binary, man page and log dir there.- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild- Update to 2.0.0rc1. - Include new libglusterfsclient.h.- Update to 1.3.12. - Remove no longer needed ocreat patch.- Update to 1.3.10. - Remove mount patch, it's been included upstream now.- Update to 1.3.9.- Update to 1.3.8 final.- Include short patch to include fixes from latest TLA 751.- Update to 1.3.8pre6. - Include glusterfs binary in both the client and server packages, now that glusterfsd is a symlink to it instead of a separate binary.- Add python version check and disable bindings for version < 2.4.- Add --without client rpmbuild option, make it the default for RHEL (no fuse). (I hope "rhel" is the proper default macro name, couldn't find it...)- Add --without ibverbs rpmbuild option to the package.- Update to current TLA again, patch-636 which fixes the known segfaults.- Downgrade to glusterfs--mainline--2.5--patch-628 which is more stable.- Update to current TLA snapshot. - Include umount.glusterfs wrapper script (really needed? dunno). - Include patch to mount wrapper to avoid multiple identical mounts.- Update to current TLA snapshot, which includes "volume-name=" fstab option.- Re-add the /var/log/glusterfs directory in the client sub-package (required). - Include custom patch to support vol= in fstab for -n glusterfs client option.- Re-enable libibverbs. - Check and update License field to GPLv3+. - Add glusterfs-common obsoletes, to provide upgrade path from old packages. - Include patch to add mode to O_CREATE opens.- Remove Makefile* files from examples. - Include RHEL/Fedora type init script, since the included ones don't do.- Major spec file cleanup. - Add misssing %clean section. - Fix ldconfig calls (weren't set for the proper sub-package).- Added support to build rpm without ibverbs support (use --without ibverbs switch)- Initial spec file   fH]2.0.6-2.fc122.0.6-2.fc122.0.6-2.fc12glusterfsmount.glusterfsumount.glusterfs/etc/logrotate.d//sbin/-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tablescpioxz7i686-redhat-linux-gnuASCII textPOSIX shell script text executabledirectoryRR?p7zXZ !GX:CU] c!b$+F>qN.DI(} ΅xXZ Ų2X4 +"\:߀'uKMxf4 Bh9k07LM iZp\|!wϏK.W}D,wN?ԭP> t]Hw֥Sy F^VjH%!򯋽9[T+g'b2b\BH S(-o{k!WuU7Qd!.oq"L噽^x|3[>UF˙('% Vr`_.aNypyF\Q?t^ 8ۜh/vE39! 6I_5wVm  96dBŃ'6$BXҹrܐ[@ _hH$Mz'g ^Zr&sI!I.B0h>)-ȶv9[U̇#5+'͏pL,Iݼz'*E6Z}QĮ1(X8 ukoz_Ԫh' Ɣt.iot gAέ244oV $ɪ03lm{-\nMb isWP}n/1ȚUdU;Sj_㗃͞`! n6iñۢ~,{k)Κ𤦆1:SXוhGsIZvyhrt_+(0T$4{x4&$f*a+ly?D*up i9 =i#|a%\I}e,&iȣ@rr); %{+ɣcNz?vL\wJmE(.'p\I8B n eU7CTr)? Ǎuե-=7Yb_ah<f6NPO?KP*tBP臭3l\{bjUgEʥ[ 9WCOR 1Q1xHR"'PO?LDJ@qCO &D`]aݓ^J=4ۭ>樾ㄈ%SޱaNNGk.#-s *} yUCIr>"40ds͙ЌyaI22x^1©VV*6R47eY/:eB-_ !(w`S@td!!Y0boξ#1 vq&A^ԊDBo#,bG /K YZpatool-1.4/tests/data/t.shar000066400000000000000000000067631221117163600160650ustar00rootroot00000000000000#!/bin/sh # This is a shell archive (produced by GNU sharutils 4.11). # To extract the files from this archive, save it to some FILE, remove # everything before the `#!/bin/sh' line above, then type `sh FILE'. # lock_dir=_sh09682 # # Existing files will *not* be overwritten, unless `-c' is specified. # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 2 -rw-r--r-- t.txt # MD5SUM=${MD5SUM-md5sum} f=`${MD5SUM} --version | egrep '^md5sum .*(core|text)utils'` test -n "${f}" && md5check=true || md5check=false ${md5check} || \ echo 'Note: not verifying md5sums. Consider installing GNU coreutils.' if test "X$1" = "X-c" then keep_file='' else keep_file=true fi echo=echo save_IFS="${IFS}" IFS="${IFS}:" gettext_dir= locale_dir= set_echo=false for dir in $PATH do if test -f $dir/gettext \ && ($dir/gettext --version >/dev/null 2>&1) then case `$dir/gettext --version 2>&1 | sed 1q` in *GNU*) gettext_dir=$dir set_echo=true break ;; esac fi done if ${set_echo} then set_echo=false for dir in $PATH do if test -f $dir/shar \ && ($dir/shar --print-text-domain-dir >/dev/null 2>&1) then locale_dir=`$dir/shar --print-text-domain-dir` set_echo=true break fi done if ${set_echo} then TEXTDOMAINDIR=$locale_dir export TEXTDOMAINDIR TEXTDOMAIN=sharutils export TEXTDOMAIN echo="$gettext_dir/gettext -s" fi fi IFS="$save_IFS" if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null then if (echo -n test; echo 1,2,3) | grep n >/dev/null then shar_n= shar_c=' ' else shar_n=-n shar_c= ; fi else shar_n= shar_c='\c' ; fi f=shar-touch.$$ st1=200112312359.59 st2=123123592001.59 st2tr=123123592001.5 # old SysV 14-char limit st3=1231235901 if touch -am -t ${st1} ${f} >/dev/null 2>&1 && \ test ! -f ${st1} && test -f ${f}; then shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"' elif touch -am ${st2} ${f} >/dev/null 2>&1 && \ test ! -f ${st2} && test ! -f ${st2tr} && test -f ${f}; then shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"' elif touch -am ${st3} ${f} >/dev/null 2>&1 && \ test ! -f ${st3} && test -f ${f}; then shar_touch='touch -am $3$4$5$6$2 "$8"' else shar_touch=: echo ${echo} 'WARNING: not restoring timestamps. Consider getting and installing GNU `touch'\'', distributed in GNU coreutils...' echo fi rm -f ${st1} ${st2} ${st2tr} ${st3} ${f} # if test ! -d ${lock_dir} ; then : else ${echo} "lock directory ${lock_dir} exists" exit 1 fi if mkdir ${lock_dir} then ${echo} "x - created lock directory ${lock_dir}." else ${echo} "x - failed to create lock directory ${lock_dir}." exit 1 fi # ============= t.txt ============== if test -n "${keep_file}" && test -f 't.txt' then ${echo} "x - SKIPPING t.txt (file already exists)" else ${echo} "x - extracting t.txt (binary)" sed 's/^X//' << 'SHAR_EOF' | uudecode && begin 600 t.txt "-#)B ` end SHAR_EOF (set 20 12 05 25 20 11 37 't.txt' eval "${shar_touch}") && \ chmod 0644 't.txt' if test $? -ne 0 then ${echo} "restore of t.txt failed" fi if ${md5check} then ( ${MD5SUM} -c >/dev/null 2>&1 || ${echo} 't.txt': 'MD5 check failed' ) << \SHAR_EOF a1d0c6e83f027327d8461063f4ac58a6 t.txt SHAR_EOF else test `LC_ALL=C wc -c < 't.txt'` -ne 2 && \ ${echo} "restoration warning: size of 't.txt' is not 2" fi fi if rm -fr ${lock_dir} then ${echo} "x - removed lock directory ${lock_dir}." else ${echo} "x - failed to remove lock directory ${lock_dir}." exit 1 fi exit 0 patool-1.4/tests/data/t.shn000066400000000000000000000017551221117163600157140ustar00rootroot00000000000000ajkgrJIQPAQlۤ!@ 0 @1 @,q@UUETUuGUUUUUUUUUUUUUWTUUUUUUUUUUUUURUUUUUUUUUUUUUUUUUUUU*UUUUUWU*ꪩUUUUUUUUUUUUUUUUUbU*UuUUU]UUUUUUUUUUUUUUUUUUUUUUUUUUUURꪪUWUUUUV*UUWUUJUUUUUUUU*UUTUP*!!aB!p!f!AXB 5BBBB!@^f B!r @Є! B(B?B!B!!Z !B!N!(Bb !9B3B!BfHBzBB DD@DD@&"" "  \D@LDDTDDDD@   "" "" "|DDTDD2"""" lDA1DD@ȈT:@UUPUP@U@TUPU@UU:TU@*ꢪU@UEUꀪUU*jN努UQU]QGTUPUJꎪuCUU RN*uGU:UPUUISEEK<UhSHNAMPSKpatool-1.4/tests/data/t.tar000066400000000000000000000240001221117163600156760ustar00rootroot00000000000000t/0000750000175000017500000000000011337432224010627 5ustar calvincalvint/t.txt0000640000175000017500000000000211337432132011622 0ustar calvincalvin42patool-1.4/tests/data/t.tar.Z000066400000000000000000000004341221117163600161130ustar00rootroot00000000000000t^H*\ȰC0"¸Q1(ZĨďĈ1c 3dq1 2nQ͛8sPg0r@0& ;iL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟Opatool-1.4/tests/data/t.tar.Z.foo000066400000000000000000000004341221117163600166750ustar00rootroot00000000000000t^H*\ȰC0"¸Q1(ZĨďĈ1c 3dq1 2nQ͛8sPg0r@0& ;iL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟Opatool-1.4/tests/data/t.tar.bz2000066400000000000000000000002301221117163600163710ustar00rootroot00000000000000BZh91AY&SY@!h%@ !4MɴB 6L'3&U !PYAh& $2sQΪ,5gEq ±M@ĉKN̊tG9j3@\]BB`patool-1.4/tests/data/t.tar.bz2.foo000066400000000000000000000002301221117163600171530ustar00rootroot00000000000000BZh91AY&SY@!h%@ !4MɴB 6L'3&U !PYAh& $2sQΪ,5gEq ±M@ĉKN̊tG9j3@\]BB`patool-1.4/tests/data/t.tar.foo000066400000000000000000000240001221117163600164600ustar00rootroot00000000000000t/0000750000175000017500000000000011337432224010627 5ustar calvincalvint/t.txt0000640000175000017500000000000211337432132011622 0ustar calvincalvin42patool-1.4/tests/data/t.tar.gz000066400000000000000000000002251221117163600163200ustar00rootroot00000000000000ȕOA 1 'pӞgp% u! oEybtF]=1˹EԴz4&r<ĴOI={Q1*Rp-{}ߪ$/>um(patool-1.4/tests/data/t.tar.gz.foo000066400000000000000000000002251221117163600171020ustar00rootroot00000000000000ȕOA 1 'pӞgp% u! oEybtF]=1˹EԴz4&r<ĴOI={Q1*Rp-{}ߪ$/>um(patool-1.4/tests/data/t.tar.lz000066400000000000000000000002461221117163600163300ustar00rootroot00000000000000LZIP: 4D)S+11z*Atdx~ո\ oiX:{u" +&I/'Ft1ck 6( ,g[A§f3P7LJb/{41(/ۋ@q(patool-1.4/tests/data/t.tar.lz.foo000066400000000000000000000002461221117163600171120ustar00rootroot00000000000000LZIP: 4D)S+11z*Atdx~ո\ oiX:{u" +&I/'Ft1ck 6( ,g[A§f3P7LJb/{41(/ۋ@q(patool-1.4/tests/data/t.tar.lzma000066400000000000000000000002361221117163600166450ustar00rootroot00000000000000]: 4DᷖGXJxK αvcP,3Xd9HR)dr.q7M{ϩi(yZ9R݉r\kgKhC%蟆)3os.um(patool-1.4/tests/data/t.taz.foo000066400000000000000000000002251221117163600164730ustar00rootroot00000000000000ȕOA 1 'pӞgp% u! oEybtF]=1˹EԴz4&r<ĴOI={Q1*Rp-{}ߪ$/>um(patool-1.4/tests/data/t.tbz2000066400000000000000000000002301221117163600157700ustar00rootroot00000000000000BZh91AY&SY@!h%@ !4MɴB 6L'3&U !PYAh& $2sQΪ,5gEq ±M@ĉKN̊tG9j3@\]BB`patool-1.4/tests/data/t.tbz2.foo000066400000000000000000000002301221117163600165520ustar00rootroot00000000000000BZh91AY&SY@!h%@ !4MɴB 6L'3&U !PYAh& $2sQΪ,5gEq ±M@ĉKN̊tG9j3@\]BB`patool-1.4/tests/data/t.tgz000066400000000000000000000002251221117163600157170ustar00rootroot00000000000000ȕOA 1 'pӞgp% u! oEybtF]=1˹EԴz4&r<ĴOI={Q1*Rp-{}ߪ$/>um(patool-1.4/tests/data/t.tgz.foo000066400000000000000000000002251221117163600165010ustar00rootroot00000000000000ȕOA 1 'pӞgp% u! oEybtF]=1˹EԴz4&r<ĴOI={Q1*Rp-{}ߪ$/>um(patool-1.4/tests/data/t.txt000066400000000000000000000000021221117163600157230ustar00rootroot0000000000000042patool-1.4/tests/data/t.txt.Z000066400000000000000000000000061221117163600161370ustar00rootroot000000000000004dpatool-1.4/tests/data/t.txt.Z.foo000066400000000000000000000000061221117163600167210ustar00rootroot000000000000004dpatool-1.4/tests/data/t.txt.a000066400000000000000000000001061221117163600161470ustar00rootroot00000000000000! t.txt 1338145476 501 20 100640 2 ` 42patool-1.4/tests/data/t.txt.a.foo000066400000000000000000000001061221117163600167310ustar00rootroot00000000000000! t.txt 1338145476 501 20 100640 2 ` 42patool-1.4/tests/data/t.txt.bz2000066400000000000000000000000451221117163600164260ustar00rootroot00000000000000BZh91AY&SYW.A !w$S rpatool-1.4/tests/data/t.txt.bz2.foo000066400000000000000000000000451221117163600172100ustar00rootroot00000000000000BZh91AY&SYW.A !w$S rpatool-1.4/tests/data/t.txt.gz000066400000000000000000000000341221117163600163470ustar00rootroot00000000000000ɗOt.txt31$2patool-1.4/tests/data/t.txt.gz.foo000066400000000000000000000000341221117163600171310ustar00rootroot00000000000000ɗOt.txt31$2patool-1.4/tests/data/t.txt.lrz000066400000000000000000000001071221117163600165370ustar00rootroot00000000000000LRZI ws42?s'FcXpatool-1.4/tests/data/t.txt.lrz.foo000066400000000000000000000001071221117163600173210ustar00rootroot00000000000000LRZI ws42?s'FcXpatool-1.4/tests/data/t.txt.lz000066400000000000000000000000461221117163600163570ustar00rootroot00000000000000LZIP  $2&patool-1.4/tests/data/t.txt.lz.foo000066400000000000000000000000461221117163600171410ustar00rootroot00000000000000LZIP  $2&patool-1.4/tests/data/t.txt.lzma000066400000000000000000000000311221117163600166670ustar00rootroot00000000000000] patool-1.4/tests/data/t.txt.lzma.foo000066400000000000000000000000311221117163600174510ustar00rootroot00000000000000] patool-1.4/tests/data/t.txt.lzo000066400000000000000000000000751221117163600165400ustar00rootroot00000000000000LZO  0 ` @PITt.txtJg42patool-1.4/tests/data/t.txt.lzo.foo000066400000000000000000000000751221117163600173220ustar00rootroot00000000000000LZO  0 ` @PITt.txtJg42patool-1.4/tests/data/t.txt.rz000066400000000000000000000001301221117163600163570ustar00rootroot00000000000000RZIP1 ws42patool-1.4/tests/data/t.txt.rz.foo000066400000000000000000000001301221117163600171410ustar00rootroot00000000000000RZIP1 ws42patool-1.4/tests/data/t.txt.xz000066400000000000000000000000741221117163600163740ustar00rootroot000000000000007zXZִF!t/42ro].~}YZpatool-1.4/tests/data/t.txt.xz.foo000066400000000000000000000000741221117163600171560ustar00rootroot000000000000007zXZִF!t/42ro].~}YZpatool-1.4/tests/data/t.wav000066400000000000000000000077441221117163600157250ustar00rootroot00000000000000RIFFWAVEfmt DXdata !!!!!!11111$$$$$$''''' ::::::^^^^^]]]]]]AAAAA]]]]]nnnnnn>>>>>``````hhhhh111111AAAAAwwwwwwbbbbbiiiiiiyyyyy444444UUUUUUmmmmm888888JJJJJ______))))) GGGGGGGGGGG======((((( ))))),,,,,,,,,,,*****!!!!!!     patool-1.4/tests/data/t.zip000066400000000000000000000003021221117163600157110ustar00rootroot00000000000000PK. import unittest import patoolib class TestConfiguration (unittest.TestCase): def test_archive_mimetypes (self): # test that each format has a MIME type self.assertEqual(set(patoolib.ArchiveFormats), set(patoolib.ArchiveMimetypes.values())) def test_archive_programs (self): # test that the key is an archive format self.assertEqual(set(patoolib.ArchiveFormats), set(patoolib.ArchivePrograms.keys())) for commands in patoolib.ArchivePrograms.values(): for command in commands: if command is not None: self.assertTrue(command in patoolib.ArchiveCommands) def test_compression_programs (self): self.assertTrue(set(patoolib.ArchiveCompressions).issubset( set(patoolib.ArchiveFormats))) def test_encoding_mimes (self): self.assertEqual(set(patoolib.ArchiveCompressions), set(patoolib.util.Encoding2Mime.keys())) for mime in patoolib.util.Encoding2Mime.values(): self.assertTrue(mime in patoolib.ArchiveMimetypes) def test_filetext_mime (self): for mime in patoolib.util.FileText2Mime.values(): self.assertTrue(mime in patoolib.ArchiveMimetypes) patool-1.4/tests/test_create.py000066400000000000000000000024351221117163600166760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . import unittest import os import sys import shutil from patoolib import util from . import basedir, datadir, needs_program, patool_cmd class ArchiveCreateTest (unittest.TestCase): @needs_program('7z') def test_create(self): tmpdir = util.tmpdir(dir=basedir) try: files = [os.path.join(datadir, "t"), os.path.join(datadir, "t.txt")] archive = os.path.join(tmpdir, "t.7z") cmd = [sys.executable, patool_cmd, "-vv", "create", archive] cmd.extend(files) util.run_checked(cmd) finally: shutil.rmtree(tmpdir) patool-1.4/tests/test_diff.py000066400000000000000000000022161221117163600163400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . import unittest import os import sys from patoolib.util import run_checked from . import datadir, needs_program, patool_cmd class ArchiveDiffTest (unittest.TestCase): @needs_program('diff') @needs_program('tar') @needs_program('unzip') def test_diff (self): archive1 = os.path.join(datadir, "t.tar") archive2 = os.path.join(datadir, "t.zip") run_checked([sys.executable, patool_cmd, "-vv", "diff", archive1, archive2]) patool-1.4/tests/test_extract.py000066400000000000000000000022611221117163600171020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . import unittest import os import sys import shutil from patoolib import util from . import basedir, datadir, needs_program, patool_cmd class ArchiveExtractTest (unittest.TestCase): @needs_program('7z') def test_extract(self): tmpdir = util.tmpdir(dir=basedir) try: archive = os.path.join(datadir, "t .7z") util.run_checked([sys.executable, patool_cmd, "-vv", "extract", "--outdir", tmpdir, archive]) finally: shutil.rmtree(tmpdir) patool-1.4/tests/test_formats.py000066400000000000000000000016521221117163600171060ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . import unittest import sys from patoolib.util import run_checked from . import patool_cmd class TestFormats (unittest.TestCase): def test_list_formats (self): run_checked([sys.executable, patool_cmd, "-vv", 'formats']) patool-1.4/tests/test_list.py000066400000000000000000000020231221117163600163770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . import unittest import os import sys from patoolib.util import run_checked from . import datadir, needs_program, patool_cmd class ArchiveListTest (unittest.TestCase): @needs_program('tar') def test_list(self): archive = os.path.join(datadir, "t.tar") run_checked([sys.executable, patool_cmd, "-vv", "list", archive]) patool-1.4/tests/test_mime.py000066400000000000000000000253701221117163600163650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . import unittest import os import patoolib from . import needs_program, datadir class TestMime (unittest.TestCase): def mime_test (self, func, filename, mime, encoding): """Test that file has given mime and encoding as determined by given function.""" archive = os.path.join(datadir, filename) file_mime, file_encoding = func(archive) fail_msg = "%s for archive `%s' should be %s, but was %s" if isinstance(mime, tuple): self.assertTrue(file_mime in mime, fail_msg % ("MIME type", filename, "in %s" % str(mime), file_mime)) else: self.assertEqual(file_mime, mime, fail_msg % ("MIME type", filename, mime, file_mime)) self.assertEqual(file_encoding, encoding, fail_msg % ("Encoding", filename, encoding, file_encoding)) def mime_test_file (self, filename, mime, encoding=None): """Test that file has given mime and encoding as determined by file(1).""" self.mime_test(patoolib.util.guess_mime_file, filename, mime, encoding) def mime_test_mimedb (self, filename, mime, encoding=None): """Test that file has given mime and encoding as determined by the mimetypes module.""" self.mime_test(patoolib.util.guess_mime_mimedb, filename, mime, encoding) @needs_program('file') def test_mime_file (self): self.mime_test_file("t .7z", "application/x-7z-compressed") self.mime_test_file("t.7z.foo", "application/x-7z-compressed") self.mime_test_file("t.arj", "application/x-arj") self.mime_test_file("t.arj.foo", "application/x-arj") self.mime_test_file("t.txt.bz2", "application/x-bzip2") self.mime_test_file("t.txt.bz2.foo", "application/x-bzip2") self.mime_test_file("t.cab", "application/vnd.ms-cab-compressed") self.mime_test_file("t.cab.foo", "application/vnd.ms-cab-compressed") self.mime_test_file("t.cpio", "application/x-cpio") self.mime_test_file("t.cpio.foo", "application/x-cpio") self.mime_test_file("t.deb", "application/x-debian-package") self.mime_test_file("t.deb.foo", "application/x-debian-package") self.mime_test_file("t.txt.gz", ("application/gzip", "application/x-gzip")) self.mime_test_file("t.txt.gz.foo", ("application/gzip", "application/x-gzip")) self.mime_test_file("t.jar", "application/zip") self.mime_test_file("t.jar.foo", "application/zip") self.mime_test_file("t.txt.lzma", "application/x-lzma") self.mime_test_file("t.txt.lzma.foo", "application/x-lzma") self.mime_test_file("t.txt.lz", "application/x-lzip") self.mime_test_file("t.txt.lz.foo", "application/x-lzip") self.mime_test_file("t.txt.lzo", "application/x-lzop") self.mime_test_file("t.txt.lzo.foo", "application/x-lzop") self.mime_test_file("t.rar", "application/x-rar") self.mime_test_file("t.rar.foo", "application/x-rar") self.mime_test_file("t.rpm", "application/x-rpm") self.mime_test_file("t.rpm.foo", "application/x-rpm") self.mime_test_file("t.tar", "application/x-tar") self.mime_test_file("t.tar.foo", "application/x-tar") self.mime_test_file("t.tar.lz", "application/x-tar", "lzip") self.mime_test_file("t.tar.bz2", "application/x-tar", "bzip2") self.mime_test_file("t.tbz2", "application/x-tar", "bzip2") self.mime_test_file("t.tar.gz", "application/x-tar", "gzip") self.mime_test_file("t.taz", "application/x-tar", "gzip") self.mime_test_file("t.tgz", "application/x-tar", "gzip") self.mime_test_file("t.tar.xz", "application/x-tar", "xz") self.mime_test_file("t.tar.Z", "application/x-tar", "compress") self.mime_test_file("t.tar.lzma", "application/x-tar", "lzma") # file(1) cannot uncompress .lzma files #self.mime_test_file("t.tar.lzma.foo", "application/x-tar", "lzma") self.mime_test_file("t.txt.xz", "application/x-xz") self.mime_test_file("t.txt.xz.foo", "application/x-xz") self.mime_test_file("t.txt.Z", "application/x-compress") self.mime_test_file("t.txt.Z.foo", "application/x-compress") self.mime_test_file("t.jar", "application/zip") self.mime_test_file("t.jar.foo", "application/zip") self.mime_test_file("t.zip", "application/zip") self.mime_test_file("t.zip.foo", "application/zip") self.mime_test_file("t.ace", "application/x-ace") self.mime_test_file("t.ace.foo", "application/x-ace") self.mime_test_file("t.txt.a", "application/x-archive") self.mime_test_file("t.txt.a.foo", "application/x-archive") self.mime_test_file("t.lha", "application/x-lha") self.mime_test_file("t.lzh", "application/x-lha") self.mime_test_file("t.lha.foo", "application/x-lha") # file(1) does not recognize .alz files #self.mime_test_file("t.alz", "application/x-alzip") #self.mime_test_file("t.alz.foo", "application/x-alzip") self.mime_test_file("t.arc", "application/x-arc") self.mime_test_file("t.arc.foo", "application/x-arc") self.mime_test_file("t.txt.lrz", "application/x-lrzip") self.mime_test_file("t.txt.lrz.foo", "application/x-lrzip") self.mime_test_file("t.txt.rz", "application/x-rzip") self.mime_test_file("t.txt.rz.foo", "application/x-rzip") self.mime_test_file("t.zoo", "application/x-zoo") self.mime_test_file("t.zoo.foo", "application/x-zoo") self.mime_test_file("t.dms", "application/x-dms") self.mime_test_file("t.dms.foo", "application/x-dms") self.mime_test_file("t.ape", "audio/x-ape") self.mime_test_file("t.ape.foo", "audio/x-ape") # file(1) does not recognize .shn files #self.mime_test_file("t.shn", "audio/x-shn") #self.mime_test_file("t.shn.foo", "audio/x-shn") self.mime_test_file("t.flac", "audio/flac") self.mime_test_file("t.flac.foo", "audio/flac") self.mime_test_file("t.adf", "application/x-adf") self.mime_test_file("t.adf.foo", "application/x-adf") self.mime_test_file("t.chm", "application/x-chm") self.mime_test_file("t.chm.foo", "application/x-chm") self.mime_test_file("t.iso", "application/x-iso9660-image") @needs_program('file') @needs_program('lzip') def test_mime_file_lzip (self): self.mime_test_file("t.tar.lz.foo", "application/x-tar", "lzip") @needs_program('file') @needs_program('bzip2') def test_mime_file_bzip (self): self.mime_test_file("t.tar.bz2.foo", "application/x-tar", "bzip2") self.mime_test_file("t.tbz2.foo", "application/x-tar", "bzip2") @needs_program('file') @needs_program('gzip') def test_mime_file_gzip (self): self.mime_test_file("t.tar.gz.foo", "application/x-tar", "gzip") self.mime_test_file("t.taz.foo", "application/x-tar", "gzip") self.mime_test_file("t.tgz.foo", "application/x-tar", "gzip") @needs_program('file') @needs_program('xz') def test_mime_file_xzip (self): self.mime_test_file("t.tar.xz.foo", "application/x-tar", "xz") @needs_program('file') @needs_program('uncompress') def test_mime_file_compress (self): self.mime_test_file("t.tar.Z.foo", "application/x-tar", "compress") def test_mime_mimedb (self): self.mime_test_mimedb("t .7z", "application/x-7z-compressed") self.mime_test_mimedb("t.arj", "application/x-arj") self.mime_test_mimedb("t .bz2", "application/x-bzip2") self.mime_test_mimedb("t.cab", "application/x-cab") self.mime_test_mimedb("t.cpio", "application/x-cpio") self.mime_test_mimedb("t.deb", "application/x-debian-package") self.mime_test_mimedb("t.gz", "application/gzip") self.mime_test_mimedb("t.jar", "application/java-archive") self.mime_test_mimedb("t.lzma", "application/x-lzma") self.mime_test_mimedb("t.txt.lz", "application/x-lzip") self.mime_test_mimedb("t.lzo", "application/x-lzop") self.mime_test_mimedb("t.rar", ("application/rar", "application/x-rar")) self.mime_test_mimedb("t.rpm", ("application/x-redhat-package-manager", "application/x-rpm")) self.mime_test_mimedb("t.tar", "application/x-tar") self.mime_test_mimedb("t.tar.bz2", "application/x-tar", "bzip2") self.mime_test_mimedb("t.tar.gz", "application/x-tar", "gzip") self.mime_test_mimedb("t.tar.lzma", "application/x-tar", "lzma") self.mime_test_mimedb("t.tar.xz", "application/x-tar", "xz") self.mime_test_mimedb("t.tar.lz", "application/x-tar", "lzip") self.mime_test_mimedb("t.tar.Z", "application/x-tar", "compress") self.mime_test_mimedb("t.taz", "application/x-tar", "gzip") self.mime_test_mimedb("t.tbz2", "application/x-tar", "bzip2") self.mime_test_mimedb("t.tgz", "application/x-tar", "gzip") self.mime_test_mimedb("t.txt.gz", "application/gzip") self.mime_test_mimedb("t .xz", "application/x-xz") self.mime_test_mimedb("t.Z", "application/x-compress") self.mime_test_mimedb("t.zip", ("application/zip", "application/x-zip-compressed")) self.mime_test_mimedb("t.ace", "application/x-ace") self.mime_test_mimedb("t.a", "application/x-archive") self.mime_test_mimedb("t.lha", "application/x-lha") self.mime_test_mimedb("t.lzh", "application/x-lzh") self.mime_test_mimedb("t.alz", "application/x-alzip") self.mime_test_mimedb("t.arc", "application/x-arc") self.mime_test_mimedb("t.lrz", "application/x-lrzip") self.mime_test_mimedb("t.rz", "application/x-rzip") self.mime_test_mimedb("t.zoo", "application/x-zoo") self.mime_test_mimedb("t.dms", "application/x-dms") self.mime_test_mimedb("t.shar", "application/x-shar") self.mime_test_mimedb("t.ape", "audio/x-ape") self.mime_test_mimedb("t.shn", "audio/x-shn") self.mime_test_mimedb("t.flac", "audio/flac") self.mime_test_mimedb("t.adf", "application/x-adf") self.mime_test_mimedb("t.chm", "application/x-chm") self.mime_test_mimedb("t.iso", "application/x-iso9660-image") patool-1.4/tests/test_repack.py000066400000000000000000000035751221117163600167060ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2013 Bastian Kleineidam # # 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 . import unittest import os import sys import shutil from patoolib import util from . import datadir, needs_program, needs_one_program, patool_cmd class ArchiveRepackTest (unittest.TestCase): def repack(self, name1, name2): """Repack archive with name1 to archive with name2.""" archive1 = os.path.join(datadir, name1) tmpdir = util.tmpdir() try: archive2 = os.path.join(tmpdir, name2) util.run_checked([sys.executable, patool_cmd, "-vv", "repack", archive1, archive2]) util.run_checked([sys.executable, patool_cmd, "diff", archive1, archive2]) finally: shutil.rmtree(tmpdir) @needs_program('diff') @needs_one_program(('tar', 'star', '7z')) @needs_one_program(('zip', '7z')) def test_repack (self): self.repack('t.tar', 't.zip') @needs_program('diff') @needs_one_program(('gzip', '7z')) @needs_one_program(('bzip2', '7z')) def test_repack_same_format_different_compression (self): self.repack('t.tar.gz', 't.tar.bz2') @needs_program('diff') def test_repack_same_format (self): self.repack('t.tar.gz', 't1.tar.gz') self.repack('t.zip', 't1.zip') patool-1.4/tests/test_search.py000066400000000000000000000024261221117163600167000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . import unittest import os import sys from patoolib.util import run_checked from . import datadir, needs_program, patool_cmd class ArchiveSearchTest (unittest.TestCase): @needs_program('grep') @needs_program('unzip') @needs_program('tar') def test_search(self): pattern = "42" archive = os.path.join(datadir, "t.tar") self.search(pattern, archive) archive = os.path.join(datadir, "t.zip") self.search(pattern, archive) def search(self, pattern, archive): run_checked([sys.executable, patool_cmd, "-vv", "search", pattern, archive]) patool-1.4/tests/test_test.py000066400000000000000000000020131221117163600164020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2013 Bastian Kleineidam # # 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 . import unittest import os import sys from patoolib.util import run_checked from . import datadir, needs_program, patool_cmd class ArchiveTestTest (unittest.TestCase): @needs_program('7z') def test_test(self): archive = os.path.join(datadir, "t .7z") run_checked([sys.executable, patool_cmd, "test", archive]) patool-1.4/tests/test_util.py000066400000000000000000000031241221117163600164040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Bastian Kleineidam # # 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 . import unittest import os from patoolib import util class UtilTest (unittest.TestCase): def test_samefile1 (self): filename1 = filename2 = __file__ self.assertTrue(util.is_same_filename(filename1, filename2)) self.assertTrue(util.is_same_file(filename1, filename2)) def test_samefile2 (self): parentdir = os.path.dirname(__file__) filename1 = os.path.dirname(parentdir) filename2 = os.path.join(parentdir, '..') self.assertTrue(util.is_same_filename(filename1, filename2)) self.assertTrue(util.is_same_file(filename1, filename2)) def test_samefile3 (self): parentdir = os.path.dirname(__file__) filename1 = os.path.dirname(parentdir) filename2 = os.path.join(parentdir, '.') self.assertFalse(util.is_same_file(filename1, filename2)) self.assertFalse(util.is_same_filename(filename1, filename2))