control/0000755000076500000240000000000012614620313011536 5ustar lukasstaffcontrol/COPYING0000644000076500000240000010451312614620313012575 0ustar lukasstaff 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 . control/DESCRIPTION0000644000076500000240000000063612614620313013251 0ustar lukasstaffName: control Version: 3.0.0 Date: 2015-10-30 Author: Lukas Reichlin Maintainer: Lukas Reichlin Title: Computer-Aided Control System Design Description: Computer-Aided Control System Design (CACSD) Tools for GNU Octave, based on the proven SLICOT Library Depends: octave (>= 3.8.0) Autoload: no License: GPLv3+ Url: http://octave.sf.net, http://www.slicot.org control/doc/0000755000076500000240000000000012614620313012303 5ustar lukasstaffcontrol/doc/control.pdf0000644000076500000240000203776512614620313014502 0ustar lukasstaff%PDF-1.5 % 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xmTM@+z&?tBL$d4*.<_fW_wիrc;`GUOV&ʮ[v6W7TvbuYt/N.5=S> stream xmTM@+z&?tBL0d4*.<̿~UfW_uvc;Z̫MfG} I]/ޭmޯo⣩0^'^x]fkn{EK{*ʇupg6;ލ$4;gZ8, M[TPRJGeWxmE7 "/7j;{Yʋ"1tm|oirI ɑc׺>[TқEnn#bBSEV嶭mzsg)gR133w xAb;aGL6K&0+}&"?(Ҧa/ c,!-f3*Ix {asIC%hS7}H=ŤIY(jŧ Z4{SO5Z ekxvKǬ@2a> stream xmSn0+$z"aKU^CvF^p=!94gB˥0pދ s#P~k@hZ+vQڦ(A,Rf5Ħq8>K_X NH3$Ǟ{<0*5c~Pʯ5W42^!0^#rqxƘE3x z)cgl1BҰ?Xq!NAWA*d1)iȧΰО 9璆NVfkVaUJ?%͚5ػbTW=ј52f&p2pjV^cHMcVYxLS7E=1j g endstream endobj 6 0 obj << /Length 345 /Filter /FlateDecode >> stream xڅPMO!x1Ջzhݸݚpf#X` *~X.2qSVctSNMuq.F#YF690-*6 ]K@jBh 3N^޿Þvc1X{}r w": # h#kގMp\K«8j&5N4xHtA,w!Il>=.n+u\^>~TP T.c`)0UV00&%9\u6 Yk * H6 rșj#q*T5d/ a endstream endobj 14 0 obj << /Length 771 /Filter /FlateDecode >> stream xڍTMo0VV `>voURC/X xe m}g<6(Zq~<ϼy3& bxLrنAկb&UxYYqXH4,!σ$fx=Mʔ<>MjTbZ%d<BcER$'e$q(4Q Իu9·ubT:-öS]}-喥Rxrtb5ŹƫVi7 A^U%+69FΛN]О8{1`fѭt =A1ɚ`1OD׽co@8IS^H854#zx}h''`?դ02;E1X EKӫqNz6k*C+I{P1 >ϓyr{B*}Tr$6釠B~a!$4z@qe/IY'Tؙ48xsL]p}H4rV_7χ҂,&MnoX ɇ6$ -Vp3L2Y1As_8yjLZC5{rQ{mhާ$tOGlfi0N[+&:Aqe0w-hU7h6g5OIWS:>AFS59pa{ NyۨWrt6.Ҹء8Hc'm<吋@')K$V~wbhfܽg2N西/0X^YXx>q endstream endobj 20 0 obj << /Length 2941 /Filter /FlateDecode >> stream xڭr>_9rwdMș]#9>9P$l% %/RjZ(LUѪݮxWJ, 4`,n}rW)*XenCy];M} @*jaT UUbG0_~&x m3Wq|j*hg:^8 .<\eYPojc="<[ڎB|#ֶy2i5-ǃO<~7rM!v:<]UL1ufxVj 4X{<#/a|jV*@t 3o}{ƝGvav@B˲h0Fjgmmv-I8)´*_YQwWk[Ay Cf[M)C: ȋb3 NTi(T׏.nat[/,T0AL vu4iLM]OգbߘE',*u1iPw[ F@LԓyI%ւ&Cd( ` zu*~xlyZ&arjQݳo&]aU$%BTaW@A'9K藡`[x0V 39ӣνv~, #Z= }fn펭Xdf@рN̵sgu;7ML'P=?b\`2p6"BVLK3КP72lֱ7.`E : f۟G6Gg27^0:E &aKd>0i.TƚTOer8ի3C'u?nxwrٲ|=rw&spm$:\Ę^Errm gfOiKڅ!-LFgpi&wzͰ?ݛLlhpT(5 HaSr !p*Q0ytŘYU*.,d?qP`ɔ%WV߳Z,xCtk` fNq21͋\ˇvfNlngϐۡXΗ ^ǡi殶l}wsS 9rz&觤48?q)zk?Ia > ߈>T'q@5c3.'N1+h9nk8kdB]q~0Zx 1"Qͳ+ - Қ)P$XL{#9:CZ' Ir{}8tmC<{hd8!1aaWPGT]{Oza5*(TU|Nz;x<Ӥ FhYn0wXbQpɚ`[Ptg5F#L~[#z=sWj-!:whS*9 $)ؔf`j̮UNsZn.+šwF١k׺<%,Vqkb%N@f5K40sRh24H lGG;"ځ3( ;NUƱ+ 2rMZRaQ3}FxyW}嗈FzƱ*XGaEE^!mڙLUGB$<*=+mqF?#"ũQu z$E'yTQٍE+oH9ĞhKԠXXl!Y'ު|Bt*LrȚ_~!\}Zkm x&;V.Vʍ,]A:r1$<[()P>U#/PH X6s@A|mأ5f"l4(:G}"HPo`t0W5p !B2\c(c~ 2JLU͆*)tjD>];y~ ?N(ǦwGNnv9'eB&x#+%Xʸ4p5f1s(<" |+?9ㅮE G&9l7\]. RP`} ʎV1.U*5 ,\a5«'OƓW5-X ['{jgH1צ m p|}!OטٿJ x?}{՝C-Y*赗;>_+CM".aå):IN2K5 endstream endobj 30 0 obj << /Length 995 /Filter /FlateDecode >> stream xڍVQ6~_[8lvwZUJNP@}g3˃xDdZz΅`q>[cNOa DF {8h,7{~"U aech 4KSNY=`#oH˻m;\-pub0ZVd4v'2&{"J h;拀)azi(uw(+>5&JTLyCf$Q5K ,MTՠC4aIүbZ돛+`R^e,\ydöú0Zz5 tlJA[> Y&o2dC혚6\] kc}b2v/HzPnd[ R*R(T&0:DA-T3E8Ӣ^Qitzkf:U~]deߝ'ZM;|Mpg̣ 5$k4%4 Vٝ@K3WXZwJ=«~jnq:o=նHHdhܬu7_0%TՐgG /B?L@ae_>ݴA (iqrX$1Kt' ΗAi])fC3#}cWT)(y:'WΟ{鏦|2gf0nN9gDZy@φ ٖfكa@io/%9-?oBeמȯf endstream endobj 79 0 obj << /Length 2103 /Filter /FlateDecode >> stream xMo7:J1\r{j$E(YZe[ ͯ/pr<‰dkk߇ɕq%FVS);_۟nߏ'r&BNȟϞ2f$8y-Fˑ?ǫ翞<'20QH[/mF?:Oj=]TY3Y?\OawSit%⣩kٞILBH3~qvY7yzLwz{ʶUWcyhGWHIx4[wO|9Q|~,GU^X7WI+;0%7_tcrZD&m0A&Pi`hedB&n6o_ QQ{Qi1ZzBZPiE{D,]LZ_/gIXQ:˽cQ91NR,'DiNcB DC5[ (I-w#$XJH4OQA?2m$BxjSU\p%ZTRpԯ*K QH9 |'c9 |57fmKS竫Pz}[0<=լ-Uz{xѬPR9/D=::OyzNCKrLk\{>7*|BY۲aM4\{s&C%㣓cڃm6pYޯ-vaC?il86 G۞hT@ЊqA)m7˂aܜ% !*]8DjL vd&d\IH2x5VNFT,p ԛ"2@ Q1+4`S,7qsDA% JAA"(&eE32WPDA Ƣ҅cnE@iGPP9B(U 3YhEX$=o j6`a-,l~?LU( FT,p ԛ"4@ $ p)6>c! BA8Ҿ3Af\edߚnus#L:};!9249$#]o]JԎ6;noeƅ ϑʱ6ekD`CEmp!NmBӎ@L+ئџ<[y!(|.!QTBpԦ!4H!È>!̮gE!2H8HHҳi j!6b fur]bCE PH@ӎ(ڀzf7t~4{0eO}v.Vхchm:DƑuWWyu:ܳu;n|ͧVӪ|BxbA' G :)\D4h#U8 F&ZR@/%;]8EiGdPm@?Ls\f3k({Nxk#X7Cၦy@LEydͨZ)!C$! GH1OQH[3# Ͳi'U{~)+[gorP91R3nwv*Ü[+6後(J6KᅦyA#xyBR>`@&g`p%Ϛ͏jU͌l̶Y>b1rDQ1"R[NڑT\WljvOܡ#JGёZ@4ᆏ\œʈCaTbpԶ2{ T?i endstream endobj 145 0 obj << /Length 2390 /Filter /FlateDecode >> stream xMo9>3ͯ&9 0mw8 %ZX$[nVJDDiUCY$ů2Xɬ4WUu:__qw$?޾zF+^1W9~u.fMso~ 7B3$Qɚ^V1j1'l}}ùг77ѳw~k} ^rƝUm?ѿ^wD+T7I=YuM;D{lb[3zi%;_Ul߽=體fξ\ۼ4]}M>aӛ~ vdŤHz7EXeT!WTȡFE'cEСitPm@-d3Lzt7f=P# şP1߷C xHM@&M; j"}4^iu^ ;{hdeCᘡSW!iC`hΙ",h0Weh]x{Qq.gB,\ĸzl& /Sp>"r#\̙炨 \լ H7Sn8$VQ]C cVD(i Pm@t)%'+3TB4F@bC1avLPW_ovm&5•).1$Rk*M;@jfBD*~_DQ81*31c&5. M;0j3Rʄ$L/Y_`2*41&u. M;@j4M!q )b $acd<Dm`6lŔ +mOm2+p8px3QCAph?:CI>&sǿvj[qz3pÑȳ#x?p=D&:gF n۬wj`/uP5GP[5 HL3eGBe%Oupԏ4@‰$C~6ܯ>ɸm1y'r~z5 S2')?|Ĝ" GrӔٽ_Dm0ѩd{*b56)z6M֙88[p##ѴB6 T,$uOYtȋ}jLF&cФEihPmF $0<>_0^>&VTLb8IU݉LڀT Bfn߹Tڕn j˨pԺ54@ j׫is%]/d0Xf7C@6TԄ jTs.h4*7!&z h0aόp4R/)$=#“#\,{ϩz5p7Nv˿3 B W6^L#SXH‘zi~v0ɉt+,ʟ BqU-3'p/4)l B4 ɡ !1P_3'ݹ7=LE%cEpi\PmE>R7볓ݲL+CE!c(~T5D (tF}U+ ûJK hI-Bڞ÷_yZ nڪU79N)wR"#"#Ȍ|d6 k2V1PwX|NVF&Dc$U4@ & 0 ò}Pvu٢\vaq4xa$ =-z8ky欱ucT^b8Lj\]KȜh?qT~t2ǵ䇣?VŲ]DJ2+ۿD_> stream xڵZKϯѹpXHC0P  K:(뉼zGXakN'U,N)hhH D⠜P8`EP[hb;.R-HP !W&*(5SN50X/ 2*89hd%- iUidHH2Xm6;p sv^=@j{vK(`iGPANˡBa Be4PU DVʮBoBn'AP1HJ /D|+6miВ)xg+P2LI7 J[%% n;J-TR,j1?Ag#ӿww?:Q-rNdLR޳w?ϠvRó?_ͻ_w뫟noǫ/pf)$ܘm^W;CJFM!Gk#ZHa32xz Z.B:BR7gH+pX2#@ϗ-WB^ψ"bY ڰ9#r )YH}(/BƂRS9CR؄^N==E>X=Z9沐x95Cf̢Qj޸3SlѷgL1I("19m1(M1Z,uƔV#m1Mc9V;хHWD!C +7s ":`ɧ.cZ-徵04)P m+'rPyOnyYϲ&fMfž6DyO6T[S1S1Jrt)n趘 5zv[F׺TbÓE궘f9 )J-)HIl[LfrZ/'0@WCԢ&؀p5oa@ 3aRAVA~03=!ΐWVVV<￳iSDĂhG=M3i4 &zxI4 i\4iBLӈx7CI&z2ћ~N׉4ViH`"Mŗl"xN/{J驪̐0ʌ)鶘XuNJUƪEh$WmSQb>R,2L9.A"2TRA#?^qm\N[ ä`b"2Z& B^S8/igd0l(u5o[ʶ^C0)-d&2cXrJnFluY nH%kcA~.1Xp@YS5m1 #渵B9y<6d J^xydcLOzFm(gBt.dK^ov&옢1'be-Lͱ湒Iusnu8,0ub5.kw!5z#2>Ih/#Qy0IW*|BCCclya߹&Jsfl/SiY5!N|^^nIȲdaߩր> stream xMs7y216zl}lD4„>{I)oy<8z-7Wߒ^‹ݱ?K;?SE>9)6x lh)FX!^5.N B d5.:9B/O! M3 %SkNNS*:7$1E88:VW FÍGlkS2!y;Hpj.K0FfHm`fh{"wInZAw-i &M)kM6rCj'nl* <>vLBI!ClM(]LZp#iaj-6p#-\x" _)0NR*("5xE#-iSNSUNڈ 8'tIqw]8UkZdta\br8ELi[WDej#16c|gb#b.htkhPC$YH)}\6"Bj"F ;h3%L[ _$q> |xڈ tN7 l$5$qy/i ^xHNxtB2o~|0:ҙ%wÜ-‰٣=a6l=9( SÈ-'-Q-i/x9{dL 62Aj΋)"[~rRԈxphȖtս6XH X#$$/#e^~ S5NZ ")$J_|6"AjC);*Υڲv[7 E(S7LmbL:# ¥2ݗr]*Vxtȏ~~xf^mno[ҽ沵R~_Y~DytBu0S1Ҟ2e:j[rӟi7\EhFҬ'\]ӠFW'k0] n' .'C^ ۾RF[{Rn2 M=?_> stream x]sE+t)]ӽW$Œ  , dHIiI5"$6zeyzs&& 4F#=}ww=9߯/yVWJM%Z6%~"J db~$hb4}4ӄٜQJ_abWZ?n%iv!ݜҝ(?Y2IH<¡gēiಣ`vp@j4:9 >XB%DK*4H?.;n\$Bj.dq!\JHreG=e=ϱo7F\h)Qª!5r>5pQ 0۫ 6'5~>\-WS]Adz~3Hre8;8zYt@63DPϱ{\c$Cಣ&`vD359{rH:S ։T9 8ˎN <,?JU_ߵ&frȁD\vtHA3Gy]e5!C&8&ಣ `v0AP´L&t1PM]:> Tqpˎ܃ف{֜w֋=n\W: `=H9]XS9z:.;fݘјx'n kz3~%=XS9Dy@9.;Rfʩ )Aq3`O9w<e#Guc0Abw+cep͈ũvjŦ OO0~Gu3'0e(IVLt}[$2;Bnk"T^2Y7LZϦv*QVmS9*ಣ `v EA݊| RxrHR@\vq$H?BapE^+b=XXQR9$JN+ .;fQ">~ɹM4D[U% ]f"aN\<Jࢣ0`YNRQт𺵥<Ȫzt@F=GcI+x z0]N;z zxzj@QH\tzhMQYx?#xQ>V iI,I,EGK`R- op6ٜ~O?ϯ'nDL~?ULtxP>h{WQnԥ+^z5z RT hiځA;GQIpïbpǒvnũ&@xjTFY\tpMd%֫o;3bnW#6+]myǻ<$>'!#`v k?6 m:6c yjj@DH\tP7afͻqi=HS5z:.:~D/oyr|B{!M[_|vոj7']E6 >xO ?yIyH.򇚗S endstream endobj 168 0 obj << /Type /ObjStm /N 100 /First 909 /Length 2250 /Filter /FlateDecode >> stream xZ W\EJDX`7sIc$w, 1TTZCZ|fV sNU*)UU©%d $!ΚwnI YjΖD0Te_Jɯp+|a|\fw `TO5iSs%ڒ/9W3`A0UpjEc) f00p֛;1ʤg驻Y,uw81+h! hIWSS7dY%+{@Cw8xUPlÝy1.w&Nż:ݹW;vvw'zG|l3;wDa1O^A kPy(u!2G3j/.tr}?t?}Lo3B6\ EA^k ae݌EI?>/j} 9̜O׿owO^=?^a+xGx /XW3ƚ_J~yLφoS~wrw ]$?=|ҟ~w$Og6DOg6%DѶh{vk{ wx aza,Yسgaž= {,͞'[Kr%DѶh{a= OζT gҟY}#>HG <*:@J^N81K[깘$KV0.M>MDRe'̻`mj}A=q.fE>cvY >&MTƼ @/]m ˤY6$E24Lּ&{$xG9 )br2fSk`ǔIZ0/0VM^J)T>N˖ )Yj10IR! UV\Ćٶ-:kE1'EJպ'V!S'EJ¼6∶4ُNI^ Rk[4ul&#|fD K9sR*=/g'빘<'U|EPͳEi&UBtkRQleU& Ɉ#IVҶd[2-V\N !}Ib틫Ϙ^]׶'׌a9kk;@9 W)[{s>ܷazuTLB 46<'흄op&7 SQ}[jm7 SgzBumdbѶ_ ~jbϺ NVŤřPgzr%}RGju{:euv۹(BY7S_gJMB) ſ])GH7%7 p \CP%` EYŽ EYž= {4iӰaOÞ= {4i CP9~CP9~CP9CP9~CP9~݄ o((aeiP엂)m@i}dRa8 ?w:SiɈHYӃx^ *([jk36uFݰ_kX@)uV)_ɘطJBro]-6>5 S:N[M&^$iU+'c)ź,"t.&!NmK}RPu)u@$sZYh{DmI[uE:e7q*οGJ4Ltu#h&ó!pX>V ד1t%s13Ъ},Kxo0 !'͈z.qڦ#().ŗ%i.AV/ۀܷ\LYCl+,~0+J4ӥN《<HLp./PFҎ 6amޢ?7\{GZ endstream endobj 311 0 obj << /Length 213 /Filter /FlateDecode >> stream xՒ; 0;C{hGMZ+?߾,>Aɐrr!b&<ҭUu0{X!dya5r@&Z?? 7F5Bsԫm REDЖ[P*.4ڟ\&}KhDQ𪧃Qd-}Y6Rs{F:9V%ROC ~9 endstream endobj 316 0 obj << /Length 53 /Filter /FlateDecode >> stream x3T0BCs#s c= cs\.hQeUgbjgjb dcUWN" endstream endobj 308 0 obj << /Type /ObjStm /N 100 /First 866 /Length 1127 /Filter /FlateDecode >> stream xڭTMo6W1x1N. ĀE[YZi!Ɇ_GZlR7(zDr̛y3 i)RA[EZ9"{CG L3 ZdZI Zu+K61ZckE΂Skrq!l%/=-WBڰ3SPfG7{ q8F?I D bR2 k0( ,RPʔ>JR!5XɒHRZ w$ BJe@iJ:TP΃e]'0q6TN;ސə;Yg~eheoRh6*|c~ pqhCuu>AY\e_w_>#C0N1,nML%謁-c/zlU=dCbixrӌ/Ru>V`eZ#TLú=?XJ@w ʼZMc<(U1@G.E^ۃnc7w;.*uE4xfj\66}=AM|3?V1ytV?RbYSr_ټ:G`}쪹QM7@;/ , U/{CwևenǼ{k|ͲKR.[Gw$k* endstream endobj 457 0 obj << /Type /ObjStm /N 100 /First 838 /Length 918 /Filter /FlateDecode >> stream xڍTnFW>=3=0HNA\WUTS\c Q5"xI"clb3KA/YHMĂݹ`cّa2Fρ‹dŊLLXl8ђ5#kɊ9IJ(ākK-!^A Iqå9N*CΎ$TXq +ECPW3Z%(Tz1j'}:5E)SzEω"F+9Ƹk(;(anijRH)jq!W `qAZU!a0 qP+ )Y7Ћ fFS"raܠC/8FS6 =ZG*}٢QX> nIA0 ;7Hq`v#Ӱ* PPIKjP" Il'/J^DG6XxBRz=+$ j(݇tn~ t>~ܽ]37me/o@ߤtݩ;>S)^dnm| 6Z e6?o~ѣh0v۔rUP,aF)?"+s3f i\5w6o?XbBױ7X6M^hrhCW^wu{oS=nM?~xw<%7 yŢWoS.bXw%VMsS@-T|LܵH>6q}.X-??4o&oOy>H |T:/moGUR;iqhfܵ%4@ UfK붫 *l1 XJJp{W'pbUC6`s?,+W endstream endobj 608 0 obj << /Type /ObjStm /N 100 /First 837 /Length 916 /Filter /FlateDecode >> stream xڍTMoF 19y8_ @sE]iAdί-u"yH>OFPdC09 (OGJ##L&! k"9s ke#YzvL6"9XAZ`Y9.%yG$XO.z!}&/C>,vE`W =ܑhjEѷr H 8GaA8XOI UP~#id(%qgv19zZ7Eq)QN>SV3otPec4', [L`1gD pPta"k`][ L 1〢6۝Ǻ/ap@ E]7YĢG2QxI,zV0K̈N v0 C,L LVVbq(d稙:cex+_*Ơ L m"1c ^.'-wo%]>|= ޾ݽt߿:yz{mM56f7,:݆eiϿfMocnǦ^2W[Gu YF:! ߆~ml?9"-:|{?oBQ|;6c~f+T}ݖj;5+EPj> yl `9N'Pifヨa?~~:Ssga> stream x˒`ɼIDJ"(VtX2IPק{f!*WA >1V+dyFjEzǿ)5a8fj1yu߶E= !2LJ)ܮV&cW>{yo"J3f4C8S#kBIcә,d$Rs|Nf/g3W߾.6͘/sXz״Igj;6kjWYn7y@t`E=knr -6eeWSn{4YC2(x2V|dqۿVau7xPD,ePh!'3:<>IRY6ɮ"W6.BfM OQ?glYav2/uT:@L R#tUnͫG9¸ s)r.-m\ yCblkok:ykHey[~zm7o2̳U+BIa d9(܆'.[S2e$& .91Ph96XM[r0B3}j#Fؑ<\jyY}Ad%7?$إItMQ!ڌ`4Au&ub/U~],ލ B9NJ*>GIJS) ~$TwC\`VF^QӀ.:G9&:bʁ0Y&jSES$$#P ˜a<6ڟSSC1׎()ZA ~N LN<ݰq .דJ%zdB'-hGhruG J _d!jo_9X`)±c@PV}&cFPzP 19ݩ&DXӌM0]ٮbx.bVՋ*"q@ m Ļ%{%G-AYblёi!㉴ߦiςN i, ZF$[:;e@|:Fdtaӫ 5 OXX/(1{dCS!1eAarNxS@C(r;~| kbf1@:!4mH*T>M`$g#8t#ch^WK%z S@yC!tK-c'u}^^j;t2iq0W :Qs#s4Hkb9:dAgK9FsG}71P6.[˕p-&ipy_Dz\njߩܖm:|*]TSہ?ؼ7E[MC G.}"Ⴊy:i1NgQsAb50"lEZ߄/Rdu[_Jii<\緷]o V[w?b\zT&bi!Of%գJ( :r*,H*S>XhvH*Qu)V9Ѷŗ(h1x4pvmEXj.m庺Fqi GB+WX`E @;%AsÃ/Ue2 (& Nz}6˫B_6߫PXۛ )zJM@qs&;p㞐%vߊ6 0;^>M˾Zѵ4Bi ;̙sw3?s MҁBL1NX>ő#Gt^^xO~X4buoM# I8uT' E7BrHh!e3 I%f+;: "oi沤M H Q4مֽ.;1Ai{R%ǔD䐏R3yJ9;oP]ĸEA9{C7R}PG/KG>1NL`9Re 5~ b1<ê 5UOt B)b|FG5~VMD B<xǪ7.S[E zk׼>?fR}?,$5@b1rUn ۲dZ :Ís _VE\mdv9DU``2L!׶"+Ogv=M8?ux`klh"L‡2 [=UGU8X^ endstream endobj 859 0 obj << /Length 3187 /Filter /FlateDecode >> stream xڽr6T!>˲dTIfsH -9Ò/p8#ڱ*6Ѝ~wC,,gIj$gY@^=S g߼3YOJaO}{ Ȼ|wfBȏBT9/ M~LZi [˃J^mUW9L_Ξek'M#X;TOvU{!? 㽙6ۀ+e|)v*=` ̲#ōu;-4DSֲԃ$u^ m+E\-[ԞWپln]'Tc5٢yjPmPk4CTxz84%L- հeU7҇wV(L=ZxuNx\QHC:2`AvU;$+>RqߏZX |qo^VCW}j3_iaKkBVdl[AKpZgK| -Z/Dz1}lwGRrbVK eh1xxpFcl(7Λpjю@v"` }ՐQЬ;pMt @IrO4# C@ه)t& ߂򭺲 VYx*[8 ~$6€9\lBrT Z}vwH`tK+IBeG$~_U9}~TZh;2~'B7C?]{7ؑ ]XەdYBę, ݬvUS(2$`[H2I(\/$Z1c;]|_W|')▪_$^(I9PK>%c8b3 pXWwxFRH)Fh! 옧ij@Hе\йPdރ80v12U(M1j\CC34 ]sP @1 ثᨳ^d0hY&&=$C"Ƈ˛~Jyk .DUj~YtgtVEϼ)NrුDOՔL]f9 gRcS/ŭnPwBH&bM9@HZV*ђ/f~'Tp|G\8IHOJ͠vd2qx)`D\ lu/^>CX (X '<&Fi?LEz"%&ߖO$MOzx8'i 1-3̀XHA}^^ 蝊s Lzrs9H,ìqq<sC^O_[u 1JsI/mjՖd8]GJc1*9Fg^1ͤ[96ѥT+F[{d"@=\#.܃2_nvC%9`ꥇjTs !d.E1B1f"s5C]PaaCu=n65%$&i1dbBF,EԅXu/&~4d0}uEre)g<1.ƷHc_' $ 'է#x$, A^-kCZ,;SڦsT+頽&Om^=w IR?4C¬N6R|Mt}5 M;Htzՠ[d`(°q{n$#1Wh(\=6GYUyJnƠ0IXE wj{c7{/k;5nsc嘸XDv*V %⠴|1pŠFb:[yR qŽUqY+wrB!2T> stream xڍVێ6}߯J@").-]F^,$|}g8-om`s9s8[Tc^K^.yWUԺ zŒ]R.XU[sWSvS]^p3c^!j-kEc YR YMJDESOMYIARlc^m䅹c, Ī͗<.;P_fX2.&B1^2=p)'O9xXSlϕ.e-Q{%o˦ 8nj,%2{6A=hNcQZwo-S Pfʸ.m׃5z?lɟAà^{Vӝ>j̛A1P߾GMxMA]k9NnO8e9f6t z(h noPNy;!Dci-xɗ"+iX69?yJ{y L S'L"S5j1#AޓƤC B E '%,%ρ3Mې~2Lt w3?%hҩ4qu<@ kʏƈNS0tn,y%ץ,˶n': ł QV5X$TӮp^3<(iT}|J qEI6u^G"kԑ+٩!9C$iMS0R -a>_693:?fL`=]'BqtHN9x᭷y2}O'3) "Kxv8 C>{M9}ǫ endstream endobj 868 0 obj << /Length 1700 /Filter /FlateDecode >> stream xYK62CT6bF/I\`=GE%ہ/A EǑC 2$ro[?,⏟oAIM.h@ vj.yb3{V+sW{Z=᭳\bb* =Ug<^w$HzgHGFCч"V~r[7wĜߜokF."f #|ħ sYD "Eһ7{]ihvUE JIƞkSog"`a}O8Ⱦ`ΰ @?:DcdaPoLz"đ@ fόyIODŽ7:"K_A :+׮#z ka7uߩS:Fsj24$^Zn(ݠ)| miSljK74-7h+"&wr4$mQum3 D&a$P(d-v.v aFơLq[ς) ɜDI jηqw퐌\uF-{t/06S G,|9%7 ޵3\aXS& ju=<~S_u;"5j&PvOvPi1nLS!HxKe5PT6  0$8egV]5Iׂ! \i\G`H“)${}/ opRY8ڤVuY"tc7Uh~ (Zオ)A d=K.c[ۡ ]V&rtF$,8#5#m;_Jg6cf:˪U?U O;Lj¾+- b7J/N/kz/ngUycE a'R-3l9 ZmǑQHbWzk3 zAg:gW ! Q*%iv:=CX)IL0p 3KяP5-յ%[q{cqEg˖okɾSƒ`Y4-J{ve{~⵳3w;[ kGg#\a>̎dso,t^:Ƽ.Ga o'j;uv꾶c\ɂG.YX\d veK_T/e}@}u);T U3f \Q:îd_ _`Ө.U2.9v'mUc-`d'O37M5a?age8r8C+ Qj4S)bڋbft1cs( %o4W9TCOQzܙ>m"l1=vOV(vsÏ?a~pG8sm#;.iNUNc1gtw돝/W endstream endobj 871 0 obj << /Length 1988 /Filter /FlateDecode >> stream xYK6WfX!Q CEJ5zIZ@]lHrmzz(@j8& |_hЩdԋM(zA|_x#E_wM~L x o䎶.*CJ*N)rJݯBښHEī_=zEb%/siXZ `:1rMm6Z!2f'1yо-Mc:BtŊju{7qgd+`w9 {ZDM.3Ǯ2f `>о;V;$T" hL)KG#|e7Ha!ReImG_4Z?r=|87M&Ahz4\uQ_-ct7~C0TMalĄ cz_yID'ۍ hW>zfQڇϳaZ97zA;"f)?c~Sz}e39b'͞ @#pLʣ(@ҹ?-0nO+c/`%5Ez}7yk0gk/N|Y:0ʅg fcCBsG%%^hS>44y'^FF {q;"Tw@ ïwӀӈ;nl#g[0Hqr7mk(,pqn]&ngN&Yge/L܎uؾ@$ qhf,Є8hgj g"%g}ĝ@ʫCIYZW0iր,xz7 &i_"49?ت ΝD1m6vfJ$]~, {@ǹޱ>;)@%|A>uּMX&imNLM?s:9`OD9Jf^"]ERw7]ab^oiBh;dQۃK`3p3^n{IU* m\chV@rf-C4Q6iX]wē[7.d4؁B`;ӏKCo䧉;lMv3աCn][n89A>̎REΎR@u)&J?p>M=gmScv1>7*2ܝwP1{9*gU9Ԫ>\C.Ț8B:Z:8\TL |toҥ zҪ?],5 +z!c B endstream endobj 874 0 obj << /Length 1739 /Filter /FlateDecode >> stream xXo6_7XĊúu֡j%UIrt;%KE11~x~|YKhmN;[_Ϩ'@(X<{3$HlZf^B"^ܤ _J鉳^I׋r!b" S;jo)򗓟pY5 Չ5"~;l HXH\3K qO82"xȉmH-ϩY6ar!&nwԨy J@*kӏO#yR Ni \璻rjn齬ӲY_Xƻ2k|jCwۊj_cv;30X{т%I2򎃋r("+R17dyyT8l&׹YuE1oڴom9^oJ 6k՚}[Wz,"IJRt71zYZGu@M=&ʌ;ѡ:VIPo+Fj"I U9Y`Q,k 'Cq}fqK~Z>rn%<,bhk|C*폦Xv^7kN WΠyjƘ~j o_I*(d2ٓQު(]=Q,ӍyT%B @hW^;ﱛ!7iY38z5Dnܿ=XWAĽp֒1S$ S^Cii'׾P#y'kbgѓY"Dz2% Wԙp'}?g endstream endobj 877 0 obj << /Length 1847 /Filter /FlateDecode >> stream xYݏ6 _8Y{غuÀ5K_H̲ކD&AYER$"?"N8Ix^n[_Pn ׃m^|:4$*Tt dwXjj-D M~8)V,>"U¯$/j 270` xaӋ6sH$$d@eSA/-SHnA2QePcSxk%Oń4FLQ;=`8p)E,x{<%uY 9.{*Qi^Ι!bMFXRNhDz6{A C՞_9Wt]>0$k*Ba;B%XUZYgď9Iw zIljp}Hg8}AZlš :ZoOlQmZp-8,đ7: =\YYvQhx#CRn4*T\ E㭳1$7AK9ָp`~:trZ++uޥ{71!` V]eib nlGn 3JtoʗsEDZ1ރybq! W^NFjIhqcDLwW b[祿Hp(j ڞ(Aa蛕 K2`u+߇Q8GV&#@ S,eMsC (a#8l< s'!?SHNG~𹁖^H}rJdp[z764s‡`X_PDI&767U/naPW=gI38&M|:ӁH!iĬQ[- Kso0%EDجNK`so qDܵP48'"F= P.:}ΟS UA_U9=5qzn =XPr6lgdG|&Č12bgaⰂm-%ul̺whP1#!Ԯƾm6N@m9Q1]nP:V+Zw⢯RuY:p.,c sK{okɘSYòZ;L# h|^q?3 S_%ƒ~eojk `2>}9Ŵaec4K֩.uOsEwGH嫯vdo V_{^^|/=bəN p}\k7{OΎP$>_7v>]tM:;7]+#FZw π{'% YWvOҦ.o8p4ƿ,D1wTڠ+ :}yE)AcPY`I7 {~/K*Y%I껤op$u盤&)k 2цֶI*gMRsvF)O69f~_hOMoO#{N endstream endobj 880 0 obj << /Length 1089 /Filter /FlateDecode >> stream xڝWKs6W&hZxL28nRkrIr%D"Ut.)Rl) Q,Fq"i"|}v0?\p:iߵqFSlu5[>d2"\?Mm'S)%R :Ef:?HDkb _L]: Yd+;2T+yb&tn:IDy|2 qYWYgc0EG10*^FjM]x}4E =P<d cwv WTF1p.uZ',W嶋,&xqPy:[mRy4剠9Z\s![zX(f7M+H㝀"CLJ(w˧)b&^k,>3$@ݞl l6<{ YՙUOwp]wT>mȗ2x6y> stream xYKFW& z!zc #БZc$% =U]|4  bwWUWS|_$b2Yl | ֠hkhC_lé6ؚzR⟫RQ&vM^U+WQ:p-=a)TDAq_o:"H=g$bR»#bF,ZXןz/q2/0pzTmP;HsE]n'-2R`D$+'G,&{Fܢ %ҲYMSi0',\.⼏޿%ǻFs@R0H#C?C=Φؚg[$RBG87'HYe5=EXؼ>-}9HpaPl/ ]Z H?h]CK+6fej*L-j=-)ȇSuIEQL$8ꦁMywǘe2#9N@לwo,ZkC[ @ Zn|+q"c#7/D2XY7.[/ "wl,ӼBР}רa^Ksӏᷖ8ly|!e79'Joޱ?qWCq݁kV7.ƁS棱3PV/.>^{%-pju?!t}qn݈TNǑ9<[]t\4<@*YƲnFUr3uY|gPO$mnks sa`JUQtiZL ].691wMN,6CuUoK&I\Aa,EEрvC0zhӸG6Aج'>no5i2{}*\!G|}g,dQ/]< 1lJWXA` FNV(OKJCO>Z25[eI-IZk)M" &Bz#G#&ևj{b[B; I'( lVH=g=h'=Wj|{i3@܇]᝻KW)m$tY4 RR$Rm=#*_KTl#T̞4un75=jUPcTSQî{t^+ b'}|Պ $p3x;6~Y "4wg endstream endobj 888 0 obj << /Length 657 /Filter /FlateDecode >> stream xڭU]o0}ϯ-ue-$@ZS4Ѷu=, E2ћo?_:=#`4pu?Ur.`'7U|JKsy7Yr܍i mWi^uWVHx!!Jš0(75l7OS1JwT_qx8T8 2{x|I3?mxrl,vm?rT P@ X]7ufq2C;7k09,ݡm//^mXS}' qԗv1o7lower;>(ݜ!uY>'.neQ88g t8Q_=C7{șahG,(&P endstream endobj 892 0 obj << /Length 1539 /Filter /FlateDecode >> stream xYo6_Xĉ t !CߺPm9QbK(K;(Yr&h<G;Ҍ(q zD=] яRhBtloXD'y Na.EߎO𷞲;$ _fSl _ VE((ϙMȱPaə&Z1edJT2/m.B26~cXmIj2ڲvwϘVМ1ZM |G;~SrY4rLax$L <2\2\)d!d án7np:6jup"4_aʻ $$޲IC$uh\F6i3Pމnp9p]Mg$uFwOc0;0).ndikkj/ca]a|(.\䭳OGe̽()zXvRBXhn}{WBsL_W96q(}펕ODݔ^.lNLUz{ecQ`L?[кEPg,# endstream endobj 895 0 obj << /Length 2059 /Filter /FlateDecode >> stream xZo6_.`(PzMs.~K}+ !i:oC}PکѾ,g|_2d4Ulg WE@(v껷Zx̲8㫫9M$Lǻ/M$\˿l"?wEj&sa-ns}W?]hVG20d eH'&A6M+ŤJWLrLjqd%]퐅][M|*YE pgM*ׇzۗMMFy[Vŵc8gvhDxD fCl !\0@L/dLa1](s==$|y>,EWړ\C2wܓU.- tDDQ6CUM4s,c*k$$zYkB1zTom?XHގmQknFX獙O2hጥbk 'n `>|NpA] ^L!Ξp$_ u*xp9 }[ XFKO'rtBl&MN3?شEhkP[& d@*KԤA`AX"#|WEOf }J[xZ;T锥&,3$L-GOɞ)S r?r9s{aЅdRުkFP<8s=ㆯ6?gM;wSú*wekQ9-U_,s{Yd9YIwڱ}Uַo_]"*]OwՉ!#_e{I/hE.SX+|)X ۑHVe[_cIԇ`Q5Ȟg^t 7ܢ~]BiSuRdǚiv 7zG,$gmbH 0"5zq@ %:2hhJ&obLm^w7n&%PRwrM ;DM w5}>,²23o(†d2voL#i6C2}dXeTbeăjġ# wT>R휎 ϵtKh 4ː!5#>BBQ91ɠKn~8@g\l]wHNcWQ4!PY99w&㼢D"9R=yGmS5i 5]GeE#J뗸bfbC20/&ubU1m i0$,KQ#hSd¢A.nROʷxچ%E.Lf.j?ZeDfjn6ٖ#=?JP`iٗyEppmQ-hOr{> \CfOcC\xB=M2aNcO/)B\[X?bw eӲlpVY<7mQ:r~g)" :J2{gCL!/,v> O'cוs#Drg˪zrC8S*nU,SK lAHP1|4sZhZ-R<#; 8N"9@kbf90Ĵf:91A|:%fٜWx35Q!X%'.x.DCN~DZt S+KcW8p+鰐c0f_Hiu endstream endobj 898 0 obj << /Length 2062 /Filter /FlateDecode >> stream xێ۸=_aKd`ĈwiM/N6̓bsmlɕL_sHJ&=NҴ(D}tx хf ssXmev}p_zO7^rA3Rd]܆n֋7ɟ?޴˔s2YL'k}Kr2]fB'/_oF $D ~!5, 43E2)͜e*K˔&IbYEQ#xjd_cy2R"L?LA=@\M᠌H9$HNLPoqRe(UN-~d6E L0 ScI"(NTD> YM;kd~)+4gF)8ɸvDDŽ 8󏽩W5ΆBeN^[S/YSbTC9FDт(FR7=.dSm`\[y x")naL~[_Er};ŎdD792d2g0OH_}j|?ͶUc [Ú##I0K'9`/-qޮjnG )ST3³s~Dog,#gY[L9&brW ^YyP)^7  WS88RAItn :6kH B}TpM;,rR)ќ?AG`,I)\Z0n7th [xj B)Hfl^.}g46H:_ޔdy,eۖ#݀c;,6wmD?*³hk@n@`ȳ|}ȇH5pTW]}t|8ʪv`q/غm-[YV}!\PƊƭ+S_C׏@eZ/35jv(T ̾[; DZuS{6z1J|lU̙+K̵Z =r]Ys`Gmr΀B7{K0#xέТlM2~s\6Y.͈>TcSs9DKvA2q6/Wo]:@df%w{P@@ Z>|MUz,O\ ˡR'Tn|!Mر?QSqlW/*>),A-:ۙ h8˶2:>D|gyTO{[ȳR&lAp&kթžChu: U=24M=2F6E&֣D15>Mb7%(g Z iBiJi& ~q`"R}*V>{_X σ}>Ui*tKF!Z׃(4e{m|lCYG;δaqpI9UD5A'ܚ _&]W d1SWO1\!2J2W|N yl!I]2ncY/e TO7ڏno~qS议iR4io۴8sGSԩ:'9h~w_,Ƈ|N;q<챓;_2'&wg/Qk^_eV> stream xZo6 _qUÖ5`2({Kه[2)ʟRcdIdg3JJ=[lN";Q緟O 0PxqyxLdb5du BGJOm桔2CE2_ ~ʚ(,y]\r좓 1-f(s0HX+{;OkgK| ϗծ_^ЛPuG\u/erøHuSgc۟g(/i`QH/rY3Yg+\EhY׵oW2LKT?`<`Sf_박@妨Svw vyߕ!AŤJEH>tRAHauS.\09e^~6Q9<՛9zL=5ͪ3p&)s uh[cNx1Ľhd<~P?1RީOĄ%n)Ch/6SN 9jJX gKԬKS(A.`(.^٠V>V<'Q<]79>pD$鱇ڰHC UCu)|I71SzmlV;9a& `"$b VS28v@>|GDVhXdk0TmGp([1 jFZZNv&qG+tǂG&dZ"hMyZo2M!oΛ ySy>TQFX9çyXY~-z(}L!/n_*Š.*{ L\mL`rg @)Ub_ ˉGA7 d\x9󗇗~> stream xXnF}Wc}g ŰQ iEںA!K[L"UlG.%&胰ݳs9sK(z&E1h2!18t 0 HI&"mFM%t4E4118<" %dޓ5ˁ 9"r"+q&Ky;H.a|y퉕"o&FK>U`HzVP#kC1Y7|,Fİ2" ֨=y; P;5Xok>ӄ#قvp6QBB rV])ѝ=Aڠe} D:H>@4tLb0 Dr@sB+ 1\yW4Ǥ €(C 3F@pI\(dj#TVg v¶JӲU EBAJBlwG4+) dQY$JhNBtdtE hs@ (1JϟF$ŧE-Gٲyq{Y6欺lՖŸju-᯼h'[y5=z<ߔS?:~%y^zNxݠi\d r{[MBZߕ$f*[MOl:tz=o˺1/Wvo.oEhs>vQ϶k %o5Ϲ:+S:*n53A_o/.M=5ǟDGrgb~XʉXoIuj"MY拵4vyчY.Fo@R5}M\Lr VS/D&|V8})i8 Nn ~Bٗk! W68㕉ej̕-ʕpk Rp7_p^{wږ#ߠp_Cz)tit/Z}KdJ$#rc-m~[DnrwӜdƒTo 9[)7c-UطZn[u4FwTĽYwQxPblOb6_ HLo*b ?ГMK_*XuTEE*i;U0||C7<VvR+Kp$%%=gxw!u߅4]H?%'Y4 jpZziѪ7 endstream endobj 904 0 obj << /Length 1108 /Filter /FlateDecode >> stream xX]o6}ϯb ~S0`h Z$d˕$ߥH-itf-s?x$a#nWk~3B0 /gBxě/ֿX&AAȹ_WAHYEhߘyպ1$V>g?{ $8{ z Q"xJ͕̓PHeU 7=PgqĸQ|!bQR)-cޘǥa;^TC$KeQ)=BP,D3<`{oA#3$aXo <# EH"wF/H$,tJz!arr5gLq?\/)$Et4)")+O٦oz3r&$QtYO-"P$;ސDőru4׵zLW]jcK*0VcEee~5Đ9aa+ Ѝ]Ί&sX9TAM jmƑcȜ;=֛8(CBjE@Gu;cɂݧ*nP>Uh qH pBA'MY-]ir:lz,򛍙'I93Bm>p.\6<-a+|lK<tt,Aed"ET-nF`*\viU<Q= C$c҅#N-2Une躸sugɬ֮<{Sp3mf.? (0Kc'ujׂyqdͦ ڻšb3ͭ|1ziQs7XqQ:8yH8g>0:us?2M e=`˯?[[@k^t&і`}O7Wa"`0|a&2}PVjNj葑:(7c0cŻH౸ߒy\s;{̼SSRc8sim2r[#کmj[]9,: -ͶzvKN2$suoK45 endstream endobj 910 0 obj << /Length 1870 /Filter /FlateDecode >> stream xYYoF~b{KP_)\8 `}hZYD%Q=xz%vfv[L0|DЉ#GX9mLF1d諚'=N}*H,ed1c=9wzJs8#1unW҄viī_ek*QP[#w_],\޺jJԔ~U-9!osoB0$DF S!uewPɪ"6Wm]9`(i ݎHɏpsHås,BmTtD-LͼtCZum2U&YAX`{ ܻZ'2˭~.&\_^UOtGq؏/= ҥR|fȭ5v$o~fTR3p1`8dney1o2_͍r;N"fW}Rdr;[鸪*[eOERɦ\ jlqO[2v[*eeFiTrǃ1> *7b^bpQ/ܤ~2)wQ`(Y\ RΟwnX'!Z=%tU^B?[C]\mڼ*v5Zs]B-Q%u56jlãuQ)1{i%@K|N ~t*:wg0! 6|'lٰOKB-e!Ɋ0pj|O舮}[1D ڭFxe؄.Ijp5['uXYp0SqT(9DsZJ?T4y*^IJ'IyW!R9&iZIhy\w ƇjxIAlk"3_`]-%d;q3w;jf$\-=5gzeB8.МՕyB 051i*%|zeWhZ(򽮻 hq' ء> ?9 wWxo6AP;)M8<=3*n 98-TIi;n2gzB ۷JsqnṖ K .UlGچ4䍙*Pǂ3ȃ4zdUҖs}V-Yqp7x`_0:/).@U( ,@Fj~.wUNj8}Šn#Οab4B q0,f:Ub0xH=9I:YSu"NqX[8շeۣSYLKH=Y6rtuc (jv0μ3s=;J9+crjLi^,b c1"LL;iF#z5a /"$ g6,E}y'ÃA\ez'rPzć̋{g D":f},Pav8h+uE endstream endobj 914 0 obj << /Length 965 /Filter /FlateDecode >> stream xڕVێH}СotiMծib%3ŀc&Pu(Jm7٠##.`@~ܼ:+Gf}?>mp]J)c.I?M \zlD'^\ s|}f&fZW2/hTheZmt\ĿW}JR [uG)YNF&Vz "w2z N2zsGWgH%Y!-v&gKb`[5 :-eV̖ެY wOk!ϔ à@k߹Mԇ2 ]ڷуh=ݘ 猏Ena5v {3ڰ~ϩ=4ak^9=}&s@bT[&׾']xp(p%pE~'&xwnG,I-xy_p*n]X푪BH -P\bM9ѧÀmiˉfESPx{Q葸AS#s:UX˴5A`}@GWj `m@L<ڑ0R@r@~OZ4ݕ}@P*Pʏ!nt "̱SY >/E)f򋩭`zhŸ:D6><$AI&@&2qO7~mP秵yea9i'Pٍr8l\QX,C>!-E<5. Uk`രm ].e˴Q~0z4ݴqh#ݱ>WG}¸CX'c&X&yÜ\1S^vhW³$!iW6|*aR^;_e!;}HHxxyutaќ{ ]faQՃ endstream endobj 917 0 obj << /Length 1678 /Filter /FlateDecode >> stream xYݏ6b.%R P5wcd cc--BT=dm?f 9Cpsq_( .]lj2(UPB]T'{y$u-zmU~f?PukG6Xc\78gOpOp:k(%:3&+)D1 'UP 3hS|2-Ip">)FVPΆů?6w(.͵8tNe4@KlYnpoDۭ {^N݂Mɕn|9c{ s]ߚzٽNg`OpG^&4DV&?JD q mTd'QaɑF`ײUzޣpAV8c -fǹѭ*hSh˜AYtcVч8"d1BȱEOVnHɮeFn^nsр"?Fv62v<Ӧ2*!`D%Kbݑz~Tec"EEnPM<%x 3Z1F٤'m>JN8C#2530ҠZJ:Xܼ +U'L`&0{fZ=$`(Y8;/-bZϝ|2μ.@ofp SK ='Z,lAR:k4[}:9v Vﮐ )M٠mBEgOcu[{?wr|Sijy#< N\>C9s9sp ^qt6>fmlTL)1Vk\YTA=d^H' 40wv;%:9Psv{wYI-dMIl0p ^\r:/[ѯX3eӱv&m2h޶_N^fl?sC͆~|!YPU9#, Q\ |}_Zzc5O&?wѻ5?t^ViA:17> stream xZ[~DsMb-m_JԊ0E$w 33Hi)M4̙3߹. pb^v;/ퟟQ.hW>{-&$MR݌Iݮپ˛e9e,R/cu^⼈n%3,[UZX!O".~ہ $_ro | …b=LD Ƿ$bKŢ/ˮlil,,ޜ#}1$#P;9^ePjA)I,=mZd܇&âϗxhd̘2Qo>ItAt[DEE}@yԂd1Aj ?խ*:Aڛ-ݲ*{7WTbi'qWxFDShh㶰:Y|=qLlP (sX/ƺԟLqnԪ?NpdaԻlRM2-<݄Á_ h 8c(h^R1\8sm>:au^" p6ry3@:phYT-չe #֨&2LeXj*#1=~E[`\m fj[t >(r,ίC0NU|1aNiL.yT Z7yxa7^f=abN.M'@uìm|,!_̡1d54|W~̹>BEGBL/'n`b+6%J|A˨zF;mn[4k75J!瓏Eϔ-̹c!3" tWЯ/ۼ=FtV}#re|W>WT}Bh`rBC"`Bxpsz:[ /Zp`EC7ԓ$x4͓*xR'p nLlPq&o 5;\Kla2˄\#eAC>hF?!O3&V~/î˨'j4_)$!:B~KX>WV #R[C'52ۓP4pV{+Y@/]TևUmׇu m¢/".哧h>Ĭ}{8'\'Z'> stream xWQO0~cc;A0ml4 eORTkӪw7)Ą&a$j;|>[wQO1OŜ\yqٍg;g:PB5q % MKTw3L0NϷi͂AEcc*y6y6(.Hwk "" ԭcI@!'j9/GxRS/D-+ DewQ1o$Ib"U!OI!ڌٚrv)ΖB]5Ўceؿ%t,"$1pH1~7,[80GKY@k 1J3k`.<*>.(+GHS&۟n?H@(c U ֨:Yk O{C`{5װ?.H]ge85?χ;ȦAH+$=@-2'jFxT=#_=t-Yqe#[> stream xXo6~_G9X"#@[eXТ5AD,yĀy,:aKw}$&~$$H%aO'څ`,N\I9ad4cl1:L(y1 m= y,TEpSMyټ*5jBM~9 ($DHȽKwO*b_ ʄB yd, ._5~x4 4Pe]=Mn=jC Sy]4jըVMC F(C&5auΉMa!4م,%B8 i14+Р-ًbZ|Zvֻ~z,1ovEqpcTuvt΋ 8פ /K'ƘK|nT9A)4eou8NF~Cz kx|Jܧk eX~WL̀hS;z,汎x:=^ٍH(C80ZQemj]|Gh?C/}uh",@^ {.Bs4W5VXھ |Ά!KKhm{oړL l!q7dvS>w2:WiGk0,'rQFP5P2p(H:!Y"zLG٪Pa]rHJP,G.[|O|`a?G$$Ə|ep"y g#(~,OK>Ld[%*_+z|PVUOGOJ^ endstream endobj 930 0 obj << /Length 904 /Filter /FlateDecode >> stream xVMS0WhXhi3Rҡ3Δh ML3 ÏʒD9ĖWo[:$:h3͏/#pq1ƽOX(Ii 5 BƢIix-*9b͢,u(h:::t,$D '65o )#_*%O M Au`Q T: px4'b0ucHvIl~M9kAf(1省4tkP =n:F[N_ Ĥf Tt>4<r41L_铦(ӺYCwágtW{mGn'W'w=nvSx_Qd5zf"XQP6 eS wrq.ݫ-R&=s4B1%cIa2\J"aAX#~iBha2ӯQúlڽY> 4[)-ڹ. !T#hD,p [, MF'S9,]M}PXBJ"L$Us".y^ mQ1;VK^TNd"^PBy/ւ<*(<$@ơɎK7>nvEK7tU/+Ns ,"z~ίC{R DB!INm}sFïa Jt}lU<Ĝre9ڎ?FR٬Ν} ﶙaevRu{$u&l֠}p'/gy{ endstream endobj 933 0 obj << /Length 397 /Filter /FlateDecode >> stream xڭSN0+|xhJp 8Ĕ6Am@߳*}I PZH,Il*&| bB|p3cHd=E:86H} -"bJ)jF*b25}MoHZ*KӪ\"H%Tsz7J.4hC{ ~ȅzٗyԈб3Oˆ#<<{(p4B OTc^t*ͪ\$`uĭbEKdRE& A`h@-uVOsaMK޹ \r |.d(V]guS=^b;EC~s9`-xL[E0XUpfe5 6FZ< 0ody endstream endobj 937 0 obj << /Length 1722 /Filter /FlateDecode >> stream xY[o6~ϯ5aj}n8ea >S}W&ŭb"$ ֳ?7M\ dDg `PKmM8 TD IPb 24:AFGWO)sI]\ $QJǔƇ2IfD S>ɸޔJuڰ0)|9 s12>pctv|NYE+PN6dvgyfF#YPcQ91%']\7.cG82lpgS|7 H~$CG F{@_a,^Bs)zGK n ̬UgN]ڼ~gF4b˿Hh ӽ9(?V~*o;kAM·gѢ0%V@-Ma._k'{=?A2XP+Viw- 4mќ7uj}p1n]m3(eoY"pt(@ Y̆bvPgptJ8xV!2`&-a.1/8v,IdB#i-3F\i6NN$0h=#y]c EѨ.;YOm_qAb5F\Ɣ}ّ`; ~`7U_=9+A`{trEj|N?+ ˘sTh],CMeiPpaZ,1ڴ8cCe3ӬGe^+.3 .5Z.Pe YxN 蔀9?6($aTZs;eAҹkDNgyHH׭@˶-K2vC endstream endobj 941 0 obj << /Length 2188 /Filter /FlateDecode >> stream x]6=—'boEK^ \ڇ4͵ʒ!٤hSkI|pf(DTPO6Ǵ\ Z'`@MOƝ6n6׶!;OVԁiRS ClLmZvuVy:,9ݫ>li u.rewiո`}!'6=!(?hߺ*An .y`sԊR+nrVVAa"Z>{#qqeKp얪~t۵Vԭ(kPԖdZBBW9>C ǖWf\DQ[[fhtc{ ^E_3UpHf%1 7?gt#0w7~A!J: iW/^ݡ:ϖղZ{ ,"aEf19SHy1wՆ?&{SEJEYV>gAO.&mV۬hn j+OI8>/C_0$6pQi;o\|"6vz]@Y:G "ǤE[${]5gW{i/$RT[/c@MŎ+Ab<~<_xBˡў3jٙnesʰI൪?`Xs'TaK. /v$vu-rbVrjBNKi5lZ ډk'uJ@Vj9A+ivx[5je҂qֺ==P AN- 隺!i%I{M;*CU"rzK<*mi?rA:<3,R>oyƓF=9Z M}¥ 8,tĠS')hJ }Qu*aAO2F&3$;JPD3c=6={2cK~TAQ4 :qLPiYjjOVWv|liTϠ }~fnUcB` endstream endobj 946 0 obj << /Length 1517 /Filter /FlateDecode >> stream xZYo8~ϯ D,oIfzADlnw(R$3+%iAc83fL"(f(f"ۜiu8!.°Gxu QX]Y֋ː8N'WNj2pr΃W%*s ZYj fjQU%"aں,D$nIt^nSxU6ufw Qe: 1TFA-Y8!u1ʝ~mSv|T\U6>M!"Vf˘o_=y2,x7OtW/0=<7J~ϳeHϫaFQ1BbI&b{0fjAͼ~涣RwTbSYJ>"JݢJ1N}5p A,ApD- x 8NC`P$,G[1LC4N}l$2(uVµ0G_ԇ(dH42q $E!wno&IL~&2MY$PGaS݉ǝjI"DYr_~X3"/KT 'S:}Nea9s63G}-H̳یYUEiz"׶eь ǣu-ncݽYtR\ӵ kU}Z [-LӪ4[KQ#s,ԞHiLS]ߍƭ϶3>X$(T[/ x3aBZ*`>x:6XtnU_cn;JuS=2ԔΪ|PF88&p ΜPBġjy}!p99*-C2`ۑtsQfLZ-tk_kc: gZF͍gS@dndS wVըХ7r5#.{S>=vzepʔ՛ qQ2.CCPA!msV?Wn>ZCo𝱆ݏ2B&&7Ǚ T<Tccc ~eZ&P5h4wfy#'pH]gb6W%~ !m'vQdOӧ92]G<qCv\ endstream endobj 951 0 obj << /Length 2296 /Filter /FlateDecode >> stream xYܶbM۞hj{WNbroY#_ "( p83WTLLM"aE~_틗Jx(Tvu\Cu( amElublͦEey ۿPB1/s?S9c&DxE" סJD7/MQSC%ʌU[ca]3 7MM6_R IJcC/!MSf|3 jfGhU,3h蘉x=vKx.KNǫù󥆛LC9\(ou7KebtTѓ  6-r*, Y$e*RtM}zO#px8ofJY9%Ӕ"_9 :q옾f|^?o A`o04CwqsPD,Ԓ~-5hi'ܰ@P)?Nj0+T P֒Cu#bq Dei?*S\0ْ%hH= SΣϡtD%(9s8#OcuxcEY> Pgii}V 25rTiyJ1bDv`CW9\$zɅoN۽Kq38JivMY6'zO@'}5skJ<>,O9 IƵlYK/[s=>* v=}n( l;p `b)(Qx{=fO,́(Nokӧ7`@c$hte'VM$s"\۳,ؒH|:2ϊ:LS{pν:/$ɖ%ی8ڼ7%P%6MDCyN|&h/qi:3/-Xr R4> stream xnH=_#„*m۴ݬFxqqf׮l`|os[.)gM'nX'9 _Oqnanj<>9~`Y+#Rj#1foߞE^<X\xZ pgtOn+ =`!X&ixpA&7D_L02al@onS{NeZwq]D kj x5$˒!Lvk!< iP[ zgԏ&ք]_\qa*~CFj!C'"`q!zVCZRYG.pCSz;WCLyig ?MC#:}r47?|=D^? v#c~IN8DCvO@N8U,U/3s6HFKo#.p'1ۥkN'(,8m2١ 6eo`c du۶L0(?E4S!*)$NAp)f!\+By~memnq]FLԶ;;X |B^lK] ~ʭR^Aj|1w_ՀЉ)<*y )V4hvz!̍ VA'Ip<1 atce[+ł!<ޘ"u&80Gpu-ͥN:vvϚ,Fi qOV]oE.M\jml/W$4,!Zu4*qLjYUG4bNrg<3ʏ meN|~/+, NJNsRy:e ߫0r3ϣyNr+a'&b*n,Q3XGZ#&vufۗ΀5,2c7=[eb[4Kva}VjKpjF%c*=ZUr\,pW)q]f_}xs9V~ŗz=LgzqſI0>ֹTXp_{H8- ŎIb}Z ŧF2:H5m_75:,\8;EEO3Lѧtu[,J^yvUmu`syUƣQA;-p'&( y"AaRd/eSOu綎@?AH=%zx[" sW(A1AW}غ> stream xXKs6W7*5aQ3m.APqo,{ϹvtۑȳW WUdʊ!Wј$IB}tctAm:Vxr<-m.8,mڍPC9ܙCwނ_~Xɶoj݊ 8wH%w ۻɯLyQ˸a}6_n6eGHUqa翸c?tsGf)PiB Fr, %Ted,ANf"qM3Ad"iTO<@*er[ @|f1N(N%L3[/=x$BFQB9Ax{h$9O;S6&1M| S̺R^j2&XAqhW#:@}8sO2FQՄd3x'g_<>3&&N`I}E"SIX/k豽 bD}<88 t)~*яt[ -W^N^Sb bϓNmX'qS$.j l]E -\67HEZR,-޷-+$\ya\[5 onߕx 3Сvy&1K$O%̓6}s9{{"{o=}՗'g endstream endobj 966 0 obj << /Length 1878 /Filter /FlateDecode >> stream xZ_o6ϧc̓/>{< ȒB'bx>ehZT =V7 +VDXp Y""q4Gw0rZB]{j0otvKU|nH9 BrkQ:A-:F hEu84$n *X>Q^s,>NlDYEE")kDTҧHb I"ŝ<KNU,4HZ/Wqn[M>v4i4I:fs0@ 5qltz$(P%~MÒ{K']Kl^3Q(,0j'Ʒ}(HXkjCRX@diV,O7~+`;9Nx4&lҎv򥛼Ov<6 Lja2 #WQ ,eZn ͑C~GvcsB< jy勃+TYK 7hdž,_l=r5uAB"T y_]wg~̟]sgy݈= iTEV4g]|ΈG3bNP/HVZG:Oj؅3gr{ R\ B!q7lo\!Ne)p޶EmS;鸹{MS߆T?5YjI:MpVV6+e_Vken=R[a:7{I7QyvGvtHI!u(R婥$>T,(b4QnB2ա6>)e2(:`UVM ̩{u$b }Z1I\Ǒ!i hodS8>^FDA ZV7@Tn+P Xsݭ#ncvؠtpnDdm\n!tn q s"D11qtݹK}0D HA}P[ _Dyo$Ϩ}\v6_w2iWb ]v/, ^(D_M,IH //H|S!]r xL\NL١B~#TݞV?6}LB)vhn4:ڟ,`>Qa (ˍjwWX)=,C+G1m#O/cG<GUo[ 0,_Gtf(SY^FFǙ&kzn\9XfS%G`f`Dy<8*rTW&}ړ> stream xYn8}W2P") EmS4~kt"T In!uu(m1Efs9d"tBED\-Y`fr>#gO .۱f:7ZsOPx/ʕϔ9·(T%)eu5Q{ޭ:cL@V9$<$ Dh!KB/$~ɛ0259^.G͡\GVg{"m+U R a~oL(#BNd0rBi/6nHX:SD#x\ː.| m=XrI,D5" Ao􎴂j 0$`rH>A|2A) Jw7NHzC3N#f`jpDiwhY4N`U _ʚKkІ5SVX b]UoD~OR z3aPɐOu(9w"|Ģwc }1E$ݏG/kH>$ήHYw0r%e['v5UR[zvۖ CӤ>'ISPH yGNTe8#EDB?I <18$Gm|v>ͶPҾNZ;t;#"Xw.]Z 5cw`t*t ,m2/+;n⛚J *1֯Ø*L =2=rK_5[`iڧ4u<+ѦVF] zO\zȑ=>C,XpmXt{j>0NI>,SҥKQXVS/.?tn_iI>_oܘuwS^~{JIoe?m>h_Ӏ4^eGS`B9)6vp ^;۱d`ٺgővTrCnI;o- Mn-VW][0ıӥ]e2BZƎÃ=0$3.a xUd>=q<[s!X۵;(:^FGCU荓=pg=PZ*N !=M`.X̳t;[#넗>0UXiR_.Z`=Crסw$l.pnF7I'k"2g<x2|#Kl $HB@l8JƎy6 FwQuv}:u3`\|8l@-o,Ə3Nx]ܷ4̦|m"#`GS&Ę\X;:|Fzb VF밶˘vb(ۺo&mAfÉadcz|8J{o@ѐuZp<&F=NZ'87>o<-ѳcC' WTd봬̶dŕ·KTDD]א6LP ׀_(w-i Ƃm@êf+d8> stream xYo8_@פ"-Um!_3R&NPpo"f %S̶̊ Y.F~ԌEaelv] 4 .7|!_ )epr,uE@]_~P\JWJ먟22Nd$rr6_z`A۠,ǷXƳO}"E_65]cY{b3L)sqhO{ʄP)H~łډGcT;W\rG=v>N, S81/ \}`!Pa'iD1OA J"w~y2Hx:cIYrT(%~D9"l}Cıa^/qu^4լY<6G#ϔ?^y& YCD $ɃG:d9g e+??})yhp tS{~c Aܹ-sՏ8q"Dظ7~8ς4ٖ 3}ۜ'7E^UzI[>iD%@Uzt/x.IT(]mBFM({b. v-M2m^w۲(jt)dwUYGd4Xq}[Phb6?o4H Q-;c@`BU9*i|, FTh mQPMMY;ꪢܮZ)@} {:dEvV W7!g8Ռ]%a Wgģ랃IJI) x1o0 tvOQIC!ؚ59dF1Ӿ9#bɄ8vfd,(phe]TvWqݺ&$z1&$.69ނI`L2M$[KL621hX0^b:!l rd sk@!?(*oW$FzZ)^q{8VGwQ `},mWNk{"J{Uip3<,0fu$ NΪ#m7M&/) /6ڏQb]0᳒'eoH\mV*T8+m&AY CP8"gK J2{*ҩ?OmqE͗gH_jP({L)0d(DCz4O,r@~}u:u.өݹl!hYD2<3^<edKVT;n*= +|a6> _.KLyEȳT-Ͳmm.i傂b d4 ׌/KI21 ۂuc@8L/_ AX} /;$"2L<u)A PPEcьLbB:Q9_r 1FVU7 ./,-)Վzsf˽OR΁5PEYRwE[z\Mǂ }sryWBd[99)afr)f\G_μl E >R^0e5 4 nO34C8K-A,: Y/TV]%> stream xڵWQO8~WtᕈqJi^ V}8!nY9^ho&4rROH=o,Ofy!y!Yjf4x'_bf":bn]r팝GRJ6Tv%91Kd U(4rinxM@%T>3۔a"<3z0W'Wc[C8fJ[+[ HH.h_}> iCL!M|/M9B_q\uMuu фʷNƭ7n?zY~``i7S>'ǶbݲZ5`寧!K)uGJ`-t/F2+".sZkп<aԗU9)RPv a6c0꼰*y< t1J\xxxO}/%4GQb؛I2!8D)p?ߤ8TncACT/"/!]QhLp[e|vfuR]^9[Ζ y| /'R9.eX_68ټ:iOPY$ TZ0$, UBM;E)::+ |B0I8a5Ѭ^1# ܸs]L6 ][܉)L7ŷG7(}ԟb 1*RbX#dƵ $W,;tZPPx+UrA endstream endobj 982 0 obj << /Length 955 /Filter /FlateDecode >> stream xV[6~?"T%ABr*"þ>Y/k)ls__PQ}x<<͌YFeg,HY謾 fW+͟7n%Xv8M+Ts%D?u}B 8B%:z.ƽLft]9v \);kY{̚p&Ō+Bau*%lZb)`fXPRt{Mft.m29CM<^8ʰΨF^eNCn]cDJeJh<;Z2)K5. >뿦9TZ!>c|7¦nǨK:!3Ɉ ɻG"uȑu@]9>5. Lv;$0rB)n/V'C?䢴30]q\&F!<=U1oD1d|aP1߈w9jߛˈ}5C"MGM3tg$S{'oۋ endstream endobj 985 0 obj << /Length 1143 /Filter /FlateDecode >> stream xXMF@9d7X!fW"%'{ 3,4jn&IJG0*^W~8$)E)zw O\.+,p=v7wy((frW'./kscWU(&%YHyt8g&%"31(w:4.Gɦ%ř#(D;J dS'!|o9:?&Hx}tUVōu Q9v@Dύ&sLr2to<8DrL匸E3D[l xv (%ٳbDMd}E1S96ruwCPuE9Ī;$Zul y: ijoPPOA2A6~͵z3p45:ᦨ/p,%bD.LԹok +jUv`xjn ;ybY7 g f_>h/a)6so`[DZm~3k.d\-˼Y-¼wQij]pX'uWy 8bV'o_؊{ ȧHPB`%pJn!2k.kok%Եկ֫g@ΑQSwho]|ޗ\RY\O~UeGm s)],{`ig$&ؓpG7B.Kt]~ a)`s+7Mt~T7YXvv>T2*=Q6i|G#A?TCD F3vd>ky2/kᛩF|<ʐHVpzOo-U}/|(b3<`z$*ද/Q3 x1JS>C~1YKNHMmD3> stream x[KF*4<%QCHBU7 Y[AIl~}5#d䵉QOwO邍|FFՕ_}+< :OW?v3%pfeR\ .'\na.:qh8 Ǹj)y $gpY. ,,:.Ɩ&/K^i2+q}gXdrjvxP w+c:uEXt̞Î+߶ V?*NrFA4^֥Z%i柄-,E[ %yc+*C.9|آlQ:F}\jE﵃"yYXV(ucTf9o:8X`35 KOIzUA 'MZBD6@r[(بݚ ծSA6/ۂӱp5`;\+E׃S_ !Nz9vITIB}2^eNniņ4={N7;LŸB8%> stream xZs6_7w^<x+) 60Jc)>B;a )Cb^;ȡ@GMCx`j(R}jWwP f[ =׋ɓ`vjM* D&+=w7k| -ԍ| Xm*Cմ׽Upa mW{CXRnjKQDz*TZe4 a`9%:8ۺ,V4Sz!6O㜁%IbUw]?H`!K!woyO5p %ra/*Ӟ|8.Vy1h*EvH6d5)QD({ȱLD)kUɪK{4Qs7nxW7ݚ"9sbD;ݦޞ^Op=|i Xt|Z>~I9hB2cQu4Z/N@9d0@;du~<䟀_z737FOӆ!َ?}ٹS${c-"f,ez6߂ Jv?C4&蚬ᢢ"TyBONb?knvгo _:t:T6eqLIMQTlkDE;q;my 6yLcy>mu,c=xjYjU=cK }tX-AaԾ)XY]h:/d]2Y J4[v묢c"4)iS*ZQߎR u.e.WLjfI*B(*9TRZٱ%6t3n F:t^dFM[T7eqL9"@o,Hmr?Ͻ\0Ί悭SWyP2rrSQz{I[Ʋ myEguX|!Xa랆^U/!`:`oeM1p &ݰ!kɟ!!0|pGv "3*T1Xq;+<$ '~ĊD+Jܑ+P\2,rWݵo[lw q0}٦P1Lڥ  #:s@0C+[Ʌ^4> <фH&%(LɧK#+j&`D2>8%EuD?{;Z> ) -3Z F E^]IHiNu[7R]JzϤ) op#K fu/~dFoVA&vvo!RPؙߡF|z endstream endobj 994 0 obj << /Length 1650 /Filter /FlateDecode >> stream xZKs6W&h&Dfmw2L[#TIxP"Tc'uR"dH:adh\/`ԓ|24Nd~W5_N^!fLRM+L$@ }CS> 7RA),:m'"u1 P^t:76 -G9p[y<8h,Vt/l-unJ9^pJ߄j] )Aoi/9îkgjn"P><i-[dbWdR`mEg2ꊮl{S 5.;׽ )eW𤭳ɻUVwk?ħ3fK9%Po 4˙]aLqxffkqa#,Nrx ^"\㜼\;sc7 h/, +ǪbCMVxպvW 9{{w4kPS8#̶'8t#3\>3W x8sZ\ɝ;t=xxf Y6?ӹ?7娀p rU endstream endobj 997 0 obj << /Length 1462 /Filter /FlateDecode >> stream xYM64mAt}Kr`lZ,v;)Yrm yo8d):SS*Fۙ+0LFOW_=bFR9-oP5vw41Njs.*M˻h <o?^} *`{"V1njKGL%NgX-!)jٹSdI*OCje:( g\c#~L'R,7Hc 9Hwm d8DYB&_Vq>FգR=#8 9P sBIͱN^Ҟ{JfQykJC1,J|v%>.4]DTU6T!S8)ݏvh KqS!FML;& :.U] f)O@'~r X C5gPH|$։d= 0uv B/?x>!*쨆WP5 'P]CH&Q}3`pAA-j5•ynSr1bӚ-dJZT_{[nn[S-  MuA3d! / B)iX]STn5k,!t%ejW1Iq)̐4+!Z5.DŽfǵ5V@E\@,et0]kSD)̩1ر1,Su#9ұs,MP/۝^u)FUm~xn֠%O%*.WR{`8}x鴬C z9y(0X@zm~ك.Pb*!-6.BT3Tux_ފs }_MP 'F=nwL4chV\'D@4܇"P+N)_$zm?b|,[da!8f3`>'Y6~m0vmz \RzpljFK|P! :Eg冋ڋΏDg#].cKiyQT΅0?Zeݸ| t7sowS7a7oXƄ28% ~?Pn7ɺ+mUcJ9 ҵ1!a>1.^ʅw85zm.6G%~6MuxmlVwgPwK!4V}&g /+C[]Pjۑ7[&vTv㟻ui#t"*UQm]U麸_Ux=)Oz~<>U3ƪG=@;8S3~=8#/;ܹN<yJ@ 4貭Ǣ~'e}v/[Ϊ.J؉q?E[/ endstream endobj 1001 0 obj << /Length 1647 /Filter /FlateDecode >> stream xZ[o6~ϯebŻX`nX}P,*K$7M^dK.ݤ{Dyxx<Y⑕F 9λq69 $(7&B$$9OM)x+MѺs;XyJOŏ?7ue.s.i{g W۷g[U{1\j;A%qwE%\@I.]vb׸s*LVw_7&1tdgL9Cr*d PڀrV3dB!/A2%=jǤ|){Db5Ćv|r*YM2a3.H͏] PXÀ{|m8l$۾[ץۣ2Co׸O'7y]֍qB"`F]Դ y[EF_J TsO<18_}^M1P6ܑYj h6jח\;KH됁(JseE? )J-79vAOm_ tឰ*M}=Sj-l`0zf ^K(rKOJ^V@Y U(>;H~68y8]E+I wm}/$Ѝo*Z˺l}L]mw X@[$t$!@@ Lpոe Am pp:n? 6R#yZ}+ 1H @PDd)=F8G+?Ϳ4 ^bsP+ܫ -Q_^h"¡u0g:GݡuҡuvgѺԣub \;{!n]7-`';v&)`Go[;`'n[[Dej;`g ?P>r endstream endobj 1004 0 obj << /Length 1872 /Filter /FlateDecode >> stream xYYoF~#XI@:mHv-$"oڧC}yӤ&h `1ŃW#cin1 Li}X%ozZW}YP7v%Y/q#>'Y>508DafVB<6u$ou݂< - Q&*b'm0Gѧ ?5~+0&>٩{UlFYuY٬^:'SyTΏeZňhׄ*E t6ϷicNcGX앣?_un酠P7Cz"f~YCp-ShH]w:>Dp>mAsrSJ[{̮ܵ׶ l38]7C˺VfGǝgylR-TL=f+$KٳcW97u^7:Mu_@;:CO`hu Ͳ_nJ;QpnW~K}Qc0t[mx)%$$âjӻۮ i \.53ǡ? 5u4}a ꨤC>vSjԽk`|/:n(t q׌/;,Lx ,Haάs-0uz뭞,t,SvqN(j= mI9rޞ 1ٰܐl2x<\Vq˦j7Y /.d<b&34rn23 =f(5E^ա ! KDG;L&|5}1%Ǖ9_yxW'uN:Sw!6{1_7+we _K1FJn V/a` -;8.@T83~Vz8/5U郺WP3~Nodnw>$&|S)Ɲ iˮKS@W,&q"-a9?aP$"Q- ?Pw.9v$-]\7X> stream xڭVko0ίd]?IRVJ+&h'p5M4E4 ]wMg'D{sOB b Ev$ЃU ur)e@ NIJN/`b1vu8az!!Dx%<\IO]tYE~͟7UD$X :MS,`mL;7תw}{s;B7FepyQ #1TvK [O`\b M PG%p/ATDxoNSIs3W]<rG%ZC pbX-v *a&9NizwV*Up+T+mxs"=kEoޤͼ "p" It3/3XTO~Za9+fuvImqk-o:!34R,mrY8 }o>jkxSi 5O\ȧcC|ݱγxMce {ciZ7 CmxE$foVrѶ~']p%DN6u{`跟]߸]=F狺+5<6_Ԅ|n*mxqLQ4i4R g*FZ>-G6jq]*%,M:Y+?aO endstream endobj 1011 0 obj << /Length 1706 /Filter /FlateDecode >> stream xnF=_7S^<!=ҸH6䁖THʎS;HyۉSElK}'I"&I*Y*l(f1?~y^GGϴeQ'CVeL3 Ax*gTy1 TSʋОVyy4R(9}{룟OhVZU8c YiMO  -5i!PˈuY NtY8".׎(?;Zpܗ8$j_IYM佧%)AXJdũH \V!Q&hDua:O N 6 )H 9t.Xi{3?xM2Hq;ԪvnqlfY Eum2EqpSA;niAGFY-mQ-Ju0ZW@6wn$=9>yEӍez, aFQv:xFf }hE\`YW7i LRS10I&1|E$ y`b jy#I.̬xqek*Immhв*L06b ;[zͫ9= .ݠB#"S<-;TyW+Ї̔宗 :\ z[BYjpըZSq2*BZ4Sʊ]_]ZcCBnAT8TRÐ Y7+2nfPoG p8}UQ2[=ۙMVm/ + ]tVuAHAs@xXۺ,i{($Bn !i0e8>=Nyz42-O tV;ҔkrGh{z=7]^;2l߼?pH̍ks8rF`:.-OLYB;MgCy2NEilоӶ,Kbw;n2|o GۛH@&σtSWiH kMvaYCX$ endstream endobj 905 0 obj << /Type /ObjStm /N 100 /First 886 /Length 1472 /Filter /FlateDecode >> stream xZMoG W̱!,MZ pRCi lI}ז-{n |||H9%Q.KT;DI88-9YSt *hVhsD1N -y"DPH`f-) APhE# ĄT5P[`%=x|RvTjQ+hv&+\uFjkNC[l0B(s5P,a5LQ9lP(©j ܆\';!(#D`4>&Sx`6R`9sZ8a. =v TZ$ Q &<6iawZg$5wMA-$2NM)FBŤ{N1ipt !P`fcp }&8 ]oxj- Ҍi*& 8eс4lR0tY{#aMh6E?v1<_-WHt)o޽~N3ĥ+Nuft}'OYSS$wD:F߿Zw;(͏[~鵚cďti],YH/eL1~<{XSx8_.>CAy%4-L{fˋ7+Up˙#ny)Vd|󮖘?VޝU=/|jӧOwgUxmߍ@D:FRnZwƀ,~d :мiC(d,zPa ! a&HFBQnPzs (D;CC(VP6Bv &HP [SvqAV&LьC=+ y,c|kwaLt͘ jdL50V6tQ>V5FGfn53%-QEڕ (L)2FrS FꏺCVR6h4V ov7WVDTJ<>̝&fNyosSlBmK86\6:Hf Pԃh бPi.]&‡VPxf  Q/cG.)1-ͷ[!&<qX_9L0g,<%+p|`WY#i`#!M}wpڭ endstream endobj 1015 0 obj << /Length 2442 /Filter /FlateDecode >> stream xZ[۸~ϯpFVHQ>ӦE.͠/*IDґ}^$KjQQm2 zؿŮ̵+:^{]u̩z8edm:Ksc]TElÃ!BY c_OX[EǐQ$SŅ|R]~5\ #0^LCPv͏>&:3ťN@],P~u[\0.UMPSuW@͂b7A/. u}zY8ŋ/`(cpN(_BpD=\`&IV~ܷ@Μ~.}:47gEGίߵ1,jL6z}l0yN^P'3⸂?@?9IB{.虃$ɦ3N5i.b%vvuB ,>8z\ 7I9Ϩ1#4U#˄[a8; y|B.Y` ǮbإO&To`}DX vdαTcV} 7bz2CAkFX]ekTLl;j:`ئZ)mcԈKõK5b)b2/4F>}ٙ!NϊMkލAeiDf, ]kk7k3;FzxQ5>4 Xx_f[htkgd#FɬnG IS8eXӴ/aJ3N11ːHWY"p: aU;v&9(S^Xk%-;Pjx`ɯCj> 4JlLZޚGp[耧m`yԷLl?l\>H|F1; KA*G&My@ > KEۨ4/e>F*-VbHO21dcQ .Np}N!g5e9Pq1_''O99dG#9Eٴ=)=lӦ,U\5K[g!KLJ62+"ЙM|V џ?'SwT&[n LT&"mg9+!uQA2?Z"~p?v2Dz_wE endstream endobj 1019 0 obj << /Length 2227 /Filter /FlateDecode >> stream xYKϯe)Rȡwz&d9hl-^InO'SŢdI-b L%_=X3~|LG=[|;[mg4񏯸[G;fgrj}'TE^zRy*'\M'iAdE=i=_@I5ˎ%S2x!-s>Qȸ=E|%5=Ri֖uڤi3ľ'WĜAԾ<=[-g¬ ?/lVIc=U%޸ Q49_7Uer'&Af _[Rˬ/?#mĂ(ni]ԄRHUSVxH{GH[{qݦ58M "`> ED|cyj6ʪ9*Y__'bपSjYbKD Shk[+5~0#NqСE;;:T#Z4 ja# L[Pp2VOӚ!R@p0@<;T { xꣂМ"=(ٶ|JJxj+rͧ%#6x/X r3xX-G>ǛZ>.~b$ϾAL|4WWÁY*VVIt ؝E"_(rK}FdIz(rS:{$j $qĄCfIcK֓1EY4*7Dpq;X5iYL"y-TL8BnS5W%zh))4$m/֖*JGq_oohfZX%hY=aμ1u-F.Q ;؏hNQPzH] Eߕ6~YJM_d MrSZ2( V(v,/T(<=O`U"!l@e-KGK3DPH(E;8wB[d8N2!ES=$Hc{&$NvߑO'gGu9O0#^i}A >}Y!r"̏+c0<(>kKp=^fʋy KA0:˰2bJa~ά\B~fZ)|W!ajAPE\NZLK@=d<з =?T[ӳ-9׻oxVBP֊ҽovIzJպ24ئ8o HahjiJ]V6u(vUJ`%Z2EmLwxld5YpxnPi19vϚt6TwUVHjq'Z kFr<.|bts ;S=6ϧF lPkŶ?ҵZyCvr\3ԂyT퇉#`wܤ5W mԑ]~ygp*LxCjEqJ*kz28ʌ]λ#.ˆ{Yc"ieO7V&˦zpx8BC|4{娤$g?t0ݧPIUI5xý3JV`W'QBgU %Rǝoӗ0]emq9d hoi([KDJ=|Y'-3}Z׆>eVVh( b\ً6b]ff*;D{-ł= 7p-['b]6M ;+T]Θ)DK̸ߛlGʵaJAK4IhTr@xC;|rQ; "2' u]UI?>`=ȅ%j4r_HHA㶥{n!8v13I=dgZzI=e,b>oXa/]>Uvz\t;_"LA7\u$bt\fm%8CQ'5s1RGbkT *9;5Lp͵fZu̐KtQT]yF6> *Hz{}y8> stream xY[۸~ϯ0ЇۈE),RK6:l -C=p}t l A=G'F.LXb}xl[o?N.p"yz YSXmV L}vjz*_.(OKUOe'_}vR3Mk^äQo7Wecd.%.R1pP3eL #sG)4+L v;ۢ:KeBjm { n.3!!֪yDLmԦ(e*I{韹澍#&AeqSM"a4=Y^3'fkϏ2,CՏϋ3\w@o D%8|:)0Ow⸭|z>׽'ǰ>cgi䳼"5,_Uπ=S(FHE9E5M;Z`۹mU+~5 c_Y[i| ';RЄ4}ZC*hdpvLqVt W;uxǷg' %[+MAG>> pk}YQ>Q#x@Ajz#Q&@;Nljݖ m0F3~bѐNS B*-ѪBkk"8?Vi#<>-}xg>Tk,␦2 ?.nn@oB8n}yO3 i }Cj}0KiǸ@;9ucxT#ımDs9. m2L' zߝNbq Fg3AU@ } qw/^n;yQ͙Ɓʄ9X=FiiY/ ME+Z*|k&8od-|E.Ѽạ-g<7 7jzR$#@]o3fO#Dj117"Q@4q/~_ߛu߽qE)ᎋoi~&{6o M{@a)W"W _g*)[[/9-}۞^xXW-;27=oM,O_"3( endstream endobj 1027 0 obj << /Length 1054 /Filter /FlateDecode >> stream xڥV]s8}ϯ8=H4"O#"m86\GjA&r?z>.djBʈF˻)rݠ]s(y'BH>f5eߗ*:fq  .,X%X DCj+0 |D Jaq"Cz er\(BE D7ᨫWmԮo=(ũ}d@ n-S)2M%8q$>* 6f)&@t2R ! c0ӓYaq"!eXʱJ6gpӪ+MNu|:~ CDQ900`cUQsÞΪʾ@P!ЩS0bʹ?VE]Y7xJ}LQc=5m`wߕn=Mv}h*>*#ũbƩ^_^#;t[ۼ>PUA5i HC.]Ξq3eJQ™Rm@=nmZ@W щ^2'١7eu0tR{IbAÑ;U3-zy/U`C&USQxhF6Y=s,%Jr8>3|kxPVxirsK5L:GVñTF׋?5Zd~UEeE*W+T.[b`NıEc-VWJ+T:œPl1aniR=XUgt &NH'2,> stream xY]o6}ϯ𣄅) 6M5SUV\Hr#EJ-ۼT E{x=3$3QQ9K#Ե֋y~@u.~} #.Pe)Q|NVmVR`[٪͋diZO2$Q2b0 =y'd"+!dHb.%@E0H )>zѴI1& b7aDuعM̮ 3s=2cƚrz2 c~/B nHy(|D0Hm#x}`[B̭3^V*u +ozdi[t3Z?ff5;xE,']B6V|ݮ֭|thnY ql3 f:{Ӿ3azixeke+CFx ;O|_J吡2F*}}8cX UHUH K:uΗ7jSS> HУC002\m<<H qբ'24z`<Fcm+E,vų e?a4/%%g)Rrk\^ADwة%?`l]R>Kޓ=Y? ~n) ~dY$VDfK{‚:ϛ yaxOJoH{m_,{9כ-ov-K۹9O::9n;{=w5Pg,iuVdekn3jlA_c؎֟o~N[S.]tF;'a-Q(HP2{f~WmK`BU{\!e:)/,(ΝO 56i9*'}x@I1(Pw_u(Yӄ8(+fMU?7ꦞ~w. Uco1ppMb9%( E7Tbv|eJ:,TTTl.g>6'13iuT+RZP2K&.{&6fIsH+m6"H<)l:m=. #=>G'׭q]^_(UA*8᱾E{a+}Y;J;B)VԈl,d"(E<c*C$#;Ph cosl~l!Xm2@oxFB}[Hҟ}aGݝV*Z#:SO2˅nWj~6!OS0۷&Ip~_nȔ#ұSîɟuQۊS;_c9q%%E[wM;IDmNvdY5,MVfjJ2k> stream xYݏ8߿o]=)ۺKm,c;{[:>$'xfz <6ȼ>AV.TaOo!b|>u%qH z:)euGAUj '/[h`I,E<TQ2j]}s9g >6 .hhS_֎^+9%Q` D-c O"[E^gӉiG^O&ڴ7uM+Da'RggwY䖵L#+k܃x>y?hzFo>8L4B "Ekh=S*E?CEQ8[IiR$YSn)XYϓB>1_+ Ž$0 RH7D8lU"ęы .qb ѹF"būqD:UJUVJGb `͹0BVzHNɐcĉmSdSzQVw"cC`PW"Untvc"Oq R:5v~HGyx!u1~q%?aկ!vF0_wWp1whFX> "XsڢrX " cPHS,1Ǽ@LwE1p ǡ›K{G`^i•رդJz5!V@8c?e~H2u*;3/Јgk#zh#F#=b'ڋ}~co ?X!}ǖQGpW #5JP4-qUE(ؗ ӽ<Kb4A%t{'-X#Y 10jN6UY4@Y^Z%9s'zU"5Wɦ N{1)z%QG"*ӵ)"T %B[\b|1`>ajƁ*fi9EAt.3UCɌv΍jÏbG~]V$BU2fHU]>fm-ۍ*]m" /k]vE,t6S;jέ^e)˝2/<\}/_@8RE |i )Sj' {FntCTh#& h" wlaM[mMV楙}?-F5YSKscۯΕj+7z wuLۋŶDV)S6(Q endstream endobj 1036 0 obj << /Length 1561 /Filter /FlateDecode >> stream xYmoF_qA}_HyVH9pc)?/`Uzd2<;;@f~LљWG،˙qrF7G?}bF0JpBfCUY pQpL۬#X@0\|vmU4ں*_ޟHp'NX`9b\, nx I,HЄ$t4, ه0f9LC^dV3ПaLGl͚`B?zfZC%ONO 1jng7j"1Ly1E"){```Ș#b1p$arpϑ:lz g(hR*rAF$(v]emڴ-c&7 {ѓi^B"B Q`0I]v;ZKě+*f J$ZH({w'cS' i/`hpT1C;߁lW: ο[3Jz!IY$ {]ei]^{2-8nE]@Q KtC -tB:UpTm _E1D@5DI$F9ňąC絯!Wtv`ƋTf8/Fs~ML 6U^s歶2]^/s P8{.B@S&'ܴ0 /'珴i+o@ljؿW6ܠt=g¹O%(un__ơ5o,AD=xߌv.kq#(A%Mx]`47&NZ"4i?$qMѯTܱԻ<]nQ*wwX8?ǰ 6/6\H2p':ꇦ%݀- n>R=TqpW~dY󔯭a>W:u %d&~=&}SOx5P=UTKkq|ͼ8:C1:m,xY TCBϙ X Xs{ UZ,f/߅`$F!HRҟ=5\>3}J]=ߨ*uZdgH(icZR'JmW'I˻L7lFf#a[#~p:le^_KC{X/5~^*6'&T*,07W uo endstream endobj 1039 0 obj << /Length 1672 /Filter /FlateDecode >> stream xZ[o6~ϯd$xTI*30]Iv?~Hɦ-ENڡT;RGF1شWssY;_~~AM.7fsS4e9 !BO>{;,JMqOqe0^zs0=yֻdMH(Ld՞G 18-E( \ORP$NL^DXP 7> @H~j /xDWeY3@XL}}PM)݇Ĭֶϳ/6L{H#x\Ze^eU[6y 'z^ݴp 00V՚StՃ@6Tn\]2uhR%Ssqsdo~bd~i헛^S@?!7B^ډ;>JI_0Rm8Q)LY{K6ץ?p(Ǎ*h!՘8Vݔ<ǀBUb B篦yNT^1E87F1"8@0FZp^:-Rg 0ŭKI*8spu$8e߈6 pţtw*X?8}%!p)!c|WaTЏx4` 3 ~o9,A!o ;}[/EiYtJPc[-MˢXT~dsjUXbcak.Jxj_|GLjiҴϮ,h_9.]/\K[QQ(e&<|9ǎeS2Ŭ ֭q5E8B859ue$}e<j՛|{_m[X^ֵwe4 oTq)kiւ 7y0E]7}NQ޺|L5r J 3 ƬtBz4Z7.[;˽naYuv8_>'{sJo@N%,y)Re`wqA =Ƨx*SO>i$3i׭nFgkPӅZdr6XݾWk%*M> stream xYKo6WVy|IEAMS6beuח)rvRADo i .#X}&۸r5ɓoJ4ݯCGǜC>BeC!q͋x&i:bY oG_F+S@#Z)YN1 MHG z{>NwHmqZO @hOdz|B?@>Epʮ<膵f1^j|f؎E6-Q5bHpEA,2BkCyYb0`z$2;|(WEcR}'YF@RjUΜ+ZB `t ^Kwa (%r$mE  [)YM .ܩѳ0O.~'0:-jay:Pp9yF~xam/%/_ s~ [b+ H{{F~xb/oWkSa0mߛn&D(,xCYE+:x% 20eeam"djR&af,0^A\eiaEr2>G=#IqWL/ZI fU?2.M.j^4Z_ g8%:e;~mPiXd}z~-Դa>϶tf箏b5ϯMq^1ܜ=8RMJ.a93|3|97p:3Á8KsX^X31gxė{]:N8LˉĹU4K #mq@EfA:w*џ*K:ӸRfN'TaS:jw'uХ(Ui⢙IYZ#?$ Hn6 ha>rQ^OٚЮny+*Z!-WB=Joe0#±٫-85Z8 ֥-MJzAUFYwz/U/ \^ғ6Is]ҹeac)MTQ':88 cHAyƘݑ}:pVh}[ 틣xvoÿ\g-]1sE鯆a,]э('uJ"**t0Ԛ]v]n^5b'<@JwC8!{݋: ͽXԾ?D0 endstream endobj 1046 0 obj << /Length 1580 /Filter /FlateDecode >> stream xXn6}W죶h.p&M '-bdCZ6|gHJ"Ĩߺ"Μ93$M'&:$zXefؗgGɥ z/G'oЌYA'_z1yuWn󄲟2ڵ|YOYtf9MYN"|i|,$R'aՀUF2E2!VʦTܢjirj,E.C-$JE5,)w_0DA 5I v7Ӝ' ̛zY} PJ )ŴאٵJ 8ARIpB g&]AxΜףӺxӡRKS"?esɞec @`h,) R qV׮Z_C&3ll2] NNnaZV+Ue2]?Z#c^ ͒+}W}-N*t l|։v<`Dapoy{T|7P74 | q~І$t:_ow]K! hNN R(PBj2$w <Z Z:7iZJ|Hr`abLL lteVzQٯ_fUޙ";"y٭[+`es[!pXS ad[ۺ?םMv,|YK變N"P!?BozljPA^O0S"`fhF|2vӄ(P#ۦ.;Uq>Ђ&=RG`{cr I} &jS[} cW`$ '!F8EwXɐYtZFۃV5w~]/qMVvnMѶ01v4u"u= sYmaq{W'4 w`i啶!CK+4`xW8>F5}+2+U"8/g3>~]b}=X90@n'9i*l% Rd(!-p[@EiZ)zQӍLKɦmkP٣jtˆW9?ml:~=q쬃\$g 1vmu{v/Brriu[]6*LVQ,s{쿤%la ߜixK2ϻջ܊~%ܭԞE[R8k!M.,G=SB`4pS 9P(I4\=Ĥk-#wT~.|"W`ߟޕ~yn]KPړqpy1 FǞ5,{(Si/kxU ɴ=އ}IǮs܉f:lk1^9- E=}C~x$v@ <CO0aՓGlȌl$cOfU͕0B9 C?-8Q% \  qq-JmlM79:}:3BsϯA) }ဇyJXx\8u{xh>ⰳu?_EX9B|/=-X endstream endobj 1050 0 obj << /Length 2233 /Filter /FlateDecode >> stream xnF=_G '+ɠ)Цq׽$AvH@K#Ek# )J[CϜuD-ℓNjQdv.:II..7cTŻ@e]vzrʞ-C!D7E*, ں*/zr,$R졏yUc^G H$eq=F_*!D`( >WGF2 CƧuc6)%19 L aE>/CEzHo:p'̬iBR& s66 E(FdVot˕nܙNwT, HC%c^*@%Arг}abo>GXY!Q*0cgQ|M xW_k)Ʊ)O*(PH$',C`S?;(5v-AU6n"2\&Do2갹V =b T)&?]]>ef^N,ky,"%b dLty-)r׺\ۗ UJ'zm`XU ^//^ەU)1Mv"X]O*f z7l feWFdm?!-"P)2ynܶ;i/ RhP}1'B$Ss kCWد7;h(ֽq88&ޱCG?ɱs~,a)9#jf1U爵;\VM[Ssm2hg06៞ĿdN\;qixDž +;EaW qi}wJͰA=:sY:` 3r誮 |8X!OTBXGWvxm,tJG#w&pΛH(C¦i 4-kI@7E1U|eSq:rZeQS`qrѸr~ob3wFǕb W>z`TbT~Fwe͏W :Y^bI|ߤ??3/weX;eqk2?n2=~zRB9a+ ZzL>r@&ݗA 7JWsJ$DtjmUCcx<.^re{뇾2oխnnD*Ly|StBd6 yh@|_ʽμ5mLGD ."#gwD!fhJu׫nN7tjϐ9YAGEf)WH#cuLcv`wrem_2]WS ;3k* 5"8~νH<]Pu `n0F sz_{uԴ7?Zjrgkk2GȔIS1n1=q"9FVYyt ->߀L297՘#W XD]ΩmG/ElYeޯPA!Wn9:>?jF`R^4) SW7U*'*ٯgn0Ut^fsH")^ L)^>qrgXrۧaXx^FF@]){]69TZ=}!AY&%: endstream endobj 1054 0 obj << /Length 1785 /Filter /FlateDecode >> stream xYKs8WSL-[<@@,`<Ό ?Cme=qP TŖj}꧆Og!YRv^G@(.J9CVhoڴss_齮>n'Ui|3MuI9x~d,$R[쨯cX"4L@ [&6ߗKDsKs- geS̫.̓zf= 8yĹldKxu4;HMoyH;NhPDpѿbI)#2MZym[@0.f>JmШ#tTO%:B Ѳ Pf:-;/q} \fI)̳Ɓg!3Ɍ4I('3bhdj[x1:)ھlU~0J[iDtK R~CgC+~m78IV1ge#@k=i"qv|d N\l89`4^ | aSr r9ŇQ(RpRc_TUov[Cr|^g8Elf YEipSKQEiR;@cck5 U e7298 eAiS7F O4bx$ԕM1=*A:'hg,[Bı}YJ.jp5)!=xQi}ͦt/)j_L)f؋˸6ـ74V` ̼YY5 4uqKkM16NF|sRPhߙCSL"&_ޜQ5)~BP-&C.\tz%X͘\ M]mk 9ΐmVxsgFC0r9TT0DDr`Aո?5"'eաz?Hu͝Iޙ2ɽI `]+g!Kac;KW,j3}9fOr?PUw%] O8_g2kgJ0cjo,"DXƾ&!a{ow Tc A=+_L7>j endstream endobj 1058 0 obj << /Length 2640 /Filter /FlateDecode >> stream xڭZIsܸW&ʍ!6.S59'8)[%FK,sb[vU)[ůbWJ32^͋خW4 v@[Q|Z_qίnnWtrCqMRF\xSJEiqQEFdwo⯷Zh|&),a<=EbɧB%%մ/O4:nv:?HxsILCop69BJƕǾdt&ĝ'l:Ԏ7Fv3*QPj.Ofj ʮ~*G>IY5'/L6*|X]lygDzbԌzI+1d!4oS AZja݇ > `%2zG8ITcoxBgD8,aat5M Ý>;7z w\#p0?#d>Z H1X|^x7 w 1۪w9ZclE@4p*dˢ eNE)n1rզ1ɹ\2c*ժ2,MSTm޻Q/`ɟ=qҸuN>;w s/PVh.$S MIu*Rlz-V3DZ{1 5n3]|'3`Kyg%o.bI- )DfcxaW*XCum`G+-`<| {EcSG(dd |&8"TLKD6V&%g㠘zх޹HZ,nd[Bvt)ns~j^Uڊ!(?9P-ȐB<#$נ䔃t(8T;,G3g~p>ҬqscQԹ>9Ŕgv`P`t"ٯ; 44}};P$a,9I XB{h U{. {"s}_y)szj+f}4Y6mQ9 gg +gZT=gIBXLPqgz %gZb : V`$Dbh}ixXeݰkiVqKyڹbGAY62p(RuQ9 ल"~&~ӺJ`* zp?(-N ۲K kHb%ч,81?컕8}(1.=?\Mh|Nk $.y[S|gљfkuQ)z`c14 e_]xnߛhTV|ͫDw8ҧpZΑRyoT跊JoPl3>r납*vz~_m;ϰZטv)ΗB+A3#!MNfצ:RC&z//PLH/St;uC{#lqW՛"jy ۉf`}f$tZX-2gdr(C^8R+,XW62AY[/sv؛W] rh_挾9so}6crZ5.Nޣ/ KOӬAZ}l_bja"z3ҮxIb|uJ$GX*s7t]*{@=k.{gޡp=zHYyj0 av\hl3yG^(+_Z"fFC7!($ h 6@-AID?ňU*er%[k#ؼ1EW ^ ar7 v`̈́vuQm܂+\256(_(˩/GNxALnz,ga8 <'t>fu_iVb,[A: ^1f0Mep.Rf{rXx?Eq{!9t r"Q(u S)‹R' wzݖTw1#]!&ͤE˃MH)gY2#ưT^Aoj(؟;m(Ukج .ZcI~9ˠ}ٮ2awF ,u$!9[./FIN}N}sj־3 J ꎈD:<iѐȗ;bz טE7bTDJζF T O,jpD-Ul\k63Y*f1ZtZKKR:>ץ\A7~ endstream endobj 1063 0 obj << /Length 3105 /Filter /FlateDecode >> stream xڽZ[w~#t,©{NnvRj)$`wfgA\JTs fg.Čß93V1lylw/ 0Q~s( z1|{n: RBfW74mYI4U> 6 "so/޿9:Q̖Pָ/gFHQ$*l3dM^|| '>> c tNcd 'B1ћ.@bHf*eD2^:PG 3`sGrTٴCm-לInvXH?~k~wow8-~{S.V,g֚ o3u+\~Md?FE^/aAmWa@C|^6VS ;=q!a~D-u#'e 0ac&i-o}eu]aVt;'6}π9X:Ŝq CfZcO@pzBwcX"U79D'|}M$HvbOq1)> L(4M0R)+ BN9&8( z޼)eR$=) 4z/;dQ,{/ z=pdQp Ut,Zҏ ؔB\=B(6\пknIx_7I\zuMB ]͙4hxs[7lRgΊ:oߐ hn3KISJz ia^v,1/VtY3zSd(upwQ[v|ĭpB$w)+i3`3lĔ^PiےHc0`("f=SsRdYL]LJeY,'p$bobid[:=2M1-s#qn 1wĉt]+(c#9J "Á ʊ&6e[ݜ.QA=y .] J)M\vqN@߰VX@'`قeTսAz=pÔ蛙LSj ĢX):N  l(:TtiŸd:=^>.ԳNTJ2!`$]GT %pP<]DY"[UYp rCy(1uNpZB;lR9DZ}PtW"++ -A[uJFBX?LU8CP3I(0G,A1W}&ߠސd޵#>`],]hʩQ9&"'T6l,Sts]xs]xjv\n=|,2mհ27%z"Yd>-+RAΙS7\ !;rHN-.tJכ0W(^#i@[w!]wY=egDgJMA'az$.PG5v1 #b`1duM.t>iƚ(.zoڜ,:_meȪt@۔iW#B}dAɃ .-n :}A]\W˫lQiG&NΩ@`aWlX!ӽqja9IeY^>RPY'({)o >i(}M]Zc&gJ4d@A eb(VfWݜaSTn)ßyNd ϛ 3 #,ԠR'  >n` 'z=z/jI2=/ J=l-q9 4;n+j kVcl|ve^ 4YK$'h^Kf _vh}&QD Tיxh+`~!}|^$0c%ZGʲEk[[.Qb;d|<y(Bx@}IOt^lw ]M0fK.4cG[i%BP˴}|*6K6胀W*;xSGx+#*G1}qО)YsINtӫ>Mz&DLÅP#w#4FKxwN O^uD\~0:ZBvךe9mr$0ݵܧN_rHGS| <9 a|c ?aF* 5f),۴Njfvuw[֝ƺ]<_,xW;5_s abBbh9o"{ endstream endobj 1068 0 obj << /Length 2518 /Filter /FlateDecode >> stream xYK6ϯБE[C]g{G9L|HkER&)Oh%AqT@lt_hE |aXɬ4My~A?^q?nWW߽zc)_廉Mr%,ibY]Rvةu6zaf-4J>Q~TW0n@HXԲ6FNmVX5qWU/S>k}Ǯ񜞳jZĤuH.Y wuCRU޶,+~u_y]||UmZ?CM+JR ɸB A)H--W:q?`C fMNoq~%ԹAm[z+j= vTq[ 9D>}Ц\")rؔ:LTG~ 5ZP,l]vAI%MCw43%DVC?jS-y~}GaV^_xOcfհE Ƀ.oW[WHZ$,5d"Y(KOxOLTJ")"E/E$x̃Z.y ~_\_Ǔ $%R2gAB4 O o3y?H9W<\$|OωY ?jO8]$*e֘zSFI;϶PaI2oWʲ$!HRy 294z^+LkpcY\z |Zj̸y;Z Y"by%ZϵL 0" 0~!&zLW]7sG0 x|PM]ͤ(:4NHf@~F $ϰHpO7O4'p| 3~0Yh /\=9?C^5R I# t4Jj)njS؆&J*ZcTJ2d8 ʠ#Bx_B R|$rkЬH  Ӊ 3́B  i?Z;>}7^qa-vEu~9xEzָn{l9 | Ly{rYXcEsk<\Rɓc FZq&GbUz`I MW7^W'?óNw;S* m k6͔aeߑg}qJ@~6o@UQsU ԆðoWXK=p ϛ zퟯ~_ D7x}r=ZpŸ/pPbP>seʪsAi9_(pk7U&;a@O]\xO5ge]Ti+@a,򀺰+ֲ&ai,]H'5lF/w,X+fǼ@Y.~GM{b1ż/6;]61{SB[܄sc 1m(D!)Ӎ& F/.Cְ{w{𔊀)4i7Mq+Ϲ-hD"ʙc߼znMcN)܊*Hbi{@(+&+C)Ld$>~2rӵ41^ͦs,/_bp| M,zqu@??[KXϏ0s:Yd" K}M?j endstream endobj 1074 0 obj << /Length 1406 /Filter /FlateDecode >> stream xڝXn8}WQD elHKM 6mpl*K$oËdɑR Qpr2K!!tulqr> K!Gd07Ugޛd]|3'X`P>ت$ AZS@ঢ়7ʱj(%IS 9GZF;~ttF^Bq(mOԘ1P'haT߷ |: iF`RE )q'ьGkM8 -6`#`Z,(l@A2~ecˈD?sg񬊋EdR35VnIZ*`Y< ڊ̸БjtG|- {Mӆ&-ܕ(j̛d^:\+:#w^4^NUIVTv -EsfWAAQY#ƅ6R"8| s,<.+դaSI KQoigiַjI,7d 1Y*J I%ӹE6JԂE&CzK zS(;ݛckPٹ-")c{ا@3/ۀTz\|o:"B3!0 }{%7;J pbl( 7ꊻ1S, I> stream xڭYs6_Gj`k>LN\?dB:EҰ\<~`M1'.RD2IEWۛyt!#ʟ/^|A(3XY]!DfMU $ a2ƂqzIeзM׋7dNyYL5]SЕE JEsft%4ː l?/Ceߠ"3&ȕEHY9/.e/oJ]B,2ε1VȄ> IQf :y$$ Ur|'9lˢLP!"& xqcOc`:wn*#gsOgc2x`H$h]${;DC,Mwg6+0tmq~첳Z~>.i aR2U(]`8$kZt[7/dzxH$^L cv^v&%!zfQnUȫofmvx{MZg7eFox$P@/*WdI YL" IJ ^PF,K(O9Tڼ*j$aiG>kD#9oX.w4kD@VnIiЩl>A%tڠA[dy\dMw!B_|Z a<,uܶec%F۲hKfyQ4P|IkFlj|6)6*4(Kmrؖ9" q ܴKֽyA]ڃt$g`0Qi  ;D/C論rOѭ1i>}՛}{Z8xj=lr6<_zĽ4轐PQ6z~rPӞ=8B$INbqk^y >K8qqGo(e#JCAUBrxB,>~xjn +<0|7E皦+Ns@N4`.z'/K. Ӕu }Wjuxr]AVYSǬ~N->*( +ެIt\`Rw+^o.9R׫.o ln-QarEߴ>$PyvtDE xքf*[m96Nw,^ R[CAf2![h!]9[p=> stream xZK6Wٵxr6N8Nj#Q3t$J!)O_h%A&[:F7uCb'fVάS);[lq?ZgD7/4 2jLj9{]R5ܗChsiA=LZ5ڋ4FmaΠRXʌK F|nj[6ݶEO93L"ަOY.Y&->(=C;j2|GڈCf.i6z)Ct%"oЉC˜wHN,??HI oѬ dݬ 5D̒䄙%UA!_zs粺zL 3RK7ffl ||pkgT\iR>M. 9x=#1e392ב #tI睲K^iRzJ&M_}'>-|"E'T~ݖuOݾy;6)jΣ<|r2DI [¬'F1)z<Ohwx9.F: FY"ӓ| Zq"IߓZ &(="HwH*Y =E^"Je@)t6Ct'#2!3e˫ۢ Kd!^cCa]t1. EBݵlŠmєyCY "qcov뜾ڕ;YA,1l ]반_z۔ClrN;$gIuMg eqv-^=/NU60E/ZO|q3uYfe4Cm] fmFfy6z쇨]B7$arlo b(D=}[LM xM+2FHbڛ+yPңʹ}NcQ W!>A6^5#2y^Ѳdc0Q W jAC7&T*z %Q!lUAObp8_a5z(ɞzWE-$oePȡxʼ##@u!|l7nEn 7! W˔:3,TMzlΕ57eӠIxQҎ/i&/+nUoͫH:=pXV; >#n;XmȂiAah\{!^o]YڞK}30esɻ oƖ qY "O,fOa ""7S0xг8E͵ V^'1f~I#4@ bNJciä Y8xà"3L6ދc :!AlNwAy|!nGㅥ:SZ`؈':%.7#J3'77AٕrWvoa=HDZ1Z#})COK9t^xL 'X-VX{g;41f5`<|C&Md`"B[fqܜif)~kU&|ʌRlVX5&>$k(GK4Z*.q%Xv[ @*__5qJH:a5B&g/-4XnԢRiϫp].K| $o ܏ B0?zZE5n!"X5}+E&,pܰ\K;Ffc c%>Dk?^u pw7Qg.eb\3oyǼE (^ 0xp~(dz`m#]wA3F(unV. j&i:@W),c|E~@3(]찗 @e$c*D jۛŚIb]i'hT~0S!Nx<b݄FN +=k%bG>|C#/PvB|NT^.C)ۮYmۺ} 606d?:դmK7M# ΂Q:<2f7|H@hV~&ja6G!p˛XIe;'>bkRDB#3ͱPM\nۢ#quqo*i&R #vRDA> !<& 4& ݠLQQXJd6E< qYp`CR =8vWVy`h_wɻ lR }"HYfvo6IZl}7Ҵ_8:P> stream xڍUmO:ίGG4&Aڕtq'meL i%*&~=@R$<1@@H%Aqwf=q| qg$MJiQIdWQM1a$ 7XauRLzno:zc G5JĄ d-OFx6$0 w0(;], Cb9X Ⴃ@AI)R@YXP16ک fX[9<;wIl'7;^(|BCȖ2yt-c.dig {eU"b"Q"%;2QMiVwh%U@3?;w_d9?qyxg,F7v,ƨIa* ;. HbR3v_N[Jn”n8ZKܺ/l ^h/I=ڒoU$(u]k)a~R&_8`> stream xX]F}_[ Hy؍vWZER>xA`5.7`sν3G:S1q\U1W4WPRD(g LYB8*~Ԏ(~[.V' vŃF7I*ZnaBƚn nq>]ī) #HGgA*0Ƚ!g>y̛M8 g^C1v?I|?@܇zQFe쾳Nu߳0A}>lLĸ!%ҧ@V#ǟ!O \9 I`AP%@jΪ9y]U>t-(u"cX{س({\.4t l|pi}IqTfBFfSajD٘m\04c2'ۜ4r.ᇭrQhQz2)/li=' ~DHJ'+[䓇U`{^H?M2oEP7r5#D^2.mo "{SF$Icy3F@AF9.q\)2$4j(@!BR# ټSu5h9}T,m[,1IoIn풧5R;ґ͊me; x{:7wi^ʕ[˷~y*ˉǔz@^5MZIleg +tau4n!„sa{s勏z>|G=J l_ae<1Px{GPRuDڈf`PSQ^ qa%|pwokо32YʙZ^1Gag@,   0 endstream endobj 1096 0 obj << /Length 1283 /Filter /FlateDecode >> stream xYSF~R.NP`I;}MeHr!뻧l5|>}w+ ))͐fʛp=[<78#]ahT`x.x]!6^TBƸO U`C0D܌>j S5^o{F&Mk{lxjDFb+XY)bD4?ag B"%6? @HIa*V|'u'"L*qL窅nbPjd0+5bY J:i!u?zx |uk:Y09 krKwqx_xvXnsx:- \_A$C,Yأӫ^7)6yB{q8|CKn7SEr97a( fvM)jI,ގ*NPcRI1$FXzߵrP]&jfj&%S+*k$]]a%crCJ5|rXj))KMe,:IoI6k%OpYV͒iR+T6PPCSwmi^i1 Zr .f[ Ea(ɳi!gqm)<٣ooD endstream endobj 1102 0 obj << /Length 1160 /Filter /FlateDecode >> stream xW[o6~ϯ[-by'Uv@QcJRP$eɕ/a /GO|$  fH3LpZvqxD\ qC?>zu.D@0JpB񗦪upަeVD1c,$us.·iY̾cZ򅝍SDu(~ףCPg:\6=gD#D ܺc; `n'Ȩcfݷ߱z}|UD(kMn}\9A} pa|ƭަ[#An;㵆hk2l8,])06pEK{6iDl? ks`i764RVB THNbp<ȥ#.h!ԛ/x=qvf!֨C&/f{uKm-M7c3Vᨏ3.Ӟ[lʎcQf˕ʿlv $BwqDhF_'o~AhQqAEUfmf@fN+P%g_I8-2ٝ+#?.r3xVNͲfFD]tv$w_.AT_Mz] Gw.fD 3*'dm72sՌɋN;tK8xwD5fH?k'D vS6> stream xXmO8ίȷMw+񁖂t힐8>4@upM 76))͵:w*/3Ox~SSCS^|g;'`X > 4TU Fޥ/eRN9w<!c'sra>79⧓*?f`EPg-q/+㒖DXp 0ăPH&بwN U0^K, b!.$ AZDXjݙ[&D("١9|$9#EX9gBCꑈ*UJ7H&,54*Cx:}/bFpfYvaG\~qJrZ0ڼL6XE:gLъ]{7D[j[&(am@=tem\Ѿ2ّbπ~L̨iI"> stream xZsBjM$^grGuκ$@KŜD$ $(Cs0U4!T&!!$r L{ dD$\*= ًSM a}ׯn:6Cu<Q_?3zVOIʳ*YʙOC}Vs͓)b'u5Qݬ,*12Bli>8\̈NK!<rC 1\'0"oiv <% 6(GUm΁ ʥp#ta=vIX|q@h#Br|5.ڲ1M!αn>)+[2{ƥú0"F:fJ9H {Vu6YE-Kq2_!H(d9bH3|pfjro6r gJ@* eSƊը(? Kd ܋  >pJOt!Z]  ;sy./6x6V\(싖,[~g_]Zw]Z>Op]O4_!cz4f<4j*/;vif{ݬʷLd դarRR+ˈ#0Y6Tn3 z(H`/0C da簵TL m3ᅬRAj Saɔ_ƒ`*#,Sg꺳ģ~NS|YʫC._:Dؗ Ӊ'{zE]eRbjUS m5 9 yih (): I4 9M-Siof2{_v-8acov6~R2WvqU*Y&M=_OPpu{wxDʢ[&ol/vnZIxڞ,(uz63+ͺz\˽6J(Ƥ kI)Ohb=Cf$ ;7$|U\h(-e0UDD)G P<`}5gum׊68.oc_FSbJ1Y+,;&xŠUnhȾΏ :}%x{T IȺͯU1ngψ^wO ND& MK iUrGlt"I&-+.p7 ZJ') o &N]sRSg$IDަI4$<ߨ~`][r: vRkwv-lo?ا1ڄbkcQ |Ki|0E[S7&yH{oKw߳˷WW3cQeFx9xTV~E15+il4'BJ4Z ޓ4n 5^#w=)V`X/ P5#=9!]xwa7[^ܨNql^eQkse5Րp>b7.8,8[U[+ )>h@{31C[d_{3njvg#Rz踵^?Ci endstream endobj 1120 0 obj << /Length 3226 /Filter /FlateDecode >> stream xڭْ]_k03\QXlTJp@kpq(Y)Ko_mpOuٝoxGJA>}QQn^lĘ1?E{Z{|y5&^5 7Sv}7n{v; #?2Oj/*$aav{珟07{$?B})F4H]Yom!ݯCzMϫ RnoRC{8lW 3bT"&UϼxYHd;2&<$DgHsbW߀l*x}m?w9>;^e3r|GsΟƓ1%:K>qu1L&}N"?>*p!9bW(St035}gۮʪ,>o3iytqQ5& 8zX]2ܿSji]bБb]e F 4(x_!:T^Ο]CT%|o@#-d_„A]_PBͱE^wIX=Om wR(b6wNpXHfDFymWt۾E|\?_χ{8U@#Μn}˓t( 8KDɧ .*{0ORURO[ۢcqT(RTjm4,%3'*y_QUuڳlLJ. l92fk)0wXRZA(@12,CȬPtͩㅼKx{8aybp[ ۗ~g߾s!QsRԫ0.,>o9ʺk31 ڢP1^)ږ59$:U& d9s(5УHZ; _X%n[X0B=rygp9pXB3~/6Fˋ<3AMWΤnf8eN"!g'OJv.:Ne]?lr0"RqvO]TՍЙ;UÙC)^m@ mr)}ƛh 8%v\ ?ά`djAafX]ɓ)|8zuӜapfh; 25{#M]Qq|/>=zȇbm[G3qQCAt:6ý=NNtC[FC }F+ ʙzʮ#naZG>Cq}So.t04SiEDRK30Xcbӄ׭|s`,N).3DPh#ڜӚ]x> 0ZyR'7H}G`1uclr3K4AV]PVSyWu;siWam Lv].\HԿ ]U޵ba!p c3T{'8['B,ЮP7qI[KcE C6Kas|Xv\98*^FOJ%ǂ, 0UOMJt3t j 6"mĜp]m)"y޵W߾VM9e"* +_L4L^ґZ>}'YD`HRm aSwbд=B,N"҅<1 %. #Y4@SieKHE}`Np8kKl.wB 2&0ԻY"ˇwZ'lWM)qj sՅT~1B6Nhhܔcu z -0EƄ `пᔂ "zbtTԻʀ\SQӌk@=i\GB\HSvF42ZhvG7k;REǢ9mØ &ËaKK6/ e;[ 2)G5ߥʢ؆|mljDP02.`*%$lmtyN#Ȩb>uW{'?C %`lV% I8zCJȕT~$Ոb_8&k+-A%VR_x^UB=?뇡~-2B^\-WBT[* ~j"r].cjTJ)ٱ)?THQAJ*_~PEFBSa2y%&Sys0/~"KnjU]D_1yڄI)T73 jhDIi% !g-٥\f endstream endobj 1124 0 obj << /Length 2343 /Filter /FlateDecode >> stream xZKW|Yj1¼(Um8VX\&<̐],9tkׯYYLT)*g̼mog֥0V~%3b:Gr(3(VCVe}zwwMhzԴ10xHLJ&3ș&L/C 8(s1|" GIleLgˑzrhE5h/Ma sy:HpVDH.㊫6&,k.cR%Ujb}HًcBd%ʘŔl٨ÕS ^|9Kp{plO(y $>p1nT1!p|s:S9#_9Q+Hb/sW ) |L"Ad1LlKv9I9Oq74iT/9}jz]k^3o_^ OךMzv|k߫m1`a-38O`*)n\ٳP?VK9Yt? 68'xFY>RrMt#0ɸf WF08QFRu녁l_br$(6^3u0e4y~]6ƃГWn,f}ycƧr]򱂹Ÿ)"KfN" r(eC7ui\VU]u0) _Q 1Do0]lX *7ա;wm8/Bv0ٙPY۪JX}3yIPf0faWQadx0br \R 6:v 1gުAo,@f 4y8ݜ]aBn~m<pWC>V(P`~<5c[ vr <,ڲ0Í~XB/zC_oWRI Cda\U1HuѲ |qX0' iRX?sAxE!97apAX'`*ԡ*ţ9͘;Mns{pT튅KSs B;8ہ:ǁGu,QX\V0njjZ;jJQM(^й͉B5Q\B(YAXMfb,Y$l^Uǡ|h9RQȑ[we*mVX}}& ėK~Gk폷/tMFՉ&<<)xs_z*]]:k +v+8#?FpޟlFf3wN>#zd6SlkLe)]꜒)dz!DAѕ3 \)>s0Qh#YC)1'Z1i ,9PB9) ZE:^w׏7t\|@gAB{zprSҟ9]7]O7^IsU7^x%tjV3Rg׸¬k^=W=1vA63Yvjfk8ABc\іCh@Q2b.6jN.N[=|v]'Z |j &nW"gO JׂrU@fx͐j 3jv2qpla z endstream endobj 1012 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1706 /Filter /FlateDecode >> stream xZQo7~_ދVH*yHE/h`}?jvzzg&iDIf(RD(k KWk,0 h.(6R ix5'v2w :p9cH>\@\*aLx*L!&LȧStɰJ0f!N*?U0H$87BIL PX~)}d 5H%)h 2 0g79$v :jR KqIю{ME}&ʁ2VĖ}Jb $][r )RKxުv Va:FrPI]2 Z:vr_#|X}!U&1u!ܒI;j Kc0*n BBP ][Ģ:}0nț`fa_ A¿`PN5< =jhnZ1dpI t#bn˄ .y$n3xbtzg͓'I>EEgAveE5D w@.f"li~6~_vWO>۽~znH0]o^}y{x&1#h%{u#H+}-q/z3jCpۻL1Z p zf˄r3th&૧tCBii``5_cֹh&ZrdKhOο\ kaݳ }>n?|߽}6^Gȹ6ϹjGl_ >$|$p( ʝH,pWRj+z*4{4Ŝ,~Q4xUFeO pL2jJu鉥NA4 ICU #!p֡q aQ0 Tcͺ"C tsw}y?`ܿ$TSG@a#L2m͆N~CRcN4;_E5jXnֺAó#ͿTGRaA;g LQ!JQfP#áid-ƿ: Vb qt4A'[J'd сEz䃦4e #/:Ω63)VgMբQeH3;y|yxALjϲtF(Q"( ¢7@Z/.sx6H>6Zo؎+@'r7r(Ǻ^oBvNЉs9ќzUJ0Ŝ|Bf endstream endobj 1129 0 obj << /Length 2131 /Filter /FlateDecode >> stream xYK6ϯ)--d6LЋY/rAKr$yf:~XEZNsE&Eɪb}B\$jab[v~XPw$@(Y(ZHJ.V⃗!;^azRU8'ٝm^]wgG* "^ɨ~jm2=UH7upXkonٛ<Ȋ Vq}—a #Iiw*P,a$JW^{0OTv6h>!qy玄T;Ydd[wOG>2xff%LI|<9 _8h7VK,{`YTD1_HakfyYs:9SЎ}UY}ȝ KǾ-`ŠF6v^tn̎m|5_ (X8VMSwf(N4|2sV& U-~r˴_zj>۬ Mzlo̸ nzWZW+V,ӶcD8I˾fh$‘Eط({b Z2 5d!{(}"h`qctiM~Oܐ.-ε@>x4 mh:QpHc!CC|dMûS3V1I3HTECIcӚ-N1>9C?fo&HT(^{w8\t*İ 4mHCnmPPOh3Ż֦5~LҠ3.E̩*)eC.p$$#Wqt64HPMNNC$)5.Ξ9 XC;t1o0鞉-?A,*t}B=ý :y=cc ?2a ͏6=#djl;-l dYɡRR#:9hNmϭ/gmu: Yrhnzg٭Y%}L^v[%CANRU|0>;Sj@uÍWX^ZLڳNhLRlн'iܡ]c=Vdf?!EW.o[P:x,I\][@AjHH؀mEm xl8X`ނ/ԡ 9{4i۲dE|\l./6詧sW[U)?NjMP  CbK0C2j W§4lD g_HWio)ˁg0O8/ Co梁78@V5MTp|gߔ_Cgt3)&. %沐gCwkI0^kYD3x<>J0I/$̀u.{4r2fUW_= 9^S#o'/C)8r٪wWI^8+Ǥ p:q#ȼ > stream xr`"c\с,Z.INY;  ==x-]\D|t!tTOD+[ hWeWn+e"OѷىHX oSMM5p Dŏ/|H~.>FjO\2p^+xZX]Qmhzk-rYUˋ$'1 \WwD۬fg=@i;{`Ⱦ)j"WQWYYeI -r[_Օ)P~C;5yuOZ]燲#ϧ`p :'L)Xk5`\׼`N+ӧlmGOՊ${M$g:G)T-26d}2-4'S~! [@ef,ݑvѶh<{b$ 쌢zE+c=t.J2 8t/vtbty*ڝ:NA9PK0Ybʘ9V]a"fi:х-}'^q NG>}WWc3~P71\ZŵoSWf}Pe&PZ7{rDNo{dʛT:ud̈~qРՍ=SbSM! qE2e9i-%{X7 1qiA V  & $tʻ sUk5qK-mҙRhŃ '9kA;:\tGVrˮ{P`KqKGU켖h]aoHӴ+%,ǘ;NgzqAxfg7 q,p =nH0U  a#OI(Dw8Kcv}7ErS6t %#%r+DdL'EJf)j&$P&@C]`I<caiS%FXBwQQ6x2gq,FGguA~G*˄[S(eoМd2?ڵm,86#3*Lsd1bXW8 5ThYE{eSEn KP ͮFliym" Rz*!QdTX pWGwpNynr~paHy* S@@ plqhXI8א? 4Eˠ83$sb`"WG9;|Xƌ,v,PR3y[s$aD֘0T0xzzB/ϧI{QT*>H+lk&b(&Eo C,1Pu(|Uυ9cA1 ÙQ=dPdGqcq}">1(Ȫ%\@r1% ]WZ/(B0n@/F$1gRR(m(o6*=> #=$yʤL!r$Ă/ [ڡk`pN^~eM-&`N{3^5v O}Nt-v*rId= hחW/Ϟ};>̳ a#p39GH d#Ƅr^gbvnn____,ufc&$Ln578z86 +e^A`wWzlqI_:&P$)}zRQS(tOXtr{i 9J?fV_+rA. c]S- &wo'9n)*-UNm@Y V2v[|14ViԨ._2cq:X݃W0(ndB(,s|0P w!sӼpqӳ8fqCdovq̸43g'}.H_`a"|6ʰ1mz5ͧuS5MQ w lҦ04s|2U\۷T9j[czLkmыA\ʳ] 5o,A}?zE3Az=v}G3\U(f 49&aIY2a~Ǭcv|8<5|I&$G,yq~*1.8zkttX| .? 9 >zGP̄V{0>rjӲ`'i%͵8N7D~PLxr8KNvl. 21b#LiDmѸ\R^64q7]O}^q .39&w2p&rڸM8z3/!!~$,0'R=P3 ibUR5!ۀe^/pyq eSǪ& DM(AX]LӦ9&5t_uͧ!س7 endstream endobj 1137 0 obj << /Length 2356 /Filter /FlateDecode >> stream xZK6WrerٗlRڇ8"5- IקحD7׍ "THT6nW/D0/^] Htu.uEl.96Y0(9?K|_p,=m,߮;ق "xxCm$hL@!LBzL7)$$;Um˭ӧ5S^`G"5wk!dV RV+~F_u a.DvV~bL=80T^Tp>ovi`%PS)CWf!,@fTd h;gF ,hb:*KO*4++\s3iӐPa<o;NVPSWmL3Z R:9/S3nUN5"bB#>vNԮ 3VK#>Al2Pꃄe.y-:/H&ɋ5j$ikV餘S]&^ӿoNnK:ycc!yO 9$*FH]D9oMOnVV}VY6 ?g ,<2&dW-6URH7HxI-5me fS~ccR5FXY!%|MDqE [A)\c1jtFW=CyP3m-/4!S@q]!Ij*8ԁF; 5|pP2!0Ic>dΦWp\65E02٬wҼ:%Uyø |YSS.;}ޘuX>m!t&Ad44^r|n7IDt&ICI{ajLM0ͲUvg@*h/JiC6_ZF^/hOٶT%7uLbd{w3nedU<:achPR_0o1)"dקh؊HAlS3#qñmbr!_@i~h#(2Bֱn:*pY}9!B4=(T0eN8emX L#7}p"ZuYrWND@La 70c&ШZ4rÃZxi@VѠbEW~I endstream endobj 1142 0 obj << /Length 3096 /Filter /FlateDecode >> stream xZH_1ߦg.R`EI,Bwz:( Iv?\yvK\lƬ.'ooӫ6ϖRWϖJl)bZ6JV.<{w˃/L+yGA;CiaOaXI|Zdv˼<COO(# 2Ԗ%kN^rq.Zp:I'ZE^ی&PGվڷ4\]g6/xm-9bqq8#CO^Dڑ3/szbڦMhoFM4+LT<Ӏ HPA%qflHG!V %:5Kbs/N cLa8)sE|`@1Im c`ڄbmFrcbڇ'"˱?1 =z "'"քI=iE>%li[~"{`|K(/=9P0aQb;1-Rg<ҹC#+ܲ&7 R}%?|8yrBNTX if! -OC 8P{A\ɷSP/^tٴ[5`=}NkT5lF ٴRH2Ɓ4Ɵ]!=HͤyΞ0k{"Y cJ/_tƅRo-D QH\7mà*$/iK Ya;'=K) ǩ^>HL#aHA҂ҺmhSci2nTm^dDLuެPOtzǣ$p?t8"HY$ߍ- N:&s;3 %8Ec/rp k@ҟqHBh$ TҼujiͬ0HA^m} H<"$4 EH@K1mDZ}]E0$5s5,5}j!SV5b>߄9s⴪YdQʎN/U1pLah1XRSPhbFG<_\UiQA5fDX3Mp#?*a*CV/pPc\! d("8s2⇂8;~v\o=C6A܆GΠ./760p9;CPP%b E#qW+Mzm)$u#wA1H@ׇDFcR^)s2};3)  aȀ&&fF`_]8n0,ۂĭr1L"q8? G=T.:{R>ҭ+\ap)+n,vkA9 +J2avAT [x8C6[q ܎]A0VC,"wUs%5tP R;Y}^ͺfq?,b |&W)p XV%v. vVbMv7^a58.':C۞yydP-: «GO_%C"?N8Mۺ 8Y§*Oy7idk}]O),c: Kk(\ X !rӮO) !q`JT䆮vWa*n1V9I8e@V8 5y@J$#C/Kn5'ֳxJĜ@)|N9ab}D ;-snm{XljX ť&z{`g`@Seqlw0lm𗔸PrX]=c ,WcA2Nh $'m@S\H&!"B]m cE ΑnWYݺb @Kq'*- C8G)w4û,XD4Z;lpG|5@=iWo`03,gYd gn^Dq(tä]#}pOASTTUű¦ߕ+lXK &`/&Ǎ/䕠Ф])ћD&B R2D2EyИV#"8x-د7L[BQC;-E)oы/Ӣwkы#-zuTmn`#ypyV"IV?Ey2Jh2_y_/OE/?tD*վnz\?\v8[>\託#gsNW /|a3p@4uem^=~Ϭ)Uղ [V6$[ , e ~3ңui6~ `"-e9]J)/w8w{syC]0eJUrlGblcPfMl rO؇^N+f]j0{I% (xwZ닛+c:U^FM7eo1Ec.";FL_3NN8}J?M?te̾}kV]MREcy}CauӌYe}Cɞt#q䮉؂w]8Uz"d7M߱E/!֣R>R3ֿ?T˜οl|&QYt[Y*5yKw5}_ 0ѳ lrn|e'=ڠ UW;z_e>n^ByXmA endstream endobj 1145 0 obj << /Length 2376 /Filter /FlateDecode >> stream xZߓ۶~_fLAԝqq=%yh(THʎw &=bvB6ˇ'm?.'͋abݓg/t'9_ܭ}Qw?#nc_7Ů/XJqmT}hUnޗ_wqT,UJE5d%"?52zAzV]+fK-۶qz( nD+*qTuPĝ>{)_1&j rf?J*WAa%8$IBrHO@~b6Lf4 -|'q5LsAu2p)N]2ܰk g=_Њ=. 7ÔK~QS)#0-%M)[ i˓$\ Sz0&)non߻Pr}U49>nWǎ5 FX=b2 Z5BZ'JJX@pJh7^73#Ɖ.Q6Rս.iw-h6Qb!b!t2eDH(U =@˖&۔G͚[.G +:p|@s&)318MTEvdeSUzZGezL,u2 ܢMӕ#}<},ۃZ.add K2܀mdKp^_,fA;!NI&[=* FQfh?CuxkwP84#2G}vWS ?OI7"E"Q,br5ͮ7 2u} % yV]-D+zQ2Ԡ3*M%2xXeїnu;nNq7rþcG3k o9?vPv̘U40CC$?%0Q4Tyk*ߏw'੸K?& -^b"mP)iX*jہnMɯc&&Ц>Vcsgc꼣]e?ۢP-=MCϸe11|]e]K`]R1$2&ꡫtl*1գ u+<Lb~j:d+3"[-z{4 }d{5v@W:~|b0[ y>9Wb[?]S7?~D 9hd公{?&#W 58 ՗AhJ۷^W7?`\PvvSpGm\l^:;^q{3|Ocx=:9Q*쬑*pPEzahx?Y׈?i $gf<ef㊶B-&a9oJ''7-|<~xN9; c#xfom뾬zj4@L| _$>L7庀8ta%Z=:YB˶Fg 8C< aprތj[wwdTvoHo|Yڦw'}70ijlVWtZ7P}ߕGEJ2N6 O,F~{& ZJjݯiJ. tjfP|yCjcpt8zG9b"~x4gx|Ғg!sBƖaa*s n^y T*{2Ͼ^Z{_k~ׅ/lױLC]sbOށX{:;-kl k`)߂V m׹un ?f zl$nu]Pi"Jc&MYȠ(%"R}^QҀ=|@ ӺE@$b^M3͈p6Y+8i317a_vh쾀#>[jg0&@4%u{!4!"~ XHI:wt'yŐ 87f@'BzsFoȟ(ڶjL9mkQ2>bSgŲϻoc(T*U>q0i&l)x*>/O$G`qg%f|H+y;%?rprիb]f4Zյa;U&o+fl %-÷[2度ڱmiudts ,Y 䣑\\oNP=ESؙu[@+#5rV#;eHH0e-"hbt@!lxqeCƦP@򱛂eU!%Dc]XT:ͧ=G )h%;mɊ6{Uq8v "H؋V1U'82(&ا#t%ct(1-&j:a E~v`.mž-* TmgI> Mfhs2f,3y"&m12x9B: E?4{O$ifN28ZZg_P䱿[8qb2]˨ P5ewLݝ1epA^}'ᢇp9)7W\4/.ؔ2+pdk.Z6"/tٔ C[A{T~_%=t`<- mu(VԾv6° 5sEJ6׹ŷ z2-;Խ;9T`9kۺYOޚ/4q |81Sܧ=pTG?婈$5J*<V 6XcKd-u0-RFAd0HuwOL*)]_&b*)t{[rMڹ'p^m 0tw*::=iyn[-֓PJz BR{ 5yc9o=@ʈOlo&SHwD$sa]cUFpN C޵}uS9)2N=ڌ)u"`>.4H͡1LzEY/tEyo 0!^wg2We`(X֫1`Ah7%@v4߰k߸p3g""ԝV 8U稻45>#:ReEA~ bG Ȉhp+=;цɮKMskǹ㞯k&NW65bt=#~鶛@Bx0O#DW(py}{m&uϸ[0Y{W%M73X }\ ˨՛HBԹ1!u4PZK"bkl3=o# ^\pǂ 8ZJ t݊?&'uGMB󁶗} |{9<Ƴ>/~Ϫ8HRWUVD+~w&ANꧣՊJCfnj$acBOisg4Qh8N/ZH!@1PZ =2lZxqMrmCK5 HB\&6Lֶa-5[ZR8~  &*s endstream endobj 1155 0 obj << /Length 495 /Filter /FlateDecode >> stream xڍSn0+Xi%mgL+N@J 5عQ4{|ιXD"D:$:*3z:Ïqgߥ%X/Ty bh!4j36Ɯsew2Tҵ}?g7L$# "L{D*8~JsrTغ3EWaU}7ܓdSS• lC)+ۮKk 5,{ ׌~ߚ f0@r{Mx;SA?$a(֬1zԅd0}LhJ@f+*5:i;LaqldSV|ωg@>_սm]>g~.i0>Az5BC/ufC_`2HR#Og`;!܅n%O;ձsˋnGU[>)Puw^Կ  endstream endobj 1159 0 obj << /Length 2176 /Filter /FlateDecode >> stream xZݏ6_a'~Kz@ӻ{[\ƗX8J]#&= 5*>t υ=:Kve[‰b̊¥TX`WmTE6eMS<%m8AvFiu6_pE}J^ݨe*2@Si4C BpFlW4 ߼ Croz<&nGmk.Q}pI.TG=4 R_xRB m2s~#-Gڍgk^VCRFN^gT5>f8-<̓Wd8r%~:J>2 R册nfz7ϝM@EsYyDdy&@R$zC&*d@[秾QPv(R,E[K#! uw^[b('B( #f ՙhmAncWm4W\@?M,|~kQ^MÖ)}!a:V}Lv4C;T } yUyr@jۨsq4zm yfH4mf;h˼v_{u J: 6B w9r\h4T]u3A)+ϕUǦձ):͑:VX¹i$IHRoD5tҡWnp6~p:M]^~FI;ŁS@{u|돎P[x\ endstream endobj 1162 0 obj << /Length 1875 /Filter /FlateDecode >> stream xYK۸W6g ^d8UIm&#B#V$rBRv_n4HhFl} F_74|2bellnV̏vw+jRXV/Sj3Vd_lnջT(#Mz[NWa? W}a:xθϽPֻz&LCٴݺnP}2:Zd M껭7n|3JaR_br,`ؘTQa/,3z\>r|s\bi!~+ [\$_J2yz-L317S:W` Mר3h%9S\kT2asIntjFtA ^_gsGA&:CƵi1.0OA,|r\@fvN#f~ MESQp~sk(͟/.%g#9f3_0?Ͷ<-`S&H۔]Jhq0X3:Wr5Su>!LnB9*fdǸ! $LPHm(wWK32_֬3TAfuƳN\Q-~,w:TRݫ,=-Ten\87l .؆$ &4nNCЬ>7^.}9t?bv5S^Ec`7I2?!Rϡ=PriWxS/_G]27tJF lzCaciz4x[.-5YФ'WA6:Wu_vCOM ~#r챾m &%}_wnpVx[, ڀs/ ? ):bH8}:w߹14FFƘK);:#--(ZTtuThCB(8P9&7(f\6@ᜌNGDl!/1/*TIG[@Py?ԡ')&&Xɧ~v뢢rnhK®fqԔtPIŤhE8<}eQU}P?G`2;&p 7"WQA~V:?tnD'Vn7ێ?1!؅u߻evO%8)a<<[sIq҇Цeg5V ^>Y+܀viGip}U>%bikar&nͮ5X_xLP.A9&a/i~8Х\<= $֜jP5-)N [LVOt|LiǏ֎Z,1%uqc!,(}.آZG0p Ƨ(7?h%TsJy<~!M<\AJL]6Ajā/ķ-]WݞB0`k`@zHl5gW=|,?\ 踯&~̕]>]vrS IԿ _5wP;iSry%Pi++9= '9'!ҋ-cu+iϮd0 VC * Ɠi `edy솧.sy)P^Ԃ>AŒwc rz&lwP/-_$$@ endstream endobj 1167 0 obj << /Length 2528 /Filter /FlateDecode >> stream xZK6Whsء0 *oʏ*Vrq|(h2E*$o7k0akv]:FE,4di,3O6 j|t.#׫gϯx{,2ڎY6OΛ8tYa:~bFQ켩e:]Sy7n'Q$~XA(wV;9bNM;ռڢ_;0Ll;bY+;+SadgnJaq> =ZW I*D2 `|E 75 "( S%i.-unFNtZT-ꪼ_!;2 R-n+l' 7H5MN-SE0jwr **kDuG~(Ⲥ3I7xFg} E+7v(@[ogB!7zd0tfcZxۺ)~ieK|͇_5 "c }Y+XҙO|C-)ʜ= "ٯč_: e;xe[{XAWْJ3l,#F;ġqն1>/1Mt^#ߎ5ɎC~l2D,T< ך\gW l# >=/[L}pWCjQ卍 Ė4]>1wA67}s|'a7C:d OusRn"[[|]E/lŸzmN)<;8w)yHoPtFM )P ZJX:ZKY<ɔ)6}nEBO e&b&vۗ_2U.$pL?**9-U,#=Bk i3?^*b }A5 #4C ;BO0 ݉0nyk{8-*y\\&Fi`YC=l !dVArk4p./*,߂0R4"P`)ptڨ^m'{k憱PߣޤBFÙLQN2*p~4~zٕ'#ُB4rR;эD /*rM z00Pl0^sݴBtRbR`N~6Q}#Sd"S$? Y2@g[u*prLR.R.jDD=3W l:$(jpY0ORk'T#ŧ i̿٘f,}ե  B#S+nœ)`PpQphjaCm >gp96.8g/i?FuD{-nDBO@vӟ4g endstream endobj 1171 0 obj << /Length 2629 /Filter /FlateDecode >> stream x]sܶݿBO50_#EbwK8gE'O3Lbw<~?~$ Y&'@6w'47p>#ųQt?YǨ^"Jd]l]S? CG/O})#NEuM]vg/v>.E$"Zgc YR Du]hz>G,ԀwZ\.aKK4FSm{5@:_vuS|1Tޑih}V4 }%`R^嗴lOٺ@?P^~=K(~ݬZK$xKef_sa= yr Z'IOcC6gebn]| uU.^%*2sx  W%"NEd뚔5Bh22r"Rsa6jvovyK0YH2f43B e29l4ܫxR]]vvawuR&]ț^s2 ک\%`Q/Hu:_//*s'U8k`0X)(EsvBӤdMe NƐXR4nDWIvj KE A' ;[YUaȄ,3aƷ[Ug0SOa,7`PWRBT5۴~ 8Җp h2sfD5@z 䇀E3D$#G@sjo*N9`g|-pjzMxZ֥JX8qdNAqW`7nׇ;Y,t1"c`'c:.4E-Ci66pԨ. {h="oF '# 5-x6,>dtA-'LaS:\ºm_;j갪'wbrX.˽UBc\+s車@CR8@<"\Ɣ}M2EC+g%VG`7m"F6Gx+ky0`i֗6WLk<,^2l,fEGXIsSsyqP&!=F8oN`;`T(2"ֹ;OѨ!'h<P2c`Fkθxh}g|KR[lHziPĤ_\\}mwT:6C8 F16/hL8-H#=K>`4EQ:vUWsX}1`0dXwvub]4,mJفWDx W>4p;UN*2+ 08x8Q:ޒo^_Wꂐ 1*$E^ )<0al o8չ= D^Hc-~AUCS\ ӥj5N[\aTJM%A\!-pS"'$6Mv=hOr IØ}ZMDgnuYٴ,7!x7E>A}өn& gQ(O-?w4H5oط/Ɉ@Ԭ-@:}/Y[˺cusΔ9g,$|T-#W,KM;Fg?O_kʙ5.*Id-9*(ˢTyAEcp P !~l\xԈ4y2JЅHDeOg}?ELr<Zȑ r8rUVmEN0yyY2O0F; 57Gd$B|3E9Z:Đee|2etoԱOhp¹"mh1y u}Z,Ԧw/ q|h/]NG9;cǺ }-4+w@tܕe,чn k`.i2UB_]ctƝSH$>sI~Of"N$ (JO'?:Q"->{ A.-ʢqYR *Zy|]ݲ#?nrt_ n0,/)m>=䳉iIj/MczG)󳋳7ypn8`?DHg @PjMhK>kL~@zܫn4F޷-z_X endstream endobj 1175 0 obj << /Length 2468 /Filter /FlateDecode >> stream xZ[sܶ~PQ  xL%vRyLj9kY=7]Oi;ca ;WDd$cI}D=BXV>|UЈQAO..W'r7,8ӳ$xѵg,ƾkWWc oBd< rz~',! $֬Kq18O `O(7x$#),\UԟZQ] L)~xp]֭z-Ǿ pm%,PҜdIlUyC݋W&jj4 {1Qq=@}OeAC0A5{i r&ݨDYտGcX A)т23nZQ~@YuU6ͭ*V3NM+H­Z p1+ 5RЧ>cx&yybD8S?MJVrP6]Y=[+5,Iً:bOS@7-#~F} s0S4i~@"yAQC3"pzܨ`T_F[M[nS<8: !EdnU+ejPծQW0ydk* )r=3vRRZtg/*mEJӠ ?B.)\$|B~]yFnbIDPf..z&tqdž]wI6[He=\Z4(5m~kd3|<*Z?7eFb$SJ_fi 刯a= } (,[n̑NeTz)wlj"]:2E[^4-] 4`6h5Ʊ Q`t`2ϺlԈX7%<[䐧A> .2AR3̸kf@808H5x<8=Z!=m pTz0UXg>S~| Aki[跦~iYQr'$bfStJqJHPYR5Vf^6MWUvR\iWGq )uN>|w&v3.3RQYH4_a~ k4Z~qD߃ln\ho۠E wr#(q8f1[v}1gtRkK/ uSvcN$vYs zl}D!\Ksxi}eխ.\XF`=HW.fu8[$Zn*KE E B6Foqɓ24uՍqDXf1X[3|ɲY}e rs(0սM%F^ <;rUJ,ַS^a1`ڵR^F$LwwjQ,JA$Nvqz*ޟ5ug!4rg3E>"> stream xYK4HqS2,R{Ǚ;.ïeɶQ&X5Xr[C=x^H"E"?Iva~x[cG'|'(MR޸K]?Eb%*Fu"*z^PyW›_y?'qF/Tv>KXpfFlw[7e!5ˢ5o˪ܗV`p*hvY`4u+\u0Kal(F_yi$|0AA'ulHgA`N$ul!JKiB,bF xH8DJ jjpQ*XbĤ@m4<paRͶh ^G1S<||LZցWu@/6,Mcw8vz~|m VW"IB>Wz6r >uNQ*"\oWFWAR(=Zye& }XteMf֫#*+7bU˺b36PX >ܳbNٝ?p{Uxv|6->` ͺ0S qi?wjNΠ!ǘ9T%C !]mv GugC6E^`VDR(I&0g/QJ"2mQC:v>l.{(e ]G+n6OFk7 !Z5ANV˒U0@pz X,Zf7TbYw<\n1|@x~S € ض9ᐒ2U⨏%QwYcc=kK1xu@K$b^ 5]ON!B[ lB9ae쀼@FPyi ;'{d^yz1/65wphLatAR Dc:{/XJNcRũT3MVuUzlIf) usiѕlgubVM7k3/ӥI+ funѤcl7r{AK(p{/O4g6m̞w&oWBw?}v" B<tMA%;2QM!w\BO?(0d`_[.P و|<1%6=zY]|41҇;cςA.c,2XS,1X>Op.AnlߎɢoU^sAv}jȿJ2>K:mv])AXv/PBT endstream endobj 1184 0 obj << /Length 2257 /Filter /FlateDecode >> stream xYKsܸW& +>^Zks@V8,ɱF| \rH*Fw,U1SqzVf۝Q׷O]WWO(Yfj;'uU}^㠻M/.6Bu\D*䯺<C3H" T|O\H2)G2V8sS%,>j]^2sdc-LYǘ՟ tQr{f=GGJDc&-,?"Ҡz-MdwQ4#8H.8A>~7bHYم|!0LGJ4J fnotd~H[z_/dI3xZͽ(^ &j|Ū%Fv2N^H$몮'ujʼ[ { uFQ=MQp`mG K]/℁`إd2d#8 ~Pd"h>qԞPr JI>CC%ܡ/锐>h5zR!@IYEq"3*$#XZBt^SwCOMMҽ= N-fNN +$zCѓ>Nc)SNN;k=>qMǙ1qs婮h|ǭv2#t[I\)p cZodAr64մ5` B*5 $.L`E̕&K Y{NHJVn^CĔ{MIܺS֠K~C[=껭L1];/'ETWhK]>ǑcA}'E:.thAKyS.i%h;TMV;xK.2&lyil7@NԹeO^:N@-u=ێ!:[nJG{F[(<]̸k.pڶlߛH_ʐ:ՕiGjEwV9_@gR"ёSEתfS16[E8GqN^Z[]Tqr8Z@vM {p]Llkу=&=%8>|mj1FޖMDa\S4_8ߗ 9@[ĉ8IB!mh L&o!?:>)~,,W690AUmkC[8馸ܘ3w˛e*ol].\I p_>זdO2mJ6p|@o#Jo?g}pl飯M7{DJd<Ia)0JS( Tx;̓A fZFI !9Z߅-p`bDkzRmŭpU nNU}vE^Gq%2* fHǃTǠ' 8S]*5ut@ɗz'v<޴.6T]K~<ù()!ūzf2;L[5(+4= n4|h$ph Xݑ85-mei{PkM@/j(w֑.,YlzЇg:sWٲmlڽef WvCqk; 9PM PO`۞b:2l/5Ks;2#SwspD="^Y;@ l>6eTu:"Da!(-a s9]v kXM~1Tnȩ0C%Y8{ud/Mӂġz,]M hS+Gi%Ƨolήd@%i2w<ekj| [[O߽xEgzœ@SPp麿[,:B$zW6x3,"i~xsE\hF,P-"~/?a}]n!W |RS n endstream endobj 1188 0 obj << /Length 2258 /Filter /FlateDecode >> stream xZKW6`uo2@w89Xr@K=3D$J)K&=Ýbwu}U_UQ9 [HVHX~}ú,\Vk9+/[oB-WBgC˕*˕R*,(2wwYBFfU]EV5m<. kFD)qW\2tyQoS{8^dˠjfRe N zHx$T>˫( 3Em/KzS@ Wo0ڬ̹ZW@:NEK?a&ɬj۲A08DFS6\hYY)|iz(:lWugj! FI?=9j$3ܸG݄{Wg4]S=њI[FqI R$f fA@r:@LZMjR&kߦRhWf:4[lG5Ձ Pq;߅i 8 <;B X}άƟMY ^2~ZDpx>ـ8[w4v-|qJ?Aª]Gz 5bYd?=K&-4>p}缛) 4cd^JtS,%5‚+vUߟS7[9ys-G?`y؇YW5x9FWsI?Kg"3kS@t`.ȓex2u1+z˄#dwphDcuF$Sd#dS2>+d#{Q4zd@6Ù@6zC#ma(R &@<}_EY 0u7)|,EmnwHC>/ChLYa Ͻ9?.'4OvQhD5*8d4BPAC-䨋OS3GQ_>h 1JiaYh a$x2t|@q^hUا [L㭷Q|"Pa=~&wz,p|VdeqUw4&v?x(\[`$SjJ6|L3r {>+D F DI$~9C *߽#2ؿY%DIy`=_cmff>wz`|tMyvQVQVyxTF_bM[5۶4rx o1bdX+{`dKDsf\z?;G #/9ˇBᗻvo# SSw%dꖚr= G.eCkn ψA=gG41#NWu].ě5㖞 D D`R%lPrREh\ a9_UzJ> .wz-Yh4vf^g$` ^~2gW%x  `.5 8vOz&w^锯l<ピNëQz!` Qá%8ּDpr 'EBH/# nO~_,Mú <[V*ɢڹv,?fO;⥮b'Bjҟ endstream endobj 1191 0 obj << /Length 1866 /Filter /FlateDecode >> stream xYݏFȣ# B \K_*Ѽ&q..}86V;vswpPN]o>>KϬTTr qՌ/z=] ŃZx²$zjnh汔2˘kqͽ3ع*Vm^~ʤY2{jw}dwȫm l*&M0cFf7 ٠F>n\ц޴o<swQ冞ܿ76_ʤDN nK}{{,6:MƯ.WRVlzNlk飋]J0 PdzOE^!cY1NGb; m!]COӑ?n 0ĝILzbUg YUM(p"Ee#Zef#WҿE=UTwC<4r}KhR\B뺙|.2|j|ߕ.f釢id'0ő,#2i3f|%X:.{"ELono`C9BNvlHNS)=.NǐwAR$L!ɋiS ԋ1PERT^>YT&Tj#oC%Q0Ө _+UDD >:pO[MkaN.R7diةv:<;o7u=`'53a'9Q?|TL.̇$!UY1I#x#қe!k ZA 36`1?-&L!)頬9H(%|YCq5`a8 &>e^8vEs5 D %mXt"ô71 `]sugʖC:uke_/P)Oc|\)?=IpTY^ߊ/ТY̎b7O/> (Y \B%bze)(*Wo Wت]_qrr)~u+ls;+@ݬܜP$r'$g^XLqO1\!): i,K}|XeLo]v#Ms KB“ : Ai~]2*iE3|-Q~f6M+XOZIJLf'xb.X.V85z_suMztšo@Rye4[ZU [Vumվͩ9-$$/"WA8̠ï`w3ahfLHzTțiPf\va@o ZOnl )3QJf3spN1 t1 1JtQ `& W]A5oJCĚ.0VDF_~Ȥ6+~V C#}f % $ e(Mm+As a-]_p퇯䞽%?2)ݧ#XX @))nJWGњ+ endstream endobj 1194 0 obj << /Length 2346 /Filter /FlateDecode >> stream xZK6WjR̮XqĞF-%*E==m;氘CKdX*D6oT*TMq|aC fv@Qu⫻8ް(̢m9}yv9Xiv' Xv' @wQ7[xiDM>D)yؾŷ{'O0#/ww&!S'aKEz mH ^vKUduO/UC~WG J vfST1-ܒ;< ?ɂ ɣ?1.'9^ 1JHRdݞkځ ԌϊZ`m/J Xm $]ŌtIԩGvBp'ߠ< yFılA78h;~˒dKeT t^#'n)'QeFEsKx̍Ý\Ъ8Zq>U5~6sDrѩW%4 Unkqg \싼8B< چ|xX*2KR UKZT?FL B:oAņ5):ج= jm|'FN ,@ąٸ*J̆ hܲz>f7))yܡN).J ]i)~:ܙF*рrdi1s*3Q)R2b`)A:KH{uA[N;湬W%%mxyHo.g.>NGYw )1|U:Nŝ{$?ZND4MەRB?ti|qpiеG$AD?CkiU|~w4:'GR^nM=4E}*IJny=g\PȄQ,TpÐ>fI$NxgkD'`$ xsMEpj 㮪[b$,IEZ\mocYɈJ9ifS皀c.~RţσP? :Kp ȇOes!Pf˕)@_LWBa#۪?KH .Y-Ά%o 7]y78l1cį2'Fna }O(Cdlj_4ɴᄂЏBo07+PʼnX_BuKcvxnu>3PD+?ėIȰkKTc'* >:bWRs>]fx<G$y`U*oI>ׁ1;c{:uw([)=.Sc}bQ5N~`˺7$0}m ]?IlH-z~ĥ^W-kgemfa8xl"kRkRcH%vt% |˫1&6a_lb_[}˾vq[ܪ,n7?W Jl> stream xZKs6W&J'ljUlhq1ɱۍ4]rY t XĉdO'mO' ab8ZQOV㥮'oٶ˛PJpYڞ"9YQY,f ]zG ʹd>  /0,Ҋ$g6"{\wO7ys#/K\XPHf߾8Kd]QW$ًƜpR-Яѻ@љLAxO E F\h̕JLR?HGsJrG8/5%|>aģuĽaP*`JCcFk$H> !WvK5w'YW%&!LC]#qPh7] HW룫d(/ih2DQ@ e+ޒ1şD)>R?##>Tw:q{wD_ͼ6g 3#g *m{8+83䧷FzmwVLV`I2kڎFޓ/9,ip 枅<l:8R1S<=iŪ9 _S2`usVޡ ¾b[{dEV8Wz]dW^4y^RkK-yGAj?Iۢ4 &k8%i]:@V dy 5 `QD9¥#eW34iOmi*Eycaۢ]јvQk!>}! rpwbUQPU:r][tS6ݮ^rpΙdR )y%{7dλvv3OL-dF) p j6܍804kd$P7y[46BVGF03@D86xIKǦc["g>̊4^6ƾǣ֨|OEŒߦ}SZcśbR'Hįm=<4vCeeY\STi9@N**H8v2>^oC=V٢ЈX }a6OPnj4&jm]oVuaRaքlؗlʻ`At'Y⸃aV]3U"T9/_j۔?2\tyTYE, z[P;9;LϬ"Rkk8m:.6sza:]|Lrग़)eI<F"+%@`ٺ,;=^U:ʗKT>uu1>&{l ఼Cy ZvJ\RhJGX=w1>ǚ"\frp^K#;dfzcw&`:o"BAYKu8^9)K_Q\T/\F~+;&`}׾.΋9U2_o\{E:]lr3vdU}Y`IC,Ppb d%*^r0'팾^U2iev X>\ 2|ݙ}Y0~u&;r>_ X賾8|F~D̈́3oR4|ąAN/sw9`CoYh:[am`Dh*\⴪)wME}nDČpmF]8Q ZKBi43-e%fCP.hPͣ7:vWYIvʿOT 6B`N=1"YWnT:Y*8TSH@0y%W~6Sr/Ōӣ]1x`X@߱3@h;:'hCjs0Swޏ]e>O: l endstream endobj 1201 0 obj << /Length 1003 /Filter /FlateDecode >> stream xWɎ6WH#zY2$Y,ALQOU^-dL"i"M1[x~u^3穩&x$IFBl: ?Qӟ{$Ζ!ڬpI>fm蟳rSKj䣄*7' 2b@hTpMyFJ .l&:.Kg8A8}Hҕ6J>/:Jy`]f8ɩLĀ1t+ͦbI9 SluLEnn-FV<{eȺk $ݱ}ED38f#rOko̡\_rM!oڪ"|a<laq#oE mn Cpۀ9v6jaPs/(wCtyyizI_J'=;C:?%Pa&;fsu$':+kɊR߮2|WOн>W=~/Shp'~& yBkyח70>40F5#aZ(QxҙӼek,ޚ~7 d)|}u;MP[3jkqmKn endstream endobj 1205 0 obj << /Length 2459 /Filter /FlateDecode >> stream xZs۸_7Ss&B| 2̓wir}7偖`DH* RYNҴHb? Nщbqq5-%nۿ>.x@yz4ЄDՐ|.zvZSOcyDՓi,D5YܔSEm[B,o,U2=})KI*wV "I'+4U8ĜKRӱ  ,dsMdJ;nZ~,OH? 9 *w/ a5XPJt CE"9"kBhZhC\(#Γ|J\,MԚ!z^2@huoI~y].A)UGQTu ""%I`4dm> aD9wSj Q>P!/3K`I}WQ@ҦDSyP&"~i?.CJKc`X^4m[xFD |?f/MQ^?*U]S#|$HL,SDXKFF^{ cv0f7]WxĂD#SDKHQQY5u d~LG?1 ܄זdJCHRHR)4 n$/CrnPCaM̷X|Ezs AX`[řƴH6*/J Uko R.Mެk[瘊 b0_x^-k)c+}.|ѐc'pE^37MQ9fw]fuW\M^}&$P֐9[ǐ =ٻixiL*0Z]"lU.tu3\>XӘ;?^z#$}0wy|cc߰ԇ_! W{=Ѐ̠׳oJ_|i`Zݧ"ΑQrb]8i Iz>KҹYmD૳vqOUns.(X.bPWScL % VmxYVـ>v}j`aPܖ`y Ub!oH&y tZPp͕0pjhH] L.@Hsx.qwVX**d]̱/ER-ǍBK3?Ι ԖM<\ nZpY3UO!eZLuϪ&;+ϤI- J 9JRĸ5L('D6 K<ΖLK;BuEoYG&6w*Q5@YxejLұ3wW#ЄEZ;U1"3?h#;%3:ɗ.ѕ.:A?hmhE-n ⮬.N, #MQM@3k@[cg..?"N7>ta}-|ľOjS'rض=`.aޞ$44鞾2ۏ㗒t$ 8:]yJ<{`6jmrHsK:Ld {)g7f_X9Nrp>%$!fE|5H0!A~o\wB:j@M9m6 _E >{0S~hn0.І|49{X|>|j1>K6`u5& ya2=> b CuU$4[q0J|j_!s/HZC~G@_\ӿΫGԗ7%u/P01QM0U((GYIZݼBB˰)0jQ_:xu<;Mx\^7Γ`ӱY׭iSu})҄HANuygGL ^_+S &rԛmq܍nnv[,YՒ2RL휂 4W!~6=IQ^U!F㓊i˲9> ʥ.(4S=vū/tJyLws:.?|O:äs\y^[>58=Ygq<> stream xڭZKsܸW覑KT%ƱǖjsHrIje9!9_n4@cP3[I0!~JUIؿ~{E.^Y]꾼&oaySo) O (= cLJrn! 5]{?~b!1#y! Yx kqD~{#?fã Y0fܙCni&N69Vn&pF;/rMWyQ߮/+o5^ռ px$#bC*A?Y7oMt)]"n/hS&K RPdEGUu 2$+pYME*eWZZSmU30SܓzMY uOKg~GKWñt0FPT0Tax [;1Dđ1\hv9fNU eIf"N5GWL#_- @UA0ZGPXiH;(@t;AdK@%\-MիT\KeD$GnW9"ЖUb3z2O sõ$Y4IXN&vz¿g7bFxu`sL' +p֋$s,F)L_mwMIV+ 86w d |N*XaQ,䖦P-l&JE[Ũf]Of J3y"b˪4?}cF,va9v=!1zavV z7E;q' AhBs_[A. dFkE'O <µpST!qL@N%y2Aɗ$K{ZWR's0.z>t~gl) ePZc5e=x2ekJ]񷜗}8IE:\ט+m?>:Lgq?o|wyݽ!?9dC'P6}GkDc|)Zo p0ѯ{^_}avN0hBxg/ /@e`_,Yi3XR޷F"loYkħkL+,`g'.S TG[Lj?5Mu@I=zC-hHx2aKa\n#3mJ? dC4e r*;*u!;%dzsj+XBz58ϞU-TMpTD2lV/Ɵ؅dBF>s5cS M[2T~0#YV} 'c\PRsFbJLl,_fkK!w=uWYXݲNr[ Qj5 DѰ^lxw UJſþ]Sc9:Eq5x_5glH+kA=:uܬ$YtƝkF_R5^Ӈ;}ɹCB5\/ncV8 m|RFf| 8<z욳Gçk|n8<#P{F!a<6S_R2_.g R ΁%sÍ7Hc;eh#n[P@=3o[pj{8& ꑆix2kqhgl t{"c8XI- [L@v>q+]b&&nqs9f\dƒ%Sq\eNP8WfT}ǀ;N|}WyXc2L}H.a^SXia3 I`VN&Y^&Br^4 |2O X4: +$˻_B8*Bˉkoayu36VNAYX| L%Kfveə"7ˢע[?{͕V+&99\Μu_^^ҏߺ)i Փݱ5_YƀjJ՘pY N˲wN(y]`KxFùӵmR[a@\ƿc1̷`  KY\-> stream xYo6_%{Yr-Զ I~;C'j-VIȻ#=KX/ќhF#jzqxRLS ƽpYge?GB򦪳{v-LGu Xc&~; v3vg6K`'uPN*0|N2$!Y*I9HԈvwh~>RIexp $aFbSj9e0zZWEγa2De=d H+#i e>\ e%,U͠C }a:ءZ;K8YX+ ; T$7O޼74 "KM3DMV݇ i$ -Iy2?HLuxܵv!m{lKZ?.7 FGA$4¢K)iYFBG~!:heFK C]W}PVC.bYT8A,/6im&قV\E yF@HbR@1b_i´hAr>@Xndgg0;֮~7͇ h;A> 64*[V fHTa`8jÍ1*"](Y~mapPlѰ9qKPbS&ݞN͕쏔:JS贐@Yk%lqBYhVP;lPH޳:q,PKE(oGwFM?T_mkg6m1]ܧ{#xB2GQq3C$r(΂aɢwOp7-7Wb=.%30Ŏw)Rg}(L{T:|~bIJ% e[7:w'#׺mS-Lzz6? Da6,5)O{/,a\ՄqIMh¸n_ endstream endobj 1219 0 obj << /Length 2596 /Filter /FlateDecode >> stream xZKWmƲ~eDYJɖ]8[c#iS/6=;@ЁfUu=HEq=ass! }8ɣ^޹n_],N8x-S=\]B~˪XLͯe15}wOZbX35Ђp0#4KH %4M DcA=Qe9REyqЕR|yM[ JIǒqh(D[u(YJK~\ϜQJy3#Mwide~ǮL"W |/Fq@6I]J+m<?L=8<<0N">,%98&4I|j=oM*HmW~ Cס'}'aD?Ef|]1*Kqe8R@IJ[?Ms',QX%O>gXn;!$eI<&FAvj>]IP MշysIC? APK81a˸Vx?]@'nS^= 4eCh^iR ݵO[zhA^oi+ͷDSu-=TPK?TOzUN;-a1ʘ)u lbLyف"FsPqa8%֚M %XOJW-}-240V'jk:V0 MW#!-ѝV_U c\ީd,oJm|,5A˔sԑ@_RK:B bץl0dԸ܌*8)GK4նNٺ8L`)W)T7[׮lc@,bb hv+cNAȗgoX׋V0ꀺS|^ Gj2WLJ$$^jkEa~h >,'89 Iօ;*H2pPNjrZ9Z]JmbW"- g.DZْYA@.-TM[N agk4~+߁_p#|pnɔ[83Nbkɛ&T"&:^ƞ#MYZp'5#"cP*{v|cT+dqCX̢.TP{qٝ~oLo太4Pw찓cOrqvWhXEehopz{e6@v[O 5 ǿY {Џc;/)~Ѻ: k~}#B,JT1V^i`K<;ۂ4B?ʴ߁d~ e q$%y,湐3)0Xw50:@JJ@<{)٪32jJYr'/w*U'dbYl=uUy̡DƏ܏f9 fD]?_'SZm {qF2-:?$GCk$2#JwHF0Ѧ+1-!E_畄ˢݘvΟr&@OaN Y:sﴘh赭Nfg[hǏЪ(vŗkLڸOЇu~ݕ/LZ!SnE]uFg[{1jo߭x6'9=~߂+wRz< $ʜԌLhA1 4faۃ8)j{eXTе ;DtQL ;?)d3zтޜ$˗Csm۽Y^[I4 kLlz7_wغgW5! pC ksjiNv#R/"L&qYvl&@ڑ p&"w{9zuKl 3r$ 26'uٿ')?wxFҔTxT'()SFu1&S5A *`c-LNӪY1 ?7^$Dlz?($E:BROTF R4['E:4pVIS)/8aةK7azI2cIFswdCHS`nN'F3+8bJ9+gD)4E32jYof~Jc7CN^srízΗ:R&vojax69dҠ R#b\) [M1oM! mS~W3iDo02L/;3Սi7g~ endstream endobj 1223 0 obj << /Length 2104 /Filter /FlateDecode >> stream xZ[oF~ϯЛf9vnlHԾlHE^̅ -p;g$3 dLE ELV\-nfvх@v(//^ Č`Rvyb2^CEᮬv4 #&||?PX1 $8(oCqWH"`M* ~QB(![lPʳXW~U\A]€k;䅥I*݁l&َ"]%%2 -ttų0D-1h5C7_ΘYQXDVks!eVG8)RN vMP~mGKwei\KrSua/iY{8CZdo̴`:%ֆ2Q"`ws~v H(v'}.lکq:Q6b5"Ȓ!‼I$`<+u,"ze}qSg"ZPl"ZߴnhM5TG>f6RT5YL`KI`woc1 ֵ%A;d*;=`ݡ_ fYgB)# 0[sIϻ "iH7o!ZPV$Qi`e58Ҙq qCQΉ#5`8$sk-WzMBFuPw  !P@KWP'ڡlQp2%1)m@FebW.պ siYjXgnR d+:)"ih3*ԱMUɘQ0ik0kw{rrnY9Ϲ^!MdΏ<-t0 =XYl]9s[+W-}]5,1!Db0QiYnU9b1K 9A$``6ВJ-?,!3bPtQ!Ib鳥"8n%C@8O,BwKIDQ>2b𥗡6 /HqK/z #u1ԝ1vuYP )ZČ~ٮ民FlA1y]4LAk!pH&ke(gVnX~>bMG5>4m~y9.^VayX} :B_dF˛.YuєB90Y]A1 zІĬtxGij"3}uܾF*ݠy7*j /~AGaSx?I\ p`TIhײXpb8}{~ VCiEi+!MnA`uF.=ҨmUPu~ C ^$f)0ѥa>4_L~0pѾpx$_Q4>' $G|Y%?19piI':hϐ.´^}g %1SW#HRց_"@Uvh-PK g9rzxp{Gr` %֭);wb .b{@!៚j'?|xGM¿$?%b ΔW?ۑ1vҕ7M^vtpRkiާr|xꗅ͵~1LtË嵝3hGuum]򺨒-ݏF̔s,9Dʪ} S'A!;:aW)ڴPy(W{}$$[2KWyfdCU,'f"L~ 0 endstream endobj 1229 0 obj << /Length 2619 /Filter /FlateDecode >> stream xZYsܸ~Л8["B\qbǎ-a4IͰ!gI-ק3V6)`Fϯы]'O/H 5'T ac߽ ]Ba-.ສK9,Voe!f1?_)0- 3LDPLӔq‚NM<ޓ#A\LʸzW;j&\PJ8gBUŦF!̞+KAniG$N# x4ȕf Q͛b.i<L=8<< 0N"O}:YJr.@9w6UiX: z2T<˵vi7(CONˆw9I )85b8q`i8R/n{xfAUjnm$OX"3GmQ̲*u?4fK<$cN,>IVOQl4xCSl>G]ӊ`P8W@}f7JHrh/_ 'x\ߩ-]~'5.8JOY7_p4hLd}Y \x_;ㅢMvm?Mu >BZGFe'cF]J+߁D$; "2Q%޴UZj@1FAi(Kݬ ]^G GB]e^m(.򥲽q@5}w;] v;g fN8\9ۺ0$! .?R[|^): [r$|YN & }9WjHf~Jk+5m  cA_9Oq^&̉,:u'ejѳP&n9I3^)^AC,u9}^mN2APj nv; 䐃ti!1dT,M̏礄#5 4/#& v΍=kF$W'0˩00a #f> )i:i'aZ{nj'fQ: TBQEd"&~[/)V vGd R=잤] 䫑 ܖߙA]<^H\;Qߘx?jwDkͅխקx]B#ua24'8'?}cG\44+w{' 7g7Ӈ~_yyWoNoFkKk'(L3k&c ̖"QXza~Db ,6< g,A ^,npľBD:RmF S?'I҈iDG0Y(fFRPRL# qMڥdF{'JT1ă#]9+WE|S%d⠜eq+c1yhMBՔ3G` d32{ywfgv gMo+Eb^@ݴV&p7+$2JH&*棍U\Z E6Хm&ehY7%q+r;P~(JUخ}l׶鞞7PNP;imAna`Tbt׿r.W^wԙ6ҟW'/{Ũx@gIh뤻۵ FjّfO 1'wah57Zx" X.=y?~v/=1NGalfXPNfc)p`[jA1G,(IBm|94ܚ)*dA `ن͗mUM85]+P{{5NCV'lkHMײI/d+.g^VkOc1.s#L~¹ n shvᑋ`/)Hvב(؀q^Y=U$޳C3@GY' DN2p7dN0aM$0l73FHNfO4m'_~"!"f5ջH7!I,GR5[xʠn~C]C՚SL7upá oF1i<+lT-2iPx)M1) [M2ou!mSN._I%b}[R/iT5/n endstream endobj 1233 0 obj << /Length 2095 /Filter /FlateDecode >> stream xZ[oF~ϯЛn"۠u_6HE"g.De3ݦ€5Cι̐dL(͐fj2tÎ%Ib\2utˆC]L)C"9c: ILw鄎2=Ie 5.6kwu-@z}qpm=x5X#A3W=[Xś?ms6^fshȷxU7dfWw՟@·viW|WBph=hr87Y@8y&"#s$p8͟ϯ@BzD6?tA{zN*LJU&V&.v־y^lܙ%\B%m֬Ajw+[ ec*Ǒ4my1~x "/E䈂 @#Bn3=FQl{B\ϊc#xQ$> stream xYmo6_!K!f*l4`}h;@D-4#)YrDnl(y,:$:-uSX8|>;:}T(1԰`슚-w&S.NTd* />OrU$t>:E8;wÊ.jaY()F߬g4L#œ*xWW@W#0@]VW'Z!#i0 9Ʉly]&yU 8'y^URMPv(ݳcFÚΊGal3D<85P3"q~aqf',5X8+2Ƒ uxs]W| ALjbdܜݐ2h]u<(HarړMWXNMpB,A)\eZN|}./ó7wv잋4/rηA!mvë9͋ojŒTiBI+7ԙ}lM5bڣ[? QD)'ӯ[6XdռL SN8T)ήL?m|~e@9 4uu.Qk|aV/r 2{@s? ^ya!ZQf$E$h3ᖳ'9DŽ?ⓡ(ٝģYRTk zٳ!Gf!Cj+l4Ą676@ ޱ&Y7eqJ eOࣀ~RCJx0`Hp0DFY\nL/UC thCj$ {F7ma/FtYHdm n`d a˃[x%;w:roJ=Kʼn;ަ 1 0Xx ʇ,nC&:!.ʯE}&H .Eœ 'u6stUјNERqxt N6khʜVb|.˾^汝 3]&`fytOE z!0x"R+Ǫy`pYzviWԳI?/".uz;ZL0 (0 R-? o0 F.eL d.X*;*ľ \c=RZ5\mivKTqGx HҊ)Kұρ I!bO%1e%IWܮKeOa kbk!eRt7+{YepUuđ}xgɑ^nk 3j;'T]X8Hta]^1awŌ('ܱFI}\eWPGW^?}\ endstream endobj 1241 0 obj << /Length 2043 /Filter /FlateDecode >> stream xY[oF~vڍ&s27&n_\?aK I9M}\H-%}ۅs?gsHBхJJZ l߶w wu+X VxF(Y\mBRWu|vb%$}\q.wK&|,S\uv˕]M=c'Z\p( NX@:pĸT",ӁJHjAuNj(#~/I^}ٌ3I*"kDPbH$^HR2oTvպ]gD]*.-*^}Ӎ▝d4K{5vݗnp̧g 3ob ?gr`^j⿱#LSKj]w^;DT SkE$ʘt}>)i'v!WrK>/1WVHe?btС1:$C)IO\a*9BzYy5ͯuc,?tQ 8FEm^UrXY g$d1{(ךށΜ*E3&\ vTRMDVRG͜!s3?Xsy&Ig7g-;xd5?%ҼdQ t,0wLr?wB)Y6871y8`a.0 0G>qKɷFyוwv2 Ma4tMRqEh>A5P,70&ghkCl_:N#bd!|8E$;pf7 VׅvGaXe&7 -84nЛsaMG2M^5b=)E|:L5OcPfcFa#%Qg:\A:2E7e.r  ` :{4|WQ*SsU8n&YTPh;YWmeayJjX ZSjOJre36OCKVRDhSxe@en0owUNdc(4uf=^.v^m%bK]M¾ntY)twz9_m̵'b[W` s]Dr`o(Q<\$f]" \DPmVhtŹ2o4V Mt'96Bʼޙr?> stream xZQo7 ~r(Q$" ( KXv~e;!4Ͱ()s!%P F!S9ō@jmlr]АbI>gQe=S_b*!ITjH[,|a0@Ѫ bnq D3;\mcb5bI|Zaj d` ,2ƀFfUC%L'r2G7W Y;n싐1$ )"L%o!]P<"*҂L%@%FCX>`n}Rn$R$5yʂ 93gJw <->],%ԖjuQ.ɜ]29Հ;, ^J1E2JHvQJA UTGY-۽HϨ,4H͉[NI)V j疖Jn$JA[ +VQ u* o'dbVf} xb͒`!eR<8Mb(A~C&/޽~lAt} ''ayXS(m^w6";IR 4vȟqEl6bZ>\?]mYX>~t?>lU?f/\-!?_,ޮ]nVmՋW?6H|I{~ '~} t??_\W^\l>]X>\_X]ng>9&GU !"8scUOi^~xu'|5dO7ﻷ_7׎M:oI/m\ S.)ɄNq GC8J;^{(8ExԠu(iznO%5Px yJ둵# V ԻrdtaJyG|j켡վjue$K7Oۭ'W=TZʓKb:[c6YQ,res.f{wQxO35P':) SB2UY҂h-S";:g=@9kpjhtେdFk]'#k5iɪ2kzఁ6M#ϻ:p vdokzG8 pIG1p*yXVNW#D&؎lv8FJSSE+~xz  tE z+M4Y,)ĒKF%T혮B9e?.}//fV>uӵCdͤͤIwr8(A(8Uˈv/a1F׷(_]Б3LTXy@Xy^Xy1JY)mܵ_ey.ǤuKu*ZBmB˿o5" endstream endobj 1245 0 obj << /Length 1297 /Filter /FlateDecode >> stream xWKoFW=@6 m6h^\hXȤKRv3#bz*y|3;_؂?0|aRARa3jw[r &#g)`d4cflj^\GY'QFohDmIE")I NC7<\.]Tk7M6qN2{[պXVwkS7rF25Y &LgIN2A ?bq¢UUFۘ÷rt=9M1a,xf.E ,Ne)X92#:3/%T$FSĶuiwsN^jY~YW+w宸q4\L)0\~ {k>ĥ8. yLsI CWsv4ڌv`'VPd#JӫpA`9   )uS~ H|YKU]AҊ*w((znWmaۀQ8[n /]4rlS-fEWylqx%VXqw}r[OuמgۋJx6>yەݥknrrܡK/5f 6gJEN{<dk\#ˆ VZ"%EUw uaԔ+|D E[/0ƽ .q͵NJîh}!ʘ)վ\om(c.E9AkL1g_3v]uDWMЅ)myWL/VpFJq8KXgA% ":r~hPȭX)Ho.JfvH4kqRGT ,$ D{H0@bϏB|tidt~lä&'X^+N#P :–t1ۦ#MR+hOy4ZG$P'12q\3Y*W0~Wp|s φ,L)K2rrbJoz wDO> stream xڽXMo8W".?D}=dYEַFeHr;Pȍm7of$"HRIS抹fWۅ`,W+pF3`Z'uYRJ"""EޕmnJoMoH$!Yr8O EU$[@„ )3PEbi1-8072˂0bJ,H 6z[H &PD4UntH%o󮬷}Y/ i;3=0{8gb[\c+fcXJ8Vg@7*qA#G|bY\RHɓ0Mgy_&/ jsݼ^oKY/ &S!]2}+d0iʧNcP Pjo֮S{#rWw1 .vvks]E 5en &^w;6RlQ<91L@)ATLq/pR,#Qͨ4>GEy8)|A)/ދJ2s"H9R}GPo &ٚe{*UJ%YDptk*4xP|5\%poٿ9ܓ!CȄSLbg.SJ2 ?9% endstream endobj 1255 0 obj << /Length 1976 /Filter /FlateDecode >> stream xZYoF~ ܇RhٓLi\`(*&* Ivn qR$OIRL6~8'B'$/Ǭ8$"Tinz1B"ycdjyif'HpvC:]㱊$NEcZVYofI;ZLܷjj AZD"Lf/nд&kK`_ NXVRcA=4D.鲪J/@L06 7= qydX)JnO@ ` (8`쑓2!" :vF1hC~rVGlc4 D8&S~~qagŻ& qN'i[Ȟ ~vt/ݥ &.5o7%E2 봜E$\ ׃-;Vr+z #NPUIOoJ=QQ+Vܩ\vYNavRgvt^7L8nH/> 5˨X +ìm79Z1HtcgH]:@W΄Ԍ}|4Bq*c1D%DD Rb]Wz@Aw8w&]E &)&jO%=\rCH>tyL J=ej fxY>I!Hj@ lEEyQZ՛6-i!EzUP}'SǨ !(f_} DQ@TjX!-,/Prs {kºFzԼP7dn՘:_䷮1ij4D'vWKBuDZOÐy|1?&n@UxmaAFXa;ˡS'FL>qM6;k7g$þ5;;8>n’EܐNU~z:4Hgeudl ѧvY]۝!F"N iqDDn|wgm .dXV8^2ˡJhhSGS:ٹNS^DUaSHM`$̵rяjb.WРzO~!A%[&B;ɋӶ]?U"٬L~_kG ̱!ZTkG'#bVʞ*^iً.j7+鳆|և^z3 :$s O}t=Ecxgel&<> stream xڽXY~ׯ7qEER@HٍvL !9ק5Ki7/OwuuUqMM"7ID*"js~{Ww~g&De0n)_:lCT wPkP;Wy݆2IQ/i ϨZ'"2˶@KhεL: .lq[ne8>,֕ D*&F^Euwގ7oyx*q|v]m`,0M߷ n&뚫/ z1M2+RY\($ڑ@[_':XZJDe"1Ϲvg+q22$J/=CREh4?[<ZnBUr\сr3 yd|E!J[+^WGMT Kx*[eiֈhr^ ۝ Wi2+fGq:UBd1Byٓڰ!bG2:YYzYԷ(Q) S:2j#/Z8i]X7Ew:x*P#2!R ((u7;ơ|5->ѿx &% L@- a310C SK9ɿ-p.*h_aP~zk<> L40qB-2zy:q,e/&.l1"c߬=cAV2>5s=U\3%μr"7KCI[|J&X+* w%#ogY=dqA#Aeyۖ7wkK4#F+Vi|4dt[wGvHgzKUr8䅋Z( yɧRYlTE[VdCx,F./F}HwպvyzȘwwW'S=3`بMƟC !kG X,{֩Ưhu'tdT/])?9cJhq{&U]d {4hDDiZ'+r4׻cH-›2]ꫢk6Q@'!)kwc,zj0!hO#NM3j z~󋁐}p!2f=8؝k*=E*~ °Lό -L(_^&SZf (;5]shI+ ־ܡj>սĭKe5&_,zH=  e>2Nk +}o\ -LLdRj$H&c["ԍ 0p(yP&p8a _Uv r1/oQ5eW-]@JkfKݎM~7FgDd;P@ i ZPr~:L/ͺ/Rnś>9Hb[K! 9V,VOE1 \{[7Nmnx~O%;1@3 endstream endobj 1263 0 obj << /Length 1452 /Filter /FlateDecode >> stream xXYo8~ϯ0eebyK*Ї6MmHc3Y2tt%%tC~sr8#2G&D1C1&nWΎ 0P=?bB0JpB&!l1 Ӑ<ԺӐs\guTӫٻٖ ~Pv"RVDPH>4MXek#cArt<,hyU0rBJhg&o^NnFd ODwO,0 Dko>%Q/\ezb"y4hӠ QBAlQBEC"(⌏c0$XJoo}.8Dk?kS)~,\,LݴREyo\z{F $N^ޞY}tf΂ ,Jgwlt^Ր| \%Rf߼Q#H\5˲XMÈ l F<U@N PyQՃZe$Au{t;V뛅 OtUKdQX%1 q3Uߌ? '/n TxE7ccWM@`1;aleޞ~D&Ȳ*]*]k4jvvզL5,/+D_/tZoΘpR8>ǪNW##¥xa^6Ѿf;ԙɗm8ݹmZ[oTx^@v 鎋ďk].fO|lڋ^ob@ E/(bW&/3bYHsۛԟPtCШCPJ[fHع㏏17nCfON?.bC)&`5q_Wkh|+fd?[̆@cZ<@9U>@akmaQsmBmCF~Z_GRnV;(ȷ ~i&L;ў;jN1Hwć CA;#|!#QrGGaROHDP= dR)KDp.'S`c#H3D"PmXŠdID#A: |.^(žoFF?fܣ  Fy$6M@"LBZ.w=Tk|UAB5eS^n #\/3` YM7jcsMzXK:IktdsS4#Y.u>~E`s\U4ز[zKu1t) 03(R՞/A{o frvcV}ӛEmoffWϡfztS$uEd endstream endobj 1267 0 obj << /Length 990 /Filter /FlateDecode >> stream xVKo6WHÇ(QznMX{CjDDd)h;Pٖ!9?̋%ǒ^!j 4 QPoBMs }\/F~9Ga(Ѓn2UimLq(lX;gcbF"LD(2)1'Cjz-xyFI0}Ѷ̌J.DG)NhzlCӝswJ?=xF."Cr ǜ_D17JBD T8&p>TK7Ba 2i>Bg[E Vm+;H7N,.9m:J&ե J]vbV$ԑ(r6eZt 8)Iu-,}:NoD&no20&[#Rc'Ǥ:gc\kujqBZõw'ZT!H_uӖYHYfvݑpTW:vt?D ]"UOTQeP}Pf܍93?\6ߩlAwzD`Fx-Qm0ZtNnCiW/K9$/vYĮi5𝲥6 OF,!Dg@K4yZA{N`M&h^ۮŶ 2kR^BU(G28C-"BiEѡR"1n#03"D!ݸBk CFJ#&*&n.<7{gBħ,N9q(赃::zNA]5QN- ,i{7n^7bZr{PmT6PG+zS!ce>W.|c%Dk)΢' 8Σ + endstream endobj 1272 0 obj << /Length 3155 /Filter /FlateDecode >> stream xڍZY~#:4]»<ˋ/> ht8q㯿 e+||4  q$ ~IVzgh~DZ߅ޟ&թjyzjuOVݨۻWii{p܏42?ރC|zwiП f_訿Q;~oT7~:%#A#ٻ]~̏)?߃/>ahm\/u5%Kv˾ay$xiDd>ʽjP55׮:N"?ʻH<][,g͖_;9x~?~8f$ ? dĮed- ,-||?pOoxzdɉ1 'mjxs½FfO"56zsTYw_#ER&WVO7K?bqԏn9y;Umt.= r!;F)ُڈz&Ej>ţ`L5 AM2aeG>khjL4i;] #?^dtPi춦#v`.o2BP{*U V9X I?G W 5[3+/k}]z~?*:zng*+T#xK"~ I\;z q &--eZX2yO4>G/!=6A]eUV V^FкZ5kX#]{0+04Bz(,&0y?`Wd !مY,h |svS< րR;_ϝ^DNm\@0Qh0;lE(ʐ?j̮\dj&;E#Xؕ ꏭ\嫗̊!7"4{,xgq$BF<`004z!Ģ55gk`j0)H rF[m$Xᯩ*5YG+X;gq όiɒ9E#` hgXFؠLK*3)VhԐ @G}; f.z"{fLv=vo>M]N,P''O ХΒ$7 <=tKNc9$8F]=Y<h[+_eO<9U'A+Y4g *IlOO!ZA9xҧV@USZܜ]N9S4'l-n]Pxy| okD$b]sy+5pU ~N!?lҸڍ'03`|q4xoPQ썊 pnN\= @&qbUmg!hƧǯyvI g@AA!VMΓHHZB1 Ѳn? p])J`j"*m%f;1B1 zH9qOr%(ZW ;rlt`ւĜwǩ}#p73U,Qs5D3駹H0.{\!{9 뒻4H`* EbxNnV+Vdx <Ì7 z[9qٻ"A;j%Q"Jfy'ǙYf98\c}zl( H("]<Zj ջ+Q\9!I}D O܆g1rY\+宬Q"gHJ8@eR~Hvя;T=y?(UЪx3fPl>?VT{ PI\ԅW]EHӁP0 endstream endobj 1275 0 obj << /Length 3225 /Filter /FlateDecode >> stream xڍrܸPJ3ᛜۻqjmoS`W@rDt 4~,hGMQ ڟoxϯY>OIrnNKR]w sO7v{?8u{U1XǿB7A^'w{w$LIEw>!L~3p%oyǷYB?.80g"nV1iaod-~"#"Ȇ7_ԃﱝgB`a)b\ Ho col|10bqt4 PJ\n#LҎ%җ/P(m7h'~hfc!kT$AS QW+ ΢+ VPYX4+vo$8EIF /·[8‘nPHB@2> δxu me%OEyC}_+ bt*kM.qorQPx5z$k_SnZqr) lFi'mDkqy壂n |-1 lʋ%'U cLȉZ= 7b}7}lGH0Y ~/BS%a%#fOf ^.#i ʽ10ZFv )^3y:Z BN/ !@}݆ZOIAX3X|@O>Ȑy7!{A/{% 1xV 1Ujj]dyNQŰO@w`BkJ]SWrC6'/ò6T=A)>ƅxK˞`QZc $c,k\Y%:Hmͳ8* UGėvTӡ6.˸T͏;ݯ<ڤu<:nbzlݪy!-@z۩/󿑸tf @TsbJFa  61~FT$r\k72ИqQE8Iu12_H{of7,WXvzԺ`ŒQa&Z* ѻZatEMvc J Cm'KnQȣ6!u?7Z´uD.lV= 8ĕ0( #NE I1gdj$.Ī*%kݖI*՜'u0@ո; ٤ E*]5OխXjUqۥe;۸rўeNhYp\-~~yzϷ6X2SJ7J{y*㈬#hnj .mER]H;$gd0HtpPigeeUG]R'\_'w90.rcx $>]Ć_B(Y8c\ʇ#b!``ACW"&B| / eyx\0ld0s"`7%,E;3;}. _Sws!񏜻"5'K_0%mnk3Ե\FA2i(FkH __؈(TC@>oQ! 6wK |Z1)r* 0pfPdP/)<I^ rCA'Pqʹva6~B azJmË`z2ê{Di`xO` JTZpxI;I|o֮(]/:C]}H\>ǧQ rӜ}/I&;A6X.8N4o+'*/4޳0R3~f)Jv&!Fk_xg%nTBoص0y U[$5]7RVyW !hSe$yP]ɖߥ[XQSoۡ pj pj~œ,s )S΁#rM`QPzvCa> stream xڍZY~ׯʋU"3ĮGJyA99p 9ڤ@}|!J}gCݾ:o`woCQ<$S(6M^tw4_6,ˢmttpԘLQo7~t*bWy;J8LOxѰAx*,ݙ硦9ei}djO0&jkdܨ1ljy[5- M]R$|Z5 4-.z`U ģȚ m=9rPkLkhdSϿl (<+`5XB料v^k?yyGj=n?IF᪁v'n!'Q$]#̉8Dx[MaޝLwE9fu4Oz\,}I{=#ћ趌s0a^i::sg-^';BC>?)#3ff CY$ .X5Η٨5|bɿ^ۺHPF T?7{PenGs(@!b &a0K;A U@^3A;.Ƙ[n]z5;+>[?ϠpEf'M/݊j{YD#KE$g*,d Q-^2Mko`}g{?P~@.){nl':xa- QlUpy aDz6E)!ҭ]Y"S9P/!d]s24ԪaV<4Q[wpꊠsܼ@&#`Ӑ?5h!g&&ԖUȚr^JznoN+gwVt:!%џ@Eั"á$ə.!5 @s ^j3 xLg "-}"ɮ^Nv@bpf&C X7ʴs#5P[SF/z1e_=l '0i6T%l",d:! k΄mSL ?x0y+L( Tbz]p<@&oГ/`D{d8~-{ ۵K\C#W zx;imqJ+o),[&~R 朽h}!uńp(P-ʦqX#}SNq*Za {V{5׎ZBxB s7tcފ8V^EZ^][ f,q0-  n9ŴO$1dc՜~%=*^-W%+2ן\|}/2H^He&`CN83F+ZW> stream xZOxȥ2JdI) EP4=Iͬ,;HQ~4b09$g=/{OUzjoR7~]&0qw,ФMz=+~u|;?8h$Ƣ>]b(E6#ف*eH0ZMX:F(;Na{v: ֐hHsqsHAv|LfeI=效xT2DXI 3ֲy^d&+Gr/eQ$ϖ{z], 0{[@Kp}(onz%N t2HP=3]e-4j:- YiN㕨БkFTy"RWB7/|JXnjEA[(ifKVHұD/îi ) [[`W@plkΣqKO ;_k"(ZH|2|^ i,5gvӝÎ-B 6/Y^Τd|( j7.~ŝ`JwWB|QFfd0@-ja2=fqU8X,LCw*d^8+Fpo`7E$~!D>?5o/<Qz{28`jhd$iA&Q;@}>QQ+Cdy8:D$D~=^ `q~P71G9?iǾS{T~_oY%9G $X;Q lr:)~Q]x[ -sc*eBwTFn+E# `\c soK/#_>c {{`[chaM~$Z0<AS/C6)M0`4bFZ&jfӰ5+&t*3.eXlxCh+/_%3nf䗴L VmΩ͍W@is'8l3< Q ƃ>ct-#ݛۿYI n-ܮ5Y[H^ǛƧ=py QNbI"j ]8iDZ8+ "/c@VLhF|Ι?,1yEwHن՚䡴N&{U"y3kl( ǤI%?`X#0&1" 0ws2ZI-} 0l"CT!Ά$3)JZ?H}2U\f+ѺJ~m-} 8@(o|{kh 9dU- 쀉S%wjQ Zp5 4=Do%PT]ᭋrK(n#`O/{l A Ԋ(3|lN o2:N"j':@ZtC=r7%)s)]M`Gg6PA H?Bl; n8Y]ᢵĩ Eoھ Vݼ;,ǖ( G{g+@ Ǝ ly*e})Iub5܍I[lz,$mCW\]&*, QD xoB˲e xx W[n?p(ӹؑ3}9AgiG9fOp$lMLGo%@8evLںp g՚Li4ci12)Iw+c'I-EVk߇ȍcױ ؅{׼Eeӈ&  K[r}&,E"D8rN&ʫt?0|դh E<8~76s_?瓱c։(]g ץN$?ݑy綕IԿԫ1TP ٱKq:Ϫ qm%@>uc2YU&!=S[l3/] 8Ag@Rnw^ ܳ8F^~wquDk}/_ܣ> stream xڍn>_!̉FvNrؓXF9Ȣ"6)#)_r zjyRnBn'}Rܔw!A |]$xwx~Ȳ(CtP/znD.ܟl[ۻ$Iۻ( lkixy|l\?Ҷ_aUg,M~' 8$wa2%Sk+K(F 5eV@O@4}e!(?fr;bj5O^>wQ(Oa]AՍC=6PMC(xd12[`W"bk6Njٷ@O(0vL;?rl_䬩Nit< ,['@oQ?od^7rSήDE@'{ [d%h4 ="4R UuF ak df GOKHW(jx98A$D2%:a&'IϾ )!:CZQ =+&#eK" AK=L0Yb6tqaZa2x91ΆrAO`p4F@et!u><K,hn>B) #Ů_ޞXvp "2kQi?oaruLů׀n+J=ϣQlcM8hxD\xƾ~~e cɚl'܆7+땶UѻM_@׌$x&g` a'n rXM\]0[h58PlrZ៕_UpbPz85X "<0%d/g:Q[ :3d~Q\kG{% fVPö#8&YfPkki.0FkZɒ Ɍo^#]&JEC| [A?;4JXΉ)Z$L/!u|9L"ώG 6hgMGOa:@{0T]W *dHbQ)pHJP7c~`7w8yN?-> 뿺JϵF'%rZ;.Fޤ2Z)#"A,c۶eFF A.\Zcbλ".B 5֚*Nuq`&z~QO/KA<gHIki]T ~Cuʞ\\ & ˵M/C!E4tZ1 H ; Sm5W5|5~lƗ I -RluBV-}GMBb$\$ޜZ9rN֩gNl ^-Z+ِkzuK*SPwDeZi lap_Uy=dvk)vHV목%{ |`'G}JaYV{-O+iМvaM'Nٳ 灛4C%GNSRKJ4qڈZ`PxEG[MԣX+8 $r ٓ7'Ԯ{- &\z fڶp/ҍd."TXlwۢǾsSh_V;A`ɐ6 RqM|#PC =Y5q{VZo{nca?|6=,)~.6mԛ=`BHuqLAyU)?MU:$ hQ< U<Mz,e O)0|zڐ\jd*x>84 A/$4fRx3&$̛ish`g/q8qjS*r&S|dX6QFOxTߝqOҥ2LznWop,)O-ȑ-wnlͿo_9y-ʞc}G$&БU%u+GY&0<ZpׄGx(?Y!W|l*zWZAd"Yr-|,ɿ"x wfCtUIH1y$ aN q:RQcoHveʥ4|IJ=#DdUmNg9G5MwN]|ּy|!w95s3Թ^pRk[\Db7jn$NX? AK;_2|.)>J?eg_os\nn?Jⅅē?kt7 N endstream endobj 1292 0 obj << /Length 2971 /Filter /FlateDecode >> stream xڍَ}b' X)lRir8aLlzN)7ߧ>(qcaWuUwV=dO=4Cs(yh/2º<%t; %|VՃVOo.?lLnwEQl?c;{ۚ~4*l?Op*UY{e{#[}Vvu /N bGgΌC'=١ٯnRO`Čvٺp^B?kOKJsB(=+p v j'"yY+)XьBח[TG;8} .@ ^^rdFE#HU3^!df#48Ηh϶&ZxRc&~Dګ?zq,[:e)'4тѲC.6_TQgO49(1;nvbQ E,߄B<#x z/̤ 5ʲ*gM`׶5SÄv"4Ӄר*11Ǝ pc 9=qfq#sdlHU.f#-K@w ǃJq-CV^0ΛOE 1,FBd'v*| inW|pwFpQ\ĤQYh}B/iĠ hYW ~$EQ`eAn!XIY{SL)ƔtXȅC!7^Ն45SCBK8+ˣ %ށuOPă_dsHV.";U,V7gi2A"s^,g_[i̧쵾o~|/ij }RmAPeԇj)OH)\nvȷW8B|&7H*+ܨ汗  d|[* o~0I4qDC9=Qk$-14OD)0n]3'%ʻ;PZ+ YxsPɓ$QTؾ;@^12+xINpTN rb:hU*wT kǑ"k^vkYxgn|,`fThz{::Hs%9"D  naٶseA;\kH)90Qλ+M-"LTc$ܑ'% lXُUrSdW/,.KusʼhC=H1pY6~oE@t/P!(u{'Fzֶe^%/ &*V1ĈB {h>Tb6@ıçPr|whAI0 I=GBHZuũx\c11r˸՚@yřW­U%bHj}c=_DrDrz!-Kia)/uގ7{-ܸOt,-γ *(%O_V$D+[|\Sw G[Lu+9{9{K/.DܷJsN

!: '1Me[c 2D\8ȉ:!"љqk ^!V5^)T(lrQadj9oG3|Ey<Vyˢk8>c4O|+-1؋oHjߏ"-WRo ^Ԧ_lY^4al<@rs  endstream endobj 1296 0 obj << /Length 3366 /Filter /FlateDecode >> stream xڍr#_%*QCIW(TD$󠁙_~b4@kvӮj݇|Ǎ n?>u}WO|_=RRǻgE?lBmGaSUUæO8r饵no?sU]O~Im)%zlyqNm] 'yxþ~tFw<9ث5= OrWOSJb\`n3zC0q0ϼ1Lyę#_i>/Bԥ{2်mrX/>HɌOV`'7ttU=5,žmW\K:8;ˋlM@hOo;}*aD3: cgd:>xς|! |A(c!.p-a^";L[&$88~ ahxb0p ٌ)Fj8 bA~ʋjp`7e:-b]{]`a,A;Mp\gqGr3:~/bMjx,26.tD[B3NuWZkodhpWd4 A`(; ` 4:'(?ݎxd4b`Fbvgs]rǖ BY@s$21 >Ff,"a-QvB')sj{YKAM xYj9v '0C 6;d-mOvu k[sO{\1<~\cGuh`]hm$9Kox ~ELW.%CzlWV!0MhyhYH5cg+i@)}%ۤidކ ~'D9 Z>)ň?ØzDWBL}ybo54!YAae1C:Ƒ(3 uv$EXGY*ŊhqǎB@(!fp|L`UvH{ 'iIBd(?%㝦0~m&8Ph0p A 2 "o`1Fy@`<~Ji|NzHU0l%ۜ1L)5n؏"²oΙ’BD19F x:/9D)$OyJWXCm[. ~, AsN/skDռSko#d}ظa:_Cudp/e|Ԛ 'fsք 3&X*$JPd)6.q"J/HK“ ƶ$ bg!"/qH aryyEyw [byfp7МU:=]$#J9?@śs0#ѓfgj#G"CyWFY|9妔r%URs+zT`[q&w|MEwrLna'p&OyI[ï3QY{9 %*/bSoP@l,I:ΎRΠt#hy㘋^ !Lu֚3lml㑷 \XҕhG/Ľj9.% ͋sJMTe]Մ tVc9RIy0D:LRVrPF M8g_Uh*OP!S墴@b*u!ڽ䈪 4́7D\%,է2Uu3?b;\3"UT&U\R*L8?Kc7B8Qm+E2&&2ɂ:TzإU_۬\9s\j0WIS_ւ5[!= *楆/DWX3A endstream endobj 1300 0 obj << /Length 3230 /Filter /FlateDecode >> stream xڍZs6_K7{sZ%xl( 8HH_Ai2],~ $8_pgY]QvVOgxx&Kt$߮.Ij/Uڜۻ>/Sͦz9Ȼ^5J5su]ܾJt q{Ag7˕Q&WIwְRXHz'ޡUs;?QRW)VO"_Qi8im/"MY\s1ߕ-7n~Ei⌿.qDWAU늿=Mq[(]VPB̨䓲Uۨ7F~-m.Q1zvEGV{zڑRx%@ W : qY+K< alfՁ ī8ʽkB46>90+ AdңVaxE!hc>*'ԽL}lX KiXE&WJoYN٘NjT'8nuy[Jnig:bz;H qǤ1   M׉"h ݉y:\^+OR`3X}9w hb)Aƀc$;͆b8[VA~jM׋@ڀD- t0hp.WΊRVZij4^xZT8dؒy0@mugWEL$&Iy '~UQn/*1!/[B{yE9z9rVA5x85.c@h6b#1m˶S3Aɟ!Р97I D[芲%[K8C6߉̀h'Ǔ^faCPҁ,3@Us(KL4(6L s?DgWv ,ᮅ܀.)[wt;8(06™ (mNJ&Eȶ?vOsz,, }0Jda-Gת#L,Ji,GIе+\xM}P0~dGQ2\qgTϔ4I~ss-P>5|xOvlb[!~_^ 4+ ,-TUr|HQNi"epb-1A2b Ycb^ ;q۫ǢjiF7\n`ZN+ȩ@k*ii8 QD\r qb6]hߞo Hq#4_t:*S/,=ORJS?(/@8;$lE!a2Sn`MF%#>(H4\E޿&P#53fLGu ^ւ< D8ӺLN2t4NC4:lPs ԅiCϞ,7/h(8$v): fNO׭t%v\ Hm>F eٛ7` Vt bI;5)e+uJ]BhY / NrIׄ]0/\a.Qk8qD6Lͅ" `6 `R.n 5d(WbTbv1,8Pߍ78kV/#8O̡^͖gtba3B=֦ 9<\ysRacRM6AMԋ[|VYmؗ>.1"6O>ůAx` ^19D s^ٰ,>hT8Qa#7;!Kr&LMjMkӺeLT`H]Y|}x)IEO\DTOzi E3ȋ[a=3sx=zEɄg yb)Uy)HO߈C?hrٹO70y%b]USG"ȴ):ו~aaS9/X@}-R*eHs/7ܜrT:,bF$D֤J= [$I$B FI 4>4%΍LI IiI`vAbo谖r87еIOf<"3_]*d1hEWNǗHD@3CZžs7JD/0$)m\Q :~Eg.1&f3%w"+O WIV7oW/y󈿉wOAxw~|`>>NDRojyÇlL{oq*ۛ_.{Mt?q_+{>XQ>~\ajF{@ws'_>Ȕc endstream endobj 1306 0 obj << /Length 2814 /Filter /FlateDecode >> stream xڵY[s8~?"5/ Ung8g06ljgƦlNMƀJUjZV1og^6vf&n~Ä*/w΍6yTU-7hlY4=Jf˶+͖٘.1w懷8Z1=V*U߾Ҫ1:[mta3]qx'۽eb4ӂOm ?p:L`fi fn, \{d-.u^{LZ {T?C6$L$/=#C<±#_sR@tL{Au=N3tx}pG {}P) {фT ̪?d9>uGp*Wfpx߼D0}wNgܧDXѮԠu{ Ӂź%)ha H7co$rO v̛}jl{  }%ǘG_;C!mGqK}W^Rt'_|oAPeQ_ ha@˿ ыR^ jFӌ?Ƶ=p'<@rΦWY!c(Ⱦ7D[wxGYGcWrc npx `;JL   W0s"`8G['2) `hRziw A:#Y,e&)I̥Q|i޻lӇԚBӚЃ>kpOE[ЫHˀz:e&%y'9aG=|19mSvbz˛,}WxDm^^Bv4DH(G;i LJ@)Chr9[e20϶*38KM8V )?3t\s~`scUkum^%Aj`^6oe 3UZ!3g6L<XN*$u0ک h@e![>yVAѸrUx}>KQGVkQm#ES, $-XEd8|q rl68{jf(ynvBnU ]NWLH 96c~2bC ek;4*NsjRTGPvHPl,)c :$[XE|VQy"ū4I8̸-S<@̳= wAqHb;@qG1#im^εn&;ы}U1)Ɏ6;,IvȄޔ̍RLw=xn9t-|nav,yoX.1@V{mx)m& "[I&qz.lQM}缕#0 #E>я;kybp/1BnZ} 9Aљ9} !}6w4!)Lg-9ʩ{zE'8@/ !bpd)Z4$ݠ" UD&StS0BPzq2,$keDVHd Ȣ7B2NYek%kD ;f[~5bwuх*ki XX8ؤqLH&p ,@hE)<`P&И@K\( dFnllkߝKpTr4T{9dJ1 W 17;͕G0ͩmPW!~P~c4jUMHm&?Va^%Mj4fl(Qg%Ar4L5mqxӉ9!C(ݛ1v0oi3ݞ>GBG]>ŖaGQ~74_~y~Մg ؚm\nNp (kUgB Z)ssabOk?6O A%WWX`ċܴ7-ݪo*g@ylx4ޓfw1o441M?iF]$e[ѱ{0 RG "qO P|'m* oCÕT Xpo~ iPXY'>ʅ}(eAA\cEOPu*%> stream xڍVKo8W"EW{J6"hEYLBeQhPBÏYebq٬^Dk3"^p/`0|$3ETb5Z,g"g]?A-"!٭j)>잛"T+2_FHD ʆHS&( s0$ DM:^rKJok!w_in|x|Gە6D,-C9轇 t0#g˔5+<@Wv_uE۲]q;1^rki5jY;OjB`.7R,i@mkFpƞV!hI k10m"c̵iQ("IN\ *)?H,B—ϝ} g_'pg'CM>(;%F Xo^1HD*O|>(!q1 3=昔9;V#_*=?څmSceTKAɌSDI<1-22Bx y4f^PDz$o7T\/Rq ώQlzMZY"ÝvCwlOQիQ>ݣ~; &3A o-Vu;sɆ[Ć gl{[b"a7ucM~T<IVeW7b:%RL"乘" l&4_tSP~.f}PIקZɨA)PAV/)ӊL:{*x7!&2 D̶$[6Ҥ]RxmtefQ`iO+b6!_pS%-@s*b5%M8.mn\DXW҃"Xsbp7X20ݟqO )4r8 6҅o饟 ,do"}k;4ԀIA/|@ԃ10ZmoUGqJnf4"FAL+$aL/LS~klC'6u{m!h uׄm^,4K&,DLk9> stream xM+tVe-oU4f#XҮ!hTgVb3@ U_XdMb?{ÝDʯ߿;bMR׋Źz[Ț3aZ~q:O7Rʯ߭7{o{?-4J'v2o( ҨXQŤ2hI3|σDEcStz'鮴?t}Q֑PULYnO"DUzab'M$!BDH/15nԒl<'#X:ݭf"]X>0I`x(@O%pPD 9K ^Ctt :Z2Yfv<M Xr)8KqVe ,%`]o4p\7>Kf~a2DJWDRx{CDƶB`Kϙnb'<A.Tg(N(DDg(q{pOo?6)5-~JזUrQ@sb0Duv\iaJ&ݷ\hJ5hz"?&RO_pB ,#qa4+o֛o]߂Sۗ ۗ8B1":F#m.)XS r8}3yMٸNimeKN)5)hyTR0=Ofp[ O@`MGMG+cQB@H0]Ӈk*ku yLqޜ!xK' 6X*SѿK.Tg)*GPTg`)q$x..w] ?%Ju F2Íh_0&F.T(NBTg(q`,x |.טS r8̈P<Hl<hXG!JHĹ2!I'~ *!;߬ʄE G/A*9Er4Qvʝj H%fBXzy\B5 rчM;ԵU Tt9jݿ1Y H=Ej|Alp%_DDcfKhIuv7QꜶ  ר T(NFէ:@eOq; m6Cy\OpPwNEr%ztt ,%Γƨ;C.TVg%Θ(+4gJetu)g)nXst!8q HSln;dYF~;婒 wW] OĂGis#&$6)j ٩睓K旃=DcOfǗDf%}BsI✽O*jhemو|N}>$9)d)fs燎C:ӟƃ8C9tm#=d 4tCtR\ku8L=,F/[nek*8AOك8g ч]9KW}}J]`9NI+[=%spd): ēXDr8hWFDg(fKTcfǗD9{?Y7|8|ZŁ >$94[O6[bi]O)k=Q@3LbeKs27#^P]SQ r8|٣8gQ+McRa„XS r8}I(~]{l bM'qp̀Cs$Ypz y*PA9{,PB1 aUCW 8GQ6f)f!+2xtOQR"s8;qg9{z,>dJ7zsܬXZ[V{c1He"q&_9{&gtL D"9(b(9R-Cö\njfD 3*Aa q`e O.Aĩ9OD.l=>sÙPsA"N'q|$Cs$Y|4gUck~x[z!YCȨj\>,DZdM."9hø3 :g5AKe Bf+99 rjKs}P xkr@*qjt-8gY < OOC 8y5NSS-PHmN+ 9*9F')q΢ԍ,MyFAb(SQ r8]":{,JU7psg^Qf ^5kᥲ8+qfX9{VlIǭb|:|hնMkif8a;o"4f\]ދus &pbch[gA }'glG6C丈S r8!`DgOOGʹnlz6e1J46ٳ8gY53/f[3gϸR3Ag XITsnQmoA28HNmpopTC8 j,֭l~SֺZ.Dl&ΝD33m0Civ츰 j8sY4['c{wsRKMƋQji"y3cٌհc& ;zW1F4 $[6L^xq~je*oқsA$<#ԱYQ endstream endobj 1242 0 obj << /Type /ObjStm /N 100 /First 988 /Length 2229 /Filter /FlateDecode >> stream xZmo_YKah(m #dLH3+I$*qٙ=D3>]7ȥ҉ I[_.KV"t-Z bZ*>RK){E E/ŚXDeB9cP]JcKT\%G+)Rd]Q1E/%uޮA؇kQ $u uQn*G )U^`xFP:pbB]LrcqS}PUsUuϒ:<"?9wQG|*J' *{ .OI'(Nr*IQY(F'5 i?]nX\nUW{͕XQTiP*XI-ĮO+'2 5E+l(]]s_KS,-*  sGQ5sp-w9VɵJ<~kP!a kBr@FPCOİAȺTP2ՔӔTh-]3M7}rJ7].'S4X>YA[!iF}(Ȣ܇wsw"!v́h4Ui4[G4e0\)֪ie&CNDO ~|\Njx?I׿@b>p]^A77ҿ[} NO,l%_0a>T}c[>Ŀooz]R襯]ܩ)[g療.إW˩s 0P=]vBkZtWӵ(E(e-EEЂOBS =DC=-j =ٲńa1zz}vh}O[ntQ1S8q,SߓqT|yM#*?:_S#u4rףzk:{DcŹ}w3[,>O>-vvvd'/9$zynz|#G8?rcz-V&=E#d!Fr2dɐɐɐɐɐɐɐɐɐɐɐِِِِِِِِِِĐŐŐŐŐŐŐ!gCΆ yʆ 9r6lŐ!C.\ r1bŐ!WC\ r5jՐ!WC r3f͐!7Cn yDhD2`#~Q}C^)5Tr >U,۔,^,7v{LĹxl9zJ,cXAē/nyrEyXz nxy S@)-yYhikZ °ic)n%%OF≸շȝ<<׶e}kM93ۖ!t4æe$T#!. ƓR˰?e$(S3Tյƭ;YawֱԤSܦ 3ֆYr'&cY"}~]7<M2m 3jA-ן[mx0)G3֟+% 6ȜXY y} 6acSO֝|+c6[L6RAH"bv"(h}v:!sb[=fV,sFKeYdz6I})k}N+XQb<%^e,ӢZPN.nJZݷt"#)QN识pS;iXSat{Yc}Y ϵs'\ endstream endobj 1478 0 obj << /Length 2799 /Filter /FlateDecode >> stream x[)hX4.Rm$E=`ݢgr݉-)!2p8xĂ7E&YXzz~n.˿Q有&01o(xCQʋrTʝHyhH:E; e!Q<_9@P3XD~0tǩ8:nE x>:iA~n1<3XEx~c9qQN9*N|'"(z/bnbTtzs7O9k*x͔䲎$aP?:l|ŲMvK{@Lsz~qȌMF!#*d(?)r#zX?Vχn:S87NSbCj#h$gJa~wV5Xڇk*09N>Pd< fwx_>Ac|M7ǡq×g(4DeSIIi6wyX8K)@01rQUrEU6#ϿZ2{4U]K2$cnOE7Qr %ESۜU}_m+x`K{iumK MR)iQ|zSU.'$6s+5tЗTLQ!N QO98De"C ̸::7\ ک0!;pf"TaL$Y; (ΙOovn涻q*:9ΎD)QxhʖOyxdH? wT[J&uY[8 Hf-:µ%; bXc'՞DaWeDgͶ~߻1!6s171 \p.d%cl|)2]A$Q)lw)Yь+ZohnG$–O9HMmSj_/]zzs<,#%SBSf걺I;XLϴ;R c>JtP4-JgI7?Ni=į&ݸi91GJ>:L'-]}S!qPN@DSy<%O}^~9NcvfNT7tם* sfRx8L㝨l猧JHYMo_L)X*EWɼC'6s5%z*l 򅃉WήsYջaclSG*%+k]&]Bxa\ƀS] zAxN- ]# -4O9r&ᑲOB*LuSo:(n`ӭ94QpCTl?>.XHݰ1՛@ah_l@64@O_[]_(޾xurqRWaV endstream endobj 1420 0 obj << /Type /ObjStm /N 100 /First 1004 /Length 2289 /Filter /FlateDecode >> stream xڵZMݿ_eU}$031&3E& Cg]]CCxjv*U$HLQ  Ph IK;=_ՒZ(ub$@W )׶/=*>lAYYxx[_~}~^$O5Is$ v}z,]^˟~zHV=Zɚ]h"').grB@&elRMFze윻%Fp26΢oպZXfSzߨfr,]CvQ͂T|+2e~$gX>'Rqb&$J8l\WNG~"he' ^BՔ'FʊjRbeʥ98lܶpn&gK¶ bWJE <5\eЏ2*-shre=Xx#kM a߃"r=qN#v*r(eVBӴ03P"!L*Nvj=C4ʆ~.'ܴvmȵ*hި)n5tRNr.'f\,5/2Dډ<{EnB&(s9#L ہ-"3HT"z.'2@Vf\Hf6A5ܣڂ!|J'-L5Uj"$'.d:+‹`q}O)B(!0/>9IZEɖ4̅QnRs8O ^bOM'|RkP7m_*$`F'!t jcb$uq^E V7K9N\e1$DqqP/ 7¨ҋZg*2?u>2hQ""Ήt4(!ڱv&nV}^R.?)R/'p޿1ûY}|_~}&+ab^?MGoGY1$ІпT@C!x;v> stream xڍte[Ө갳cvұmضm'FvcÎ͛={cT,Y5"#RP23:13rDd,pdd*pdj@G' ;[8 ?dvv)k ?vQCW ,=@G&bghaf^T&..?lƆYCgsGDcCk\P;;s3089S,J@'+G9C_ÑT-+ۙ::k c [##8@YR oX/Z{`gWņv6fS k @^\ݙ`hk򇡡zCWC kC?37 ) ? <'cG {g'z' ?Jd.ٚmOh `jakbG&. .@IѿM>Dp̀6FFFv&t76gý=O |E},Lp^N@ ߊ&8&&3hfa 1/8|G w6G1MLl=1|$E%5h?:aa;w;3(ZƿJښc'c׿/9(irF6Fskj?M1vc`MՁ I:~6Ih`llW%WcƬ-l vN\*:&F,c!T?Cۙ1`lCGGC# 6$laGq>S;G?Γ /b0C `0HC,}>C^CË? `P>2S8 !2>23r44~Y##H?yca0~ ?j0~1~Ta/GVlfWVC`/H_ÿ# GNu~d2u~]?n?/.݁p v< uBxnt|sdTt^ˎ].OH)TYwB)#}(kb+^'mMaI/ J3pKXSE'B?`Ty:xXvK9p")? H7X]WU. R1KP:Ooʙyn-wP*4Kk9z S)6- aԧEMğj8ľ ؎t|2=nƙjSrr F2 Ӥ2l| WD P=g4 ȏBQRT{ExsrLq9_A)x!fsE- [a K(_d\NPC AMX( C >Ejo] mEz\+Wk=KebWa(F{ڱQtc1UiՆ9ꮬ$HNJ-Z2n^fs@0kRxeN$Z -((rRm"* 68gbd1]3xob^ {1'1gWý|+ עPZhLdX.|H ,=ZGX_ت&EJO ?xZ~sIraA=H+vL6fP֢6qʴl@Q4/E%y56$:2D6|ECAջ336t7[nhg=5 aJXϹ)>Y[Ƭ\|\!f߈#rŹ_ee!ύY/QaltE{².!OtH_Je9h\8lX1˥W\*W},mA&D|za("u^f=\v-O /6I !hA$YO@ ' Sگr#TF0,cΧgpv3!B%W'CX1TsbW~t)*협IL젉S820v$O $sb 1/ J3ӗ '~·iOcn̘gz]r#F Pܨ6bD% :u!rVLhs]ٽytOZ*EM9|M?dV4 k(ڟ~h)xom i܎e BS-Ց|y+g,e7m8uI;I@qA-ܧRV50X ;"ۼ>سIJICg;6mF)2kJy2 p[Y:sz얳Ɛ@&F`EnIWvIxuQ9|\Ԭi5냺w.& jDioَ8Jags˾&4[5xà̳3QīMH{ HN& O͢ jgb[V xԾ,O  VǽN5w :'ߓ9~eg$,/bӄmˣ5h9Rq֭u 7MΖĆI! W +TTF#N}&DZJ]Dei(__a+ .LpBۜԒ k8w60p="[w][Mc<SɀquOv1:FllLP5_rO,C*oY?ӻ%2 }K{% & pzچ[u~"Z(o hcY̒4BT eM+qjf!ʿEQ唓Av]1Qg:^7 B*p%ȓ`F߫@ù>4Rt.d+On#ŵzmr߃Vm!8N9'XOK!j,9``FN%Bnuωf Q9D$6tlq(Q&"pH#f~%>0S9I̠?>^pz>BJ;z6/1B@^3.臞>'3jI\BogU#1M`%j18m|2Shf-ٝ XCbIQRЏYt?w$bnKOrϮfr,f ]e|oY3X: P<÷ufKͥbL|y៊:b|Mh8 wjԂhrA$Qp.">[(P䎽>!gAd;u޾'Ym~x+Kwr"Ծ>wZg05+ VxԈ5nC\H@B0ODr1o4")0RpD'QbJG)%>01xqn'{YUv:g,d 9$!X\֥J& 3,Zo G<[)d,oE aVwxd}1O0Ey  "hKaᙂh1%~TЕ^m2H}e̳hc`#Q<7gOPYbAN [b1C^!C4¿VڰGcmޏA6hI9x/-P* }O8*\\e(_a)AЯ2>y-O%OQWEֺ^18fVos9==ǂ:OGwftJ ).JdvRYo1v- ^`^sNs D0\fS{z!%h ]qlAK'CϳXZ8Vm1eVJכ& 08<9e-pLn)+y\1EG|aM52ԉh9B?)#q2$gdN0Vnů{2u]eaG UPqW qaјǨ23Tvd ]Uʳ/SEXˁ[) zbtkMew `PT1FNMA|Ńq8rhk5Z:ho˽&q>yq&ZYF؝~ S-m;ņ#S W?@si\ /Fc{x~*Z rχGgo v V_tں^0ϔl ~6Qd),rE"ίjFZv7[b"a9߱:ﴎY`dK-Ʀ]bZ<̌߳?ӺS 6ݳ\+Wjij9e(kȶm|gZV̍pאR?1F{;~;#bC\ &넺 i+yQ,~&7 6u{ v'OE\+k&]vxD焗M3C7I 0 KF'3~ }lY]|Ct58@3x S;ƈ/pލY]jgɅb*q.nhi(/ث┻FgYJ W\300[L4 D"Ki0Mg,:RĞ<Wc. otMn +<8pyy6UㅷciA_ -<0Zʟ1HWFiיF|sD/L#TS]!j.h"v;g\g$65=C`~Un/τo·+EB [j/ZS6 ⺒^iN6w}f`1d=rw`Ħ vl{V:K]Tc%ѽeS3ࡾX)e+KxҲtSȬ #4N7*$DcdŰ{3~0*Q"'^1h!|j k5f\9i>ۈ\/\Y\ }ǝVN!^]PlС7,g4kV3DwKAL9R*$zuW".,$R]M-ȆNrkf/, !b+  ORgŽmgؖ54):W0>̆V =p~woDXԼXG^xPRb.ԏ -Ǩ%Zh:jZsb/Y@LZmom;Dž{}xѧUl]wyeE)"kل$ʂVHZG[Eɀ u8#F CcCJ$' x@OJj|԰r]Z?8f{kD')ь( FeqcԊB%߹H~Dt=?OۻGo]6l_#37No:#j̶noЙěבHQi,SiflX!jPt;|c Ⱦ ͳ:Z,â|y8HeWF0V}WBVfAg1su ?OMϲGsty Vf]?3_A:XO"xE^E`bq,UOi Q"a,9h( qQ(<5Z|wCL֝>NXc`0i;A5?Ѩpe0բ  964p _MjX~ }]I]|% _uk_x*Uޥ+ Ά8kZJ:nZNuDtuQ+%ShtrNFSP;k.amP8'ti2!q{?؃Xt:mux0@ <ڝٳڮ"#B g%Ջ"qs]- yI)`!߅q9vMprxOT⟷8귲,G֟#/b'oO`p5YC]PKFu炓0M%W~¡)ޘke!*ÐFk͏{!q!Lފ>h2([P^ycd.Z5?^P])TYhfz6BB>PӎdeDOHbfW*Oϗ_(Mdz,lI@*W 8+gmѤa=bXX]&u*HN'C{p_gFkQꬓ㉽gD{bES&Ioc9 >3ڗUE(%>h׻N%fBF2əM2*+cT>rܥ/[Ɛ(w4q-6>:vczs=a"꺴]RUx`h͏y Eԯk }ݽu.=|.|$z&oj둋f5;x`4(6$e-SqL"_ZPyoU@h6!y 2}!z`-Ex./NT6曅ޑjLOM^0Y<_3(֓7/1FۓD@L'y_DٲHj\Ӝ˚ńuaM (<;N B)-%8 *lb xTӅ|~ۭ8_-dZk- ezP, +u^|F'vm|C &`WV 'sp\}ѷ<`юel~-+ΊP R'ŗVjm˱Zay[c5A¯I2}г, ڶ_@UGch!`{`M#C9Ezl 8G~F4X(Gu:V!!~fJͼtp}!W#Wqg.êVmm{e@]縟Ν[󌦏?|vuؓi WZoP >y$ecb6ǎ_On `Fq"+:XSivlbr%tm;cOH&ħEն WHӌ⩥8+;|B{,^== A cޘx@iA68\nV*LlkI"&_ۼ1(\MK&Ƭftubig1qTw! Z1M5^ ٩ .uv TDVN7|0#8V$uv>OH+e"Ԝ)Ft^Duh+5:W9S! ys"^gğ6v9+7U{JrGc i`B I9P9&lv{ jBsl(PA+lU{Fs Ll0& ToI+9 1r54f ke 0BI^g(4TdP›2<^i+Z>U[Y?]ZI0@\^R3E<_ Fzg-2q8@8"2_vA"CDOeD̋y͵Up4JڶHqLk_hauGو^(CFpi:9f"@"Ik= @73鬝 @ɈHlX9PxύrdB"Zv'pȾ[ػhT|Æ48p"Hv\@6k #!gT\<%2&<&VqCQTeh] wE~`5p; 6碓3*i^]_|ߺ2 '' \Щ[Yϩuvk^7*,BZuk :jFp6 P3 tj-=MȐ ijC3^ 6isV?$L*ƻъjvyG&_raZiHFRy<h(=DD4$c(ߊ5\~ =U 9x898KEExWlag.:! 퇰{X[֗Nl򵝟}Y91Y \D/,9\>,- hkZMZ'}8ɰuw? ^`gY*{8db@ &7OК*Bn3G@3[( U~%s-Vw@}Vԝ0:7IQrcG Ŧ|⺢bMDU{̼ 8_ԾW#\WFClgɲ)ig.a"EtX +N\v ^@;נ4{yV6[3k`˵p#)[j\N&vW܍w<P )I5 `[j|%&#,%#M-8Z(7[eEt'/Պxr~#>D@\ ooU"0s!2d%/4fuo 5K˜ xE"SȁͿ gЎ LF+s4nn)*/pjepGa_j|Ҏ΂T>dMY"]2mB&m@&+;"ڣ ΢L)!v(C|iSXMcZU'ju;4sP ,oאqoU -ٿ, ]apκ3/!Q(WWmTU?'Bh{+\oJB>Sv֕gb,uR)7_NRdψnߡ+P؍.3]:3cϘ]P_@U 5vsm.iq9. gP yi'GN~A(W vGP{$U.;p"bw## =pk(,|L1&h2Keg䴋=yx޿~""לx rO``v !Qg;u~Gh9d8;+tU[TL>vwdifkN"s\ ),Waj1dƂvX4>yWe/`Ţ_Jl8h10dʹ.ȏܾ?l cfnR{Aϝwxgѩ5D4U F:׎,CvVSxg?~p[%g9g6{چ5]vQYthdC "ŹqRzK%z KG! ?HYsWjK,?E ,㸅b;iQd?!iTRWTя}ΛPRf!kD =D^""yo7*q(f FG&dڿq֔F964Q `u}a(|xF|%s6c>ֻ=f;,TꡑM^t:Jd4_Pk裼;7uj Ve@G]}qB#bG:p 4(BiLd ]+( y҃:oRT2ĬeNHﯲjLQ2(%bc^ֹA!< endstream endobj 1504 0 obj << /Length1 2334 /Length2 17926 /Length3 0 /Length 19284 /Filter /FlateDecode >> stream xڌPֆ @pg\!@@www :yzɻV(IDLAv ,̼1Q-V33#33+"%5?눔@Nvx9ίk@WG;[5 `ef#/@ja P`ق)=-̝_u@mB`; br0 WE5@?)͝y6Nvf47 gs* 22@h5FDJ?5;x]0:ؚ5y=gn+@;{la (I3:;9^の@ kߥ"*kdhadaWLyf [S1;_[8L^݃õs-lMabϤaku 9@&L {؃6ڃ= zt]@>^YX&c- ?z]c0Ofjgk#fRUEE^ lV y;Vl}Oɮ^'=z&X?!,+tNhca8׻`]5A\]Q;kkq[3n;Tqg]㯋fma Rsi0032z}>^go_ttz 2+:bk90qDI7qI `M,& `Ml&.^ӫozUWMJ%Wu^~;I7kWU]7kWuϫozޥW=ok3/-?s^hGke/tC/^]fݳ__[_{P^m+ھNvc~-uo__?v|-X^Kw-\AW@'kݳ>wnvfGk?u\8h?5ھ^3yu LfL-+o+DF(4i[\Qiʿ8^t-mHP_ /f#:Rf Kꊳ&k M񝤪{A8@d1'M3:J-C$("ҥv`$h}' :砾jdis.;W9`-0KLVKCۚ<ݰ::)D6&8va?belB!B}mo!_g1=Saga_|EBBASR-n|zȔk-H< 2h^Z q# {a- 8O'UιOX}OPxݤ7p65 +y _?0't%Mk.%ה#gf*T`}.! b ځ4O/H7TAdb۪κ kG!vUXwv43_7b$ݔwk6IAuhñL>7w*~uw$}NMj8)PPyA2Tv~;#6~ K3'JN2 oAq?`;e_tL`0oͱ6w,? /{uƢGוu mvcm@ʗ9 >s0h7Ԣ UM1Zb/m 9EK .nCӛmL .Ky\&&a$ຎo|I곾*@o2Mbe c!,Deҝ}ƫDYHԮ #p[.>{;)['r fƒq|f{2 {xN^/#A7FUc F a"oث(s'r@rP0 -_Fò/tLcN b+#c 7bRr/ҧ.2 R!eNelGIe8q;0gmxF-]sN7/T~2WaTeIo'o`^RҀҨ/jw9=Q~hCj,NIdG,: %jw(>R8݀u8k6h:*3;̊פ?i\䕚GF| ɾy 8˅ERGtʯ>q7JP/j%JkB>i: :?p5!d%$d\؎} gLNԕ*Ӵ:%SmbAz xOUgRRza X!c4X;rjվ I Zﳹo{M)G2pfDkkG(aWYo6l//[3P_cKa8PIVj@o5;Z+o]լĘ _}dhqD=  aٿ?0R;Θ>,LN8x2 f2.]BDHy^gaH6qC5qJIUI%:xX@8v|n>d{4CM]|3-]ܪ(J/TpƢA8 Np"J1e:(uk59gR&[λ Z=I+CM"6cDJwX]iKN\t1i%8+k%JgqJZJL hI~;:-G$2Y!ybC)AE=E; 4$鐐:)  m>LA|^Tz_vLca܀xN%ћ Pfb1 Î @ЀHcu­>Oswcj*E2`\yӆMSސ|W}w:Gqhї1 Ua&/ؙO`;Bܵci94{SDU'r]ݑ}"1!OM/a˝*5#0O Ј͈YK7U)^"z4j<- Һ@L@`+3*cR ]vX7x!Cmi !0V *WRFϺ±, sVqH_> }Q|ZWb'*h\h5)yq]uuMEN'B6.ˡaMdƖ~RV,lT*ETSZRݙ|S*Kߝ#JZԃ(/qC5'xmůMh8kD: tͶ6h<9;dIP=u?1-,(G}]0,sa /d)iiq'gە܃dL/I.Y;3&Ļ'+/e`\#>Z7#@J3ӷM~rYY2qбś(kǝ5vX:&kь _Lhϐ VEX&M1{!8:?ЛCQ8Sb*pwՏ˧;i{W#{ ,(lsLөFF$l! @̚<>%$PuJ|`(vXej©JݠEѯ?#YKzc]AĠ > qp08G[>ۭe+4"xnfv%HhJrcW3\p n[Zߑ޶f֟.Გ7 z7s.gαKUN[9CHD\N%w&i%:ԵSݓ pjn'Km|v֏_6}ZMf6e&NE`bAQ^bDEz-y?{󑏜J;Ӛ? qoc!Q<ʏOOCF3k|QNħx~S̫- ߏBBAM*OpvqUlI:Ͽ)U FqEvy(ěe%@ #8K&-Q';R+r{v|mUr68%,/>o1?wdb SXEKl?uW<{Qzp'AOM azmvQG R3h(|a.- dHH=StM*&Y+Y$ _1hu0 rUH"u:xo?.T\TN\ {t{ѵ)Y#ۢ wSpWsɗ dUZ^FѤ[ 5oB(TI G[LsMՈ/mЃS/aapFCNfvT$Ab.~2F\nrh.P'o/;1S&sj3 6>"[)؍yZO+i̪z}N=G 9|t9cG}2WG5덞1{JklК锈X .?']c>;MHD7HV0еƪ nbew0mp`" /EZcAĦhEYv_ҏ9{RVެKF>SIDQA:UX}T͝{Uo2hm |n`xR ŀIO~X r[X8r zfg( D,5KF,o0 Oz 2oN\ָ40v *(q,V?- V1[jIS 9rJ.4ך/wrrxK` b.'ƀ)L9qFMx}٤=5,B3y{9x=Xd|9w^ɕϓf-6cJ#hQ(X.qkvEp+.'t?}xBpaVHm Û`LmȜ\-\pt2$k,@[n)S&TQ,$>qHک"`~!+׉B5K[)BDd%̞,h@i,mS)fpn S .vpDQ"7'Bs]`'.% -K RFxwm*YkO=y)ĖBc9Iۃ~:ww69V%٘ٱWpkeyߵ~Nd|Aw*Wė8xRa#^f* +oPDSᣉC^NOl_@c _gЗk0pKu;Ґ }9% VaՆ M(ѵ7XgLdŃN m%'}A\ȼ1owR"`4dWniFh0c,Y>)f'=xMfZ~)<Ѕ ݘ_{v>&KƹRGXQs[=\Nv] zZ8 ,3ÇӍ%2f/CțpGAp 6w6`%1_hNܛƏ潁=p>]ch!BšEkJSfA5{MTo֍QCOyٷȾ? ,WA~ꟓFrE9>!5.!H0a|x^&ە3a;2d[grBKmܜ Qf@{[ԭRЊ n5 Fh=a/`06FtڠW9Ʊ@5bOu؄c&˜"g,|`9&'*?s'Cy~alW-H_V Ϧth[Sކ$ hhC}).lڝVY58#2UB8u%3<`考Um)wu13&'ەʋG_CM-4K]._x55֯AX(V4[׽p2Ԟ7H_VnLg< y67duns 3-<( '8z"UEn*V_kqƍl%myǍȖk٢)𸮦Y$vkK"D/vm,C Ts۝J9":̄X㛌FM@Dk^&D(*D9ڟ'-*Bj[ZrUΩ{j$_>9+u - Qi~^ne{̦UfGNx蛨ꮒ>LT5tF;@{[k^h*`& ݷ J:F~>OMšsnț?͠_AP+"5޴Q.tf3E"n;dO\NνPӟm ҄L5߂Eu#MԴi8#]t#0*N0۱^]6zv|F cJo!2&qSWl]{a?9v {ٻ\ޙ@?JqPP6C8EeX u⢩~R]yJPuy{"ڝ/KF/qgݑ6ϧq_Mt^\|5ih7VSlRɳ_0ՆhuHdXWW-u's $59R]u* 9P*`+YLzg}peE&bᙯKQzZKvY\DRWB"$S(8ć-bҙHS)ҿ\<[ Vsh-u^j ~o9?1<ܖ5]9e_\ӳK=L~KJvWrw9 [tRoީ%_+)[0>#c܎H!Xx]*zO@ *ʏCclV"'.gίEWڠ~{"z]v,0?6 {Rvv/1H>**fzW?{81F{%VkƮ:٭UmB:KIv׮qutM% \E0 dU(^^sHUx1KAv@5?]ǮybXQBL! fhlr_29o.j_%zp]<9Lb5+֩{LB BPD a-xܝ* ѱJ/ީ`dHuY|j'ӿ&+O,òU.G1!x'`-RVv%'xYE98Q =br ȸ8/(6%񈏻Xa|9+%~V?r4cy0`cRE4jYD\՝5Êh-n3O0& 25p(tS$n9 ш+&} 3- }T:#?" #D䧫 +Yo#T˪)/oNEDj:,n3dM{ T %Z]w .K5eB}.0}e:xhA]:"%/(R"!:d=-ta@#(~S{G{b#Hq.?cgZ/8DXMϧ1W*UfFSmU梃4DjW+^sPgtQN=JЕ;B;>"=.@yFÈ82M*`KWnL_MOԃ|Ք>*\Lʾq zYQRB?[Tf>V0V3jUI. )X̛;rEv>VOo#`6][b&U5:΍ |piN -WLhY 82WX㭳!Е„<qaG,5r LS(Wܧu_affa5{ {Zב8H(^ƯӞ:Å㣤~|(eU16vm`tU)9dI [oc*$;D+Uĭ*@TGO(skCQ"A6w,6dB: {'i*Ktv"nTa8%=NVY LTiЪ &gz[ ul'RMzt=H0qF1דO3߷2JvafOՌ USЉ}*/NϿbX(ZjT4GdKq|.ܯר>˝Ęwh+xDگaY8\F(;0Tv'iyʀ(vQ]aPX ޿mIffJ`0HxQ#%,X?e.D)ԭ{P`/;/ g_TJwSI98|б<_*˵rٌqIUsđTÚʍM6 pi'u{<#șTC"kBW 0}q|!Rļ;ѱ =ZGIƤ0c3|,˛%nf&uPQ0 ӅI =u^HêQ~}Mn[">ZqKvJ<¼ }b12&#N%۱qaj=Fz}ܫ!f;ڍ,v,iӵm+U'! *@-N|@ +\wV^;d=~o 4'v:p =bPA>J~liU%_(cxSd(rO_J{_\J2HЈw0G;>B~6whlVMDrCvH=y姪ne"*x5*ϳK `Qz7 đ u%(s* i(j5)eb) #Qd.=ӧT< uEW d 2DuAĀfTVI2kgc. ߄9z!,eSm($1-5s׳zȆV&?֝/[>M9w3 _IL ch0e&kYsn?S{#}fZOO >Iu+j~ML.Ok@$;K=|nX&X.o:t- $B1'Ej u\x ͑/!׎#j n'>db6a5Y;-7ܣ&.XPYB!Ak 0jcC8+'g!i>UQuq<"_jY/%5fߝơ$h<@ &S]?jψ&id9-D}~>*D;F"‡_}&GSVtt#!޷چe`8x|K\I_/xk ?V6QnJQAiYJ81E:m5ʹyU%a={"dZ :~G2ᒒJM6U*GsaKmт:v&ϲ08_Šxg"ќέ5p 7` {D1=ES`"胠3۳GvٵTY+0OPs n5R߇ùCzb>F p) DB8R}%Iv݁PTzcASuQ~bR1ZoN2sHWqO~v3I!B8$*HOlJU J!`pxlԁcp"Bؒ3hUvuL8ZZy~ glDG!Wt8qO["Op[y 8pt| B1Ft}?(!|lGڜذ) ͱ]DKMҪc]Ox{ _p9_x?ui<8,YlQΡsmUn9 0->?za-S*z1HD6ҩտs͕ Z{v0.]EAxPah[G`,r/k-s.>G߈x#7m);ˏPקpGHLA6X> _{K{46W&&f48R \:wf bMH]meDT_+oH;=+W؛.8S hZ{H S>H;||"r1IIH `xUN#nU|?4gu  <My:Lb:}jkSu,OLh}#k:fb"I&+ٸ5yؠX =YC (Tx{yY|zL2/u+&E NJ2''(V{aYUe˹l&V(t̹uLiŋ/L 7OtMIq?o!GA Ӌzy-/o3cP[5I9F*I qB>aW1bQB{J9!C^F :x*Iܵ9S}²:^o~31$Hz/\ݻ4-ZxylQ Jm=c}z[^lNγ ~7 H1Z\8_y:@VP>J Ocs?r3Wq*wBKіz>UwOhMu7Kj/+ۚq2W~Vj!<<ݹ9 ٣ݦ!?F]_ŕ \JγXGzIlwOt?YVbe3SvJ?Z'ڽ;6xӤ ?ާm " v^A)@r. ʵV5Lo6mV c(ΠI^=m^v:lN@ Ν> 7Lk\6\:)Ypbȋ&φ]j0|gVێT~4zM(BNs|֊Q:X TmLx02*7qDG JxFhy8x5bZ* K+#zA*'-e..gg085R.;;D1c(s$Ľ f%ljMtV8ҼII(J\lcO=' a}Si&԰+^rEQh ^fZ6x}Vuڨi!u8̏}X|"䎊P{nb k239TF(/+[mM;3?j3޼<*eCJ>vc+'M) n:v|/q aDWߪKYOp,W)4 zW91A+;6|`**zx"5Sw\&sz6ɖfyNB&<`aY9)MS֐qJ伔2 }i&25Eq;̩z:&.J-o8* 5BC|B_MxvUv"U; 4E=>WT,PtA_â `{ђS -ݢ0aIahBȎ~TA*C"xTCݦ_H^?"^Y(8)b}Kw38R-go!3'If{Dv|ɤf.R:2gL|KU@bQE1ټL\CSp̗H TٚhjfBͿQE e߻Z &'a-2Ij{tw%ۥƒJͻ`ixS-ST Dm ^zp7fVRn:7Cn2"P ܚeup85)qM|Q*iC *f ,rR72 ?(m27?ɪ>ӧ bq K^Mf@W4\˫}T27:øEiRU8{jx-5Vdbs'd`P; 0Txlmy+xy*vsƯcsXK;7F&t-j͙uz ^ hdlQ'" b|X_T;{GX]/S<xqW&xD.#N7Ѡ,̪2kgڧ#nH ,p)\8i|.?=Eɹ{!}+7AR+lGrr5I? Jur@xVH+WhJ\å5. z%b/-/*2 \K3@ ~o ǀa?0mh\fX&U`^9%߁7_߃꣩L=1s ނn-ЄO W!NO﬍j8@('|#e@3)[xT8c>d ŋ?Տ!؀+i 7䰎]&@ߪܣ\ E&b}m7fڢehFZI#\=9QHuG%-<ǨPLB*yJ}޶^.;?r:H?=;R ]gD<[yuF[5W7 (|^ԜU1Sr~Z҂bM6xՅ+b} lyРsmBwo%"{=[xa~\%g=YQ)EKs)tmčhО] l2nnq=4'aM"QOȿċӍxZeGO: JۏdžLv 5ơȵhΏUofFI'EsݭB%n+xbf!*T5DS9zQ)4/|!N87@ƺ\ ߈nl~浑ygJՍ{׺&g&%L`OYkCMz DV76 endstream endobj 1506 0 obj << /Length1 1594 /Length2 6710 /Length3 0 /Length 7741 /Filter /FlateDecode >> stream xڍT>Nt(1S0ƀ"Ht -HH J ?;;g{s_=CE;-L @ BemU3@HH($$LaGqPp$B_ e @7Dm$pĥABBa!!H4@h2wpD_7PtP A;\onB\H(OnYG4MZPq"Qxp#CyJ@\a$9= ho 10Ǎ'0 lO_(A{ D/"y] 7ߩCjME@˯i*N C=~G7}s7=ag ;O7Ac'D I K`QFn @7 X vC(OX@ ߘao揂,n|0;$ *jYߠ/ , DD€҃L_Κ{$@|oW^ 7F0?J|O濢_yƹ p+Oƍt=7kYRMa6&r Phnk\uY0 q#f{*hb %I H;o!$pS^ "5S1a- uݼh[/D?M hߓw8B/RAGnvsZa(7&ytu^OӠ([7|`Pi$T&©>Vu,YTRt>NӇzVU4ďnyzpi`|hff}bC?#!FOPgfzg}> 7^?uY1!h`Z6Q`3ENJ`$8=y|"5G|D"%IS~UF]t963~//Y*dIwV<1 E;{>%XkwBi#$L2E߼vW)k=g27g"qᩊI}* /|* ҟC#SVZ##U& 2Vsc'%f^OHf8㫌/TMK?M601 NqQ9 ˘Iy5!{A?FHΜ{i}nbԫd5qoGBg$~1Jnb݀)e!W Yӟf d4n!Ox4WcC3siR(m Y,"WLw@r#2֓8.x^ļ-ޥg"L'R2;YNRkO6Dj:J-֟rmWJ 6ZtX}M\3zxJ ohXT#y/{f!; Y`ӈH6ʽp{w6oK?UsidTتʝs{')5[ң;r.)'H馦Ūe{Ɋ3cpw^~b[$uٻvӼ1la̝%`F}y_eJ{F.[P}æ_Åi%=tW f^ý&K A2 *1HSy,VΏ"KZ{'.xL޽ *P Y.`2r $?^O1-𫒇7{5h7ϭHO.{zP,JٸM~}-آSc^A=e}#x%4 fx)u[ sHHV j:(?wVfħ ͫXOX6 <ȃ,gwybbQnq{vML$<{~2݇SYXjD53 ˅ޯ9-I:0[3(:C=w5G25PYUh뉊z!^>D݊N|q/gA*[S e$ Е{ 9aXw̞ռۮ>薶4#^%-( B$mA*l4ּXal8&a3p8o6%L4z_;BM::3)RqbEn:@h 㾪b\qݨ$d`lrԖ2G:".iW ~[†{y*xסf(Jg`9iZpM`[׫N [7y|6vqwL(,E~C$ vPɾ΁ܷ=U1VJ:A;(Y5V]AsDqxR[lIPc.;!4m-B?eBj/r5uh6 hf._~mxL;K~$M7ÄァΓِ 29N|#uB:q[tFL괋9Za>5ͣ;q]TG?#Z7`aZ`,^Gͽn!m֬q^Z8FJ);BR}1oO#M,Y6Ѵ474V$M2q{3H`pe8?=:jɄj):}$&@~Bִ:Ӆ16< {zɜ& FV2ZH> ″6'§iġ2yp>n_e}G  bֽVbϢ;Gzs< aXӉB6 O3L٧쾺Rʮ.cֲz=7^jha]jî#ܻ+- ܛrHg]\p|DXQR@vɡ06EO7U-;Cv+ϫ &WMµ(sܔ|V$n`ɦjoݙˮף!Xlw?N~yE]Tl.A,i`1_?8q\Ӗb۪Wxl9HDRmQ , 4kDMGC: @klA|JKtt *wa 7JUk[kJ-;VXJLba9WQU#R{Wa\2tD`::|I=&L#g< RR߳" Ń'Vs:I v7s9wW[bddՐ#D$0$ChÅH-:Ou{~!)F=\>VP"3&0d^Dh@ʏ285}됽WYQy$sS.:N#> .JJEyuRFȚ7Rw@/.b< tB8;U0ԓW.IJ:Qy9㋵_PRP P"*s/ d? ;p23^nbIY6V٫[ 1Y'h#Ǹ -̻Ӕ'x !t+YRSE*9Zp`&nFu>gg` @.6diK]2kWYowYUSVh_0l l.GJ F[GT\9rxIsiJ^sPv,4_|u^-/4q~iۘj߸G.ODf WU'}ݪ6M > Y1|fV-rF'O^c|G%c@+v?$ 9wlCXr< xV83E+Zv}&:-4~Τ:3l3v] Z9jauw6 +ySb׷@Ao|3a-qVJЦt*d$_ *>#tB$885"Ρt\Tr lD&&z;t!G?M.ÉDl] {ȋ]OvlMFƹG mL/`z]xx'ca{狌,5晙~Ӭ?>9Kr2_%F/7&(45sJ&w;ugXǺoYfriAH"F8S#J(bW=w&异Gqm9ʹпe ~',`!XgdssAJO=o[2L|,i]X2Y"k/~߽>wKxuy^q_O0#Z|ܽ۫588 ~$>dB1}BHR"]~U(zt2`$t"Qyߘ+ 5I;D񡣭h :$LrԆ$pOnLNSv υeJpGLuɿWUpMaգViAAĸ`uQ&VU^MBeμfͩ~GĸTJ5u"A]t&e@ӃLEZPb02ËOQ1"Mshѫ8^5W1jx]㵓*^#}ч><'+[G޽_ 憷G7L+ξe0% onzpj0`D@m ZlJC^xz]^ͱ?;/u9+ʁwa2BK1Ң2Ĝ -*5;9rE78̍FX~gYrƫJ$إ-O}&?V6܋oLz=j{ +w,,r#YbqtҒMc1Te0&Z-mO=VSU"{mj(*&CYYE(w (kB(SSBy"v'T;OvJP{Xq$%k ?}"QdlL*Q,Yi_B{9JܞR9Ц0b9ۇ.ź%T0Ӻay]$8O_RFv>ԪEgM0v*.lPUUh2iSiqo<ouXtRg"8[ A"Z&Q@ k$(;14Zpt-ڴ&fvQt_cNT"-%&>B Zs A[shDxsA}9p Q:$< endstream endobj 1508 0 obj << /Length1 2170 /Length2 16719 /Length3 0 /Length 18025 /Filter /FlateDecode >> stream xڌP\րҸ;ƥݝ]{ ܂e#ޢYߘDYA(`f`ad)(Ȱ0Y((ԭȑ(4NVsd7E{- `ef/@ u:#Q9<,,oq6pm:Y@ƶ5S+ \P[ ^&&777Fc;gF' Az t: P44F$ nN@hfbotE@@)KXY9dlaeo0$`z_ƶoƮV&o n QUM@`gFg+ۿjd[%`gr݃ߗkcf273 3 PF:o"?2 :LP>dKV0+ce|l \>^<_BbaY&@ +{?@;YtƏ&W$ 'E{(*b`c0r0Xٹ\o>GyV𗳿}krvP{ChLmt?ly67yR97躀@m_4r2`uxivFfɭ%܁fV`SͿ-=PW̛39{2S׈lm__ |[Cc;9{ ]qX to&}NH]4'I/ѿ$Lb$xL%.b0I!C&?]ECo[t?] `RCoU[t?]CoK&-_M3loYAoo e,{Ӵ)Y`_d}gRoyQx뛝?J~3G>OomuZۚ;̷M&[NM|lkY*1y 6go>or_ qEgL]݁HK|uw5"n gwڬ ~iíe2ɥ>INEQǻ^; 7 Ē&q7^yZ_DxK! к,(Pz(1K%dC;jJ3x4[Lw9pr~}ڎ֋HQL'GJpFZE# u ='K Wk)q=Je"!|d_ANrH:(<)[iF mP0Y7Jg'lXl擋\@05BKαO#WPV/;tX4>AY7!ZܩūZ6C_P.}2d}nD\䲗vsП'^G]]H#Y<#śB; 깋Cn3[HaD3$KĈ}Bn,Ǔ>aeVR.KGpOׇ$Pn5d J[Ah](5ZC6gcr+9l2STV~yYb F~7p/>\>42ә2lBXQH+L  i 0G< @piuY*xqHMyܽj@sR:)ECBYMn pJksX4햖[ֻZԉphS8*`mta,+)Ʈ!4no@9H#|jY5 2T;|i#>b{*薰}SZ'fw I LFOqU0_,E8Wk #0:D_|5*4@&?z xQHO!qB81N'WU!JZPۥ9.k16L U(ӥs :Lٵuǘ]Ƭ%fmH:5Rjn2 aC/}@'H6qo}b@~gKbe2^Ԝpc(# ᄤgyq"9f.!ROm4S=-ÊIMbNdui{ATh=F{ll@&\{8:!|\],1Z) 2kP fh(/V%:U5)Qv1|"%>E!pRk$T)S1aps+▯…Nϛ@a%,88(Vp3gu6nY0=m.5Vo!~e67ȍeD>C?$3/2M_zuqT1n duq|Ѡy返s6dy(u }%Pb,{^dÖ:p[eܖK }x Nx1N'nEHKɂa|w4jh罱4)gs Q&WKo dMi-9oO)M`BkQM*%.yY=ݺƗ96gSVY / ~ZAMegE|pD'Ѷoͨ$}/"BkА&SYC {5" Sb[Qh?:ER# 'UQ'{_s3WVc&F;]j 贎PM[B+tA߿~vE=ܜ&/-Cb,u __Ϟgqdw6 @JJNoMb(>8{f@iokbSu>e&nX(Bu=*nV\2+;z^u (m't+ƬCt'n*~WLdNMl߆7@KdvvhÚ  Sgb N|M{[# hJ^pUUUllYws},|$!=Q.m ط]Wq8bZf{[N]'Jw`S @yf\@.Q )cA^[Pݵʰ%gp!yK9e8c+?%뤢ݨ@A!MuF"L+c|(mhSmILwgAx+5I zv6,t{~ac{0a&gQbU{)C1d 2fSa4|T:&l:a'f3?~oт%F^W]@GEDüY3SJ] *5䐈$ 5=YgQ}.reY=VGMT{˘,Ǡ@fQrֶ0OI|z*ճ V/Ab o7$ѡMZ'NΧIrlEÆʌI)p1=x$3VM"jBi Z,_B^VE–ȸO\vss0as;TJdxg0RDOyiԺ 1wa7r! 6jb寮Q/1B9"38Ky;YB v6ԙb~yP.""2YbMCWmv62s1?>.▢@ |SI~!7U? )KneN,BwGq/3 aay~|Cт'<_~b/ X~B)K"%~^Tb<gÐ5I"1oV?c D8"D0NSQUMf#JXsuyR%MnK "}'zBϻSǓ 5*wEa0i/5)Hs .-6qoHG"t{k+j~>\:r۫H7EOK@6̮3ddR4JޟܭAB(PW:RP>WIY)aS@rg5&Wl$.URkF=l,޳:c7m<4XJ%PT4`}j]p5'k &_)7e3ֱU3M%\Ox,T2 br{lz#+ګ~Fe='=rVDr݅h&y[O FZ(\'[D ~8Z3 ;[a{c| XKM>DmrrAdx[ ), ȉ92%FI4g q}S˖dҸ9KCP-XE(ۡgE0XCrk /|:9!Oޗ6g1ԙ:DL wl+(l=Ӎ}%+)5] I]O&nِ\%>x"Ӽ^Ia'Mj~9/x.}rfN $vN8 ??On4.5'ehym(c/ؘd#u@+Di(`0Z攑p%" ]4d0~بwņ{ht)J<">c8yz[m68¬EBö@^y'-ui%D~vA1D266p("e~s& .g;rk1,Z3 ;+Wg% u93m/ұAf6Z ]GiA-wd+Lp' LSOӴ٫ + ; /ZQ_!_jQ;)Y$}$/6J((=b t McE> ~Tg"Hpj9ñ)髇RV> x YoLfn%u#z3Ԙʣ_5àzCe?rUJ}݈<hF P* #KM&D\R[qw.A>u̫.-78t:C?n,IyĴğ%q.SJ{W<8V*$G({1J [涗ՌP X%&E t X]K(`Qɝ=Ev3nnŨ)s=IÕgVب V;%L\}{Ӽ:ۯΎaNˇ򉔼Z:}imFy30(9wlszjyXT0B4;&SS#9m Ҥ"*% vD:mVJ %gY-BnL$&`Vv MP]B2R ю? Nr[z0rt(]|MQQl:~eOI7( ZTبv'D5*Pnenb;ee1jVQ"wAWɣAW 7|Dhi-FdoKR9P$8o)D:D <1v{ |ʃAްy3V}.wVvr2w;-#+a ulJ(]I7aA #òC1*\T/y#hgSzt]{-[n xcx$|ɫ!Zoxm%QGQLFu)/q&;5Tp +Y7`pe~R&GC |gʗ8:n46O(9JiqY*T2[i(?Q{7NwU?,^I_s#[kpWt $!j?2aIۜ1\ˮTY;ƥc*^x q0J) %J^J$ ?K@O;G9=7qo?:\vBάpI\x'W0Kd+LJÖ\O=ƉМ>&6L\|1ak^O -^8#WJ>$54ei j%Z)\9x:%]T]NO:KDpes8s։bN />8 d赜[UCg8>[YvHEi6i_{Ԅfl)+$]y;Kt%d`E ){7Do|WĦz#.|^3gx=7cEꖭ7/zQNwl(5îdyCWnY= g*? u ?z??~@>;rp"D+ѤemIMN+5I$+E1eލv}`=6˧NZ]&vƗu~dc2V{R$Ԣc:)'&,y-;~xwmmF+w=<-{fȐ0<<oѺjk\ *0s!r YzD ږb:n|'QEunÎSn*hɧ PU_\-ZfYfpP#Hn"rv) HY/Ԭ, upUkPZAb)]9*jG4롴vnSw Tar/eًb=[Q֮]"&Ve6L;Բ}Gƫ%[0"R >鐃nV,k|c揘+W-[sc3.]ܕGvZ*^&9> A4D :(rxI˫*TiWX MlrD0IΒLVF3,">(#ZLI# `bT-$QcuVxcn\Q"b*`!wS}XuV {ȝ!z4͊ib\!f{8 kAbn԰ B6-oG&aP۬&>/iÒ?]`!|Vyrk.iSf!HP j@%+(FzWF_yumߞ?PS)ƏP:77@ꏀ]s k\ KO%%̤7#ίÚ!kct)~mp-}yOrG~E ";#dnz\5C`iwڙcݚ ޿JG'G 424}\qxaG5/!!#EG+9{v:L_")~_Q/2.Ko+[讣SC Y ) n3#mmc:7"oQ0';N0ğ%DA1ZUnUDe;0k{a|Q}VX5u *v*> j感Ol4|)/دhK8*RaDǴ $8:e~ݯ:'>z~L藆~ 6Hd)ۜuAH7Yy _C6"E0+v+FZF]|;evt.4B -fT"f4 7%r6yj'0˞*SǕ5m.4 } ]4UNÒ|D'2^;ƺ( >PlnF(97W B2WahH%,yxN2)T>An艜Rb[w#Hns3lc{A߂뵻~CD"Nv9 ~@cupLiTbc]5N0 1ûYr=D׏ gݞoh">1%Z Sβe0+?QQHLLYT8,edrmu"r1T3kZOuv*\b;nB$1g$+ b90e1(_NYC/~XI-EO9_ɦֽ__8BewUA'{QIsbYzR#rgq+4w6kW;='uT\nn!uN̽tGx;܌*!*svd`#b:vM=W6b&3XV*< [=n!uLjiע) P>i'j_sW[ޙ 󫓉wEW_dDs7 -<8!k|zm~I48gvCCG}UͳZF+rvϾ߸ntV@9R_hdU"+$b?uwdzCH}{m/8%Ϣzsʢ a +D ۠U}73Uyo\۹鯔[c5kӭ~%kJtj@ ~>sOZ&,^e: TEA*8HFFߝ }dL}cX6^/2g֕nةo~t>e;xp|w@?MMA\x]bcz`#5ǯ")bô>K]nD}qͩAbFxXk5Pw36QOt`O0@+~(C0Ij.4}zFRUOx4f&We.|8 zC0BgXSmq,-vVjf>Hi6#`Mg ׹8sb%CXo^#7nC%KE|dƦژj!x!eO/~X:dvmd I I9s4F4q.k}STfW7)m\ԼӕI( ~efasR$X5qb=Z&|$3 E0t K2IYyB\QH~`hLᜆoW߇4@pEbLlrzFL"_KL%<_z'C7b?@xVecMΠ BŲI!6Ps={Em&uU"kq뻃yx-{3لj D0rOKE0ڧ(@5 f=xW2cygS* SŒvD-6$)>8x^?w"ǔn9ce^U]Y\&f&Xs.s^|9ߑM] UʯۀCk`Q_N@BYjMyŜJzv"|^v#a ΃X~Η-t?b~r{Ͽ "טQ&"K84gU@ZA]^Gڧ3΍5 Xe=&?Ҡ_{ WrU]epW1h!7J3ꯈ[_G/d pe8̯u dHa 3IA\X+|U\0SJS(U}L~ \B'uC|,Lߣ̀i:3VŅ۞eʰkp<eiIcvC)a[tf+&ay/a/$*%^8h%7X[7tCMMJ#04/xw+c)qRT%X 3^%+ZĻܞ0]jɗ&0eXU|(h>Ԝ"P8և4.G(z={SOi;wqshV` 6Կ }Pl`UeY\HI ˧ڃ("R8#MmmOiO(ȃ?65}EHBxt$e_c]7"ꙋ6L [E%[pJqp䄯wXB7r}Z~n$J}&kwbkR(V wу / D<2gj֏Q|Y!q_^EͶMG 㜜 2,mFBW@w-tF:\) \VsHMG9cdgl~qzK3bNOO? riaM'.FkMݽ`NikE$pXK X R[Gucɻ# IżUd-X'Qڭ\ӱocM?;8/\Phep"`;&MhCq˼^ŭ9@k%l[e-[rNϕ3Y쑰xhtVx4WlFV~`38sՊsEAmqѡꋳGANW= {峮|oo׍N"4\/UK):͚Gk")OMNE5hd _b"\9BC8ΪBٙrnL#񘓜z^%${of 04Q_xT>/v}O60mMgGƩyÔ"9RAVFc[t2\z)*43R.ɯ~1]4z?f.&"68^K`-ZR!U#y"UÆgza-'q=_3{uaM[־'0h͵%},Z݃Rbu äbn3(C|wC WW1)fߛAλjuy!bxM[q۸fӝ֐:-Ohշ%R£# >vfh{ÄHݙhib6áMvL)_po &:+jEuƝ*Z(`,qq;Ub|#Wư[a2ȯ2;UM06Sl 8-c R"¤!,9ZNgɃNȂ(RWA T (R Zl,oKGqm/CȀZ5iY'"82,܉SzyCy#-ot)E?kZ+St'45zԉStt/6G5|^ F8>ֻ)1b PG^-&x'3 \#`28Ѣמˋ;V R cs>dv0,)Or ;3#^! /lAFc`B~a޴ǝ;ǯ,%$A6I?D|{u0ȗ2뤍.}Y7: 'E} #P#Q2c +/\ev wsn[ç8dśm`0GuQ"FV&.^D!v`c]uBGٷIdГ$ ;ޱtƏ[x'#dU`Dj2-WSNe'M[n 2PIտP.m)ۂpUb[Z%6Kj<s0"wV8!FG -U!BS!caǧǑ1k oź##i?t'4頗F?@Q}OlR-_ ($k aː෕ҼEx< Vj$\w_>&YQȪؕjȊrnxH$ALO_9L~H,IӰ ∰ 68:qǶ}yk#F_D.#w 6Fjv]LR S9z6fͦS}~a&fڋqTbSf]e7:8:{EݎNgKHp2NGN*2^A0]M#ܑs6 xʛR5=3Eso:9 mW(pl0<۪33,uTIxMdY2񇻘#mbm'Y*#v-[X^R9nA F> *)7W.<{m4b ܡDlt8\p/_kU'˺3ѩOZbG?˳(`k>ٲ1"뽁N\QWذw`Y.2XrX9\_=8WHխQ4`4N;}l: yH*(qEcWmZVL얚&qi] KM|z:^ȥPPi1FXׁHT{ѺAJXcw"c#pdrZ SPAy~mCupj!T]ݫL|7JVzOA*ۺSKFQHy~f,iG$6s$ADeͬF#g{FrwjN2pOٽH> FB++r$,W<J΢ IE>w[s̉$N?yx Ԓ7TX2D̫Ew COZS{ujǠl&l>!vВ-\NO,j-.~"|&[%.|"HX/!C57+;a0 ȳ6Xӡn*Nv.XOzqU)Vmq]nU#u d'Gk[D[„^y }h1-.57k_6dgJR; E $K2 bYK7hyb/*7?F2y-h~dIE|X$U$Îԗ7%َYԆ<_>접K~7^]фH ]bܔZ*Qy(c:`pdW]̔]9}8nA4˶B7xN]⇚JRY%a4Qc 4^4]]r锝m>$`fR*2jEk|} ?wupUB,Sc R)0#`$ xVi-LFJbplCFP[COB'iEC$1rKltUlglrbNN=$QX}uQ I.Jd-SF-gqy.amO#i* ┴?WeJ p]h+Gl*Y}9" ;7F4&M!Nx_m;R{χs!+@1tSlYA?#Ugըq:n̳O}]PԣI>գ$mSi~vZBSsN?% rk<(ܬ. ljѳ;S U.ݮ"⊢" [p7M۶R]3^]sM2#?_ړ܎c/+k⯖DpͱRAX ^Õ=ތE&n=;pUk} NW]0KDlQ_@2ge ݲW뾲d9V%x7>ECmҧe@r2:gR J58BAQ$|-MCp͈K[;t|d>mp~C{^Xqtdz=ѰhӜD䐓pyOKV₋=Y\voweyS^Ʀ=U;?e?(@u=a:-8-$M.W~z-aVv ;bJ"ZBd1 ncbW5Pn`VrGbi/a[3GEJl V`еikħ riGh UdG^Ip;iNS;NuU Y';%jxdɇwQnc.0menԫ^dNt?ָf512 u15מ*(-GG7\'>7;b\}ʌœS'om@E7@E[Smίsg^5ҘnT6N)wNNV د_nbY)4ɍd=|6`*3$) w[`L&5&2U2(-*)6Ꞡ'TT&%Qmވ$:ذʆ+Z<ĀAwu~#v)m kJ5/ Zz1Hku`nhug9Idg&!N{+*\u # @ 3φ4niGxԈ|ö9A_ "JV2- !"O.^@`4m[iX)Fd` NWmPDxdm>oRl!GKN6>Bgq'e oxM8f28ڒigTӕvIٟXخmlvfbn6,Pa> stream xڍuT6("LABa0$[mlAD@;%$DAB:D3~{}?};NV=C~E(FAB a0mp>aH4J!c``ަ hPĥABB@a!!h4P삄h ༏vt ߏ@.7$%%+ !`PC!`{!K9J h \!0,  ;&!C-{$CQP4T:PZ|? ODHԯ`0vpܑ(8ij p|@0 Ǣ`0lj TU qX,猂?YvppXvEy}E?ǀ:; N0u? ń$%D$Ł0' Y ivǀy#ma'00o Hh#Q0g1H7~ , QXPMOQȔq*)݀" $$,?x;bQh|~w.HG!'A rt !1! _!7dwloH{?x," -*;j\?3Hs4~egZk4v/DiўvI f&YwT<kGjDY icx G_ + Ʀm1gj 0DxQt_Tո8(/AZ(iF5,]= 'u%/ &5 d Uy6FOl2:T -_ܛ 7"BPpgt<xGBeRIGЕnlx%l_lq Շ_Yoz.Z\f@n"1b+;4Ij!#] .te& <2?ċB\ITj#$>嗚 7 4U[\ݦROi͌%ZzZT9u+^Br4)O=_?LfԢ]c#UF f}d?f|/s/sU{@Rcs+aU:h;\,iX RRl%ux1d"%qMꒆ|KYff$e7Qk.a+;z TL;߮QVz<D,2N|Ns=:l4`Pxo-Wb.;hi+> ?ɅŶSp.wnCe`aPJ^!M$S|{1K gwY2\ =̀|0Be= ~BFǤY 0GFBџŖLUT}N^4\aAT|~40l3ЗNe n]/a& ,^/+z`[,;_`Dy鲅]sp'JUfԂ)Ʊ'oP^&!`#qNOMUyI+PNqahN23Agc߭]'>)ҧ:Msͣc`D%Lu%K:Z$nD N=^$cUE ^q6Ǝ]9k-! >iV@ے U9](WR(o|@"Δ9K̼k7׾L8>׏ayi0Bڍ OEgKׁTS$< .~us%Ucݝ1Uѵ_t J,j ]⃒p7j]@bpTEFN_t$` gaI 7r׍0oܸeaA5YyPA})~iw6s|_+3<||/Z. !3td#d=?pKTXX-G5L7vp*rP٩NY ┪ůjvONF)_p!*&|Ua\[QV oτE\xAGrUvB=t+bŭHvDfhc_,!B=e>dj?nWɻ\ZKk"g%w f[0^ň|Su_? (51zkEWa|f m-8R JڴR3áDb[.ʖE?hkoAXc\fV^,Ztm^qMY{籨|# $ *߭SR3a20Oh{n7}ѨD$q$)Ԃ;G/9 Rڻ^ *}<9[fsL^`-iwmf,'<@{ +VvF,(*Cdg),VcW 8>S) Gp`VO*>&%Omot g_ra:#2"Ɨ 97cKTܣqa^={rÛ iPJ6F[Zիb&WU=B}k--_= .HF,`ZzWMWK'bV[IK_ica9 ,Jh~$3^Õh֧}RY(3q]Laբ0:wR]@g Dŭ37AZhx*l?T "Q\]|!hΖkAҍM$C$Q>A%~bvs#>bR_7T̿xEǾ6 tk@Ԉ1:cm$i9MU}-@3?nx{W8M H4, CY<V('^u}gw2MlT>8=z]0lFڒZR)-gB(V6ne-1NL{c#lc^ ogeծ~Й;d<ܩfp/#°y=܇Krɝe#cMZ_)GbNrZxYr@zNM_L*o\/iPa T+L,iNUuz6~ ,כX_*YU-\&,X9u{ՋYta)L|@!v3~4Y];-=TLڿ ȭ~)&{%m}܄4dTs*˶A[B=ǯ$ AONwew\rm_v?=yyU?3o$jHI6#d4d]+$?R}Oе`; ԓNp)},츅UG߃NiN3TW$]5Yjcij|ahZ蟅9 lH&n&H } MxHzRk^i>p?qu y*~=/Uѻ2_R˘aG쬶MF6/OnK?}" Q|NeiG4OپASUxtI^¶5fh"s7*=|fJ AȸJ(/BOrgh 55ɌjބI>e,<60)_aU.K/v=PX1,42z3>o$@*~K7}2SxP8ý5ɝmh1>mǫܖ_gy$Y_o(hJ/ȼ=ʢ S ^Y(N6oY~qZZ+"׊ ;"]Pn)lP֒I6djgǼ`̜Yߒ9e!17 xA?PU+ٍDv/G?߰?_j_율u++<3 ϕ-'2ᡟE/ʌTD3mc* &|T-Hyt(u1 6~LnY!O$q׹Z}ngydjDLK~dK$ߘݙP +sXIL|9*_ttV5> stream xڍP۶-kwwww@i  ݝ .ACp}WWT5ߘ\sTEQ(evfdeb+*rXXؙXXؐ()5@6HZ@G'_@cWk b`errXXx'Α a 2(2@'$Jq;{G11r3IA`%DSc)_%h,ܘm-hn gK 4dl k2&$J%/#jN.`3#p@+Xw`ebO$=@` 9PR`rvwf~8ٽlM^tn UxN {g'&'yeI-? #=ڬ5 70abϬ 9e%y5!c:8Yxy@Ԓwy {'o>^v!> s/$/'cW o#$VV`j_r豼r?O^ef'~ԥ?>11;w#+ ~}**Ơ`'Uln`ek]&w1%W4\R!)?n?dw+i]_h*%ZE{e_ x%3#+ _vhr625K9~[^XXU_֯W^2vz5W9w`S;ߺc;:{ qX_jtl35:2M+Af ^n?l{f 'h*b;0b^A.տkyA^?AVݿ}; ڸ?n=gSGEy@SE;S`Q7Iس[6YíDU2~V).%1ۜoKW^;$ 7$R$&/7I^њ!rSĈ Tv# Y SyS-'QaHq˅+uvהd)`jl9 kr^Rڶ A&/yVvshtx'*@5p"]PZk=Sq;/i 1ZYڤcQ۽=|^,ѯ D\hYF・?kI^FqErO .eYmQۄ`V %OMXҊj!t3SRd2ߨ>5w5p|p#J)gLCE[ x c0[yyU`՚Hm.k>"VYy9ר:I!#^WAicxaPrI'oRU){ J#+B;h`!+K ]h`u3 ("C'rXxAa=:$*j|s'X)]R&[2d LZzأ?pFWɮGbzlhXŢTը**Ӄ7$<y(LT2Pʻl)E؃~5$sz|[=OK >ޔ+#a!צPt&>D; Ӯ}Zwe0|Z5}nk*LzÊ?QJ[*{dsJ3'gzo6+']]eP Bw-crTtn( iI8FiPz/@ർ3xYpʜN &>1O2f3"}Uʎ`<=LaG,[~ EE ㄓ3;,t>mu:4ZYØyƌ\R`KD= &L"|{^UW(3}nqRdy&IYJO̔?r7 P[2nfM$=@+B7Ntv)0uJn sMdV9mB)PwzȵÎ0 X~{ W3q3 i|_oE9qVN+ii)03tEc5$%ǖE`Ʌ~㮅OoI:ؔzכm_^AlGRo~ӠWppP\#Ac9`cA,j52lއLs /X7àIhoCN\:CV5bk[~As(oq;s0'+{3ɤRNs1Y = Xz^q): &͋N , XJw,` B(r.PY>a4*j7kSQmY n)O()4F+{54W \ꜵP+aºIqV"FLO3*C"|SO/WzF4[ʀJg`#!9x3+9OI ۽-ˏudsuW$w<~>86ܷ JN$Y0ygᘆl8]-*-X ~6nVH-1ё2@K] :×#bWQNQc<6qxDu 塉$$e9BLC^~ :AmN?- 1v&?QH)*[K`U93>C?Xh<(7v 'f8Ы4݄&au 1@p͸w;GN{|e{P,8C!L-k`HNp}XS`<;ˡ̔|l <c̰it5v'IߖDiEYVo/>'rQ1Z'{s[nԜfӣ5`3T"vv:Aa۳5-O;7 nMxJq|{fjYA\gWUj5sY' .ȘޢMK-CJ{5X%7-Pҟ3W#} AF)KiSك@B5O.HήR&+(kOKjh|mIrVM!3f2*_lM~=~A,:gmhNCV8 }L)5%9fyLfuo_glEJL)şݟD8S(E $8F2CϨLDaWjxz\k쯂NK_W| m=# J-]M&j<\n}wYeg}d9>bDˋjV=쏧F8Eqw-'Zm8Dz;d45-+*DțqRdewӧ3rlx?aj(.el#ϻE-_ĥ*StmsB OD0[τI?./ɡ+Tz;!^f*.@V]j_8vvCXmN{6xKxchٽaY yc}վ@%lDpi f8KkL=ywVngK5~SYɶ38wkN*:?L:MڐC(ñmtZEbZt2՘MJD&.~M`>iXU:9c2#yOΨ#ׄYE^<$tuj ;Uj T<Tǭw7`iyGPm>@U:s9+{QTKB9LQ&]cg<Ym0$ɌQPSX7xY]AA [~ߟz23NL#\A&4;yo z|(skg'Z\aXx7%MhCX Q߼l ?c_02PNLŶ! S `h&(I&#vJ/$&o|4G:ޢ7Բ_fq/F={3OYyݢV%oy2龆Eea&2l^+߫5T\4WO]^v~YAjk{AB`ޤ Y,Z&t C"~Q9R4}jmpMCPLE+z(X9ɖFDá=.!sJ*KRiȗ~@ާȔ2.3-* >%%g9f>_TɘVM)AHdB;j{}?/kt.dw\i ;E\ U̯ЋkP?(^EmBpB%*+-OFyx2Ȅ`dWC{f$=}ɐ'xB;H1X TચoÇ|E9gqayy6 ਲ਼R`āOo 6-7=vs,nVǛ+!- @r>a~ȡl7퓣wo?=RUB߼ VW<2q{3@8@fn!04@V29x<(;I_ѪC'}rf,gqTcb4!BRB*jI`K1 2j1ާk+S43;;d=>} |!gtؘ,(]>?ҎOK%>0fL5;UQ&Ф"/΄>jܹ5wF1T[솋?(VUj?Q65Ul'zvLOOX:TR]LjyŽ*~&!DaX">lq>Vs&amz6:k>Ku(7_O6P8b˟qz)9(OD~Mh{}ͬ<_\iG񚫇HxjҚ-4`ʞ?]Y] EUSS S4s VqUMˇH!s ՋXRB:()srssROϔpU<C> _[)/1_yQ'Q$gcI4?.tzt,OCIꊨ{,7'o4(gJ# \ /SЅT<’B fS7ZbUo}ܟ\gm#H q$F0D ھ nEU]Nx%z " :?|zz*BX+FNn7/%GkLxV %V=v j?Ed16ݏ8(zCa2KN6逿Rk9M <)G@S'߶ /naD79b2JDn˺"vz0FMNz);_֐ʧv}۶i)?d#K{Ic!Cw '.8G5 l++WD^/-bppFtP[v])wT]CoKSJK;l񞊣q}/!4g|59 j. _(a~ަU)(U1_|CnZ01y{~܋uޡFϦ1fJQX}@+~ Tz{Nnhj:O{e]1׻ƚ,$Qy rŽ({_=䭍Tu ^Iz#Mhl'[S 1-O]jWm؜"P\l=[ZL{t?#UVtx 4CdN̫:OF0 i٩JۥoO1nʶg6M"g$XO[-\ۊRYi,ºݏ] V8^+oR 2pŕ dvO,{g,bo_ȩ= }܃o.Ԇ)J=bSjn9^{X S63q/,(PC`]dpwn`kY0~)y<}xM]ϩzˠ@f-?}7n>SQa0JOLTY}H |ٚwɒnxaϊ*;a#^<[ ͂3~hh |4D9zUc0*qIJ60}3SVŷ|TIl$5c|QBA_ረ*-w̅9h b*(}N“9x̶M x3}ӦH[r!ϬNd^eBKr8-6*f~H|~I M4_ &d<2 𵆹sϺEI:q`UhO/k Xy_07wEdxyZy|%z6oQMYCԠ ϧa)FZF{I@ZN7VsjZCrx%詔 ,H(IYՁ,LHlaZ.tKCpqyAUɽ<@7(]S } SV ~˞ڀMxJkni!gh9(; ) P F!\2XX R~&Z3z_U4]4c )ɒ, -z5 zSO6ZW[gĠ)& U*F[N̆E!g04@|ۤϧ(pW<>yZ @ 0y i:êR3CS0iYCWU\*h)V`mm}XEJM(* 8 :#%ܚ#|QN\9b?! nd}ĹWJa "g-ޘM}JAÄ=Tw4Ed{It-#lmkH{[J}vC0ԓ}|Q- xVUgstDѦia$(%ݻtΪqKE}0U ߵ6x7ўMgNP8[)R#= fMXұRu'!M8H۔ˌ ۆ7 I1}oQ:?>q͔mShդ\g`~h*E݉dvZ6 <_@YM$JζV C59m a>'/ΌIC,ļ<|PtϽiq+F GIMX,#crZ+R _ͱ*db1U /9;`-|odceL!X!yδgHCi߰Y(5Ӝч >F̔Jt%6qY]$tF}ŗSCj%B Y0-i"6/UBmg7pCTouM>k}}Sazt9c$ة| :=m(8i"ҕc R_T]ʸhw~f@T>QM8{it 2=P(wbU:kښ3ɤ VL߄D~7dI#;lCI*­MͣS^9 zRϢ~z*%/"w.#4-c2ޒajʄMbhh!*["}AӒRO*B\ 3\sޗ؎J6a`N>"'@̛4ˠw,R3%B Mh} f{ql0J6g^OM*5P}ߘӿPf4]9Qu*!ՒwfKT.(vu֚ K+LQ2n/Q9NQWoPjhXW$wk7a@DwGgʞ̢&'G#]SigkG~գF8PWWRy̓b .֯m;sfysڰ3s|ˉٶ1wj=E5,%"̥P@5?[eFSWg.̒MeH(h28+{7މVM_$BNi;?`Uf|o?"H0% #ƀ:务8+i珔D?xWuqx#t! lֺÜ1YYVK endstream endobj 1514 0 obj << /Length1 1390 /Length2 5891 /Length3 0 /Length 6846 /Filter /FlateDecode >> stream xڍtT. C "0twH0  13C HKJ*tt#t ){׺wZ|{gww?+g (a(^>@AKKM $P#䯛@B0P@@@(O0#@@ PB@TEP H'jkW ..w:@ A0eqœ9`(\v(?; GJs?CQv$ r``EmP q8B jgX]oBPd wr<0[ QCy@0_@# + w xH0B!FUsJ0kBO1g0;aYՙuq)`\$BP0x7t rc&r;l0C@|6E" Q+-F7揍Y>0b'C/k8?S4P3cp8WPD1/>, m\5 ]=e n?i1r3ysw⿪X )::sa/ZWFZp` }Z-5鿣j(F r0[ yP2b Ep0. qd 1!1jC^/?Pֿ'(B @$c,F(L 3 f13f7p_~"Ss @< ` 8Q}EPI;ڐ$^҉ P3"T҈r~zڌFt3my^J*O#^f [f#xcF :' L]Xw#nXvsPx߫蘊wSUnnn-KӤe7Yy5XAw/s):p5,,Q;UC$νRO_eݶu}(JG„Fs/2?mPyYܒݶ*\N8>Cnw̨$T{';[=l(@!0"QJ?`u2/X^HC բ#f".o ywU\ @4eڟvASe|[)\'F3wbqdNF}֠5,(#NUl`vk,mьH0Zݻ_0+>ʬN@Pف'ooRWHͲhE'B yߘk붲jrճ8Lo6e7:=)hrhԧ'0, 7͔aqݶQ.:2*H%A yoEVd+xEG Ive lyEis蒥ƍ8D'nLv>9QPFF}BI =`b[U|(?LJP=TtM )0y y7{KjnyzCPfEg NC )vFϕQ;݅[ =M ԛN9vy"V`̖#,Z&8E}冷QO -VE\ȮX{8ͪ7MSgtǡd (5&twmx X'+JɣC dY;ƹm@F!7 wy)Fy~ d!$gdNZXPW܏؞BLƷSy:Dvjqc/I/}D`wֱc$;=X7\]8%At| >;5m Q??-z+}R*^pzmx̳!xEVm2ӊR5hZ`]0C8BXKwSP=ͣ6BROLVYEnkD z>rLIsTKX i|OXIz&lCڷgXOʂg'[CCs& w?aIܧ  WEM:&49R#;~WI8aF J*סsncij?UKCJn;.ѭ wga˕Yw.${enj+ɣgnMȖ 76\*=*Aky_cKӟG|#p*GpiK/pIB6˾&g7q1 ̗~z\| ;$.ĵ2TXl+Tk6K ʉظI#P7m\~ycOLmAߢ=>*˝'![0@OS@yLgJ^uBt|P_=BM6ơ:FO{%sQ1݋1U3׃C]%yTR~S˩|بjEwߜxA"FNXJU,)1s9 K( cdBMo[U &6,?PqkhpnuWo62m0z0Et(8MfK75sY |{P+ڴƂNu &՗v Ui27qd{s/^W 侲O,jgaLX~)2e$`yL;oX/*ŦnZT,_"F[|8W&4DIa3Sz.4nr2cx'oٝ¿r<:q+.h$8*T7؜|+R<_ 00oĮ?*-zvSmȃ1^tStw"V?H_ϔs_ &?YSL 9ڇ;RP)39 JH&l7_y_=tK -Ȓ,u~kpShRWk5!)Fm_pʩmTHX]oQ(`ŝl?I~ H/LY 0͓OC}d D4M/jֲv씮bblsy`/hWT~W_~0o"K㳮qx3Ch5_k_+sjWЂ|~^FkdnB˝x\|m goWLHf(Q!X2rqjZAߧrM~91"XZ)"'즶(Ir.P9 .6M?%G"[!VɕҒHNow oR_@7|xj(AٔyZbE ._:tϯc/r+/m6ﬕ)[rShwXWKr*wraƛ(USYʟRg0Pe~꿀JGtb7 ˞X1y&pMO6txɄtͶ\ȥ$i48Nja7gURՇލ7qO<ˎ,f(rc`\6|i86`>r%XU0$r| ]Jeq;M6%ړe$ 5'R~%gxiT4b޴?aG\DGpVȉ@ݧxͥ^O"H$g@K3aO}DL=|OA/5*wv?JToD~2Y" N{Ps7>̹JPַ7Ӊt-B`3/NAv⁧9=?{KPe|sL3rwz(\ >'˖O+JÜ 6 .'v䰐*Ԫ͓Koݸ=revy>.$|N2r!"b~JGJtcD]0@z <7+SOX-۴өbuz[M]I&$O.NGQem㸻b>L7JV%kqT.p|׹J4tfI-i|Л J?'`U+5ܥ2(#Oqeͥ9i7ȑ&CN}Q;cj.g"Vj-eUNok@] o<țY㼏-xɾzBh0[XA7ND_Bv5> |{1H$)QKkZ2u60ҽ#?Sh-`KYTQ@݃z>/Te J6JuUR_])Үb;ùC׻[Gb܊3]nGo9 Tw4hUAF깞;džKYjYf5o"AVΟ%/FU%W$\7Fs/W{sܨ/i$p˖&N~ee/և5_(6t%Ӝ WUzMq:w4qFf_p"9ұRVh5/霃I9UMu1}JOT^#LOi KiPex Ċ'3:Ӟfj˭^L!ŏ'kwؽ6d-e&߭DjiUR$R}.C*V&#»'ϻj?NbZ2&(3炟z+G)QDf󺈓PM?=pYvGW~Dbloe(Qg"CVVɖK0]k+M|*_i)f4ljPF6Z Od9bB]b[fx23JtI3&ckIq.=ot3z\7~0-sޘiBfp.LMa+i}4> stream xڌPH-']5xpBBp;A~UU0Z{t@E(jhrtpcdeb+XXؙXX4l@̈TZ@WG?]n`8N XXXXl,,0(2TN.6Vne#֜W:@bcnP4uڃW47mn)A+`djb%Dq].@ J;cBhX۸mWwt4u9`t*+g6V&_ɦN6VK,0uh ruzڀL17HL Ӟ+ W̿ʀ,`!hotpsEOh7;kqՄ;PV daae@/sk_59Y:9:,Mm,?@;O"++ `q@]lZbgkO`yY8:zʢZwOL `dd7˨C\YKGlcAo-%Gj"7`d1b_) U&MHM6y(:}h6+f >Vh*ePq3[-52P׵`o򁏖pK/|rů#0uq1Fo2q|YgLn= 02b7Y70KXr30KYR8Z7b0Ff߈,F`r o&(x\T~#0E7sQ\4~#0E7s\t~#0/o=Avplfh a4Q>:Eb bo/2nt_뿃DGϺl@{ SWߝqvL,`C 9@_e7d=~cepGw?VXG,maGweNp^7pf~ŜϽt-rcB@׿0g]vߎ%H<`_n!'8ho_Eszg"VvLVV0˂2f7kOp ? x=`f7V4G\u4 m&Jɸ3*8EJ~.K˵h@'$"aC ܻ$զG&qޱCb"F ]'g? ;69,gw*9^=%K;\H%1ATf3xno0NP02^Hb}f|VjSC_a OP/{5f0|\fDcgKQv^heJbn'Ua+cW4GcU[-V:,m?-NVQt;|jW{o?6 nuk Yy֏Z^K#m](ư4L7L잀u3EU0O,8Si9'aKҋY<|kvI/i٫4U2&boRM>|Y鮝(`o;\ZeM9sUɶGkBºy-7KKŌ8jݝyF mhpfGf**ٚB08 Gi/xd(_P!op^" [NU] [U--8/K-uZgb9>]s#[dC[2Bz?g'hP5V5Aژg˨UMOњEʴ^Q0\ ; ˪B>=lRO=i|`A*֕@XA.$嚄p#Wr椗tC_)(m ds l/ґXÛGCl `WŧaKf2UӠ?C`z]%.7 !VA "HkkpfVf0"xԜ'x3J GUѽяHH&IXY?4?:`}V#۷4| C$Wɭ<^*3nc2(\]Y?|xeFƭjbd9`$РqCÃL?F1Iu#vy4q鹢ܝb.x_5](L75&u噖:p}M#Ĥ3ZIh_Gӄw)Li},U=ZϘߎw8 #Ǘf`VFncWn-otQzvL$_͋tǙLb|0`U9_LP%C7n/mbscuбk Pn$,k=꾟-fS 5||q7Mp*X (OSܓp[Em`?M6S죵}ͬ2u*+=+ڂv~rţn:22e3*WoM>ug'%1[^uZT$ٲHDwJp~rbgݤ}ڑh)u^9H&GCB;&wtknkB>sTD2ƜLЂ⽭XUircA /z͜!uF;7 ŧ-sTEŹq}h/>c1Roa0@%wrB@y-xm1"=-0K6 'A'j88-MR}%-*L- 0^0x:Z}Y(*/W!YwADEII8gCcLA7@՛"\2k*>#2GzJYIޔlbT+9 #kig7DLF(WfRXah)% 9 4\!Z6{HMh т;&bWKfRf 6L9TYq Jy7 Fv9qi}:rf2| OK\sJB<$Zy)elD7@\ސ⥔kvUFDE=“ޮNrjouwjhF!wBsX؟ml&2:y}Deg2!6WXEJґDǘ9rC&=i-N ,vm/G4 c2M4*ҽ9} ;{ ^+;H2#E;>GSW}HE`-CkQqxb|v)ٴO0*CSU+*2*F]1z!.iw3kqiSD?#*Kծ-٥v:(T/ifC6>F`xl(-7p$]Rt}隌{qS`͠թco,<8i/9<[G'$,HfNaV*i Nm0 Ld{}>E!Ub>2/ل=a.u@#,ó\ CޑBV7 8 ˄Tvr5 4%݃n.JC0b5S`[/@,l8%iY,4]LrvK΅ R}[֔OJ%NBlrMbO?[^{a2v/Iv#U5¢.ŏay]Э&fD&f j;6ΚMT,YuTZK6/lg!C jmYUJX=a7ټf3L Dg"إ.)hƗGA(ʏ[nJPR? 2^12[J 5!6~\$/n c"Q>M)!4]{sX~8u|d+m7J[,IZAF%Ugv4 h ݃@ I: sΓA>D*]$(u$RdT-%:#)ė7ϗ?"yH[5$ TeP\L5[W W.e Pwy6(JόOBDp&M ~IBJ }최)8>[Q=f|ORA!9=ĶOI]_pΖ9 u˫ğ0@̠t`"- 2Q2o-)z s\W)fcϳ̖k)iC}[)e{4pӤ:ښO׵uݵFHsT#}d2'2/#qwߣUMؔ~]dLHWD#n-I Tx[ǙHR^:gӯ5XDߚG9jC(Ҟú@R,̍;.{& N#)wNլxuYZip n1HÛeBN%V֔E="'w&F y}M0۲.'E얢k6_;W[&N&1t]~K\].ZCDБK3`m6 4ZoO'⇢wkPn{Z $}W߄&t MyiET(,m7&iL|٤KUod{, ky-V)r~^E.Ÿ&(QQh&ÒLI}vmLCq1m n)Y/5f8#.j"4L\XXnǽwʚ$ЅsR_uM3T a{"#9is矍:ƝU_R5/oǹz.>8πj,*&+&wyS`+sh[ezes@G0`}ܒ:E] xW'K(ԓ rm MW)J;\UKx _8F  A\tݽµВVeq*n\_\3p iӃNOD2 sZ⼈-ɶbs\KpXKBnccDKT?nFh>%TjnWQSS Yun n ?!$ Qdܧ^T{SiU(H/HՇJlЏ_~~!vZ 2,DyQkJtlEGcP.)2TR='m;:SzASXaJd= a %Qg4_Egj$)BO^{\I)V֧syIQr5I9"^[-DosvyD3G'<$yMX_STCkW4;t`鯩+9yoC:!cK2ȻfT[kh^62+]zC zOfDR֥/N_BVЄ9"c0:G~"Af$HnE;_}G%z\D&{z|rXm~\FXw[{JjCR1asXf&%jf.֏oos(|- <'B!lmHy]F4}| /Uq"k5ͪNJjQ7ʎyO\%Le"d{sEqʗܖgÚ_kwcfPFe(̦XI$JH?(}jnܶpaWuAf~m#N'&m-$1T(7--l,L5=_R.hR{$4/AnqdhKϢ^7f\l9 6R G$k bΡcMnukCAyL|N0|Ql~sݧAyƶ$U [z)0oYMkq2Kɼ^HȲ!bd`g `32a|3fV .T.n7ۓ=D5!:`KLKw}- `rjR4bb(Aj Vx+.=uZt3tZɱ!YfY@(MSݧrxYBJۢu,Ѥqm{ oT^rL,Fh*ukD]yE.ҧ;O'r¯jLsެi+FOh]DsUdBM|`MWѿې(/MT,5\&d6q4WUSfP>ߪW6%`rۘE.ɇEm:Qʽ֐/(0J8A鞘jT[¯=lLH$(FymP۞ks{0琪|JUFFK8G2\ݦ ?3:> k@Uh/V{}λ ZҌff\: eLV'Kn5۾O ׬"|0fͳB9n鮪b*-0#'R$s7{Uc<4yƽڅ& X1^9SU/7ʷHlfkGV8 Q{Br؛(Zz'0?NN05*a#g},4t6(e uu FjdQiFu '3x[o!~:u{|Q{l0Crǐ0ͳoBWGWY+.aN R.V.V\ cy2B-Q~ قz]^KurtLԉO@A=+4d_[B鈟jpI]ٟ{ER687lk+JLɅ}ߜQ{N(S#`v!+i0[*,8-Z%8Jyj[*ԮNi~N\hF!ֿ+Ph^EJt1Id&;X\N^ w*:(qFk{Z;MEԲ/;$Q+8% Gt`NiZ: T岼pv R#h"b/0t"p}zmUCqEDMM%"޺™3?ӝ#w6wj^$C%y@:# *xnG.73Laic+f{sވWS(o+rӉ͙-TȐ"n?,@z4zltO[xMCޔ}씗$? Un$KA< "ф/n-IKyy9ف*- ,ŢY>Y-lms5_ѥ$m+BVژ">qV0QMS ]>;,\^1NXVwϗe4 #2#CAdBNё7k0(P>mrx(oꕏNXwdbZi*4q28 Zin-,opXp A|;BEhq֙q34xVk9b]Q:%Ğd8DKfocunJq,/p:C=`ӑc?wců ZLQ@cI *1v MOR +J$Fxcֶg=e*Ḩp%M,Z|ƲҔ:Dj6c4kj Qg^esk0lR;|]MB0NBn^q[w BZ-x'"5 ϴ?]Vol297w%B(>+0^ ,d,|AMzė#tV(o 9<0 >wUl ^Sq9T>ڞGhM柨R?ܓ37 /C* /lv4SK:Ŭk" Q+ҋs.@FK`'T%DzcCq\jKsɐз&҂BO~Ov AF )5>Dfь@IXO?ɛ>)kN:Ќ ,|}ukrӲm'ϯn!SՌN#*!!{9w$4lPZm^-/imW95.伅@[ne­^EiNGJfsXNǖ>׭CU b#km e+a7MGױV[nCB)d}9n7+ EM1~e#5'm7۷5YkC̐Kߑ2tӓQaζf4RnQ6秳R`C[uuD~ 3D\*b@H/aѾ8#wu rD=<"8HǿoMNqt׳+͑ ֫!ćPka? "@:^7FGn!R+]AJʤI?zr֬QzhM8 z6.:g{GY(~'USXeh[Yh|EZZU0+B 1x봍TgmI 3v3sbxI0[d Ue|M`ҖKLu5Z{KDZk.Ϳd=ԡ&/~,tA\ WUI:9_b har=1X#3Y]ͯV # #A(4|$GHk*IeqZ2f,K PhhNga^e9bHAmb[UWal{}X7GX+v/_y,xOcݢc6Ш/=0ԭ8b 'f^ фQS*=(~JCK:L,<߾ls4o"@7 H3`fרx3>/FӸrk(syE]JAZJI0Q`o,SmNnuٍViNtt@E≢f#I ~tN?≕86 {fjTK98 S?J!8nNTC_}:\ U07SU*kwW'C*Uqxgt\4ZMS7XxS%YU9mN+Uw^&4ZT6^L(ka W.P$CWD`I. xfogqYry(z&iK 7AFȤ4h1=:ܺ'3>"}Um!ݹnQÍBt2|>@ϰY9yRCOXBEE qƢ| Iyԍ41&s&~~4lk+RCUcdrD**qllpyo4ICVc\9WeBH#Z t4MPbvX"/^]z|ĥ}={n'd06/f^fϤI>bՔtIgDd*D}5#E.m! ؞ϤFSLL= H t2N ͛B3QWAL bn#~=^|;+fq?4 l-Hr\҃dcZhf9;i색S"e~kĮPo㭊Ɯ E҃{~PQnhDNYGNSd>9]kIw q6⭯\9vAKLf?Ey5]ib00X,7G:O'z&1Yrg~ &5M}a%Mt /q9rfծ36}TA22O̵Α™KcHe*zUFG̋8I2ϐDWEHIړKN\^tM|Gw2W2j7VW\l!I.A񓏣a"B^H>a/'EVg2щFcl>X蹇]rX>;hЙ!g"Y`pD7Sp <͗wRmSuc\ZYz 9mRtdo+)GzCj ҚTc΂iըb> uN{Àb;ӪSv_"B *:Cs!*DaF-r8aګW,B9A1:sB'_e߳+C;Fxu-`Yy˟m{#:\:lfpœ\:D /X!Lqpr86#yP7`3o N&i :Pd61&;<u!КҬ ᳆~H8CVp4pYmh}ėdus[4WCvJ8϶N{,͢^1CM0G 3j;N3sѠuKH( KLB-Z`~d=z$I.W"5`KxjR\kuvA[ϔ|/zpVw^Iirxfk =TOz,rl(=rkgA)T}36g\D-au_eu݀2voVh-/:BTцFEӧKK?G⹠)`OȪCOR]j?B %F ./c ]D/8Dxz.sArxv73eǗ$ F~Hʴ cTqO (h)]6O j,u#/7b+;Rg_MH.B{#OT/p^$+j<:'ITM+(0B>$&1\Mtގ>ʾ ƝQdlٶ=Suб'f:E$q{;=][5ʰ:Gd^ٚׄ73S*ZI`;NCA|@q`(:l5c%Oׅ&%}%b14J/@ Hi2ckwjO.(y(Ҟ8)s3BaMco]  ' TIҸm@ϖE'\ ԬLJCRٹ|FHhP=GS%nleo[:?2,〨TR'-v/arͤZ3K87刎wMt(71@=N|$HZrjY;ΌLk.-kgJv^Aʼ%Fo4_\{UvB--.𺡏~~}#ClAQv5Ŧj0Lݫ:V,{XX Z2L9 &15)SIXrZ[Y~ uK )ci "Ck8G!|⃐<5 Qd9}z"Sw;:Ŵz.`o 0blC$)Nm{qG X^ΒY% zj~ݖb}|]TX풻KM"n-d% & b21s0J.Τc%B{a^Q ZIf,'8vݜR9ZF(jIWe:qNE&}xjaӰ'+@Tq32~}tRW FYrt&M㢣d"4i7(i.Kͣؑu~sR*HjCh' ǂYuL-U5T-#1;#ܣ7tرon Y5 *WzY\ߚcIjFO>T$7 qNS}D٥۹ 5`ȳ <a Mf<)gU="v$p$9d6|~mqн$rdA٪mqǓpYH*XZa "OaݦQ‚G6uc'F*Vb +1{zeJ`jn: zl^pvj/Lm@iݲfN$n Miw*Ɨ!\( 5HvA{;@I8bslg\Rt_VɁ HvV뵂Yo|ÞI0VBv|FN^bשQk`n^'\6һx;dPDVi6(|DC]N759v`oEB-Dyl)Zm.aaRAviY4j; +%bB EGVAsmY3nv)(Mo1eUT@my c=x,9)x˫:aY=1#ԛާ ִy/&Ċpgz뼿u3")@hW($ʹ1bJKAP z<,pPB>*j=Lf{ZAiNkCsԧo߼x->J.N̑年jyF%th=Q^[& 3ƾ. *6on:8ȞThíS ?e+K)).A|4F+?`g8uva þy )d#'TbM;E *]=B|HhbݭCLDL]9 Y[Q' NgdEře^3 '7һJ!>ڃ[TX<6JjQ\.ǧE;rSVX>#8c8 e9H-B]h|̦O,gT'< aE8@Zqɑ,ڐފqڝZ4cq2ԋWIņf\ XnY[d/j c]D,,1ʇOj F8LD.AP}Ϩ ljx$(/}L>/L~FN$M9cq*n!E,CI0^tDapf숟^3Vɼ8\XXI7|77@[pn v0mC.AYAwX GFT=6c.,IC6Qеܡ= G#y+2LU O˨?E1e?tMw :7Eo>:ujU_+ z`j/Nn*DY7a1ojpPf<;+Ve3Jc\ ZUBuL hzWu7W &/i6E.Ŧ Rp )c^)U%I#D4`2[jZU7 /X@Yd޺Kdr&[t ȔQ-:g\z&:hr$W#fku[i﷬g _lfBR,g]҆^]L/髰 :Ù 2ҋ'rC!|;1^YL`O)vO-I*9%Nu{*H? $4ۣBvς4tVE0qC5jp,bݼsoj#CZ"MeԌǐmu@6gMZ0u\BZ"4G(8S[{*ٲ=jAj ^eO5flp< (J3;r'eH肚XMI:.%X<5?*MsI%xqBOgrX>NC.nBS )$eAOɛ)iǞ-ȍv1U[0ls/@aOPR\K]C{o^riὓiiS@|V D<+M$өɏvjM[6f; *fO 6~R&*JB=JM@xR2b\*k2jS#XY4?N¿mFqVSQ'4dEJλ0qp{GSM^}UOSa9p~T C>Z0V|` ]BSzǢHJ47UT6}Lp<l6(e3$xl |'ۄE+{pf9U-h€Fk}=?[;|6)sxUppUGU8!!a·ߍYWAl .Cp{cИ?d_"#~~ȩ]x\ @b~sx$Թ` G88Nmhb[)`̞Ёn&r6a)ьT)7-p:!ڪImLcDVGuDͻ8DhlߵwT0N=P.B=ǟ5}PY:'?Oe.`u ;#POE~#`y.YCvٴAo}M|B^~,yǴJG G] (JE=zCXtЯ%e`JFMVQtv)j!xBn}>7f:#|9٩| eRPXY.gle԰[ X:|h~5tcE,=o8+ѼΚhbA 9?v%G(Ŭ F=G*,WE8GK FqL͈-sv/=vb ty -tʄO\Xit*^SĿw.xM4[V%%=MT" 5=AXKl$0gtz]ʚ Myy;^;m?s:`+82uAGS "~Z~9"'rΚBǁ80~,ώn؇je0JU!m%cC 1I'a0pX$?tZ[@68>|Smf4h V6NaƪzI~m}w|NU?}AWMd*}rےqvh?cU\* Mx_Y@;F ae4(6= Tlӓq]J*fWd HLg\uda"r[򙻟" ٞ0n.@55h1mr1_^ mon.)~^y(Dی&& 1DHIο@!jԗdݣy)d2,>9&K dj^9>Oُ#†Js>$ KR p̐-z3n)Xfmu27N =^$hlyn%2YBA^/r<'%?,j?:$4{jU±7>uՓT-?Z P; kkae~ jQu*_p5 oڥT dw)-Plή^uW] $]=Ç?ʒ _8'˕VL.0(`1(mWtRn* LR==S$2uL RV`^{ܕx44zy‰nY8 )d`D!z"šj"nd:Dk |B-Y6^ӓL/렊 '^4۰6zR"dQP j}F˃x;A K:Y o:!mWaE-ޡ,Ap '|}S;,5R f02KVF~5~ xT99&nlUxyH}nn(Ѩ]!#cK^  r:@iͬ2zӕ7E.)Йo#k`@a̦4Q$l~tdcji_iK'սƻ =.15Bc_*yA+8{Mշ|~dkSz=4eoE{`4m KyiKWzMԶRTWzP 2&Z\VQYm!|iΥi+d /AhDFVxhW84MEeo2Ac clQh5[jİoE+ 7n}ݠ o*pr L%}E#ܜIq}/.)8`Y< ?@CUvnBo2%%d~~s=:Hj3jkMg\1W9xڇ ܠXV 1Y?}:!d &%?εX,I,0Y赻"W 0Ԁ}L)c1Ҷ%0T%t@ٚ/J[;wDWj ѫC3b 9**>'-8]bg.IWz`Ƥ: F*,4ƻepOiʏ)%^,+*Gɍ]SeZɐ47Eb^ZlSB[wj iYV{&~58 m  񡩛9n3;Fms_ ۋ4Y(U] [ZÖ' 1^.d6yx"9b:W$iB ob8}ۺsP>qx(`Z )Հ{\*Bh*mZzyc/lٓKm7\blyvbp--@d|sTPj%yHQd@װ6 '~:U Sݦмk ٞP\5 EVlْt # ~@p'(>X6QybX .79!e_3L HT߲ P$h5 p,vM:W?|7ex5h"y.*MQ}rB0 g\#𛺑a0g_XT;cD0AӿnH9Kt=vy>% +/E`L\^ɚ˽g$CcZ ݀3MX-3!D T(7Vw ioAnݍQ}06L@ kO.kCĐ,ζ `!M<+ g 8 Bq|^v)ؽь "?w^T[GA)LG_cA[LdlL vl1 lS=SF'Oz^BS.3$i~TA/!K: z&~.dT#pPr5v J"щ*%ja <(DfƯK\ 9nNd n?P=d3%,Ƈk2}" %1pNQK \]5U ,v a4Ӆ@ Z)p&$VI~}[W3'5(?Xyo>'dXiVgOET@[FD8([p3\&&\--:bə=4j m!QkPF "jF! Ou6o/:[ac%Gm[Yws9Eg>]qOxQho4%G'=yve RkO^~hE@v Y=RUhZTZՓeaG }='͉$]Uܻ<@eaCٌ/ZLcJ9jK&֙rllk֑[ou8Bm+g ہjUCb+0~6suHŊV'(?e@*mc {UrTea:J900li P; 3PR7g6z.1'ʒ&0\]@XK'5ߙv7Ai 1|CE.Q+&0gvP>9&+C, =Fz Y`Oa0~t'B~AD,עտK5} (lW4Ć{¸r<1r{)7d(|4Ya1]kpg U!}O>ȧfMQVt78k;-#=íi1Te(=M ~U}ApĎh 1KK# YT/-7y'Um"yRdJ^t $u@iFÏjfD:Oɗ:P"AFR(`.e*>C@42TC>ԿӉmr{VI|]W!E gA%)?aEyc:PGP{q=VȈ .&|Bql>R%fդl6bOe l 9d02":7R>֤ې LE4Bzh]tTZ<{zOy"}g@f[f +*{(! |*CL8iA]{P w֎ĭ曌[p&"1"*Ɂ؄պUC_S҆U342 o'"L9X;0Wg!iDӦS̓b:LpS&88gO0ޒ^x *$Y"E67͘%M  1:DM\ٔr{2}dMSl n.DA?sLT``~LvqCIy:>̡76S` UfO<ƒe/]}'6]0 [SuOϽ*2E1Uʥ?j(vRECMO\-dy^[)g^D5 !p'u9>ā}pʺxV ₸:D_-d==R?f)JZ5q KPs` 1)0#wB!{\wbgI5>;OJ8g?d# eGvyx=I#BDN@&=|6YW[b|B$@2?JNrƖu!Ml$f hxd0c}{W̊$CZD>ϒ/=O}[X{eN#Rh5[iO6m泄3uT_~ qg@)im3}y?@`'{}ReSf=@sw L'LwJ?}w~ӡY^qvbݘo8\a9]sotdXѻEZ^G&?nD\GQ\wdh d[PmDP> stream xڍvT.!RCҍtH# 3 tH4ҍt !%J+]sֽܻk֚ywyװ3)!l*8O( x/@!BvvC(솄" BuJ Mh;b@ @#M8IuUupr%$x``7- `-`QH% A\$<==A0$?A EA`$l=. 3?!;E6@أ2MPWUsm_ _멬XtU4[DU ;7NwQbE |)Z+/{0 ן@Oܽ0yݣ4FBA伛8磣QCQ%0u_ "zY<lu&gG:pk5Q?:FQQanTxu+Jb⤑DIFtewhay- kHRCN9?x;9ڏ(g ~%~ׂ+H{.evb?( :zyLWl]@:csUY ?]r o/pp 4O6Ȳ/V|g97"{mF^}}9!D S:X76ODI3FSY)g)UIL<ߙ$ZWSw8˼oTУ?=~7dp|zv6U_o\Kg쮭9"/!xxZ2%:R 4VME=Smi-Kdc`0C̑R5|JONdr}s/)߀4cFqLMB `roҡ[ T k5!wFNxVfy8ZUIpN5b[%|W54 C:λ O\%Fમ0b}'޹]c;+[?=)yjio[/n!]7n=b;I ,wiYޘvzDajrW19Òi=v>P>D{y;z;SY 9.X=zܢ2 _h) ˸H=a$>N3+a e#QX1w_4XZƹFjD?{tyRvnk#Am#+bcu'^gM(iTUHipT* 7^E@]rSrݵ7CYe*0nK;%d?]yS2G彚'4Y>ء2!QGbɼ .HDi쯡>e8K=)sXW2\-70bԾuWMҲY 1OEȊ̘P b i7,[in2Il3(=vaP@`Rܕ4VUz{Ma_V<[IBx]e#h:@f̞y6VI%ݡپ5\:qB>^ބSh<:Me*/hH&75uGd#v|T(lŋIQbiLQrLڟ<՗Գ:{Qx9yn }_=A'i~sHX=#yUľ / Ԧ7ꫝ~E%9,ܻA Ӊ޿`X#I/e#qF\_:y]X)Q$9I|jX/J}0+?3(9k0 "~'+e2-O~cSS4)ג,Md'V ?,*F->W٢~Qt;*0te W.p֟.\V *h<XDEF\PʏrsTZkq#n)޲fI ǻzм3 4e5߁i mm| .UAzƖ{2r>)D{S5Z8&h"G̉էBd3|lIϞO-Ѽ['R ?5AX&4MZ<5tpʺlD4ʂލoq2V?̐.joXZ5mدN(8eu~)C/p BtvsPpEKbf>fb0DU7g ?e1BDywa˟l_ kĦUM+Ip_D!%\PqVOqT{to]S{sQ^,0x=Vezsw= E CMr :a5d8Ě;luΜpRoN]qKjrגt|R%Cul8cڹ~m8i"dQݧRG2xM٤nfx~_ltw{G}t=9\S8m.V597n?59w rvfN̠,w+]][̫*(G cwiM =2۾L\ʢk]:ɋ  InZx~iG rʔd˵?edPjPNWyL1C65q?RY噵"K!"jLd ,6TیPȲ4:Vd?50>dN CXzZD!{횣a䷧|jپf]q1]јE!ZKxLef(Dc's X-|#e f%-4273fka>i|Κ{¼%k(J8Z[#$:g} AK}UKNSKS^UTUc'q.fH~Řcؚ-rS ^RmI5ޭ 0F)~mLW!=8Uom>r+ZI2'i<̅ܙf&iVZHd^.l┼~6Vk})s.$pz/%y[#KIQ6JTo bb| endstream endobj 1520 0 obj << /Length1 1460 /Length2 6785 /Length3 0 /Length 7775 /Filter /FlateDecode >> stream xڍvTj.%1tt H*)5  1C7tJ "JH7JJ?wZYkώwdz5wt PpeK"*h`aA0XarApO ) pSzʹPH " JB$`,C$Pꃰj QH'CppB#HHvʹ=0(roA]($A ___A Ar=>p;rPW@CGe р Gzvp n&P cǀWkA PnP?G:ʚ^~^@(!@.P[ġ@e9= ]_y<n^_~A7Y iru#<SDxa~E9#vJv!p5ſ,b` 9~7wVB~Pn@{t `=^@v@d=~`4 @'K4PHdjoU(?`P@H @bCBeW iJIݥ$Z ciЌ!X CAi_Q|]\~k-Wo/4P @ ϺjޮUw@w?. *p_ @uQ_ PU0go4R C.!Q @-!5f0$Dy](yB 7h7""٣=JAYrs :[/q (W0oȿ 8L`;{|Z%+6,5αf#8}N&'lX.ˊ,UvC ^dc^EХuZ`zȋmf&C+ G m$*~=sSkzoD5/? Y)7Y޶-2zǷ`j+jx'p.@Q{xS H?ze'C&AޑI< Z Oiw~%3&WռTf6< WM `o9   K)]:Unc=0(xsQ[zM~D9ýC@ -g$bQ_j]r{c R_Uv7pf0N?|T,NBvZ޳U>ʩd9 &Š_e.;ǔKW)uVO0c(<xf`Y#&-OjMHUQNGIkwj2 XcJhiu0>z?v\Zy#Kdֳh.B%p$ݕ}u3CuZFh@/W#-=3)B>M:M'"u0\o.[Fv[9X/ZaՌe m rgND E<'. s0S!CM1o|G }V&b7ܵڜU7=z(hzqTlܡ$jyqrdVw:AŲʰB=epB\a7E$:lͯx \q{qonGh^B4R.c*mDL4xr5J˦^mqB =gQ-^۞B*%͇gǨ`N<ՓɼgǚXqsee2eoDzsv,sP֚,zo|j7OmQc 4h5`C̽=3e=#u޴$WO)7^ZkflJ߮}eBIeGo߸ʔw=~Y5fA.6iee:c? (yF@4mQzDvj`Ƣo$0꬇NPdȩIpRg \Vx<.zN3lf`vԠ-Å)F\zQFe=lׁh!3E$m Zi GL|s? 94|6%%ݚ71E c#+O*I0|ɭ}*~wOy\W̒zʊwhL#GAjGCE~ :~e'D-=FG`2U탳j/foF_u| 4,owK{L{ x$-+w#?5`k“(Fr;T@(=7R"xoQA'X춳:b6exPaFxi(.FFiLߤ/ItL yt/ 3GCGҮ%iC7n&cA `Qxҧ4^x`#]k6bd6=D찔}N 4H `N8۬:Y|gu4w~wFNET^DqCY}ym]3A2#ׂ١Zұg[GXcZp֍v{/~hl?WN+ۂ3C"넃^KC;.F0/.Pπ'!0[#ˋ>JDn )1o DMԗ^<ޗQ;&3EC%47 n@um,sOJw +yIU?]»P3=!ZVy$ボ!仲r+?f"(ޡ<)MI܋j}z[ًIJf!$j*>9Ul/]:h\G$>wKfh|ѕ,YWi;3 UF Yu*Y!vl 0s"(V.KLU ӛ/p|=<\:GR!M*^!y/)Ll%89t\ɨ$aާR\6@C:̮DI4FNJXMEA 'wå'\K'  9`}#P+$ eaSߠKpn4e|Zh`7դ֩NKe#f`^ղ@8"UY.io$Rfh-`Ƭ+e}TC+X lcg- c=R#gA^Qe\%/UM@<(-vǏ}J9?M,N>PiWwYkݖah/ QT c/mXvqHjJ㽻*dZaZd(v]cǫN)eק\Ġ/Q܌{Q[Y+r}mf ZMJX $^=ɳkSntVX-b@E9*]o*BY0| r{G6d-Z8?Ew(Ma?yzߙk ЯND$A׷hGs>? W*:rvZtf}Y1H(.ՊmlRQlfse!Aڊn3 E9_.{ZPySɪAFb } &A3So. s3Ȳkso{~4H isp'r7(PjlSAFA'XQ&ڿ*xL4h۪*"GyN1p06G9xDM9Qۙš, b9{3ql4߲XͦڃCWވSxŽAVЪlEK3 ^q`@m FxQ"lnΣqyC8esf|nwnfOD_:qjy 4uSt9دmZBKv a'pV>zzӽkޣnVݭYl޾ؒr .w{D;90_)4J^;с@Ǝ64G]8.#~2ZkgX76l$ kmIK=yYFQo5JmB߾w <] rYLH]t}t0nE4S3& aHM@+B'v֕ZͰӜ~~27{FoٜBHe@fܒؖS "_:좧0"O̱㋱Z}٨0Ng&nh۩L܎::|d63yBB_l)'B^Mh6!6/G*$qqn8Lp3"f P, "sݠ8fiSQ$kZ`UȭF7O䌹Jk87OݏqbgݺhNն~Bu'\IsGzI]g=^`>-p1)b04ݿPχ>a F8\W=]Xl||a1&-ZDynI ^;`k 9t3>qЙ[EP&TfnĘOUoUvnYqR|ӪhĹ{jIUqܣoվ Z?}{gZ/U}im0*vxf ƏKfyZ.Yo>]"yo]yl(XWzf~) x@:0CmRǎlIGE,Vb[RMv5:--8<8H6ſ5o?&IZj.".Ͱ|K]^SkCbSáMsDwvOd? W> stream xڍTk6,H 0twwwC0tIJt4HH HI -H}9y5k=skǽ7.99"Yua `20.PL ^?brG3u(p p  P_P@ lP@! LY/ _G- [XX;@ZCpG㍶.]-bp7' :  d].@0NL#/Xj xt؁`ǻjM7/c OC8[B]ݬ!`h*q}koCk裿5Oimc}Wa =8=.+;Y+}/ן:C`<ݸ!`wO1y w֑wp=_7%o1@7P aa@T 6 0a_a`)x?'GnA!.63\.%#5=?9x<@7W x(Z࿳Wbcg{1XKX7m?4Q/|<]\h?ZkWGz}ZWup8Dd:Ep  V:?>|=._).~5 f8Gv ? pqBGcy{( <\+j<^=<o@yO1.+x#\pG?|71\~ _5{|C7 s3V4ܩ1^ܛc{B|a5 "ZK]N:thWy %;fR;nn-u;0>MH7 RbPpIܹ8##t0{ h\y(4 V-G~ީPź׏3 )e(ɝ#EsP^ϟ|VIf <-7“p=ZCFOfBJt?>/B2_Q2.VJ=cs' io_|ϽUg""Jml%juXxAeV;;eP, O7=iRE{\5-/Q(*ƍ=-ɝCNg/ٱqCUreC ßA+4># S0C8IK*$O$JNe,qx'$oP֠"Kp;Xwmתu: IY! 4_#0uI޶ĵB;:-"3F;Z$I3~g<2W:Z?).=ka@J3KnkܯQl^W1]rc'{\IiS1)łHtyν:V'Bv|?Th?lӘNFHr _蹾-sQ:)7 7Qm>eZ"Yr)(g9Tc}."Uk&.W7]f= ܣo>})~SU,i=LFYǐ<\UC6jMtgCRix-r<lAΕT9 bc#{VM.VL8(KA@B7B7WDLC e:3Zco3_*\գ1m$mCSJX^ ͔8Y? q >0BþvI+pg`J)(/ʤL=e7ʑy mO3b8V{ZZg.y&Yے"jhWde{:#UOƒOu^9tKlܬf/K}_h wU<$.AJUՍ c~3"]1(H#|.6PLpא-)ryS Ӱ*4O'O{S%~\"2nfظ}_d;">A3G}F`ozrtp‰xKZCcITc3}ƯazϪ@ĆI `)A2}zkKk JqlRBA vEYR!6O{OKaD$KL2i]zB}^  ʴZ.ey{_=wP W|p,,B$_ I7G"$Ľ_Swl7]qطlXBh{Ηh> m5 ש*ԯ~Yy; B]^- Y(V89M*Uvr{Q2fH2,//z7 /@GwpE\1JJcz1Li"*\M=~t.&5I%W[a+=cC~&0ǘX*|i!ԉEPדÜʟm0A˧oeK^4lMΙh /} uaʍ4|yH܉S"rUQeWwf$ެպzO+zusъ$TuʒCM#e<}i'Ƣ3Pw 7Nфom57ڵ}dCRDJV>!}1-[ Q Q2W09l=Czu{< eiSq#YD) hmpUh;#ٕUtJQxזFPe11} f*Aqtl"|0l oYOӚ0ZPf@eX phRtg&׭ؒh׵❅eaq^BI遙5t*eBAǴq'5>G:P@XPNR`ʇK & :4! .C8Ny>jγ?n.(;U"/>aB\v9ƃ#bϿZ,8ԝb&V|mr rYNnBOR =0\ S`:qB/ij$ە<=j烙xEStv4̐$ L\*5qYKgB،~z>ɬvESL v x7 Og1Kҵv}>z"q9@nΑ.9BzFR88ڈ T>IwXml&YIFH7*33A2򇷎p,I 0_uτhG{xu`ɣ;%|86TuS(ɼ7N:շ0YRwDZO"83voZ4)Ƶ}Ҭef$J\:wuN qk=m.pxE<|7N,zQ@SH5kj)ܧu׆s b*R͠v^ܩ_ KiN*?מ{J3:)r$[z| zGIԮ/}*Y2u1XҔz 8DRt&۸$*#KRPXE)0iIO0cH&#B6K!1C_dխpD]bƓJȰq(bNPm\L :r$T=OuV*||ٯ~s#PhmB-|g Uu/y]eH͒=8BswOoWg%ɷ_yE'6=>lGf.i{`t:GQFX겅"ԗEJ/P˕" rP0F$E'PT(IOݹ}LYZu?xB Zj*,8U^/kMF X %$3f;Τ6gi.I/dNt]&.GTa.-Y<b6C2YZ `wK7{"r/G$8weO٧DEZo*U( j[2̝,b/~ߓ7ơmj,p E٢6 |'N3=:[P֊ZMy,nNEk/md꾖ZL'zm.`$76p6"! Q.na;z !bpbDC#Tk7jGRjoӱ̪f$":|*Pr>Su䰺}*c2Mi9G@兎:LÎSZw5G V?48MIqfE-?LZ(E_}wB`jqN`Y VҰO%8yP}+ҜݵxǪ?HZj5]No%U8?wu;VF1/rYV ~Q*/coVaݬGWG e!9M,Cvjz]g3W+",a)1S]s'Evdem;/Tڕ2"(" Wk97%O4DӽW$ ;c{}'*[33Ϝ~6̠XWP6^TgՁ1mЌؐm,[g"eL ѹ AZNLWqIAۻtl /߈B[#mg*?PXgsAw*oVrOsQ ->V )~[4 Vz>~W#;DRH4PwCh9U'A%Ы,11&doClw]9$5U&($Im x`l." ˒5m<2aˊOVVd'ǃ viY/( YipgpjѠ+r rTVrADey; n+uSG)|b$#VG(XzOȳIZ"8ij$9jգVAci4d3G>&h PmfI]7/e<سt5&3y"0BHŊGHx^K +vPJnqL[ePW&xrRc]a'W{(U7U,A$ {9@yd30BGDD[.39n4ۣ-+Y͖% xXך\w;1<}?r)^lL=*9B{ʘQ3ӛ2Xӈ'sKEpb?/ȐZyqrN"֑~@DYiP ˁʫm% 'g|H{US@L\ ܖa MkqVtƙOkɞ1m策ݽkەPr"Q]r*`]KZlltF9 Q.+Q'OFjm)lcI7kQtzUI9˿xEV/IJ ͆MLCx)&y&zdrQ}Ic-J JLi!.de|]bfs7‘+ʪհ02GO(O@DT ܑ\iNQn1ń }DwdOTPCl<3 +9JV (Po&׹//c~LsJQ)`ނ!Z*-3QlPviJ"4'5XqR3SlۍPaȧ gK+gz/)FA_x#y_)= ^aV I|\s$uG ~ HnmOI5=ɗٺasAep\ɹyz۬sgy%>PBw"W/Ua$D=RڏṂBuW-gyK| <ϩur Zbc˯3Wy\%%[1O endstream endobj 1524 0 obj << /Length1 2385 /Length2 19114 /Length3 0 /Length 20509 /Filter /FlateDecode >> stream xڌP[ Hpwgl 3gfr{*x֧{uU* ٛ%A. L<QyU9f&+ <9-?rxr =N@cLl(oȸY<̜KFFwwwc;g{' j:%@ tr*`lwi 5K+.N@X`ke 9]\Af@'8;@UZm,0307ܿ d1 d0%\<\ mnV&`Q7H+>gS'+gg+ۿjd+ 3Q{;; /~bVN@Sp=}6 {w2\AV@iۀEd@;'7zZ2@/%_bp sp@_+s  <33`w2Ǐffc#fTUQצwU{9X,LffV'([?|An/5c)؃'3zLL__.(IKOuuo=x@Tͬ\V Ds3q-r)YZ=4Z7[+P @t3_" ^M+27kX9NNƞ#v73x)̀e# 0w\9FF?(q n'Qb0JA,F?(e 0?Es\ 0".0?EsQ\T 0?Es\4t  zMMyk[~!_}sW{f͏\ً|@?f`dcɃ6:ӱ+˞lG+QeFhrw6Pr<:2M8RZxz]i"cz VR)f:M֑@A7`|[wUMkp oĕYOԷذG9:Tܔ-EYNxy{)&;wQB<և. P>Cͽ8:AU̔SJS߭R01C!3/diU 7*<m՟. ޺l#` ҋCX!?FIߘSKv8g4Cl)PMMFjk 9m+tOfQ8ư撾j0+kj2W.n}40ׂD<^o/fU}QzNY ExM1,Un*XLԃˣUIYR{TX-A}͟1,.VBW ~wRPt }kEi UytGx3X0L^k- Sߌgyf3m0QW 7xQ ƎU,pv,O< B=wr7/8+b+~-~T%ja^[9\(jڞ||8+"NppU'}ފ6iV-{l6y ]"L 8>W_,a&XYukqJQx:IwCLTP[!p)(L{̾K:,"c/!7Cm_+Z|ϯ <폯"發%xM1[3S[>3vA'?}QڶLlԴﱀ" Q.>< PNhI➰a={Ui &=ϵeV8uP:“F*S<ɻglYFYg^J6# +|oP~ؐe$բI_? 5۟3#/TS?&͟zi]M_yAϗNNH::FiUJʎh oFE>CX ~5-r!hk;NU@_o!X/—*DV)Fw,Pp]t ƠMՈju  ZDWVYgPd&_O_qH&ŏԯ˙)0>j bqv݉p+Ic}bexzᬎYQ-1id}IikN(@Cvyab1f.^S+v/گO܈UӳMMdnbا'w9'֭5 b%/)c~5“1A "֜++,?7|z@轁$ݕ/,l,y;|OyfHB[=efif\^yPiWq ̋xNB3:MMWqX;-R ޱ> El׌ɤp-v^΄l_0NCk>d =̽[_2ij~2ާ6! a{ js41_ dXsutKIQ}L/ UMV%.s;_0~B5F}ε,aX,?0%IzԢw)4oǸn%L5WBdS\P{mm] a-`kŠF̪SH7=}YbpnHEG*Be6>v .c;cr/ K8bWNYwdIh=ʘ-1Z |uwM}*qTr!lHrqWeD Ll`˃P,a씚xӯ?)oĵ!"kĵ_&"?m2m5UyFp@#AC=k/ErP3:$WVUrfz/YTrTM7 4qH|ܨU/EYȑPm_āF 4$ySzsȑ޼F͍ӿ^dcy㗶\9S>9QnGLޤ? !J48M6Hff3r,+# fJ%Js~B,eP4C8hƛL,`@,h!+s<SPɭ] vq+zZ3c^Wz,l^ \uᥗ+p^2\~L}P?>V8JJngTUYq1,Ӹ#/϶G&]9uMfrg/YOWsh~mJBOD_EW-[dTu`aiD@E 5<ܳW^=poNil>Xu0Rm?L~PjKabzh_TaVܶe"1k'Ď-mS/Jxz,Ƃnٮs$kKJ*taWbVǰJ8VsgT6+aU|@$TGydx2wGtz@M[.A ̼:).ւ&rF@E _88][Hg;%5>*OV{ԌޱE9<)gH;ȄQo]z@vlOsԃ|bOߞX^c;D+~/)0/:o]ߠ|g c5љwڕNQ'RQhkB,,W2H@%eUK :tND[I vImqoeLos+k-[f]$ m{]c-grK{xx|c5K&ga\_m:Q[E(tNOķ|D #6rj˅`MV"R-"ꄱ燘24Fk8K)芓 ^vF^<jڡ_,r v@*Bchh m|@urǧG)ݎ;y<JltJ3`ι#yzb(B?57 Srlqrܙ'u{qvcq]e]ң|a4&1^9_1D=tBxȮ`\ 2K$׿ geB)MkW S=%ItdQ5d8 4G^>ի:{Dx6BM'd㲒U93IzquIq1~ɗƌGc3m"B 6wO}švLhWmh6,0:sFōTV;N/sHEw]N\Q-8JpS3xC+TH5feצ^w/JO+p !9؈HPѭ[* Ji+ r'Mqk  LC>4Oy&8'e]LL:|RC-^܊6DgmXS`DӧxdGGRq )Ǡ3fVȝ:V@[.Nlz)'Eg[ucO$ⴄS7'b}3jHirU̽h&Mx@xƊuiLD 6W}b.[]ǔ U nN&{<:ʹߐEՒmd uI"V6|r-9N9ZS~r(ճc"{Us-ce"B^t4gF^!hXZaNͣi_d//] ~m/8Xk!5-\7,iU ^7=/xe|%V'TN"m=4~~Mגu0]T< S';f6&I%=Z Y]udls$wT+˯莇 Q-.[`dLoɱjkyV~l*\9U7zضg^}Ώj#1=E*@H OJbZ9͒t !Oa N^Yޡp *g{Ejefƪ=Nv0bd;~4/ſpg;Kg<,7!W_4  2,5倣(ݾ6J^Ȁtigؘ2\fo1e~r+2k-y6G4U5Cpߦ_o PXD+wvճ!֋vsΡWJ;Iߗ)n`|_rKU)wHJ%a]S.|h&hH2|OۄxK;VȐwqGY(wu\9ҰE +%V]c㏤=/85l _>K9+(վ->vz@԰OZy#Z6R.U>!UlnWB/ }$Y8)~ߋ6qk 405ʩ =+~>pQ*sY.6ޣxFk|%E?K1Үwsq1g=N{B4|ye.ðuin,07Z$dDRp[?ty@0&^״njʋNWT;wR\`ԉN:E `=dZӲv_,ա&c46 %ʢ&}SH7GxK#Ktr7n9TW_^xc~oF&3MdM5.[(q$_tnM.&0a`s9|N$h4qHF vl&)Vl8t~asf϶aѾL,1O;|Yi\p# u9k`E<:>U9SPʳЎ`*9t$LfCJEIŏ*Qul~#8"UF=ϒ$I{.]B2p|6X88}w(X 蜖gS8$kjur8^P$9Cp6tq?ܬ&FiMv@Y*vf3D/ |H_ƌYk|jll9dXz)TŸvr5F[ej1Nm̂MdlC,Ж e1g;ց/oyˬ6T݀{6+7F(3P\l|3>TAD5@+?.mf~5ԳY6ғ#AЇf-C^ Q @ }zDz#'YShcUn'f~Ru`;q@B>!= ;tšѶMR2KlWf\35uͶ:W ZI (\T6P065 oɤJaL\0aۗ RͼFF-[WtװҕGm5 53(hF^#%nу l=xq䔍S> @}Rk{#y],#x䎦!_SLmEO:GOɊ}bpUKHT_֏\Ɠ0)*`B?**Qo=mHg9Ѹ(%0vᚑ A: OT$ BLrt}$IA[bOaIPnaq8?Ƈ+c^ws>%!WrPEjJ.Zd;\NлT%w AwGxZoK~AE̞M宪6秃E^F?C.JlkFtfz)#C'rKn %#|`CGz]~3"lj2I !ߛիE[ΥǬT&Vd[w-ғŠE9 ;(3]]'Pgu o7fJ➿ ǩUΜǬ>M(Flg(1[ͥ kCW2~RdW +\TWO(xڿ_ۡ˅GuոS@us,)aGr_ KPLŎ#q}*^ijkN X3q$5kѠйXcl eZ &R~z4!w2[N aFj:7k/pFF@ܗ-l":Iw&& MkwmPm&p%rO!ECAcv<"@ 2W(i _ccOZX/!־SYXrVGtW;3 H[7̪#"!VJ+΋=:ᡘױjV[*|5W_Y{:fޢ %Sp~w] q{b@?bl$c[`91T_NLJ}S?GJw6Dt=/6\>BA_ =kٚo(`>E0ɭ̭nXC#iOVG~. /~kUMn;>D1~,Mmh{p+ːu_? JGPGDu`s"~7fvFy}2hިT!jHk>n/3yn_eEV4oyz([7b/Q0 ?ǥfފ;*ǪIEҗ]ӣQVT@ c8 :7FE" &3hg+X_)BȄly[\M~itTfd5C=mۨgׂs[x4KS##^݈J(UZl4KDȌVLCOKA7͟T!6*>E#/|Y'K̳wq5W6fX^6*qQ˭zi`X#4_MR ?-߳+5-gz<PyHr$dJ:YeN|GcMѿ&*MJӶw5rgip۝o9O;vG1Q`)~$Ze!<ؾj:ZO%:Vbn.'$'.n=bs)VZzB8dM_šaؼSw:F^K FOBqR&f/ ]kgr.jyi/{*PD'T78eUUk> B=V@~ аg[T^g맍ִԣAY'h~EGe-1%uWYY#n-G΃:gBL8tҲps>,q)%]!t-pd2%]qe#g q3JR4Jϭel2S,{d؁.ŹkD ْݑ+>jvy`{J9%{D For8 f/$Q$]'6G+tGng9cW6pMW w0*.W+S%'qxYqc鼣 9A![2:sbyȅ_`jU1iD8JbQ*o+"9;FP'L-j r٦sֵ쫳菖-y9D8MH>( 94o2%m"6Zͽj8T]~iXď?Oph~ /Mq11rh:3?W+}P QeMC`DxRj|W_x#a h =9%{̮Ir նj,Kw΂Yg&F"grHV?8zނz8BQLąSުK> 7 B4'duX~viiRK,t - hHz:VXwB?/*Qƹu;Tm /DK @')T|kzm)3'Vͼe(Ƀc"ꃘP-m2CTg6H$%.bUFJZ=pYvNjƨ|C[Cʤ?Z߉еw#4y |'-rՋM~yYH/QP<8DQKe5"]B"5{/oiضD3R^ f1q᠏)(7-9aFq}o=τQ\mO"rlf<~ͤ? a3M~1r`_It<<5Z>}C޾(9|WV׬RVcm(=_J)uga$`R9K"VxPO( k":*t zVQD΍U4ZH e,N^(*ۅDB%_Zh1 BHVOlZ9'k!fꉄ6"pڕEqtH4]T{abb(0#4 yn9$JDD֯}o9T5)dخEn(cx:h%lua[Rڏf;27)xEF9B`J**Kt+~u vRσ``zr%6]≃@ovFFkVڛc=ͳ.8wJn=ZyS >|I7 -H)BK$ırLxl.F0zf(jLQ3xLU T,]Co1:N{o~qwٝ4y"}Y9(O͍N?@0f}=bDTkhvʎ|8 ͤZ?6v1%piuӀ)vAo`rk}գa<]cH1yk.R5&dmF=liK0<[%qH̞_N1zN4\JKg<|-"vt& N(ZuS"{`3k/J.)ua Բ|'46?kDE(K)ݽa9B.u2xim}^"^ޟZ%ڳ1ƻ_)޷ 6'1҅F+4{pnl!˗erv0ºy>#35hx$>xB< l\Q$N^.!Lu0|?-+kVK ϱUP6Gk-qȴLd-g^Hɛh^= ^ķ,mZͥZZH5W/.%J- ir^Nz`4y#Ĭ2/a']w/cGY!‹j^3|*ۋ&3cMA(7F]rOv)R2z"C-a&󅈕K`U;ܽ)2K﴿ݐ1|R+%If/@r f/sz@@x`$m즆4r^b?WysKbWŚ3Pv`e#+ Ïk{-=QpX eɎ*}I=.aʊk ^UlusɥCAd`_w_^Wr /J5}Z^7(X2t*8Txƹ L16s>* eMw+ZM|t;<U*:ha]В <uNŽYJ4h:|M6-~Eqr_N;Fo E;)"=Yad:`4fVMYGz!)w-e:۠mLuht8$6yh*W¡<ǡW~L >v |wZ4RjT*ӑsU+Prbf,I憷0HȰl|ֿ81Mհ%P@Uٶ֧G%==VIpN(gڃf8E4iNE哱DZeH+ $$v^Z(|X_:HQg=[z8) +N"!R* +vb5"K<*:2ba%#;zj-Pl6ڽP)`Q[x7ivW枤09uW koLre&> 7 鬋`ϧ>uk%o]1`s'Z+LPN%w:DG @Ia:kI>~&ZǎrfW}(1M kn(ݽԐGKD!qNiM<I^'&S] fXUdwt87X ZEng8E8ri SM Tnz6^-nʂ-4~"I6A.fWjxSOqĚݥ FßXly|-A3eJ6ea+װLIE3C<3|!Lܠ,;⺬Bр1]iv"YnmU%5=7{Ln%<$!$PV<9ho<ubLDJ"$O2jҴ,\C}e/}B~Q]УaH֥{d68+o_oX)XfQJIȆC(9ˠ*7Zy\Km0TA F4DoGmbEWk_ȴ 'zSC7$H|}d ~jh]룏Enp]U#8_A ۥN TI_?hV=d.QJR[i_Fd k{+ :$GQYZkä= 7:*q.ARl7'w\1z֑n&¿M.eW`w4Qnuxrd^DaOt_4*r3 |ϧC*}*2Lzj.~jț@{gK3+>=~-Y[='P$W|Ǒ*~"ѿ<\r,%7W-N.k`6o\M)Z58e^,"]RZalCHu:PO^_" }`;\3>D(' d;VfΩy|Mr] ߔ*V'͙Cy%]QᮼԥR6hє; z`;]Ξg%7,Mu w0!ko!R'? C5Į>|%/Ҷb!'x8S`(UGOht!=x>FR 0rtMUWC,6rt+ 9KWa}uڵkHGYxD0l.{Ujy'IR}|+)ZYҀi8šs صZ~ $;L<#0l/?/ 7"hmI!_TXE3Gܾeta(.ILmwKl2 |!ܩ+;b&eBl`YuËw 2{7_e[?=prp򙰘i<{d~Ajow^H]lev)LKB';0nq)\ u `;8 x [6\x}n \XRNAEkFU8+1F}{࠰%:&TJ"TLY'88˶ \Ny[KJXyokl)ݓ0A" /)i# ]HvZav#W{ Gh[Iquʨ { !ǪaH!"n.j Qo(L;n%m?Xk6hVk &3ad~R̘ bC0j6Y47z[W6<wT {MF-BGŕ9TMYĿZl?-L*KE*d;P/wmB;gi0;_U7:.g= endstream endobj 1526 0 obj << /Length1 2089 /Length2 13347 /Length3 0 /Length 14601 /Filter /FlateDecode >> stream xڍeT۲q qq -hи{p $8 ݃]Zd{,ί *)$sfbefʫʩXXؙYXؐ,m@-HT G'K> #51#WWy@`cca#ؑ fji gȀ@NHT`{GKs ם#քw8@hibd7rپhbdPX=+; gg{> ͍։h.Hpt@ S_ F1#Q,,1͜݌AKk)?@UZhYFoD`#9Pcvvwfٙhd~7r512~ux#2U:8Z;;1;YW׃3ڂ윝Odz7Yڙ%ng5s3 w _y؃6l0{4Ar2r]@>^XY&c  -,M `O}f kh+3+_`bcgprx>H?*mgSAOͮi s)_z,,&XWwM.66{adkivq~yPoWM?S,2tVigױ3mm&^f-$,AJ&?H d׫lfb:qzοMQ]L'嵩89^i r@f;kU ףZ@ K,ob%(^sלr5o~//@ל+&_ 4_5WQfkk f?? ? :@? za~-t_ k /&ppvU*|ue# Gbg_U@?uW?Uoᯙkm*ALP0"!IyA% /}/E)_e>b,Va2 w42: G7Xm3="~?C%kO KG:-d߷Cv2~D{yf^:R[%ҝT$&1s3lJTAmu JONKZV/&H B;w04&soL"ѵRy GXKX1cV)pi!?KTAT }eƃߙB8P&pK'm bLh1ܻ~ mP`'m7RDF iDsL#n|XHȟsUmdsG:vaJ͇7Joic8m]c8ei@2IP3>*O~9ʴ 4n2aP&5Os,vΓVrs{B&׵~۩_94=B%{tthE>ye~Q⶷̋+sFg$L@B'όUaj ~Olº"N=\_SZ\w' =ZX$pU "XQ:$fˏ'; Vť/ mͭDYB e]ENi;"dOf9kfÏF3֊Mcr >I?2Ք?ЧL狶SaW=QԹ?ܱV11PGoܲ{_>b'Bz^1a%ITd%O_hd;' )hgŁf^$dq6mV9H9Yi)Cn_=D+yquO:͗q.jM!9(3)KEl_!0/Ǻ*#:dx*"X 8)h}ʃSK#iʎ$OZֱg̫8'@ީXrwi/un'o]G`@MzÛOz_H|[tD6&W~qLm[ -T^?tnE^>3/n:3-neʘ]Zhn򫎱}oУo7Myq Ўgk<͛DnԂ{:r'WoNJ]CK'R!flUI/\ld;a#q+$[?۠o[h R#msxF8/Q h ;R%. 80d%PKʕҍKUخ˻9Hs"u1XCxV7Jvo 6'电L䝑S?A śqs#iCoޞGN pD$Mr ۥz%5og9W$I[ԙVoہ): G26jXWX&͑(=AF!+ q|e8GKD [VEgp}]- HJ"0t$eOA]H 5F7B#NVA [JO)/R.ExH6y1ǹ+IʕQ>^ۍ3dh~ǴlZԍ% I`=f<иa`Y<|#ߛ(4qԱf 7J{vőF32iXTǷG4I:"ecqFiPvo,FM!кA9heu/d_đcD]YY$[Tq*@XJQr<'QP һۤxUq/a[]jB>QKo.mI~:bX49EφIxp按tDgXzJ ܲnpK%~ ;=w}8Ojz8,(T1:rar& UF@}sfՃ!E/=nQәxϭ6h1-$q~ U vS)><C5PW\lr T29iYRaȓ9d{4fԳR5_s1|~&kBR/oØ~B?`Ym=h[oD I>iH̙|IF լ3^wvaj,JMW4,o b,[0G/ .n],rgOsEjjN`g'Y~FƵܴ4*7smr|YΤf~6Q얶Fǁ􈯫b>sQ-!g:=4'?Ŕˬyh_zDyQ ur'ܟ6ϣ{!, ctFg9ڏu*v .OoD#] 7IѮ̮WY&k?mĦ4lV>:;s^.B8qiV;= f !v7?yk:\)1bP8ey`VϐviE`@ 99V#QqY Ɍv{n+!5zW~š8]M7(jc~)2|]ƬQd% 'g)⮞nƯథly&S\Q/ ai|~yS*]^&A3b)՟W;0JӺ,9FO h5$,9% ,!TI+hOmy!H98/5W.c/Pt {ᢀMkrl;/*|YHx0 P.i9x"5gُ}zރu\FFOn| w`+6Mil*uA =s71ItDfdy76jɢdn??qj^FPBI:a`SN77X:s(7~P*zSp> p(7`#DKR8C>q~X_֭ Bxa;+{VIK בyw𸦴r峉aOestl1p@2 }L!B)](}|%S樫;!f8:dfW޹h"4hh6V!] @eʯ8*ҨuN$)a. 1|*p VSddAٍUcZ'1z]K( L+t8.&_<(ZHB[C jm<27ېeM;O)j[k6Y 3Nnf̲=( -9&J rJV*BPFnf^T}/Owp,4JrPbxJ"˜9DR )fiiɶdGg,Q!qsLf RyrڙN^yL'\t}Hub.\dk+#;ܟI,|8 1F! ]] -IIձ1.u%}NλCB'GӅTζjXIBo.hSG彾1ۃPٰiZKWB6b\XVYLPe=Cv%\6,>*LȐl$sOptsXf5K # ;:JÙQ~M|")Yh¢"SNڝ 9f{)ش~ qOq]^!Ct|Zv\Y9-7$`܈ ksA.BΖd`}}]Ӣ\:u}ctm$l(GEN8u|4C8ίwDf`7׋j o/ hIQpߴ/I>hq#%)7%XD{J!b[%-o:e!:\Y4+yT7gng9Z-3s/e!^ THs.KI{}z F5"$u9toaE"ihat*oUYWNk;#}9:<,%ى9] fGN d(O\yE 'sAmZZEyN$wyW^vͲݮ2;lD1PV.6zE}Ol}L w LV3E-c/ r5PG<edQ!˽=npLBR|7@@VAԪ!{̱>/)_F_D^ Dgwe'eM~[tհ09}Twt7LrYWCa=!뚋A׬powyj+a{9TqʌomHy 8QeA=KU\=_)UhPOT~faN/b<2\͠:0Ь 9"^[ 8KÅ}z,rf@Mt;`7({C$wS3F\m<3ػ7 d91otK_Xg Ai+۝Xc+,hMJ|~gI]]ЧGg}u|'k:[g+{?6@&iӑ!>&nQkJMaQLF1jBpH40-v/r q^6 /6gU!-/!bǔBċb ?MODg#]GBGOG4QZq XS*`S[v.ㄗJi ®⥧E߽ĒJ ,-&%Y">l`'n\́Gsz&B{ &w_GFBȼTjb#~9}y#{OzŁk4kj$F*igD7GGH"8YL#`3/[gXW}DROP J@Q `8;4QC6Ä@tus>EoiR 4Ը6sgh_B})F\i/Yg2jaOfY&D a6 7abm8 Ww>AQ%"4t&\syy{2ރy8ޗAViE\ي5O".Gw7'tN:7g"cnc ވ;kBǚV)>贱*.b"q].# . [*Ѻ7*KS [ ꕓwl,/Hj6Lj[IZL9Fnu[ O+yb QQ\%2<\+xzEE}Z:zs|&Yl0 tq5[- |(nyjC{0kG*fY؟3NwV*TsYB~BvAsSE5~Gi@L:@E#(80;aXFP|->gii]n=r| fcxyX-e˘RRO^ElPS^ ( .41jR߶ OVj8,P_+m^#|jȩnx$+nG'Z)hכDV4+4#dL oiE.#{H0ȲxfGθV,zk9K}5.˷Yv+WD`O"Ħ ҶJH[L<p"k4\X3V66OFh}Z7CwkJt1#JCw≯qB> stream xڍwT[6R"C7 tw03 ] ҩH(%] " %!)~csZ߷fg}]{_^aa㑵@0$?/H /$¢E@B<P8L?0eS#Q@ 8 Pt~ ~Q =$T0EupD rܿYW 4HG+-ЃB!H`rD"$y^47 E: bBƋ;Bzp{7 .P[ A<Tu@OEr~?ODPد`- { RRE 0'삀^` :P ̇!~Am"N !x?Sz@lQpapo_+{(vn|0'DEeA H $@#n_Nf np75$jA#^ OǿWx @0k{@}3~7 0࿎OIDX;>??# Qaq i?mG Mu;&E\A [ԃ_!?;Rtqg `WH4()j\ *H0J 07P@촡H[|m74( G@-?_>lQE_.J=.P\Qz1 #Q!j@L@@?]_Um==PN/fZkKojn+TrV)Kͳ{~5IO0s͌rveړ%#4;gC>Y!s)ʹH4Ş%=hjDZ"k3L3$NרּUSM(:e1wb5bscE|1Xx n 90cjkX/b9YXŚFi}xp2 ZHTE-͵8o1!G0g<-Nx}:lI Ec&sXsA$qV]66Ϊ3okb.YnCZSh9iMX{#+= O"pRMG4sAIz [&^-pz^&3c\сi'%m=oD+Ek{UZ\]K-b4'0Xz#ᬉS:Qqˋ Png "eS?)<%C2M@GH-]D)מjZF!&gNHݑkN4dRyd2M扅}Yk 1tmb#Mp Gգ9L Ӹ^䉁ØifԇGz%`l恼GL{?u~dٷZ* C}Ce0#O\鶲LGnKRMz~9ei#涡hϟ|sa>9ݡզFǖִ` r6el:&cВeS @%ӱiGHC b/VD~"J]VM$Q& XsWc ?J#OYj1ۯM:'u+Ew"&LBs 0ݰ>$+jDk֡))O*ɮZb19+CoDXF̽GsV߰  }Gjd"L^WW/.Zi!M9΅Md[֮@&sb}ApP9ۊM,IΕSsKJ;w!\#-)%tipFT'݃@f & %^n›W.rv>K]7$e%: :fSnTQ}i֎L˱kz]#7{A" l81`ڗޏ >&~ʄۡei*PZqՠ*Ey F(A>+ufj\i{[ ,ьk;GS'AG)] 'ҶW2Ԫ'(l- {wf4 ǁ$1_N a*`XwMa4!d8dGZ 'mu&G% 9Np6~jR\剏˜Jh^Sp&S*>_#%ӼタJM[@(L3Mhcă;?#&$O3yj!XPoᡘC[Fi7 ~bʩ>ogNwvqi'N/45)PpeXQ~Gbwؔ1g?ZGQ'K~.YNab>#|Xͤ᲎o79WbqנGVv$uW?sqY|uRȑOq!k܈x~?gd!U#y)QzU679/^(K88-sAYav¾^5`QnW-eAh?G%.]S _⁋9sn' ?=s(o@␡GeicK48H!eg3n.is5A2{ֱ]S_6S צ\E̫Xg#|_s-21g Qf^&O>O6B2׵ȺXp<Qj$]ښY$k'?tWtymшP4==v|8Zgq1~y.5m/pUxl: YEd 䪆1kr0F mUϢJٻ>ŕ80AC͝a,*}lU0SX&\Tss#-={,^cR22y;} 7toQ%ـ]ڶ0TŜ Ux1)vCF MǘN2H'ȻdșK2NNSMI-gq "8hwTge OZ 7!yBC&̸,lǗwW"mJ7uY*_2 V#H%#- u~1_rb*s roF@cU\? *07NҶC,f[ŕ !+E]Ŧ@mXFuvOG>b۫\[-a#ݶG.gx;Ǜ7SKU)q|\K:͏/c:Q$HI{w?dzjltoc~=pt>p)UD,~Qg4&H'xPnk1~D!t:j8tśΪJ;tAcP ƴ=}<6O ܌~w%d1w{oƮMf̤FyUX+Zyn|2ηı4δA%ޑ1!Q_DH^K$]ْ]> ZWW͎ ż^ ,!c(<` 5 GnEΌ:S7CS™R%<ܵK.{˲0 zx޻ "i"h{fޣ-hT I>oȝ9jSōdcX~Uk?of-v£1~90?Y.y$Q̟Btz~1ó?Ljڬ;Yݸ2 y@6g`6Bo `geblK շjvL[̤8rܼe OV3꺣bs5Jwdvc2B7*6ψ Hj{);zByt^_^NA9H~CȳQXe.KΕ!ogaAf+^*h(>; X2 i?9RϺc;`v0A|{{P ޣב}@,T_RZ Z[frr*RG {5; &_&;?.`O^j㠻Y3|0V]Md[S>]k$iQ4/.[Ե[rkbWe=%-YfP0`?ꏚ̜ީc~YDH]5 TYȑʪ3Bo#NQyH]^i[[\dٔ>q]P>>UtD0%FM4K' a`t|I3_w^x:|,=s^޵E]ӎɵ V3'hgG6LtvbigoUn *ޤ;ȾFzG=h"Ic2QؖȜ 56N[LŎ:Go karj.t"MޜcqTZ7u|b2KЗ;mC^I|>HUxҌ}Q%󈔗Ӿʨ-zc%\+KKa52&ɷN#̟E<UB}1T*/5 >6#pvw5Lso}Pp;W5T?ox|8 _#`#,C'GlGa]%зa^ͅ:L#&fRcR[ cGL\u+'aNzoEk#z-n;X HDm@Kc3(R"ҍγqKXW$E˯ˈq̂>vqrTX5zSFZ}ՙ endstream endobj 1530 0 obj << /Length1 1557 /Length2 7036 /Length3 0 /Length 8087 /Filter /FlateDecode >> stream xڍxT[.M@7.7i  *IE@:RTMK/"w{WJ33{<N6cA%=T@ ]cK "D&047NiDPLuĥA@ @a]!Eq `O(a(qB8@=cM; p !+  ? C:Bh_pEQH? 1[ԕ `LՇx(! F_a0ǬpPAAhѯ<̹ \WppU)ThPJ\\ zg_ LܡaL AHw# h @4("0`u!֘{|V@@l0 s@"~XDH>_%ǨHā$;>& ]9e4׀KQ.Эb@ -.7H mC?`7/F^h"1o9B`^nmD1Ӡp(ZtWxC|04jি C@ (د 3dW-H UC@MDLazY@t3@XDc\HO_=P/L08({`L Q0 C!#9a_! ?8 TT"Q1L7 O2;F5H̍/˿1-^P_(hn pyqQ#=jWlekiAƄQӁ|_/F|_.g+@c)v dpxFbL ϊ;|*RGt.}-ߵȒc=diMHiei:zxOo*1{hiM@cѣ"Z(*zj-Az<ؙJEF2;}[2E/SETBo?|ՀY>b[5&LBך,PCl(kV^ЋGoZ;,+?o'x.jeABN H&C.9񙲸}|J6@Ie5|G@Y?ʂ5 qc'f"4٢3go;ES8^{mǛ4lTgKC澢{(Y ŌVMKHIrR*ׯ= kː >\;V5M"_em灰vA}ezZɰMeˉvT 'n4X(5܇ǦwO={y )no'wƆヲ3*! AxUsXMX㤕гc7bչPw&}ʪJ2H)ѵ.<`USIJXS4Bٱh=O[c5RଗiIXkr[.@t񣰅?%dwׇ;6am1wWʎZ),Y\ىݪi@ ~EIrqvil~Tݖ4s+}- Ϊ:XE=f4?Nra(-Y!`vB;6 |1_klTEEhW꿝HdӼb S#vIswY^ \;=5 ~V/ftKU3OS+|i`7[A>DnlxݞӐ*W/7(/1VVe^9# o#oD#I5Pb'i T#gTǎ[c΋'Eٟ3._ DU? >|haLG0Hxp֎/w{G) |.dT{|+·l>R B\y6˖Ik0G6TWDkOlysL>IqV΍5҆v$mf\yb)e+Q,y#MkG;#+l ČU,Ĕ#žGo'?NTUa;sUnfVi?Wͯ w+rlN6qх,gr1=veF[{l7_'3yw)i=="JGHt/]A ͅ~7&}`aSkﯡ]*a۬|/0\bdMg޷jwf7K{?w3 5fp&Eu3.&vWC*9d.2|4éչW]{97#fbeIA.6 @J3kF qb2z <*pȾsW=&W{곲A [ +F{bCNXUldVj{q /[W cެ϶*DûG]ZaFt# bBI]X>t,@I00 ƪ^3X7%e@`wO?&3/W=9 ѧϾjIrpa{JVԍ2$3c)GHZ=3*_v/Au/{5s:qECϛ ȓNn1|.H4@"4OMcbdbfJ<\Nlc1|ϐX7\>}{_y$ԯc贔" y2ҳSOcϫ 7j8xĆzWA -0`uWg,CT1?!$\y0a9 \Ź,W2"+53zĶ$+ 8#&^Z35}]τ&[)fW!,ݽV~9{Sa!UL1(W˸k!}ڵ!?ؑ#~Y}MT*8E9%0&ؼRSo6vv΂Y3wJ7_Fo5LtSf'/茬jm٪ʯJQO[EzM/s23q70 :=#hЋʑ:,cI ZG"P'Z.ХJDBmDq~fmY&`-arFƷmLQj{;ؙ )t}V4QSfOm`ѲO4[,f'9Ԋi](6ܨ#=/Q4przRyjNjуa2֕WwXǾ8}Y},0m_ ~qgqUk;'>=YQ=*T6r]zK.鐺09׎lY;+7|b$y@Z;{4/=`{=RӒd0SyD~yz^$t~ҁ}^cI_ \yM4m f/?-3M a IS\|̃)WE,OtW\-oeWFw3QܞOք4>vEfnJuv̟sj4Ȓ'/Ŧq,j!U0"wi aNmo#>'ɷ{r? 䧸 E@q콵$UOm6!ĝ4;ORiJzѯfSqИn83]9\]9l@[ /k_g* }r؝nX4Kv,j91vS&4.qI<SJ݈*?ܴedCݎ֬`Fiwr^{X`#вSG„ "nã'm{.>d$/c0drV|N7<[ q\rf6( %d$ݞb ːU/l5[ON:u:yw $Ō>b΋W{#ώ5~2閮n;QSCǀ7WsйgQ=fZTGh݅A#~'5׫^꘰JP)x2a9:2NR)y,5~y0EEit󧫖AiM^ h 4ϡ' zʡ^!ܑ6jeNua=gsgڳ Z4cBTLh'onܔL ~p^]xdt,`>غ<ⓞc%!$|{u$X{< OwrYTa&)B更9 57kr$y O27"YSoƖYP% j(nhwqLm֟ʍ[u**.3D-'WŷjЖϨY_n/͸:ƶ>9-xˤ^h%Fyih;ݝ?O`iej\4>:UyؠЭR8U]T(s¿m8g =Dm-"lVg*\/ =A Q}h௦(iyu,` y>]1y/ ^EJ)~;\uIMq34*g%oz^q. _[!rmFl qޙEϦ0ĸ ?K9idu{, 'r P ,+ VHk'iYhRYd,1Nx=dTy&)n;vCEo֎TbIB$^n3x+CպߊpN, N'757zƦ#R7U旮%E8/2Ț[A:,fHEɣ剳02f-2h$ %mڞG8$9HSM' 2ҝd+-[nŀLQ {k4'#s_Odm +Du)mBhY Y`kǫaAR4}%u! nO5a:ĕt߼z]e-";~>s|SYg5WCUB_S7E3ly]45e&l6{kN39Y\J13@>v|"n^RU^k4Q[+I8DKJY+ʏ;R}GOP(߽{kѳ79j/>F&6f=VwA߶XlɔDo~ej&&lҺ|9 [sm7:ŁU/N=v0R},w\ f]2vOK6K)ޓd)KTٸ|n(VD t([Z߶y=+P w`cގgSxZ/Eȍ{|l(;|6~>S ϵ?8iVzx;ݳUE_hFw(m|9twShbyU%;HQ4U삿oUv4} :c8eK |9CN!*mk=¸sZm5m$/`dcx[P̛4vnCק)w AZ] U\W+TIr;tٍgoC+qy WWIl(F=ﳮ~4)?K=U /Xd.+dؖ$FHrV91LLF)of^/[K6܈H'щ߆JAS|6fwjvϔv7Y֧-`k,O gFy86y*V.kџҶ[Zֶ߲yɰp5'^)tGѢ%cQV\Wk `!W4 Τ&_doi(oγN<SH-k-47.PgbsAYhk3mOz/Ϋeh| 6lEÞy%"x7;L7̿}#2Bȿ4cWž68 0/ g {x,Wipg%XdT5p,mY]Aݰ" \\]M{˽ƥVx~i` MY_TOͷJRCuV)qZ$xӦQv)o|ZΓd)TYHN>?|sgb7#%-}d9!p.sd"%Q/A]='O;$ڬ'b} Qht,or/Z|`7̆TT}׶ߞ apeJ5"It϶.p$KB"fZYyYq@s8 H4xE#hnյ +0ݚ,"Ew}y孊' [vsRk3avv5D;GUfj?1Y9 _0g]R{}mj{+(P|-Tb$s;JW缛]wna@+XMď0:%cYO?P? A3[=VzXc?U!!췬7ˏVlQ@-/_g2)(u_V[Iޚeyc,6$1>oT,GՃTnQ*˥EѨC A˶K`F4qCCa v*~ŝAH;Ջ H%C߁n]aF&9x9Ka$N[R]OE*u5% ޼uĹ?G endstream endobj 1532 0 obj << /Length1 1433 /Length2 6408 /Length3 0 /Length 7395 /Filter /FlateDecode >> stream xڍtTTm.(0 -Jw0 0 Cw7ҥR tIJHww#?~~ukvV-]^iKTGF~~A>~~"vv=LnE:p QhLB#{H@0K:@:"=0kz.CP$ (zG(AŁ@777>3i-CtP+a3>"v BPApgt 7*4?j O%!#[`P[r;#`W0lv]9 =grsj+ zpKYr&U svp믅 ni KG>U YCQa""BbJmx9"V&>0+(C vPH6{E,aj  CчL={%n+ik?6;$ }( /Q1ϿhaO2 xZ/p%.si Ь8!)0?SwῲH)6sf/4i]Ph#2SѪC-a.mUFB[ Ü`PK- b2p_RZgد_6 v&(Z>WAXҙD=txЂf2G!t>+ױ =apF`蹣-A~wq=L::"aBUD7}E}@P(ض"Lwo~1"Ψ#\1F ?]qIewCc {-sJ9( e_.[̖zAєexmMpL'>"*^wnp(Nƚ̀nƊ2be[DR MR]`g2 t&i=ݙ)GoTJEC)&Ώ"9U5VKQB\ NHs r0EWQK=_&cҰ`zKK8!q3vqBظZ7Ŭbi59=R(_'X2WU Re=(%cY}(TAM;3a"^U!i-\Թ- IsWWi&dCNUO )5hpmE愭j1Pj߼ Ee ;@;\ FXu%onڪYZs&;H=Iˌȫ`wdɺYa]k+m^Mt09B $7 qĤ?MEm&ҍ<=G0SM]]T NG=}dM/Cq AVMgITdG ~ x|E#wL# 64HIN*X,Z#'6]5 >KMTjxM8|Li'uU!eiB9]pq%pRyD|MK*&()"! nOk5bɾ,^AS-?U@ xXќC/3$ōH/.i.}' |yaQۥtWf˰VC/YA#+FhX.ݪ(׃ƙ^P;o߽J>8HՏ  *&#L|$ΖEHcD} srʾDd~e7:.f%4Af{SCI[\{*dn4BU;E?,dW Vm$:=/6n 5PY[0:[-Et)r$ LYr7ik|2zvI/R3c:E1g}txd×l8+{ts|WbǖMQǕĿ/r,{k}"}J'2s>Fg>p$Zou畣Éqꕨ¼< TߙY0>1cW#z498mNY{K?T0.$Zlv"S=n1VYiw(uՏ {-rO[xnGfܑڈHtmpnbD?Tq~zl'~1tL?XCD"nF]$)r`G7eɲQY:d~m<~"PVإsN`)u=c?M&'K`iUj?S!ǀmCF#oʺۈajٱAIÞQzLAK60\-<,7 .'2 vVNA3@`A@XJDܒ%]C4Gܗ녷е$ۼ%^bqoE,-;."Iu,}wgaJIRX+E출ZSnV_6;vSF) LSl&Õ;W0b9i]&%kHiLgG_MarWQ3Flk1G2mЫ^Q}bc|u ~FD)@yE@W8;D3M6]ˑětI<1K8^m,Ln2k&0i-~lzϔi ?"&|a3kĎU!e)Ldg|* ( iB稫"4p.ߞ|VA :gckOD 1@cS $U9G6[o5H)HFeSgTn7I6Ԭ45ԷL*{y$|/zZ ޢ4Ŷv][̤2_:z[kX8Jjm4H@ ]՝COkaǾ$֚Mi0ӷO#$­b~Եi]LͭH(F;sVNU/WBy"_1=_5-i6{÷?rmQOL=^&) PrJ>]D\T; ۗCwx{Mo(i_=/<W*q*ĝ;xH/;i׈+s|iV;g-g%8e#TZv \o] ԭ&SYƤwmţ-{ 8ÑMmල["zRM5SVZYKUs*&8d≽AVn`)^IW_(Uxu԰4ETrL<&~baW|dQuX9u< a ͞)cRyMYϩcG~Sm:&몘Mupԋ{_xg HFT08z b }]u_GuoNz"ڼl͞*E ̳S1(>t(7يl3$ '[iNzҶǓNK(IͦW3nWvXNLhܟgÎ5T[7x12s=$GҭOjm"9 )o-)L3Ne M94cQ J$Ș8XѦqx[Șƨ|g 0h<3BhzRG9l ~VQ4A5L]5U:Q/eJ konۋ5LoPDِNOujiS5 ]}"T <<r'r qG :[aGݵ+,q%D;ksj4Rt>)RsO^^]%o,:%[ )_*<9!ވ;}fϡ$4lCI7gӣ|?y{0IY]6 >M6QjiuW4s.հ^^LRA2DvE[VKzwSX1ʵHO-fS3\l4Jc wx7E Ffٿp1ŏck8#Q#+\¤#m WX["iܟpkWZrk|cNݳz~Eׇ"]6--ͽF-,˦ȻNc]i 2H1"uLp!YlڿdB}*x3ߘUzG +9Uu\;Q<ѽ@gVs}bFc%z[M^ \LrIM;ׅI~?sLVvOI +u!&S~hsENt3O? Uu̅';trYY Rͥ, `kT'.2e蠬 xOv>.8 bBE+z"do o%c)%4w o$h "fd a1(ly`@s2&JnWY̟*)Ҟd<-QUUD!tmS=Z~hSYe>IN҆͜X(U*gJ;hVbĝ>;RxQhT!Ɉ@UD='_+yd6tƃH5ej[֜RDv=Е!^8P" otD/ba풛5XA3 b;%ՋBM _?Q nt}`,&@嗑XB(yqjezJ=R053{C6Dn2;>X!'ϫ0V_k#fwk;@ÿgO>lrT,F(Zb@kWp'Aa@o?d)Hn|TUU5lٰN.Y}*.,6ŬC-g)k8ATб*oo?w?*]KEh:1k4f)=?}猴9 z^[IAuOF t87qv7(bQ>DJ<#)+.w:]K!ETXl!*9/,=7{Uk-He_08,x[{+Nu̖JIA"o u.՞3ji8e*Ÿ^ܻq|4N\i'ܬRID4{39s#=\}LtYDG0,-Ed]uUft#xC!u'?NBܩrmsjO Sb-{:񵬽WiUP LjiN/PqCGuS'jΪx.Ge[`Rδ8NPO nNq "ϻy6ICЖMBF_M5-Sg-=UY#aFԄU76G۫[5z^Nv0f '͛-yԀūٙ.ļ"·VKSh>"<@x2|@g\^s\∵C0্(NƍjW| "hDfM=XT⪥囙yY}=yyU•~/| 28|ooO8]ؕ9,{+]ۨ'+aNJ+Kv+؆jMrL9h, Om28?^{a5, u^l"6ұzqWDxƘԥ*)Ż'^i>$H 9K~6u2bF6m3b&Zh2&r EXK3Γ$@{/=kϢnת4~cm2W԰ RNnщs_[#a}Llk8z"ŲRBWph򎇱i^~H4H '8ӷy" Οp-m1KIimB΁0<}b A|۱GGu<Ȭj)O{zWdNX_o3PJݖ+c%cQ}Ov 6.e).YWJoMw endstream endobj 1534 0 obj << /Length1 1764 /Length2 11944 /Length3 0 /Length 13057 /Filter /FlateDecode >> stream xڍP[-Cp@h[piq w܂23w+om;k&W`7w0I;!,l %M9v6' 255/;26, g)&i y Tr]vv^66n%L-lmiy=_: =t=h (B@'M@kJ YA ,.,Ζ"Lwk@rvhlj5dj_  3j.)`s3t"@+X&ߗ`gaw(d 3tw4{Z-v " 0hjofjmgj'uSÿs:[;B\X\2,6p!.v_ݓڂB`s?0wud[;$y5!f 8 'h?_{vtpXCv1u ή _:!̭f_u}Wv sĬRʊjoofNn37 uTM\9//nkw-eWt7Y*W/#iW;?tvG*JP_2v_uffban"m2WR_v? Rupybcm__Wi+:l<SggSOY"n7V<3yM ppFcV?L!>?o;V@v+j `ZrXy6l_I|U<+?++CXׇl/'?+gW ~ 뉞$5Z+)ȟ;:?UD^ nμ3Ig[mO-PB37|Asv7nVh'9\lg[EѕcW 'Q}Rllg.m_F7 *xd8"!'*LpxZ[*v9*s8RKߙ79*\$!V0PowK>D^3sL۞<=ߎSl؀K؈8x#aFHCbf'7a7( o~Wdb)(V Mi$$3ԫj\xϳOߌ9fzFh3og8kE&r2P;ćgxT:/q􁵕i;h>EHLh*ST7E GSXoE9{}!-bD4 œz3W&arA>9.XS3OM[$# _k`B ~[~K?I|DU5jw")I4;fd]FG+K jLEC_HP%<]FM|]r[~+ձSE9$\hb}>3XE߂&nY ܷKߓr5 Nղ`q{e0q>Q3DD=/X>k Lsx!*%{thnb$\$>n !)Z[! ;; \!rL*ıbh*0Wz{~mWe[Cf'b[h-DUliYxPw =1|,Z9:e^-#3ļ8v\VH0Ϧߞ:%da1+Za.ܺ6y%r1gznSS4((y͔]ֽ~4ӚlY D$01b*=f\LgPn[K.1Q2z=T?w'۝}m|qV6o$w$lIXn*1||bPkXKnWRi8T loffo z%6r6#h}g\=?mHƓ&ƪ9 rHn{rdne"Q 4GzFQ!zAy yiOC;-(ZPN-ARD$ez/iFx [WuXE,#E}gwྎcZ춟;Ջ[7NXZ6I¤zďGMޟʎ=ֻЌui%TmqYA[,m.C1lO$)q5);~6;x"rNofb֮y> k^&驥XgՔw_Ȩm5]g$?w"\$绥|ļ(Z_o2A?@隢߿!o <5Fb5I?H|Qvk稯u]:zZkzq;j4̝_@_^yn%8@i8s[>LP=w( Nvw\^4 l+&|wQnD^1Djr>{2NlT?d9&933{Vba5 WcށK{ RNNiuQ~ZhC×MRx c"Z=^BvPvjZZQ0|B· L%O$&>ɎHx݂ jv<ʚ G׉G@3{c%g:4H拺[AH{}z͉-ƺOxl<2Y]/=~E2X.nllKTQ,IXO k~`\\GjA˪J: C &ђ_eF;P u{ h"뤑TC_5Ѹ)A>C cqU ?`qV ;›  ׮"oj *es{AaOY?ɇ/T[wQ)̾(5Leيʕ` ]H+NXpWdOe', Q)>mBf䗚Emܕ=ҤR3S>sv> ey'YTlCߨ} cɷ$ugǡΣfl:'gM[U ¼9 ݌J|vaQ ^d|(#g" b{2Td>FL[ٞ \@.Q]J7=v 3YEVfɈN*͟!ةW|ĪG8Y(f&?R=,硜ZNkAyNWH܇S]5k'HKR-BHPSV+u ᄥx$|"=##SrU'| %Yj+Ƕ+.>o;EP-i[ޔkU%w$~\IW;|9=֦ݟcDkjWP)W5XvS[N`$86T[g'V1麒 Pw aX>H[I/CҦxXDGc*fYWVViptߓ^<  epV(.6"V౛NSC&VVz?r`T[~dдԸ a8Tv1Uo7M] D|<4 "PRZa)-/653'@Nu,ŕG[7/`>M).xʗѓtBr@Q ZJQyW 7IvLR/G 茉&XwNCK4/xD̈V˕ƪ|r@]"_tzw]8;# &2ζC3f21ӽZR4έWh 9I)o JDyflF:S֬>̟VDfeHG-my JЂ䀺,<9?i~H'^"Ye^C@߃9uH}h"ѵwx9_PPįg+nlqr,G][_[ OcS[M}/ iEfE6Ueէ8#gam5*hfJ3|W!D~Z{A90lPe|Ir4bzj  z9)%b q(bY؛)¬.S}W}dQU i딑7+,G$֡%ͺHFS=mOtbS#׾eBڳX܅zP(@ X@_T W-Q`QoO%5=lׅ`l2Q}dKin YIޥ*FSPX"3%eI<ӵ0d.qS[ ա0y>(Yf/u#㨛1ue,BJJ 1@i.7 LJI{i'L{P$etHeO^ri6{k2 U1j?7Ј1l%g2ꕉOG~/Ag:p"RYf,Ї MZ4-V?e ~ʘ;9x1-hrM\nY <!hؘ n8e<跉K S[>&j0M9X6v6o!( $*-5yLkoՔy_t8_4\@d P/;K3-dtL@U;H4c*?LK'0ESSOikGUB)]dEؙ,JrL3c/{46~pȮ~3A/j x֡x,RfIج)ٸEYo [: "tef}іalٺNk?j'8d"EcT}Rc I !jD) .V-b/^H9-cr%d}1;!- :kRp #wX-"۪xC&j*qc8^Du Wցi" ظhZaE>, Sԍ4$n|Sj#~ub3Cu`BܓowbĨ2p. ~]=-D1=+7is)]d}'Wzjn8GBBQZ_/9 Em9/Hf)!a329Ctsݲkmt'/!6&VR!mbK'TwR>SxDgLrCY ) { -<6j`F`'1q6o=ȿ)]iqدK^^ qT3nph좃ÃɃU_I%]O0l]/z oD-!"N[??1IY')WɷXhezGM)AgX_Ǔg4.v/zmA:9D "&6^xU:ǘOG1h`~ͺ=Nr%гmA5+tf+{l]a;vj^ċC Da?rlR]?YΥ^B׏'U/wji6:|&Ɠ:eN#|2ȁm4uJ6:.W%_䤌uw,doYA0jtl~hši?eYZ>2|@di 8B޴j(X|] S/4۹)ZԂk5$ |7H#޽̼ M@#{Z3,WWMfkvlnNq"S[`avhm1QAXA>%ѽO[6QŰ%g_6t]{8/eA`}!G"3jx_2Q*B.OV^$n}:Uq!_ܹxP(Ɂx9].~Qodl7(_WAiF5sa~^NVy"73#/mBj!+:|%N FlWn "}dY&ȳ ?ANu#H҈PՅ"KMΥ: ڌ; bԐ4_vq;H%~4mG6[\~CxEѓ9%pXu~;>ixs{^/ of}P2Ȗ_uЬz>b{  ݟlvN5⚨B8b}%gD],5v3GlGJ-+q K~q!O )QlbK\Ȓv~MG Dd3?VҋN(sۅR>>Dn Ã~f"f-COvصŀvlEąll5 KԀ_|ww!;:bfhQ\;.?M!g t+z iZnc$6ISOғaؕ/E NY Ic:|j7q# 0-Ez)6E|[ MYIjMtIOru[t躏Vfn$7 S mw;ɐ0qכ =Zj?NBpO#c<,GNHAy=`QTJxli8pY=sFFsتVG ?Ph"r&A=1~TiS9/yo/w( :_kQS)׎'Ї4P̏#~!LӨ(:B=eS!p+EQpUHߜn\{pAHv:ю nkφFpe$ NY?VTYa}[LCJ=GusєhG[oý{}FBumgLCڪKPԸ)d8\R{U9f5B;N*Cf!lfo}56L<;?[H;6EFhqf?UҲw]se"d ` |.u: u{03|-I:w:ZECNZNmz$_N e.Ryo$SV>c,kvD'oO&_b]~X݊C̛??|M*&~= @u=hitDڽ0Rl{Ȫ͙:K'G%7:3ydSn%~C܊-=xz͗3 @1C|4 47'ޣuj9;&4I7,9s)ADp[vŮcWP|efMF>mB0q@..#δG HL7)0b~V3ݤQuVԛ6TM~[ d!%9 G畀`Ób!- )vAca9ý)=7$N"_WEU`6w ~%!Ptc%UHQI [9Ƙ&Vz/P4*# &2<VA{d۱$r:d㒦O4_`hkzp\C<%Yxy5—'&IpQT~UN~" 9 @q p7ZP^m6d7u`r5[ W$/X6&:`6uv13ĝ`Qۍ0GpO|BOK9 ) 3ݸ- gߓ7j;SHۣJz&ܚJ:+%oGT&݇h#R D۲ d OaQe*]qf^V{My7 Cs&c>Srl"fdA rj責t:P˴`huq "+LPDh"3q~P<85W)@ɋC(iۻѐUDHD/~X= ҪTࡏo>F珽rĎ1|(0n)l or߾Rx!۝f"c,< I Jrk- f+锏R6'SМOMt %m}SI%jT)lInQx"9 9UqQa'/(dQh;}$ZEAI 3!8-[ůƯ:QƧ߿j]zYNRcpf"cZ+gJmU0Ygfn]9JO+G>s=vԚh#hv- fz^^d3FcNr/f,XOa|;(%?~Bj8mq&,6ə 3. Pu̞],!ͮ>xLqyKM;t<K#z'w_+Cb&"O#ߞ,S:OKXWq~FZn40{ko QTDGN02ڼ2>S6"14!J/n?Z(ȜtZ02=抔 E^/?: ߓփmdagZLO,橍1:Gר|2&t%ˤjH0^ky%pQL)NeDgO0z endstream endobj 1536 0 obj << /Length1 2791 /Length2 19915 /Length3 0 /Length 21499 /Filter /FlateDecode >> stream xڌPX .{p \C]B`!8.]dw%սEts*re5&Q3 P dWPWgcr0#QQ['G:9[we.`C=@`gge0v2(0dA@g$*q 8>hMl||<DNVcK8-@ djtOZAK~wwwfc;gf# t:K() niB dnV@{g P(96ۀOsllw +MMAvVs+[ @IJÅ`lo7v356E %0WO}ΦNV.VkdfI{3q7? +'),=wf,V@l":,{:Rkv9e}́?Hn@+O`Gzw貂Ǐ O 3zuH)3SJ11pq|Ex؛|wփX /cj yr7㿣e$jko?uu T *ͬ\V 6Yhlbjl-gV@et2K3Jڛ~/;7Rn.o߈"x,/","V bH v`yA"\_ sQ|A`.J"^0\T_ sQA`./Eh 0w/E_~/_9'o9xm^=LMmm-s;!kdl !Go ?|t)<[bg҂bD7 ܿ[\ 1~A4lbb4}#'=@?,2? |6@p'^sK/zp^ |uDz 8]L~P?*,?:9/Nϕ\x8@/' nE 8w43yó>\`'gG #q2෈ Ǭe9rl ru \@pV? T^8#yf[ |,.='U@iad*l](;؛)-:&V;4D+WK"dMu*->[-H}$L">>6MT9hyX7=e?FBfTʾ3EjDOSdS0 cxO_^Maf?2 Frz묲Gx-W;wP@_bLR{&yEbcX%n'?וcuZme |׍f@_p6`.%Xc=x` 齽s}p)wpT35k ,苭G|S`^JYm=~0W.y슆_ +`e5b_ ^' f'Σ^{/wwzOۄ".2k# (px2j"?>LHB*\wޛa`;xӰ+t3jؐExKeqCP` 77HrPwx:'Rsw 5b. Ƽ!LQ2 WapJKB5UVhڔrPc3ztE˲u/RFt:u=<"jB%tc ҩ1뷚g([>(ŮwO_Z3>E,%_ߎ4ؿsRhk="t촅U`*-R)Rf3>|S* s4]Rާ~o҆G;_$uD31Rr~2!<"J#!ȯ!ͮ&­*t2c.&.eJ76QٽmqYȂg bʋ4jMClY&(#ߜ{Կ'@TJt@ k9[康=GluZuG˔ۿ:wuݝc|5p5 )!u[A}Sִ}U1G}PVʈ;_YjT/m/ۺ4!iVtBCxZEVٺ-ɰɲ#c+fR]5DEEk3XxGQ҆YNi3h(fxБ}OkZsP;f qH[pYaHU?K,b1"[[仇yQrM6\oӵsHC}J3Cī>)6`FI_W"(Ηdp1bH/' |D xmM_iLylG9E1v):8:Jh'X_l z'O.O +yC:S dYs 4Ey㓧4:d jI jWG8E:H0TK`HN(rq>#iD8fGb 'y^ïY{Ebu0X |RU]ȋCc9cq%!P3^;?CkI> |zy| C9ʏg2Q'e`&6F:+J ɭˤNI9 aDPH \Pu4U,<6@œ8Fx:NGY]>`?TؒzExrfְW ߱BzPrS4j YoYpjD,{|lagx_zoQLV<ލa簑 a4%muyMڽ+L4yhJB| X%I@[3}@9T vr-1yʣδo&S1*>f4AbB *ھ6#9~pD }UL )6'&Yoi:g3GL@%S88]Wyy0.zč;s>77]py$8>HTp\罥ll ;x1ZAI|OuK 97]RkKZ}ߨ|Wcdڬ2|Cً}kXK,Uu,]e0H\Fqj@o7wY.}\zpe=jyT1y.?_P5qtE?|қq Q%4~#UiSQ\ {֦dݞJyeq^ H83\0&%sLT[t8쵬<0B݀0EoIJ'&sӆl*dA [_ɱ\UroնN̐D  f:_.7$^vݶOx4{ʗ6q"aK䶪PIf };˓i՜(uGver&xnN-t&˛pF/b5hԋhCf<U}'2)BҠC]1@j8DwCƌUPm&z༾6CBl}C_3QRO@m dl ;̐1{_=Ifuz&4 Cpͼc:"N=h܂544RPlrV'u;Nm[yA13`GO!ƱgUKxYxTn #p){s|2z)}\3Lzᷛ&8UJ48e%ChH>B7B2i΍u;%SW<c&E(TƬqg,߱] \L9 :@213@&"3D4Kf-W&b椩7/2.i';KGKɣ) v3 clrH2rAamSע)TGm! bPW\ƔlGԽXՑGIrsPjaYOU.H0V2t9?#BpkVܙVŅ] ߜ0Weh0}l\],/SݧU=o}*⻾T6^_÷ o|hC/A!M \qކo ;9 Ĵ-^-UeCO[dL?+2dpI`eE^)a~KNly2piڜ=َ| `h)6{ao14>1 >Ga]hӋZW^RkڜWZjoRd׊2Mt1O{pUCW%+)|f>pGB%3 ߕpe Vs'wckCwp'~C`"!0;Pݴ=+(#~VfHS^HKi#O_ !a:Ӹ%؟Iij7?}w0W~5G*sJ}毾SUޛ傂nK+#^wȣI|#Np?)2L\PzMjfO /oBga\)5hѓ+e G5v4mWs%^3| B]`Lk6"[ I)V>{ [t׊ ģu )|**#f5E[˜[zS-15L[!_M~&d:TãZ?- -prή/ rNhfR.wGƒYĔ.)t Fפ%i!_R;5CLXL YNJ'tm`;OZ#*ӨcYm>YȠã=u«/KaLA2|#"ܾ+3pVxzo($f.MlG7ZE)pH%,cjl>'æ"zQ^gGgdIj:҇)d(-%_]VUkb W@z >O [?;Q?fUuQjh_`D-n ׹36R}b}S SN'twK 6b J(B2ɺՑ! 0S~ ]Qf _0~Xvɲ4A|uV 9Ļ*4>U"bś{!(U\. 5cKM>ATř <\ CI0f&7 +)>‰ffGGoZTL{R 'WtOsbccnWa[:WeJ,˸ X^%snnR.&I8ϝ0Ne_i[@mjF <0}r򮴞oh5CN jn#)*៸U# (`LKi MG4~)'Mnlǽh5IW-Oo9[||v,p9A$8]j҅ۊj=Efz^*˭w^~5z}]e><)$}JhIHGf ]"t[!W}{ 58Xx47 N{^vXzUs*Aq5VOh!$2"+$-Q*P>-6e׌\%řYIşԈJgif]$gf#zkv[N`RzQ^R b^?/bW\Ε0!s"OJmN*n%f[˚Ϲ5S +O`0Kɾ_!dG҃,LDlgsMY¸qs/fiRq~aI$CSYY1Qa$9!:z۸2jpvJ+s2Anvz-MJDX~E6*Hnk3mPK:}_b{/\BJ`h؛͑!s67#8tY-!`ҧs+aȨhlL[e: 7+ FmU1ZM6ھ2D*==5WñEs(Wc?m"`h2m@~{'sd{9 K,vc_ qBе欄T44Qk2A-f/ȒޟkW@DR?_@N{toXLU3Cf2r+h`\fkIJ a-TƍYATX_CFf W,xu֫ QziSP "7tLvxZ&0E6+JYSkuTԵϤ"OW恒FܮrUUP]@r Ȝa?l<95֔u!.z\YD, pd\+$g,ˁڦUlAe+'0:+uMEQtl𗹑$FW/?iqٱo 7.9%N4& R%%q)i]7Zw bEׯe<A#[3wyk;*F@Z)$ Nx>mqE"ʣ3w>$t:mx~-پ4jRszM3^k[. Utw>(2X8a|aeL&7WƼm_w-4Dc'is9( ­&vWA$WewRl%US"i[oPjεyxkI1XԠNꆋ\<pA=PQ}1ڰ ^ĪͼYMxٷ ok6힨Pp1O0XR;A@*. V,ƠN ʥV*CxJ( x5eI|16^Ņĭ&4~ACH$MU ; naҲC'h2I`?O5 k8Q EF 4>Eppƶj11"]zF~RGȪ|DFY Cl)}`ܻ|&@2yHў2ˢʓ%#l/ hIYo4|Nދg <guiUQq4 jf^O;zcMO?*Ǭ.n\IP.lUpO$`0p5ӻo}7?s!gz{UΣVc2ZX3H06-oG [𫄤vf6,c&SIsHr / _d)s+j)ΖU_YʬYZEɌ-/@5kn5(g+|ٵe-ӐwE.ߛ`M̢I_' e2':Է9rFfYMogSYp(ah2,ptU{> #!6ߺ%<]K "x:VW{.QOip1S({i.6!MpcLib [J8趗3}ˣЛaDj=A^K%fnq| w/MB$a": d_‰km7cC""wp-9`kdm,-/,Ҕ> of}2m5c{xUQE/GV41|~5t2DfEX*HYNR.3?{ٻ}} &oB>ȿm'#x $82 ۦ㌚6JӲE|7c3VV6UAY~}m1]HUrC8/+kALJ;@fMQ#› n:ޘ \:=?} pz†1Մ}5k,lq+N­9! hfJ}Z#k6w3~9 DOXftoܞQ$-)YklFM#dƺFm>17>ˊh*^L1X^&g-rJ@Skē3x}Tc"ȭP$"FKRf!l'ƭ&SZX4$fdX8mo(sN;O j2DJ_aJDpDJ]\cN"@A &)}f!:}"&N=]G: 4 rL8*o`∦x;S͂IJeXq! ^pCjxu.G|J8Al&%_$k㑄qUʮ 6B'⏙Xp{owrچ<}ƠA\v/ēK_@'iJרdqɟmO앆Om3UgBOE7(^7v5+'B2a#[(@T1IV;ѡϻbz:@u7*zsa;bՍJFӞ|gs?z\uBV\ODVk !oc -Jeʎ^"Or^!?^;%|| xRivLXs{|b /`鳉"lq:BDXFa*OF.D6n`7R<7`]e9 +gY^;ؾWCJRb*g.9NB%?b/P, ~wyk('X')57-;)l4ӫ֡'@ύ& _iumE)#t앲H L7i0OAhP(dckq߳Fg.ۣk8ť |fdW)'r^9L z9,d*f>B.͉TdimxXZuZDH8C%gUx evoe޽3ʾ]s1]xc[Ih j,4fxr{HXϫB$qfF;=GHO>=8!-&ވmeF;bqIіAVeddzX Aa MHL2w$ #6 Űd5^\E:D\|<ۤczV(b.J`p_=HGQpgX;SѩoletD~8,>&[ȭa|6ʎk!60WsD|Yc{ _|OFFʋ<=Eh ϲZ'N+}hV5 c'!]C0෶a肟,ADOihGaT>T%K92\2AWjagVm/ˑf%ҏE3a]"vB{݀y2vY=~r5BՄh.EiKDlCU?ߪYqgn$*tGmCv֢ P;P14_șI#7Zk+!fv9WϧGܷo,OZ6~y> S?ëEq>6Ona:M| ]=LF(5 eIaCzUf!=< {+/KLHJERJ})x(l^q#oCЙ*(̟+7vr1Eigu= &7إ4yG+q󮋙@,"G[6x%otaNʫ!b-~u|SEzݔ-խØ(no^51d:3˪썬ncMVL=T|.D-Kx# 5],Lɬ {d \k#E26ֲxp s4oVRqd|e74aϫhRSJyi- yFrZ~?ziWIܑ[0pFPUlpwʋdyË?8*ޛW'xطqXMG8}+8UNdb'Y& <@$kM VVm_u9t^- 3j^;]kըXˬ!VQUڎp4!3fjfd8IޛؖOMy=>~U!_/C+}mj>גyÎaxc=ia&㸀_uc^{M~~VEgӗL]Ra$A6">ʒo4y1Ӄ~Ϛ>RXwpR+nHRDB; ro\Px(ߎ+;_ؒ 6'IX:}aGA 뼨'K'}`d N BPZ%TD= vbYG~ 8t!i*,'IWQVL-ϼ,*y|Q2#qᆷbVmqs%Smk.ci*5&KEHη/ O7qdӤ|[Y xE6waR3O]$+L3nyF6tVgn:5K)iĮ3r/ OUɓOӛ4M(Q=_*'ͭsX m_)Vh(۟neH/?QQf>$Y;gV+2lяjZ_pG]HB3d#%^= S~[@ǶF/{vj@S ItRTi<`4a r╢$k]⪍9$u\O4 V^!Fps<Ш K/Ú"btWUć!+_%;JV9*:9̆~Δy4axxXFW~FS9iuq $zギ==񰧣=* WJj <_ͩв.' Hٻ-RG[qe.DxԮ.Lq}X>DD%? Pu wnMKkzMC )͟9Ra&ɣJJ]%a`C,bcFVE֊.A)% DKW Ő h&VhY!^nboIw4|Pb!>,2,U?>eJ v_h2uI"8Dv{2YvdޕIcn|qV2! u],tF, HߺP)`8HTF=@(?NhhbL2N_,MQ/IɵR~g,4UJT3 UP7ɶw!᛬13,+zԴh-'LЗ] gU_^d6)Lh^ؒ_hU+,,,7 ܦʟ Ng-PJchωfhS  Jq̉2F7 m{1ֽ}5a [. ;4`W^qh !ڙ Aaȳ$ݥf ӫ}fGX<`;[~ 0~CXA{ލDAF2;aIsf*594 }/NEH;p<::{k!90Rx=3&GOӢƻ,ީuPS $Rtj{ z8ӌJ0!rA~Ec! WAtSǧ.Jq{4ZDbxN\6l4Qo@ruLIw.#PCj<<{;zDžTE n{4x{={Sd$c{ }\SGEc<1 aWs/=Tc_z$s,nRKEujD+#K:0LF:{ #=c>/tŝC=jZ rvtU--9+ (\8 ϭ/ g" @|;PRq [q- bq~)Pv/%qA|N |K]! Ƨ54*-y_G C WփE0)ei;*ݭ_kKL\ !2t @Q\KOȂy {web;GbۀRwsZXj0Yh,=QL}[ڜH]8QAgZP6lCNT.]@AQYW ":I2^xrZ~QšQ?2s!/u\˰0 ]E7nY| Pʘ0z}PS#;oYxv_.e$b~O`xXr_mmI)Ie6IQF$y(G{|nKPUeؐI ӉZ`.Q*$XYK -_IM/GZ6'yъ7h͍=5 x#BZ.J)l黇bftB[HM ^M^)C7ʯL/lKR2jTP]&B3<-(uٺ8z]ܐ dO"VBlH6AuђMWMޟ'ϣŻ?PqV$/*ľ#Ѯ.ؚL8~%\!J 0s?oǻ7T /)YZ3ݽm=eLr7eY3OKjj7#kL/Cӯ:l>f@ԋ4pBUK0yu,@B6NSj O-ΗE(e"KM.O{/#`8* 㒷}pzxlvY `\E|⓻V ܴ,iWjF]=j%h'I5˖0V;-:"^ GT؀#e}MfDכd@qU~*i -bЎiJV3lac? OQ_OxN O'J!#6ZB_Es[[K,3 wf(f14Φ_l 'Z4{i1Qq?3yTU]w0kxˏ %i V6h㰱T K y*EȲ=+8>1L*Z7:>R%7~)NyVv{vȧsaoˬŌlܧ{ŸlNKz!o yZZ|<X&{:"cgJGLo ,7ɪ\d4E.a)YAT6m8Fk/)P<~QAum/>EEscjE;q'lDF B-==˻) *896CSz6ubɼGR'|h&iP6h1W;ƳB/t!q\[`%3%CIvoQΆL:ʢ6gx%Gqޓuĺ%*oM+99zV%y J endstream endobj 1538 0 obj << /Length1 2306 /Length2 14495 /Length3 0 /Length 15845 /Filter /FlateDecode >> stream xڍtolc[6wlq۶Fc' 64'O߷9+k\k&'VP43:330qeUTLL LL,p*pj@G' ;[? 2Cw;Y;[5`abC;Gn @ eg t#p03w~?_Tf..NmƆYCgs{DcCk\P;;s321819S,J@'+W9C?1T-+ۙ::k c [#=8@YR oX:030ݿrdaaCcc;{C[ [35 /&L05ѻߙ[_%2ˢ&v66@[g'p݃񟛵sL-lML*ŞQ()ɻ `gbb :W[^g/{;{{p^N@ ן&8ff3hfa h_;@}LxZ{6~eĤEh?:!!;w=N -MII[S;?7u] j{Y 030?G// X[[QXX{k>./kTM,\lV} mͬF '1 w߃X*9YL331/^[?7o}m;_0tt4cz#vv"`#{uvp](;Q/?`MF(!N&ob0&ob0Jx2=oz'>SM~{`TMժj=ozž~ӻ]glg~#acKbc_h c_d@?ݿ^od~||wY [ko)?NۿU5~w_X;f{N;~ hc ż1g;Ên޷Ϟp]{_Nv({]~#˻S?=u9{:=])?[t-3 xsߝ#UOZvtyBN pLCYBuҖ44mXa^Ӟx+hyG$|q_*pHÿGF̓e-| r'ApGC˙z#|Z䥵VԃCm|K Y {ѫ8ro1dɶ7BD^|h @a 6u܎UybBΘL.Q. RnnV^ׄU!(B'|ýGF+j]}sUhQ9zo `6$+MwS =qnڗ3ql/*Ʀ(w6.ǎ,H1P8QE\.sڄ]`kn4Uw#1bgFÔBC;YjirJkm!\2I{S޻ۅA5n W;}:T0B͵Fl]&:!R-o,Q0%_ظ[HgQJL .'胏+^Oeȷ9m!iW)cM m4lS6R:-,~-jP % ={ᦲ UvWw9o{~ &dl;EBD˵_$NMx>P&Æv)Y*Λ1W!\77 ;ެԑ+7e:fS_@qj;C6"i;V+MffEA˞7htA\V,P3.3L`j$V q̫IHcJF7ˎvOyEIzcL2M2 CV]ެ;)_2d5Tzps!w1$$|gBJgٸL,{QzV2OU2DT+$2o|ʎ(I^6o^9v [aLL=vK4W k?شeuN['QK@oB=8 b!R\Mf i}Wm?İv ~l % r>cB(։JJj59ZSF8X=XL0'802OᕛrS UŁz8x0PZ8^:(:K7%\|| g>&|kC"oU׫pߎ lEJD>0O|g"riB[uin.%?0 QvP3}]K ;廒9- YADIt:■Wgm{7mECk-{Prqq< z ]?t4cl,86σ+gۃWA崰o6&zCsY˫z=^K-Ҷ^Ln%;xuhSy\kē6ܱP(z݆g4EfAn5l͡s,ӌ_zB&[8LX)ǙB]ŕd %d =H@!t{I1%6LFhX*FiSIgϣ !  5`Sc_LHtuMƼ[|#RROtuaʳL3$!1`6Xk'w^p9"d:Q 9KˍEADOޥ= (l(W~u[YIYghz)kZ;\rj|q-%/4:U ֱO8UMlM}u.&a+I؜A(B8 jMFɠ-HYW %x 4PU:%\ d`f9T'=3rrքvJJ\ȯ{ZA qa exaL6K].? 4E4kF{"K5$ qCaftAz)f4Ɯ_V#a0K>{ whVq1D]}ȸ X@W;dL"vK2?xWؗƷ6!5yw56|sAQCfSdLrlkZ~kd]jͶ2ʪG|{rs]=n+nHzW0_11)V_mnY#?)р`|gd\Jbv[ZPӨv}8-nz-~R@WTqW@Ҫ#%nj;=~S #e+!yy?Y[g8+y7Ac}=5B./YE B~Zo/׼k^hZ­vXNr"мo⤩b:wO=sv13$af6mf<Њ+46Ê]prT(+oy \DhoAc_l]m|ް !wdnJnKvׯ&URae N.>F$ߛ_4KޟeHƯVRL䝯yl$`MA>C-49"h?* AB*lIOf͹ųJ~рē>))֭TQ+'#x#⡇NZR^Ŕ5yB׫{}_ Jk.&H#F )b-}-gvՄ.H㉇XH/QX?y]?{VV !#"c2p |S!L e)`F7Kf\S+Wj,ʅ73afm<9 ^[0%J;|\Bש%,KzRr)Oҏ BrDLZ!;&պb )΄@oV|Ϋ 5^*}6~)CMv&(I}^xd4u>C ]nbD%Z&glJ96e!S,29f'7d&<5]dk4Py[gEYm;]hSQ'.t=[ m`ET6U gK?"3Z #W:A\.n(8)/<ֵܕ k~u{v"3{sݤϽ5`WElq(BKvf}AeRβ|MA_HF_ ?N>=i^N"m'ܞ"@g`#rҤ+Wp/"h]xwP3Q8qy |P6~6x`Dp/;Qi4[:uX67ccV)p^K4kǃz9rsp>¦V1  ց0Ts7 ":cw1 3ɮ a }Ɋbꆡ5[4ux͐}f#5 .jt$e2A$lE}e~ZCĐp gd0|]7h#&h4h,t`d  l<6qCCG#xY|u]RoKu3cu19na>Cl5-*T^# ۞쁟~~a/jr$!^@/.B\gR_$q{eXI " RdS#ItL6]yu DЏFO^&$~O\t> C_P@[Yq~Er #o[@`4͋Wi-5wQ8ۻ 0{Ο^= ;P8?}ZFubb5}˜7%70%EV)tV\݉Wm&f _[a<ӚP)Ms͘:܈Ra[ϥu#|C.͗⻣kȅ;գK_% 4^+p+!Л_F>q:2xQk"AC=uhr:P͵\jeKZ?̽}ĚЪ V=&گGdTԟx3؁L~O -(:OǑ|YUM@ݶZU|vl Fd"H[}Gw\R瘏1. a`v4[4%#]9s=vt(C~ Uz^Țye+@qHg],1q85ٿ`BgNRgj'/>w:.5i%|dDH) zVTUV+Tn+Mm.=s0gV+sʩ< rfp2$IHW Zm\0_A'6esn|H sm׉e=͠>6-3FAnH#SX>;"g#Iu'*y`/~_Sg30Y#Ew]MXqPӑp7WU#. jT1Cme`TC?S_zz,,3  1q5A!8+9?8 J,.!a"F84gMcS}p 3ly]b@y(7>/uu-.EJh0qIA:lq :]sʰh r^ݚ[ pDy0ҟ GPJ݁4,M (ݱ,c|ZOt.dFjw2Y\1+ O+:#e$bNj`B 5W.idmJ$| ]cM+G >yro'oDG0U|(m?W>~\1mE).*cR|.&Yh#|ƕNг wiw!{taQ|) uۗORX=rByxn-?Tʥp34̽fo|obzƴvgopw \(]i=|ZqZYI['K\{+jΊtdaS:bAD){i/HnPO/s'F@Z.񷀼-'{7'bzkJ^?Asr)qUwRbZ}Rorٍ(]:H[Tp;*w#üAb04ԴZ/'Fl tqk<:'5@>5.=Ի!l K|z-nrtM]+tG͛V7!mdzx^Bh; 3hl ~)Q!e|<?疸AKMhQ5ȴuЈZ?~Ǚ%.KN$J/QcSGszowvlTæN˺8 V-@ -d#m=g Dk78s%u^%VToCt1DF^/E;t%w4*1"28H+1(Lu#)z$yG"+|#،˶V)[;,%6h#q71eX"(=`Hmb*nU<"3%9ȑ]&t"p7^8kߛT̛)JVti\}&Ԑ} yQTI]mXN5>p4Ea.אhtGX*KKoZ{+`v`Lu@GvIv0 E Zyj"~L/t}S]Gy)-}hLC'-9ecZ+,u Ho4^zo0y9`郶V6FC 0lZХFl9j'S}sPeF"ÍtG!&Q,m|,xAp R_c`hX.ӟC2v>9ud7/ML2I 𭠋U^ ;@ E`: c4'jN#"rXp|il:Ύ-䱍u?q4<Ċqsb0x#\i />ȭv!.R9^l/f*#>-D2e _WP+e J|#7ì (%##;KmdoHs (JA5ƽ#Bͮh"NUE|C ZH$Gs;W&kB< դ a(6nN~"H: OE d1QY~!Ǎ&XWfPCYpkP%I&bȘjU+OQpv+UDNBX$91q?N(i}W+gV&%I8qJK6G?UV]O&R|=ߣm'9-zտBY-[fNWe>\ rj:2Rf!0u0 ? H:mr0NJ8h4O!Aފ#DkN`R;4?|^r؇șC]4n,a.8_j6cφ6wYN:#)eAs< 2`y$ړbpq! ><9"!*|SCĖ2d9}qs 6=bM@1;w4qX eZ+Ts6⊼RQ  [*:|kJPf\0v|^ȥ WM,[ \IMi3 ̓gxJ,EtF$:)Ռ\C4YQ ~E=md Z9ؠ]o>b3L?}6)7*C&62b=sHyW}V~ȿ01~}A2,|,_l';QT4fѽ~m%(Et!W- bl;< *!Ք_4ŞK.̧2wʥCFu6㭹4 ' ҭ`&n!)-AzRIK.hHp;2m̾VXƼ(J:QB =Bqos c rW%$](l]\pt~4ظ5ˤ,DX{ҤP 1J!P.7sGFI6DuK6,"CqĿdFnG,Riܨ՝5G JE+~!ġ|y((=>; \1 Y4>A3Y~`<܅G4zhDY5} 1[G4CrvdH1[0D-\f)3(q&IovP}F\м-dF}dG, Feϛ`L${"{6 |]ƸrWBh\ȺHG3z&+-3$,uM©/4blIcH9>3C>}L0"3QP sR(dI]hN0$"~y_6'~pz(a BMCy^ݸ$[ *uwO%Ln ]")و],c>dc GX%snc =u6'1DַØus21,k81*Rx!ːɼ`e>3. Lۦm Nt ^I\9 6]22#na!6uT uJJĔn4(&/5^l)\&"77+&&67@<>88xQK',l {cR1'N)9|:W09H(*?9]|} /ͿVp对򢑃`y[e%8MqbO %V9.~MY>e*6Q1lXzcOH?YSv6tʒ~@ z?V~̞ L5f>^aª^~|\ըTC beM(Xm@Yd?@読k;rS׈Meͺ9ev#Vm؃UM+.ᅂU9rc#Mf:+ 5>\)  }$i<&X6"SzҟEWyB P6 l'G-ߗCi\-ϻ hO?# lf.dc["*Ba+te'~+s`$}z}Dr (#tY> ̬^Z!wW״@~e(1MW8&DQƂq{9!{#wXw@*hkF^з%t٫[6֝_ GdRF.|'D5𘐻I>'gm&W쨘x.ݫ](f3fM~NpRyqݯ}M40fwcIjYٰ߂ąXCXَijCnF'lL" >uL/ds(v bCl0iPa8. #)3(j] ʶ /3n~"+o +YDLoRRLGݫHKn:/-]2U{◑E/w`VFϽP% c\Uد8&_r[[JyLIΎBy(Mz.f0NJIK\dϗ,قo|͜LHp]Nzh]JCg&^kWTʈUC#%U_I2#d!+iM\$JQJ%Ȧ% X5b1bB@qnh7~f/wNx'0ٲEQ2XD\lTE 8=%RDwPw-Ȫ2ԋͷ ɛV23~F+x>V/MdہZt,rXgp!{*n~q %9y*g@0RԑӝL{;D]i\PlVGi6ؔpY,U Z(V2jO3tй}LzX5]r8#zdr:$ ¿5+N\O8^2M WǝhJY!To9fdU)e剱ܾ">=1AsUx^ɥ>:@OGt)5i8-KO\#9TTqF:=)Ӆ2Zh{0 Hk)ΰLTT}V`άQTt@rֆvۻ.Oq>L(ު?wy''Ŭ1r!rp0n@94gWcA䚿_f\bWjQK4i ;Sɷ7||2 5g_{K|eU-}jd: (7]Q@+ә/ DpQiQV_:X % "gFAN4[c4yw~ev` 2Gm}[@!9sǏ'ON`z~kGm }ݓ&oXV|d,v mT`>E)nƐ'9(7ϼ4B,sA'9BvUO0'Ǽ8?SÐ Pz!q%1JqEf=kWr:mR{ ͠ͅ4|}ToS Gk ^үFϯBWՌ$X7Z4D0U6zLEq]^C^ܶb4J_T=Ԝ+-&X: d0oSK)CL PzӍCbmX >K U@zycgKo;*Fjn՞ܠ%e%xeg!rÄl;^]:9< iBs;?ݶo~ǐ5%?=Z1Dܽt޸&4gf@b,z8T&Ē2(w#(}Sxc(~RRu836>*؆hU_*IxDaaȕ[U1r@д|yGH㓭h"J-J#2Mv /k(z `W0Y O'c[Oon#vf1F3/JbyThQ)~ݹsTm^daw`J.<gCfhLW8>:;Vn(E*\zUSA)SviD'3 l5aWmD{I) hZGr]v)nvZz\8Q<ی8<HN Su^e&Q9 endstream endobj 1540 0 obj << /Length1 721 /Length2 7774 /Length3 0 /Length 8360 /Filter /FlateDecode >> stream xmuePX5ndp,k@g{p],8$5!|ݷU}ut>]]ui坠nn 7'H# 8ye`TC,:g7b89{lm,=- akapu焹siҁ@n6 VI]B``@u`/M z@`nYjrR9.]j PUusÆX_/2/ 'XZ!ֶP,|SZ9^[;[#>Y?lwu#"Ԝ,!0(@ vus [Wy[/,ׇ.jK[w!NP_ȥ+]Z8YB:n,.kmٞMn0[/u%-yy@n>>~kAng X`.9YڥWVNa_F\93"4?ԥġ 2>RD|Cx򾄾ڿvQ):Y[j&gZe21B~T̈́k13Qo.{ MX᩹*RD~6#MaE~+~6v"CrUJ! 57L^2tj\suNՏ$UL3r9R zc-h"h2 Xy`-nLݡ*Y<-0#B TNB67QkF5{Fk/i vyʎbxKA]Kd!^ ,qt"&.R6lIga%/3=M.`3'p"$Q .Zn>IQ30,|*݋MFv8v]h;-2 HjTMfЏU?EU_&Va;UG-8 Lcu==t*mP7oO"%\ؑCJwGNtaXgZw)[GφJĖCKę,XO=G/qX.1fs~qAL4e/lC&FN?*2^a݁)%Xs2٦J*5'joSե8?lD>%Ct%g;ss:X #ړjʅ?%hkxMRxQgKϸ c)/nt-SU&e0nEdp9q˓,{;RS$1˜4J߻4 g4,/$,r0e5J4y˝Kӳ,| dߟ|Ib,}ĖDFUSh" ,Ӗkȗj6g=JBŧ&_Go0gVU37]2uƒCՈYɜtԨE>Q.TD}Y}e&xj ЖpT o4VئLHt[ۇ+댟-.aog.Y;)Ft*`EGڔapʓtj DuW"|Nxp:&5u;AȾ>[$+jh@Q|tW9n};?bLT1oj>!59|y4'Fme"?p /r28,{cuV,H5Spf~A.L-s+& A힕׫j_:XT$mНeC(lE&ňD>44Ҳ6*?u3R}"YLZW+2Fu<~P ߴ(|Wx;U(1PWlt=> |I] N[772w&Mo*o j\qU)RF+0R cm&QI~)a wFf5Jل0_ɿa28ؾ>ރ8ؓeUּ(6p?ײ-‰$ʝF'5vucB/bֆ `_<ʫڂTJ>xʛWcM܉aC=Dtˎ&!x(U޼ىo#$:/a1릧%ps)i#H*^wMI <rzh%NjG >O-3WXkq0:]_-{x\]b|5xN6`J 2q2)Q6kg@ڿvƿtS;{'eʇ&b횶U\D.HpO,RR{ 0Hl\OMJ5,Ai0#- e5).>wq؅[j~U`LQd@\_DZ=`>:,wRmyr^Cj2-=:-DҊEqW3^(o&@N9eH^6穨/ 5|E mgJ *:2'Frm 忧-&l=oD=%e'_`F] Wdnc jpeNYV&H7 ! D7uR0 ֍ڑV*: 7W1T0ڈiAiv݉mG0:!HZjo[_1P~na }\ *{t5Ac<(q$oF--_ Hspyg8x!!bFzz|}O``,>ۇ5e~0Ju6,8#|{]8s/?B$S,Ќ|,Ano0(`]*9z:Ι{dv&!3BKߔL<\^ftD>ڠQb gn/! S8<\Zg Qgk6_%>YD|WM>a"EhY*Ϡ4Xc& 6R@ĕRC!p;\Ɖ8Su7` 6? [S+kH¬0m6{,WDT&D8kѝr =׍@`ҿ[ܟ)ʃ:tp>J8ӫ DbhM ZZ6koX&1\lU>1O92m>`n劢O4j[h߮>ظS+ NZM %7KJR!ɶgͤ?x[~kX8pMxUvZ[MMMb49fnm1e,lLFY#\mfw.ZSqpSOP%K^934,RodQiJGܾ#'+V{f%{Vж"\t rMu"Zoc )qQd}U U:ȢғmoaB|?.a]QN/=z0).^`2 .;/~5;32u wOb{Ľ-_X\%RDyQ1ַQBjKaUT ԚV 1h-(7`~N:$Uj,D,LﴌMAJ|‡C g"5P s&i.M39cvL"DS&C6aEWne\B-h/gghg̋{Zܦ7$0~dT_l 1mvk1gV3ڐM3Xhx-EwĠ3Xlx_~8݂kF>po`XuLn؝hm2+ɨHVV9 t4e&m ^%'uތz%+/i {b"~ݴtɏ{*@8G)m,R=iR&!?uu4X4Rj+dbU+'4;y(Amx=8&^O$Ms7Pj+lM^~fǔ)v4hA%M/g56 p\ڊK@gY'} ގ-ʰlxPmQb>3uy}2P{)Ql2.Tzko45k3hSb=SĔH~S7E0_TOj{/5 j]z$j@⋯^ն!b8VoF-9帥]w jE !L )R` _HympJsZ]PJW/KО 9A;f|5ȂbAMnK]C_.2dcGuǤv[ Ag-Ggl"Z44 l܍Y@Y!;,Tqrs]`m FX&5/VC 5imNvM}r35_S8Uݵu /]r*+}C[ 9)>>ۊfx= m.PiߓfgacNĵibőW#+~ŦEG[i {AռqpE ٱ(N|*tEQR83zO(鸧w/nrˁKizђ1 V[ZӒ~j[O)6Z UI rߌ-o z11եo*DFߝYi6.U$ӄ AT4-PJx0B{%=)DB[{xcWrA#Ha17%zӷ+fKhĥ8b*売'5l414?k\'e,~y.[_ZJYw9L8'qD>}iҩM>-ܛZSWtE͜util04e-%mgYe'lCG|u~W}Qm~KyQ$" DM T9u?4R4O.];%x/L2OH{l}pN«N e2`E'0oy€ @бWF w{ŹJw鍙dRQ' MfcUcn.5uD%ȈɵM_wg)/ LࣺqpJY)362wWOg41(14l$CG_~rjl9H NR.} l=7b@jگ{&gzMr&Z٨J5[ ׇZYIFDw)^Շ_U ߾;&> stream x\Ys8~nmE}TMmUI&d،-y$y&_}"De)/@_h4RZBij 6+0NAʼnYh "Vtw,܃q4/4V0)GxY`%`XaBxS(82ķwPéL0i!Z,ԈࠦiH!:F% PF|QCMX 3G[8 %  o F*" 5+TBVx9@n*%+a:0o^YcQY'Taa 4w(8F`U2#! ܁ {2@*HI ?XW[>s`a Ճػ )xa6oASoh}%Jz `I4RM4πLbG]R(z@`!` XBר@lE^hhQM6$ˌ>ca5zMN HJBBU#7F~+_WEy<ʣs>+Lgմ( &O{au:/>)Й zR )ߊ(O'E_#ݑt f dؒd-@5R+N+fMsͰ+b4{Զ4Z?I@鸒$Ĺ-i*1ݬ𙆨jlw-Ľ vf7Ђc Z R= WKQTOa! sAT:!Rsi8jA\GishgaaϕY˹fMD BF( K+ix(9S6 4=ީwnOM=}*J˽VvË><;g驖l۔<L%/ &W 2zCЁ49LN}.nIVD%М.Kr1DQ {` ߂ܞOM^CO3*P0+(7d')+*Sk\"Վ9q)5%~!6e3+Vއ[R:wfYy|X9'12I0\&n#K:\Ӧ-"A"W 蓮d"fꇡe_[ )SX# &$ NЀh $<WJC] ';#?m 3 Ð< O=s<ߵQW:M<mYZ6t!³hEk48٥T}EC?JN|sn)@B0!/6n'K׈Hxf]`s &F} Bu;cyIX&/ha:I*uҹYX(9IKDA<-U8=J/):F b@㠐: |@E0t86q͕Ye%MAZ+KxY*>ʞ%x/(XwJNy]AڑiQ<4&'>,Ç]#hA@%mdLԺȖTa{sq9#S+${pKL(MOyaNӢA ZZFwݢO<;&QmϦ;1Yj-Mht{j$ (~a9v\MBXo?VSKʕiՠT)1&΃ z)o(ӜY 0[:(b>Yº;;,X)'WǤcS6|qKv-G%r)|uʴ4^;?,BR.:Y*.b19mUVjzlմB,)`"f1Q`9FOLHqƔk# ]4X:z$.T #hQTӌJrgcGy'S?1+V+Pfch?e%m[1I+']z$-Y$:6?XϞ/ɴj[LJ֚^ʮԳg'y=d2K)S)BDt"l\҉ %ROft<p;%0rPq9wĨx6 :&Sڮi#oY F?3dJHei2g28;`tTiS=h h^]ӧ$ 9.S|g~/˧e<,]G9,?O_ee^ק8KyZN.'/yyQʯeyUIy]YNY9/oox#`JZ;~_>)u"jFS;̞j[B|_~ Hьerx}Nn-ǣqXN.hr`UUr6V. y~1rA/[NZ؛M|I*G7M߈{!π2>3ͯ 6}:_ Ϊr4Whv}9^ndZ8Mp|ųǀ㋧}8ϛl45^b1+bH{:@؊g#td:^P\UÖao{m6/O e 0~z'; 0 ,tWKT $ܑ@A l-;k+(~<ĜX_1r07ހD}oD-H.0[ƖcK1l̾4gjZFf-:XPy3\^ieLe>^|ŏMoB9VcbjFAח73DT3P̫ϗԽt״s#W#h8|+̀mO Yzĭ'[ (X<{q lבMx -QcWuj "iQ ]s1o><{7;R魂yGsFzW'oۇѪɇoH7ǽ=*ҽc 6K-%c6c:Ny8-?~8^Vyy>`W7e5qoQh My"ߒ7K-@d@ D4GIu5N(]OGWUKԍ^>qܿnv Y:ZS (:xk7[M hssNa< ֽj I?']K'__k$lo>C79k2ECoh ]:ӱFL4DٜU꘢ud nsHK`#eEhjtK,g}{c:\'9OCG]ɍ&Ƿ+ZwPC^#PSoo[;Zu $q7v8ꚬY搄lkKa(nCz u6Oc2Hu?A>~K܈g3ȗ` ԅ ^?izů`Jj.4@+ok;$ x:]]-4YHDb"ʩ;\=rp7"7 n|M Ƙ4 7݂݈^"b$6K:OĽڂHRl irΊ| ^H~fR?#iN Q5USHʒ"iK m!kRغR5oC֕%ͤ2ˤb=MLHɸ)YHuKr$)MM|"ej ԕ\MӋmHBeJNҸg endstream endobj 1545 0 obj << /Type /ObjStm /N 100 /First 898 /Length 1881 /Filter /FlateDecode >> stream xڥX۪\E}? oU "A|$ *I{W5yHR{fת^[=S#Qڑb!rC:JGQ'F9$nQK-zFhl$D!L.0Ub8jj0*޹#sՄ0 kDrO2^@nȲzF;("&4ԗ#eDTbuT*Dhr$fS% Uv# >ropQM8=(A _!( |ueQ3^FDFeixܛ[2U4`02 $.hTI,hTə޵1pABx4+@&iK7FJ `4TѨPQ#o`ģ(A(Bf0>1E"F9>4& W1#<Q\^)c|]^KwOj/.rBܱ6q`s^魑#v{ġ84J2n4JJFO%YzMEm5}>^7<}ugY8=}ww aeu(yO~}P'Ly~BO,Nm2hC3&Ϙ<+1dFOvՙEӠM6"@ÈG1ECFL8V>z L6F~[>6ڃ$ZX{ sJ郀.~#82 /ox˛_;ؗo޾C'Ωݞ~~WޟH)]o˟k Woߵiq'u[0/jK  }be;k%Y6ab-VzʊwX,… Vr(m#r*X`/>VXX`KW=-V|Y.Xq,A>ʎRM~9W̉g'q=tR"XJ\QΘ[p@ZzDhH7/iE+,.Hm>v^jU.̙r*1IcZz\AE/a-迥%!DdEKX"Y.XY"K9u+XqXqL1FHaiLHZci;bXO^EYH,FuRl.rRn-ᶧ7EE-O䉊<[n'y_جNYF\W8gz%\dWqGx˦OŷzxOTɢ,TɢyOTIa{FAQ֘JE ^AꃷxdQ!E,Zp2RB,bq3 =T"V,sxU"VNj=*x|+V0Xa]E-XF'X/o*+xXXyx,XMg#y"EXdŊUX{Ϟcy,/&[79̢5vy?q5@wEglxQ|!XSa!) }="fl.+ f/\LJZzyy\dmA!-!Dkx{(J'D4gYBGB̚_CV>юۻ|im=>dCj;d敔XcGRv2B.[5k G<[<ȖTvDˎ+XIODC;`=vDe"V,y7/U7\ưcO?Zߊ˩T"z'H-ro5{5>wܵc욬1YHF'H -Bp.ab-#_+)Va!H*ե endstream endobj 1549 0 obj << /Type /ObjStm /N 100 /First 897 /Length 2114 /Filter /FlateDecode >> stream x}YM\7s0"> "@NAXms07O=ǦZe,"b3R[AZOIrCNK r@]?K^|q!|.)-ԆuаW8NRL؈Ia@!%8kH9$@ IX D WM%5@K1䘐q` sO!$cO9aO+W@ 60P5c3ڱh\A@1YZzQHQ]>R22eԉ40 EʔQ(RBQABQK(5(u1K`QhI,،B1e@#Q(V|dA($P B!4 5(P {P( `=z1A#HT;rJhtWRh*| ܤ5-)HU >оDŌ| X@YK\QP+=RPM\:#l5?0"4v?ڏC͸| rde:NPKG@)ǾjӪ<0PWrhACz| 9/zyP1/~a-V~: ^Ȱkx.͝N}J`}D?Z?Y[N1K2e]HZd\N3RV}Z/l.y)b )XNtzNX +Va]Xu +=y+=:x6uPbXd]O:O}Ko<Ͼ=rmcV Wsٞf>LXNL9@^i Rb9 i i 4L)U'%&$&M8#7!ބhy}L1ބx9^ѿ ѽ q&poӫ7◌g=^`eÊ;*vvt%+aYWVadukbxVÒ-s]YNXlXyVYa"Ja]Vn`-:l;Ê+,Xߗmߋ{-Gq˪l9:we9aGrt~W~1ocj=^=6Ǽն{{l~imx7}^=6{ѿI{&9~2|w3X> |ډ`e Oor"Xe" ߄  XN+fx2|3> ߄XNi%u<:߷W^iA܊FdDMfr\)2[GO; ĸâ-ֳW6r&V&d5֑:l|ݍN<;NeIӫr\+2GO?Vdfgu2Gᛱ*+,MX> ߌk3|4i`e MϷ,#۾%WKo]YNXXu}/n1?˧1 >淐ĄOcoW17ǤW:phN0Y_3f2Ԉ2qr-״|uZ;ɮX~GR+]K){t"$e^CL/l7@qۯp_׃,]{ ]-P~5ښ¸R\pW )&Y <&QUyO@FCZH/VFVz~p@յpHR\Ji兟k@TP)ARX)86i\\H2HեQ6kAKuĩ1 a(o+% endstream endobj 1579 0 obj << /Producer (pdfTeX-1.40.15) /Creator (TeX) /CreationDate (D:20151030084512+01'00') /ModDate (D:20151030084512+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014/Fink) kpathsea version 6.2.0) >> endobj 1564 0 obj << /Type /ObjStm /N 15 /First 138 /Length 552 /Filter /FlateDecode >> stream xڍTjAW>!$$-b^$CX#BnUU֥5.dKxOńؾ}&X)8CxSm20YB}Z5>b\C0~76iLm`Yf.m09Gdb183d]:CjVd{{E+^Qz!# =tn ezKnWTUXNŹkLjGM Yΰb*݊\T1VW+Xm@B޲"_Vwz{^~F~Nx '\) E.f) HA;wnvj\7wuզ6U7;-cn\?DNkWԯ_&3mnnvw0_~ڿq|oYa|0\+ endstream endobj 1580 0 obj << /Type /XRef /Index [0 1581] /Size 1581 /W [1 3 1] /Root 1578 0 R /Info 1579 0 R /ID [ ] /Length 3662 /Filter /FlateDecode >> stream x%kl]Y9[Nq|K|ﱓ8vN$;g[ˏҊF*x8"G1Ю&!FHU{ A4M7Ôg_z>k}'ǴY[ jZjZ/e F>!(gAiM]j@(Z:i-Wup,QFP'BzAh8 :P:1pt=~0N` a0΀Q03`0 ,(?)z. `x6uAg@h h\E04 ep,` ,k:X7* nk4:x6#l-< ;`Pg<"@8=kAz5@78Ep \7-pcT `z Vg"} GotHg=>{|gϼy|g=>{|g=>{|g=>{|SY=RЂe8>[28N0 ΁`0CURjA8A8 &Yp ? yjy={x{={x{={x{={x{={UmW < zS([x ,xJ/beT뿭PջqI A=fBF%:!j:![DA'M#LJt#Attݤ׉NkDt .I !Ea0Bz %L4I/MI" 4e"O<'$'!"݋IuRHO)u)ALnO|+ӓHy=sH"&>,I|J%R^o BDk1;D(Hy'R)CDJP>iOOBDvLP>ACYX ʳgc '(ϲOP%(|IAyL|(_ǪwQUP or@e >}CX7ﰜo@hg% ~寔|~݂R>JqYןl&,8 &_SfF<3@m܈E]wIM`|cݩWz45plR6{~SJ5yf?1"5}rI<[f?_tlLiYѮ٫_ m~BT'!C A_(^d}ͯ&`5 N4)=ZdWih3U_gG7tH8fNR1Y8a/ 2J4Y?|ImQNӿm8ٰ3\|7q5[Tv2J> 2Wۧ^(e~6 Bs' 7wmuPF(Ül\͑.I1)[67) &Clؖz):ewElK =s:NJRL#eUq imsWԦjlMX*39!uhJ^WJ9F ̽ usPj;uàzLT v5w'Ie_VG/=~S` !sNa0 sS`_V 6oVzTʞ.CZ4 X-l-`ŽW5@[`au.m-j{,3Gࡅb<-\z>mm-ʮTVhڐ&5 _̕OZcAaS/)%Z >Q6X*=Z-|m~6J)hvZڪ:$=nSJmJ&-yJ1ИX)ŒtoFmCi )`YmZUK)pNZ{5Y@E33~اC.4KURIx.IQ*]?iRIQ* 6p(0'Ŧ!O`N%)8n9)|Xͫp@5(D:P`ߠJ#h͠RiA'8(8.pt>)p !0 FGQ0(W)LYEyṕ`,zHV=z;4,+VYZ*RYUV º?vkulG1[ x Av.`c=31313$dcf?fcf?~~~~MKY]]bd!Fbd#b1"ƈ#b1"ƈ#b1"ƈ#VE]m />[R4lw>hĊۊXq FdCј[{{'Ѥt~\є}hj~yYXhjÏUtj(?S:Ch\ku_\[Tom7JO@mՍr`u#J֔ g/z(sZ2>ּnF7Mr endstream endobj startxref 536738 %%EOF control/doc/control.tex0000644000076500000240000001354012614620313014510 0ustar lukasstaff\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename control.info @settitle @thischapter @c use chapter name instead of title in the header of even pages @c @settitle CACSD Tools for GNU Octave @afourpaper @set VERSION 3.0.0 @finalout @c @afourwide @c %**end of header @c The following macro is used for the on-line help system, but we don't @c want lots of `See also: foo, bar, and baz' strings cluttering the @c printed manual (that information should be in the supporting text for @c each group of functions and variables). @macro seealso {args} @iftex @vskip 2pt @end iftex @ifnottex @c Texinfo @sp should work but in practice produces ugly results for HTML. @c A simple blank line produces the correct behavior. @c @sp 1 @end ifnottex @noindent @strong{See also:} \args\. @end macro @c %*** Start of TITLEPAGE @titlepage @title control @value{VERSION} @subtitle Computer-Aided Control System Design (CACSD) Tools for GNU Octave @c @subtitle @today{} @author Lukas F. Reichlin @author Thomas Vasileiou @page @vskip 0pt plus 1filll Copyright @copyright{} 2009-2015, Lukas F. Reichlin @email{lukas.reichlin@@gmail.com} This manual is generated automatically from the texinfo help strings of the package's functions. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the same conditions as for modified versions. @page @c @unnumbered Preface @paragraphindent 0 @chapheading Preface The @acronym{GNU} Octave control package from version 2 onwards was developed by Lukas F. Reichlin with major contributions by Thomas Vasileiou and is based on the proven open-source library @acronym{SLICOT}. This new package is intended as a replacement for control-1.0.11 by A. Scottedward Hodel and his students. Its main features are: @itemize @item Reliable solvers for Lyapunov, Sylvester and algebraic Riccati equations. @item Pole placement techniques as well as @tex $ H_2 $ @end tex and @tex $ H_{\infty} $ @end tex synthesis methods. @item Frequency-weighted model and controller reduction. @item System identification by subspace methods. @item Overloaded operators due to the use of classes introduced with Octave 3.2. @item Support for descriptor state-space models and non-proper transfer functions. @item Support for multiple systems in time- or frequency-domain plots. @item Improved @acronym{MATLAB} compatibility. @end itemize @sp 3 @heading Acknowledgment The author is indebted to several people and institutions who helped him to achieve his goals. I am particularly grateful to Luca Favatella who introduced me to Octave development as well as discussed and revised my early draft code with great patience. The continued support from the @acronym{FHNW} University of Applied Sciences Northwestern Switzerland has also been important. Namely, sincere thanks are given to my advisors, professors Hans Buchmann and J@"urg Peter Keller. Furthermore, I thank the @acronym{SLICOT} authors Peter Benner, Vasile Sima and Andras Varga for their advice. Finally, I appreciate the feedback, bug reports and patches I have received from various people. The names of all contributors should be listed in the @acronym{NEWS} file. @sp 3 @heading Using the help function Some functions of the control package are listed with the somewhat cryptic prefixes @code{@@lti/} or @code{@@iddata/}. These prefixes are only needed to view the help text of the function, e.g. @w{@code{help norm}} shows the built-in function while @w{@code{help @@lti/norm}} shows the overloaded function for @acronym{LTI} systems. Note that there are @acronym{LTI} functions like @code{pole} that have no built-in equivalent. The same is true for @acronym{IDDATA} functions like @code{nkshift}. When just using the function, the leading @code{@@lti/} must @strong{not} be typed. Octave selects the right function automatically. So one can type @w{@code{norm (sys, inf)}} and @w{@code{norm (matrix, inf)}} regardless of the class of the argument. @sp 3 @heading Bugs! To err is human, and software is written by humans. Therefore, any larger piece of software is likely to contain bugs. If you find a bug in the control package, please take the time to report your findings! Feedback of any kind is highly appreciated by the author and vital for further enhancement of the software. Bug reports are to be sent to the Octave bug tracker, the mailing lists or directly to the author's e-mail: @email{lukas.reichlin@@gmail.com} @page @heading Distribution The @acronym{GNU} Octave control package is @dfn{free} software. Free software is a matter of the users' freedom to run, copy, distribute, study, change and improve the software. This means that everyone is free to use it and free to redistribute it on certain conditions. The @acronym{GNU} Octave control package is not, however, in the public domain. It is copyrighted and there are restrictions on its distribution, but the restrictions are designed to ensure that others will have the same freedom to use and redistribute Octave that you have. The precise conditions can be found in the @acronym{GNU} General Public License that comes with the @acronym{GNU} Octave control package and that also appears in @ref{Copying}. To download a copy of control, please visit @url{http://octave.sourceforge.net/control/}. @end titlepage @c %*** End of TITLEPAGE @headings double @contents @c @chapter Function Reference @include functions.texi @end @include gpl.texi @c FIXME: Index is nonexistent @node Function Index @unnumbered Function Index @printindex fn @bye control/doc/functions.texi0000644000076500000240000073562512614620313015230 0ustar lukasstaff@c This file is generated automatically @c Do not edit @chapter Examples @section MDSSystem @findex MDSSystem Robust control of a mass-damper-spring system. Type @code{which MDSSystem} to locate, @code{edit MDSSystem} to open and simply @code{MDSSystem} to run the example file. @section optiPID @findex optiPID Numerical optimization of a PID controller using an objective function. The objective function is located in the file @command{optiPIDfun}. Type @code{which optiPID} to locate, @code{edit optiPID} to open and simply @code{optiPID} to run the example file. In this example called @code{optiPID}, loosely based on [1], it is assumed that the plant @iftex @tex $$ P(s) = {1 \over (s^{2} + s + 1)\ (s + 1)^{4}} $$ @end tex @end iftex @ifnottex @example 1 P(s) = ----------------------- (s^2 + s + 1) (s + 1)^4 @end example @end ifnottex is controlled by a PID controller with second-order roll-off @iftex @tex $$ C(s) = k_p \ (1 + {1 \over T_i \ s} + T_d \ s) \ {1 \over (\tau \ s + 1)^{2}} $$ @end tex @end iftex @ifnottex @example 1 1 C(s) = Kp (1 + ---- + Td s) ------------- Ti s (tau s + 1)^2 @end example @end ifnottex in the usual negative feedback structure @iftex @tex $$ T(s) = {L(s) \over 1 + L(s)} = {P(s) \ C(s) \over 1 + P(s) \ C(s)} $$ @end tex @end iftex @ifnottex @example L(s) P(s) C(s) T(s) = -------- = ------------- 1 + L(s) 1 + P(s) C(s) @end example @end ifnottex The plant P(s) is of higher order but benign. The initial values for the controller parameters @iftex @tex $k_p$, $T_i$ and $T_d$ @end tex @end iftex @ifnottex Kp, Ti and Td @end ifnottex are obtained by applying the Astroem and Haegglund rules [2]. These values are to be improved using a numerical optimization as shown below. As with all numerical methods, this approach can never guarantee that a proposed solution is a global minimum. Therefore, good initial guesses for the parameters to be optimized are very important. The Octave function @code{fminsearch} minimizes the objective function @var{J}, which is chosen to be @iftex @tex $$ J(k_p, T_i, T_d) = \mu_1 \cdot \int_0^{\infty} \! t \ |e(t)| \ dt \ + \ \mu_2 \cdot (|| y(t) ||_{\infty} - 1) \ + \ \mu_3 \cdot ||S(jw)||_{\infty} $$ @end tex @end iftex @ifnottex @example inf J(Kp, Ti, Td) = mu1 INT t |e(t)| dt + mu2 (||y(t)|| - 1) + mu3 ||S(jw)|| 0 inf inf @end example @end ifnottex This particular objective function penalizes the integral of time-weighted absolute error @iftex @tex $$ ITAE = \int_0^{\infty} \! t \ |e(t)| \ dt $$ @end tex @end iftex @ifnottex @example inf ITAE = INT t |e(t)| dt 0 @end example @end ifnottex and the maximum overshoot @iftex @tex $$ y_{max} - 1 = || y(t) ||_{\infty} - 1 $$ @end tex @end iftex @ifnottex @example y - 1 = ||y(t)|| - 1 max inf @end example @end ifnottex to a unity reference step @iftex @tex $r(t) = \varepsilon (t)$ @end tex @end iftex in the time domain. In the frequency domain, the sensitivity @iftex @tex $$ M_s = ||S(jw)||_{\infty} $$ @end tex @end iftex @ifnottex @example Ms = ||S(jw)|| inf @end example @end ifnottex is minimized for good robustness, where S(jw) denotes the @emph{sensitivity} transfer function @iftex @tex $$ S(s) = {1 \over 1 + L(s)} = {1 \over 1 + P(s) \ C(s)} $$ @end tex @end iftex @ifnottex @example 1 1 S(s) = -------- = ------------- 1 + L(s) 1 + P(s) C(s) @end example @end ifnottex The constants @iftex @tex $\mu_1$, $\mu_2$ and $\mu_3$ @end tex @end iftex @ifnottex mu1, mu2 and mu3 @end ifnottex are @emph{relative weighting factors} or @guillemetleft{}tuning knobs@guillemetright{} which reflect the importance of the different design goals. Varying these factors corresponds to changing the emphasis from, say, high performance to good robustness. The main advantage of this approach is the possibility to explore the tradeoffs of the design problem in a systematic way. In a first approach, all three design objectives are weigthed equally. In subsequent iterations, the parameters @iftex @tex $\mu_1 = 1$, $\mu_2 = 10$ and $\mu_3 = 20$ @end tex @end iftex @ifnottex mu1 = 1, mu2 = 10 and mu3 = 20 @end ifnottex are found to yield satisfactory closed-loop performance. This controller results in a system with virtually no overshoot and a phase margin of 64 degrees. @*@strong{References}@* [1] Guzzella, L. @cite{Analysis and Design of SISO Control Systems}, VDF Hochschulverlag, ETH Zurich, 2007@* [2] Astroem, K. and Haegglund, T. @cite{PID Controllers: Theory, Design and Tuning}, Second Edition, Instrument Society of America, 1995 @section Anderson @findex Anderson Frequency-weighted coprime factorization controller reduction. @section Madievski @findex Madievski Demonstration of frequency-weighted controller reduction. The system considered in this example has been studied by Madievski and Anderson [1] and comprises four spinning disks. The disks are connected by a flexible rod, a motor applies torque to the third disk, and the angular displacement of the first disk is the variable of interest. The state-space model of eighth order is non-minimumphase and unstable. The continuous-time LQG controller used in [1] is open-loop stable and of eighth order like the plant. This eighth-order controller shall be reduced by frequency-weighted singular perturbation approximation (SPA). The major aim of this reduction is the preservation of the closed-loop transfer function. This means that the error in approximation of the controller @var{K} by the reduced-order controller @var{Kr} is minimized by @iftex @tex $$ \underset{K_r}{\min} \ || W \ (K - K_r) \ V ||_{\infty} $$ @end tex @end iftex @ifnottex @example min ||W (K-Kr) V|| Kr inf @end example @end ifnottex where weights @var{W} and @var{V} are dictated by the requirement to preserve (as far as possible) the closed-loop transfer function. In minimizing the error, they cause the approximation process for @var{K} to be more accurate at certain frequencies. Suggested by [1] is the use of the following stability and performance enforcing weights: @iftex @tex $$ W = (I - G K)^{-1} G, \qquad V = (I - G K)^{-1} $$ @end tex @end iftex @ifnottex @example -1 -1 W = (I - G K) G, V = (I - G K) @end example @end ifnottex This example script reduces the eighth-order controller to orders four and two by the function call @code{Kr = spaconred (G, K, nr, 'feedback', '-')} where argument @var{nr} denotes the desired order (4 or 2). The key-value pair @code{'feedback', '-'} allows the reduction of negative feedback controllers while the default setting expects positive feedback controllers. The frequency responses of the original and reduced-order controllers are depicted in figure 1, the step responses of the closed loop in figure 2. There is no visible difference between the step responses of the closed-loop systems with original (blue) and fourth order (green) controllers. The second order controller (red) causes ripples in the step response, but otherwise the behavior of the system is unaltered. This leads to the conclusion that function @command{spaconred} is well suited to reduce the order of controllers considerably, while stability and performance are retained. @*@strong{Reference}@* [1] Madievski, A.G. and Anderson, B.D.O. @cite{Sampled-Data Controller Reduction Procedure}, IEEE Transactions of Automatic Control, Vol. 40, No. 11, November 1995 @section VLFamp @findex VLFamp @deftypefn{Function File} {} VLFamp @deftypefnx{Function File} {@var{result} =} VLFamp (@var{verbose}) Calculations on a two stage preamp for a multi-turn, air-core solenoid loop antenna for the reception of signals below 30kHz. The Octave Control Package functions are used extensively to approximate the behavior of operational amplifiers and passive electrical circuit elements. This example presents several 'screen' pages of documentation of the calculations and some reasoning about why. Plots of the results are presented in most cases. The process is to display a 'screen' page of text followed by the calculation and a 'Press return to continue' message. To proceed in the example, press return. ^C to exit. At one point in the calculations, the process may seem to hang, but, this is because of extensive calculations. The returned transfer function is more than 100 characters long so will wrap in screens that are narrow and appear jumbled. @end deftypefn @chapter Linear Time Invariant Models @section dss @findex dss @deftypefn {Function File} {@var{sys} =} dss (@var{sys}) @deftypefnx {Function File} {@var{sys} =} dss (@var{d}, @dots{}) @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @dots{}) @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}, @dots{}) Create or convert to descriptor state-space model. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to state-space. @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Output matrix (p-by-n). @item d Feedthrough matrix (p-by-m). @item e Descriptor matrix (n-by-n). @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (dss)} for more information. @end table @strong{Outputs} @table @var @item sys Descriptor state-space model. @end table @strong{Option Keys and Values} @table @var @item 'a', 'b', 'c', 'd', 'e' State-space matrices. See 'Inputs' for details. @item 'stname' The name of the states in @var{sys}. Cell vector containing strings for each state. Default names are @code{@{'x1', 'x2', ...@}} @item 'scaled' Logical. If set to true, no automatic scaling is used, e.g. for frequency response plots. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @strong{Equations} @example @group . E x = A x + B u y = C x + D u @end group @end example @seealso{ss, tf} @end deftypefn @section filt @findex filt @deftypefn {Function File} {@var{sys} =} filt (@var{num}, @var{den}, @dots{}) @deftypefnx {Function File} {@var{sys} =} filt (@var{num}, @var{den}, @var{tsam}, @dots{}) Create discrete-time transfer function model from data in DSP format. @strong{Inputs} @table @var @item num Numerator or cell of numerators. Each numerator must be a row vector containing the coefficients of the polynomial in ascending powers of z^-1. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is accepted as well. @item den Denominator or cell of denominators. Each denominator must be a row vector containing the coefficients of the polynomial in ascending powers of z^-1. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is accepted as well. @item tsam Sampling time in seconds. If @var{tsam} is not specified, default value -1 (unspecified) is taken. @item @dots{} Optional pairs of properties and values. Type @command{set (filt)} for more information. @end table @strong{Outputs} @table @var @item sys Discrete-time transfer function model. @end table @strong{Option Keys and Values} @table @var @item 'num' Numerator. See 'Inputs' for details. @item 'den' Denominator. See 'Inputs' for details. @item 'tfvar' String containing the transfer function variable. @item 'inv' Logical. True for negative powers of the transfer function variable. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @strong{Example} @example @group 3 z^-1 H(z^-1) = ------------------- 1 + 4 z^-1 + 2 z^-2 octave:1> H = filt ([0, 3], [1, 4, 2]) Transfer function 'H' from input 'u1' to output ... 3 z^-1 y1: ------------------- 1 + 4 z^-1 + 2 z^-2 Sampling time: unspecified Discrete-time model. @end group @end example @seealso{tf} @end deftypefn @section frd @findex frd @deftypefn {Function File} {@var{sys} =} frd (@var{sys}) @deftypefnx {Function File} {@var{sys} =} frd (@var{sys}, @var{w}) @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @dots{}) @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @var{tsam}, @dots{}) Create or convert to frequency response data. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to frequency response data. If second argument @var{w} is omitted, the interesting frequency range is calculated by the zeros and poles of @var{sys}. @item H Frequency response array (p-by-m-by-lw). H(i,j,k) contains the response from input j to output i at frequency k. In the SISO case, a vector (lw-by-1) or (1-by-lw) is accepted as well. @item w Frequency vector (lw-by-1) in radian per second [rad/s]. Frequencies must be in ascending order. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (frd)} for more information. @end table @strong{Outputs} @table @var @item sys Frequency response data object. @end table @strong{Option Keys and Values} @table @var @item 'H' Frequency response array. See 'Inputs' for details. @item 'w' Frequency vector. See 'Inputs' for details. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @seealso{dss, ss, tf} @end deftypefn @section ss @findex ss @deftypefn {Function File} {@var{sys} =} ss (@var{sys}) @deftypefnx {Function File} {@var{sys} =} ss (@var{d}, @dots{}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @dots{}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @dots{}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @dots{}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}, @dots{}) Create or convert to state-space model. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to state-space. @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Output matrix (p-by-n). If @var{c} is empty @code{[]} or not specified, an identity matrix is assumed. @item d Feedthrough matrix (p-by-m). If @var{d} is empty @code{[]} or not specified, a zero matrix is assumed. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (ss)} for more information. @end table @strong{Outputs} @table @var @item sys State-space model. @end table @strong{Option Keys and Values} @table @var @item 'a', 'b', 'c', 'd', 'e' State-space matrices. See 'Inputs' for details. @item 'stname' The name of the states in @var{sys}. Cell vector containing strings for each state. Default names are @code{@{'x1', 'x2', ...@}} @item 'scaled' Logical. If set to true, no automatic scaling is used, e.g. for frequency response plots. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @strong{Equations} @example @group . x = A x + B u y = C x + D u @end group @end example @strong{Example} @example @group octave:1> a = [1 2 3; 4 5 6; 7 8 9]; octave:2> b = [10; 11; 12]; octave:3> stname = @{'V', 'A', 'kJ'@}; octave:4> sys = ss (a, b, 'stname', stname) @end group @end example @example @group sys.a = V A kJ V 1 2 3 A 4 5 6 kJ 7 8 9 @end group @end example @example @group sys.b = u1 V 10 A 11 kJ 12 @end group @end example @example @group sys.c = V A kJ y1 1 0 0 y2 0 1 0 y3 0 0 1 @end group @end example @example @group sys.d = u1 y1 0 y2 0 y3 0 Continuous-time model. octave:5> @end group @end example @seealso{tf, dss} @end deftypefn @section tf @findex tf @deftypefn {Function File} {@var{s} =} tf (@var{'s'}) @deftypefnx {Function File} {@var{z} =} tf (@var{'z'}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} tf (@var{sys}) @deftypefnx {Function File} {@var{sys} =} tf (@var{mat}, @dots{}) @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @dots{}) @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @var{tsam}, @dots{}) Create or convert to transfer function model. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to transfer function. @item mat Gain matrix to be converted to static transfer function. @item num Numerator or cell of numerators. Each numerator must be a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is accepted as well. @item den Denominator or cell of denominators. Each denominator must be a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is accepted as well. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (tf)} for more information. @end table @strong{Outputs} @table @var @item sys Transfer function model. @end table @strong{Option Keys and Values} @table @var @item 'num' Numerator. See 'Inputs' for details. @item 'den' Denominator. See 'Inputs' for details. @item 'tfvar' String containing the transfer function variable. @item 'inv' Logical. True for negative powers of the transfer function variable. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @strong{Example} @example @group octave:1> s = tf ('s'); octave:2> G = 1/(s+1) Transfer function 'G' from input 'u1' to output ... 1 y1: ----- s + 1 Continuous-time model. @end group @end example @example @group octave:3> z = tf ('z', 0.2); octave:4> H = 0.095/(z-0.9) Transfer function 'H' from input 'u1' to output ... 0.095 y1: ------- z - 0.9 Sampling time: 0.2 s Discrete-time model. @end group @end example @example @group octave:5> num = @{[1, 5, 7], [1]; [1, 7], [1, 5, 5]@}; octave:6> den = @{[1, 5, 6], [1, 2]; [1, 8, 6], [1, 3, 2]@}; octave:7> sys = tf (num, den) @end group @end example @example @group Transfer function 'sys' from input 'u1' to output ... s^2 + 5 s + 7 y1: ------------- s^2 + 5 s + 6 s + 7 y2: ------------- s^2 + 8 s + 6 @end group @end example @example @group Transfer function 'sys' from input 'u2' to output ... 1 y1: ----- s + 2 s^2 + 5 s + 5 y2: ------------- s^2 + 3 s + 2 Continuous-time model. octave:8> @end group @end example @seealso{filt, ss, dss} @end deftypefn @section zpk @findex zpk @deftypefn {Function File} {@var{s} =} zpk (@var{'s'}) @deftypefnx {Function File} {@var{z} =} zpk (@var{'z'}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{sys}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{k}, @dots{}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @dots{}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) Create transfer function model from zero-pole-gain data. This is just a stop-gap compatibility wrapper since zpk models are not yet implemented. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to transfer function. @item z Cell of vectors containing the zeros for each channel. z@{i,j@} contains the zeros from input j to output i. In the SISO case, a single vector is accepted as well. @item p Cell of vectors containing the poles for each channel. p@{i,j@} contains the poles from input j to output i. In the SISO case, a single vector is accepted as well. @item k Matrix containing the gains for each channel. k(i,j) contains the gain from input j to output i. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (tf)} for more information. @end table @strong{Outputs} @table @var @item sys Transfer function model. @end table @seealso{tf, ss, dss, frd} @end deftypefn @chapter Model Data Access @section @@lti/dssdata @findex dssdata @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}) @deftypefnx {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}, @var{[]}) Access descriptor state-space model data. Argument @var{sys} is not limited to descriptor state-space models. If @var{sys} is not a descriptor state-space model, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item [] In case @var{sys} is not a dss model (descriptor matrix @var{e} empty), @code{dssdata (sys, [])} returns the empty element @code{e = []} whereas @code{dssdata (sys)} returns the identity matrix @code{e = eye (size (a))}. @end table @strong{Outputs} @table @var @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Measurement matrix (p-by-n). @item d Feedthrough matrix (p-by-m). @item e Descriptor matrix (n-by-n). @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/filtdata @findex filtdata @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}) @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}, @var{"vector"}) Access discrete-time transfer function data in DSP format. Argument @var{sys} is not limited to transfer function models. If @var{sys} is not a transfer function, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of discrete-time @acronym{LTI} model. @item "v", "vector" For SISO models, return @var{num} and @var{den} directly as column vectors instead of cells containing a single column vector. @end table @strong{Outputs} @table @var @item num Cell of numerator(s). Each numerator is a row vector containing the coefficients of the polynomial in ascending powers of z^-1. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item den Cell of denominator(s). Each denominator is a row vector containing the coefficients of the polynomial in ascending powers of z^-1. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item tsam Sampling time in seconds. If @var{tsam} is not specified, -1 is returned. @end table @end deftypefn @section @@lti/frdata @findex frdata @deftypefn {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}) @deftypefnx {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}, @var{"vector"}) Access frequency response data. Argument @var{sys} is not limited to frequency response data objects. If @var{sys} is not a frd object, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item "v", "vector" In case @var{sys} is a SISO model, this option returns the frequency response as a column vector (lw-by-1) instead of an array (p-by-m-by-lw). @end table @strong{Outputs} @table @var @item H Frequency response array (p-by-m-by-lw). H(i,j,k) contains the response from input j to output i at frequency k. In the SISO case, a vector (lw-by-1) is possible as well. @item w Frequency vector (lw-by-1) in radian per second [rad/s]. Frequencies are in ascending order. @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/get @findex get @deftypefn {Function File} {} get (@var{sys}) @deftypefnx {Function File} {@var{value} =} get (@var{sys}, @var{"key"}) @deftypefnx {Function File} {[@var{val1}, @var{val2}, @dots{}] =} get (@var{sys}, @var{"key1"}, @var{"key2"}, @dots{}) Access key values of @acronym{LTI} objects. @end deftypefn @section @@lti/set @findex set @deftypefn {Function File} {} set (@var{sys}) @deftypefnx {Function File} {} set (@var{sys}, @var{"key"}, @var{value}, @dots{}) @deftypefnx {Function File} {@var{retsys} =} set (@var{sys}, @var{"key"}, @var{value}, @dots{}) Set or modify properties of @acronym{LTI} objects. If no return argument @var{retsys} is specified, the modified @acronym{LTI} object is stored in input argument @var{sys}. @command{set} can handle multiple properties in one call: @code{set (sys, 'key1', val1, 'key2', val2, 'key3', val3)}. @code{set (sys)} prints a list of the object's key names. @end deftypefn @section @@lti/ssdata @findex ssdata @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}] =} ssdata (@var{sys}) Access state-space model data. Argument @var{sys} is not limited to state-space models. If @var{sys} is not a state-space model, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @end table @strong{Outputs} @table @var @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Measurement matrix (p-by-n). @item d Feedthrough matrix (p-by-m). @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/tfdata @findex tfdata @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}) @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"vector"}) @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"tfpoly"}) Access transfer function data. Argument @var{sys} is not limited to transfer function models. If @var{sys} is not a transfer function, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item "v", "vector" For SISO models, return @var{num} and @var{den} directly as column vectors instead of cells containing a single column vector. @end table @strong{Outputs} @table @var @item num Cell of numerator(s). Each numerator is a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item den Cell of denominator(s). Each denominator is a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/zpkdata @findex zpkdata @deftypefn {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}) @deftypefnx {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}, @var{"v"}) Access zero-pole-gain data. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item "v", "vector" For SISO models, return @var{z} and @var{p} directly as column vectors instead of cells containing a single column vector. @end table @strong{Outputs} @table @var @item z Cell of column vectors containing the zeros for each channel. z@{i,j@} contains the zeros from input j to output i. @item p Cell of column vectors containing the poles for each channel. p@{i,j@} contains the poles from input j to output i. @item k Matrix containing the gains for each channel. k(i,j) contains the gain from input j to output i. @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @chapter Model Conversions @section @@lti/c2d @findex c2d @deftypefn {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{method}) @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) Convert the continuous @acronym{LTI} model into its discrete-time equivalent. @strong{Inputs} @table @var @item sys Continuous-time @acronym{LTI} model. @item tsam Sampling time in seconds. @item method Optional conversion method. If not specified, default method @var{"zoh"} is taken. @table @var @item 'zoh' Zero-order hold or matrix exponential. @item 'tustin', 'bilin' Bilinear transformation or Tustin approximation. @item 'prewarp' Bilinear transformation with pre-warping at frequency @var{w0}. @item 'matched' Matched pole/zero method. @end table @end table @strong{Outputs} @table @var @item sys Discrete-time @acronym{LTI} model. @end table @end deftypefn @section @@lti/d2c @findex d2c @deftypefn {Function File} {@var{sys} =} d2c (@var{sys}) @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{method}) @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{'prewarp'}, @var{w0}) Convert the discrete @acronym{LTI} model into its continuous-time equivalent. @strong{Inputs} @table @var @item sys Discrete-time @acronym{LTI} model. @item method Optional conversion method. If not specified, default method @var{"zoh"} is taken. @table @var @item 'zoh' Zero-order hold or matrix logarithm. @item 'tustin', 'bilin' Bilinear transformation or Tustin approximation. @item 'prewarp' Bilinear transformation with pre-warping at frequency @var{w0}. @item 'matched' Matched pole/zero method. @end table @end table @strong{Outputs} @table @var @item sys Continuous-time @acronym{LTI} model. @end table @end deftypefn @section @@lti/d2d @findex d2d @deftypefn {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{method}) @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) Resample discrete-time @acronym{LTI} model to sampling time @var{tsam}. @strong{Inputs} @table @var @item sys Discrete-time @acronym{LTI} model. @item tsam Desired sampling time in seconds. @item method Optional conversion method. If not specified, default method @var{"zoh"} is taken. @table @var @item 'zoh' Zero-order hold or matrix logarithm. @item 'tustin', 'bilin' Bilinear transformation or Tustin approximation. @item 'prewarp' Bilinear transformation with pre-warping at frequency @var{w0}. @item 'matched' Matched pole/zero method. @end table @end table @strong{Outputs} @table @var @item sys Resampled discrete-time @acronym{LTI} model with sampling time @var{tsam}. @end table @end deftypefn @section @@lti/prescale @findex prescale @deftypefn {Function File} {[@var{scaledsys}, @var{info}] =} prescale (@var{sys}) Scale state-space model. The scaled model @var{scaledsys} is equivalent to @var{sys}, but the state vector is scaled by diagonal transformation matrices in order to increase the accuracy of subsequent numerical computations. Frequency response commands perform automatic scaling unless model property @var{scaled} is set to @var{true}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @end table @strong{Outputs} @table @var @item scaledsys Scaled state-space model. @item info Structure containing additional information. @item info.SL Left scaling factors. @code{Tl = diag (info.SL)}. @item info.SR Right scaling factors. @code{Tr = diag (info.SR)}. @end table @strong{Equations} @example @group Es = Tl * E * Tr As = Tl * A * Tr Bs = Tl * B Cs = C * Tr Ds = D @end group @end example For proper state-space models, @var{Tl} and @var{Tr} are inverse of each other. @strong{Algorithm}@* Uses SLICOT TB01ID and TG01AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.}. @end deftypefn @section @@lti/xperm @findex xperm @deftypefn {Function File} {@var{retsys} =} xperm (@var{sys}, @var{idx}) Reorder states in state-space models. @strong{Inputs} @table @var @item sys State-space model. @item idx Vector containing the state indices in the desired order. Alternatively, a cell vector containing the state names is possible as well. See @code{sys.stname}. State names only work if they were assigned explicitly before, i.e. @code{sys.stname} contains no empty strings. Note that if certain state indices of @var{sys} are missing or appear multiple times in @var{idx}, these states will be pruned or duplicated accordingly in the resulting state-space model @var{retsys}. @end table @strong{Outputs} @table @var @item retsys Resulting state-space model with states reordered according to @var{idx}. @end table @end deftypefn @chapter Model Interconnections @section append @findex append @deftypefn {Function File} {@var{sys} =} append (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) Group @acronym{LTI} models by appending their inputs and outputs. @end deftypefn @section @@lti/blkdiag @findex blkdiag @deftypefn {Function File} {@var{sys} =} blkdiag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) Block-diagonal concatenation of @acronym{LTI} models. @end deftypefn @section @@lti/connect @findex connect @deftypefn {Function File} {@var{sys} =} connect (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{inputs}, @var{outputs}) @deftypefnx {Function File} {@var{sys} =} connect (@var{sys}, @var{cm}, @var{inputs}, @var{outputs}) Name-based or index-based interconnections between the inputs and outputs of @acronym{LTI} models. @strong{Inputs} @table @var @item sys1, @dots{}, sysN @acronym{LTI} models to be connected. The properties 'inname' and 'outname' of each model should be set according to the desired input-output connections. @item inputs For name-based interconnections, string or cell of strings containing the names of the inputs to be kept. The names must be part of the properties 'ingroup' or 'inname'. For index-based interconnections, vector containing the indices of the inputs to be kept. @item outputs For name-based interconnections, string or cell of strings containing the names of the outputs to be kept. The names must be part of the properties 'outgroup' or 'outname'. For index-based interconnections, vector containing the indices of the outputs to be kept. @item cm Connection matrix (not name-based). Each row of the matrix represents a summing junction. The first column holds the indices of the inputs to be summed with outputs of the subsequent columns. The output indices can be negative, if the output is to be substracted, or zero. For example, the row @example [2 0 3 -4 0] @end example or @example [2 -4 3] @end example will sum input u(2) with outputs y(3) and y(4) as @example u(2) + y(3) - y(4). @end example @end table @strong{Outputs} @table @var @item sys Resulting interconnected system with outputs @var{outputs} and inputs @var{inputs}. @end table @seealso{sumblk} @end deftypefn @section @@lti/feedback @findex feedback @deftypefn {Function File} {@var{sys} =} feedback (@var{sys1}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{"+"}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{"+"}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}, @var{"+"}) Feedback connection of two @acronym{LTI} models. @strong{Inputs} @table @var @item sys1 @acronym{LTI} model of forward transmission. @code{[p1, m1] = size (sys1)}. @item sys2 @acronym{LTI} model of backward transmission. If not specified, an identity matrix of appropriate size is taken. @item feedin Vector containing indices of inputs to @var{sys1} which are involved in the feedback loop. The number of @var{feedin} indices and outputs of @var{sys2} must be equal. If not specified, @code{1:m1} is taken. @item feedout Vector containing indices of outputs from @var{sys1} which are to be connected to @var{sys2}. The number of @var{feedout} indices and inputs of @var{sys2} must be equal. If not specified, @code{1:p1} is taken. @item "+" Positive feedback sign. If not specified, @var{"-"} for a negative feedback interconnection is assumed. @var{+1} and @var{-1} are possible as well, but only from the third argument onward due to ambiguity. @end table @strong{Outputs} @table @var @item sys Resulting @acronym{LTI} model. @end table @strong{Block Diagram} @example @group u + +--------+ y ------>(+)----->| sys1 |-------+-------> ^ - +--------+ | | | | +--------+ | +-------| sys2 |<------+ +--------+ @end group @end example @end deftypefn @section @@lti/lft @findex lft @deftypefn {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}) @deftypefnx {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}, @var{nu}, @var{ny}) Linear fractional tranformation, also known as Redheffer star product. @strong{Inputs} @table @var @item sys1 Upper @acronym{LTI} model. @item sys2 Lower @acronym{LTI} model. @item nu The last nu inputs of @var{sys1} are connected with the first nu outputs of @var{sys2}. If not specified, @code{min (m1, p2)} is taken. @item ny The last ny outputs of @var{sys1} are connected with the first ny inputs of @var{sys2}. If not specified, @code{min (p1, m2)} is taken. @end table @strong{Outputs} @table @var @item sys Resulting @acronym{LTI} model. @end table @strong{Block Diagram} @example @group .............sys.............. : +--------+ : w1 ------------>| |------------> z1 : | sys1 | : : u +---->| |-----+ y : : | +--------+ | : Lower LFT : | | : : | +--------+ | : lft (sys1, sys2) : +-----| sys2 |<----+ : : +--------+ : :............................: @end group @end example @example @group .............sys.............. : +--------+ : : u +---->| sys1 |-----+ y : : | +--------+ | : Upper LFT : | | : : | +--------+ | : lft (sys1, sys2) : +-----| |<----+ : : | sys2 | : z2 <------------| |<------------ w2 : +--------+ : :............................: @end group @end example @example @group .............sys.............. : +--------+ : w1 ------------>| |------------> z1 : | sys1 | : : u +---->| |-----+ y : : | +--------+ | : : | | : lft (sys1, sys2, nu, ny) : | +--------+ | : : +-----| |<----+ : : | sys2 | : z2 <------------| |<------------ w2 : +--------+ : :............................: @end group @end example @end deftypefn @section @@lti/mconnect @findex mconnect @deftypefn {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}) @deftypefnx {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}, @var{inputs}, @var{outputs}) Arbitrary interconnections between the inputs and outputs of an @acronym{LTI} model. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item m Connection matrix. Each row belongs to an input and each column represents an output. @item inputs Vector of indices of those inputs which are retained. If not specified, all inputs are kept. @item outputs Vector of indices of those outputs which are retained. If not specified, all outputs are kept. @end table @strong{Outputs} @table @var @item sys Interconnected system. @end table @strong{Example} @example @group Solve the system equations of y(t) = G e(t) e(t) = u(t) + M y(t) in order to build y(t) = H u(t) The matrix M for a (p-by-m) system G has m rows and p columns (m-by-p). Example for a 3x2 system: u1 = -1*y1 + 5*y2 + 0*y3 u2 = pi*y1 + 0*y2 - 7*y3 | -1 5 0 | M = | pi 0 7 | @end group @end example @end deftypefn @section @@lti/parallel @findex parallel @deftypefn{Function File} {@var{sys} =} parallel (@var{sys1}, @var{sys2}) Parallel connection of two @acronym{LTI} systems. @strong{Block Diagram} @example @group .......................... : +--------+ : : +-->| sys1 |---+ : u : | +--------+ | + : y -------+ O---------> : | +--------+ | + : : +-->| sys2 |---+ : : +--------+ : :.........sys............: sys = parallel (sys1, sys2) @end group @end example @end deftypefn @section @@lti/series @findex series @deftypefn {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}) @deftypefnx {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}, @var{outputs1}, @var{inputs2}) Series connection of two @acronym{LTI} models. @strong{Block Diagram} @example @group ..................................... u : +--------+ y1 u2 +--------+ : y ------>| sys1 |---------->| sys2 |-------> : +--------+ +--------+ : :................sys................. sys = series (sys1, sys2) @end group @end example @example @group ..................................... : v2 +--------+ : : ---------->| | : y : +--------+ y1 u2 | sys2 |-------> u : | |---------->| | : ------>| sys1 | z1 +--------+ : : | |----------> : : +--------+ : :................sys................. outputs1 = [1] inputs2 = [2] sys = series (sys1, sys2, outputs1, inputs2) @end group @end example @end deftypefn @section sumblk @findex sumblk @deftypefn{Function File} {@var{S} =} sumblk (@var{formula}) @deftypefnx{Function File} {@var{S} =} sumblk (@var{formula}, @var{n}) Create summing junction @var{S} from string @var{formula} for name-based interconnections. @strong{Inputs} @table @var @item formula String containing the formula of the summing junction, e.g. @code{e = r - y + d} @item n Signal size. Default value is 1. @end table @strong{Outputs} @table @var @item S State-space model of the summing junction. @end table @strong{Example} @example @group octave:1> S = sumblk ('e = r - y + d') S.d = r y d e 1 -1 1 Static gain. octave:2> S = sumblk ('e = r - y + d', 2) S.d = r1 r2 y1 y2 d1 d2 e1 1 0 -1 0 1 0 e2 0 1 0 -1 0 1 Static gain. @end group @end example @seealso{connect} @end deftypefn @chapter Model Characteristics @section ctrb @findex ctrb @deftypefn {Function File} {@var{co} =} ctrb (@var{sys}) @deftypefnx {Function File} {@var{co} =} ctrb (@var{a}, @var{b}) Return controllability matrix. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @end table @strong{Outputs} @table @var @item co Controllability matrix. @end table @strong{Equation} @iftex @tex $$ C_o = [ B \ \ AB \ \ A^2B \ \ldots \ A^{n-1}B ] $$ @end tex @end iftex @ifnottex @example 2 n-1 Co = [ B AB A B ... A B ] @end example @end ifnottex @end deftypefn @section ctrbf @findex ctrbf @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}) @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}, @var{tol}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}, @var{TOL}) If Co=ctrb(A,B) has rank r <= n = SIZE(A,1), then there is a similarity transformation Tc such that Tc = [t1 t2] where t1 is the controllable subspace and t2 is orthogonal to t1 @example @group Abar = Tc \ A * Tc , Bbar = Tc \ B , Cbar = C * Tc @end group @end example and the transformed system has the form @example @group | Ac A12| | Bc | Abar = |----------|, Bbar = | ---|, Cbar = [Cc | Cnc]. | 0 Anc| | 0 | @end group @end example where (Ac,Bc) is controllable, and Cc(sI-Ac)^(-1)Bc = C(sI-A)^(-1)B. and the system is stabilizable if Anc has no eigenvalues in the right half plane. The last output K is a vector of length n containing the number of controllable states. @end deftypefn @section @@lti/dcgain @findex dcgain @deftypefn {Function File} {@var{k} =} dcgain (@var{sys}) DC gain of @acronym{LTI} model. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @end table @strong{Outputs} @table @var @item k DC gain matrice. For a system with m inputs and p outputs, the array @var{k} has dimensions [p, m]. @end table @seealso{freqresp} @end deftypefn @section gram @findex gram @deftypefn {Function File} {@var{W} =} gram (@var{sys}, @var{mode}) @deftypefnx {Function File} {@var{Wc} =} gram (@var{a}, @var{b}) @code{gram (@var{sys}, "c")} returns the controllability gramian of the (continuous- or discrete-time) system @var{sys}. @code{gram (@var{sys}, "o")} returns the observability gramian of the (continuous- or discrete-time) system @var{sys}. @code{gram (@var{a}, @var{b})} returns the controllability gramian @var{Wc} of the continuous-time system @math{dx/dt = a x + b u}; i.e., @var{Wc} satisfies @math{a Wc + m Wc' + b b' = 0}. @end deftypefn @section hsvd @findex hsvd @deftypefn{Function File} {@var{hsv} =} hsvd (@var{sys}) @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"offset"}, @var{offset}) @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"alpha"}, @var{alpha}) Hankel singular values of the stable part of an @acronym{LTI} model. If no output arguments are given, the Hankel singular values are displayed in a plot. @strong{Algorithm}@* Uses SLICOT AB13AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section @@lti/isct @findex isct @deftypefn {Function File} {@var{bool} =} isct (@var{sys}) Determine whether @acronym{LTI} model is a continuous-time system. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @end table @strong{Outputs} @table @var @item bool = 0 @var{sys} is a discrete-time system. @item bool = 1 @var{sys} is a continuous-time system or a static gain. @end table @end deftypefn @section isctrb @findex isctrb @deftypefn {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{[]}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}, @var{tol}) Logical check for system controllability. For numerical reasons, @code{isctrb (sys)} should be used instead of @code{rank (ctrb (sys))}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Descriptor state-space models are possible. If @var{sys} is not a state-space model, it is converted to a minimal state-space realization, so beware of pole-zero cancellations which may lead to wrong results! @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item e Descriptor matrix (n-by-n). If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional roundoff parameter. Default value is 0. @end table @strong{Outputs} @table @var @item bool = 0 System is not controllable. @item bool = 1 System is controllable. @item ncon Number of controllable states. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{isobsv} @end deftypefn @section isdetectable @findex isdetectable @deftypefn {Function File} {@var{bool} =} isdetectable (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{sys}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}, @var{dflg}) Logical test for system detectability. All unstable modes must be observable or all unobservable states must be stable. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item a State transition matrix. @item c Measurement matrix. @item e Descriptor matrix. If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional tolerance for stability. Default value is 0. @item dflg = 0 Matrices (@var{a}, @var{c}) are part of a continuous-time system. Default Value. @item dflg = 1 Matrices (@var{a}, @var{c}) are part of a discrete-time system. @end table @strong{Outputs} @table @var @item bool = 0 System is not detectable. @item bool = 1 System is detectable. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} See @command{isstabilizable} for description of computational method. @seealso{isstabilizable, isstable, isctrb, isobsv} @end deftypefn @section @@lti/isdt @findex isdt @deftypefn {Function File} {@var{bool} =} isdt (@var{sys}) Determine whether @acronym{LTI} model is a discrete-time system. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @end table @strong{Outputs} @table @var @item bool = 0 @var{sys} is a continuous-time system. @item bool = 1 @var{sys} is a discrete-time system or a static gain. @end table @end deftypefn @section @@lti/isminimumphase @findex isminimumphase @deftypefn {Function File} {@var{bool} =} isminimumphase (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isminimumphase (@var{sys}, @var{tol}) Determine whether @acronym{LTI} system has asymptotically stable zero dynamics. According to the definition of Byrnes/Isidori [1], the zeros of a minimum-phase system must be strictly inside the left complex half-plane (continuous-time case) or inside the unit circle (discrete-time case). Note that the poles are not tested. M. Zeitz [2] discusses the inconsistent definitions of the minimum-phase property in a German paper. The abstract in English states the following [2]: Originally, the minimum phase property has been defined by H. W. Bode [3] in order to characterize the unique relationship between gain and phase of the frequency response. With regard to the design of digital filters, another definition of minimum phase is used and a filter is said to be minimum phase if both the filter and its inverse are asymptotically stable. Finally, systems with asymptotically stable zero dynamics are named as minimum phase by C. I. Byrnes and A. Isidori [1]. Due to the inconsistent definitions, avoiding the minimum phase property for control purposes is advocated and the well-established criteria of Hurwitz or Ljapunow to describe the stability of filters and zero dynamics are recommended. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item tol Optional tolerance. @var{tol} must be a real-valued, non-negative scalar. Default value is 0. @end table @strong{Outputs} @table @var @item bool True if the system is minimum-phase and false otherwise. @end table @example @group real (z) < -tol*(1 + abs (z)) continuous-time abs (z) < 1 - tol discrete-time @end group @end example @strong{References}@* [1] Byrnes, C.I. and Isidori, A. @cite{A Frequency Domain Philosophy for Nonlinear Systems}. IEEE Conf. Dec. Contr. 23, pp. 1569–1573, 1984. [2] Zeitz, M. @cite{Minimum phase – no relevant property of automatic control!}. at – Automatisierungstechnik. Volume 62, Issue 1, pp. 3–10, 2014. [3] Bode, H.W. @cite{Network Analysis and Feedback Amplifier Design}. D. Van Nostrand Company, pp. 312-318, 1945. pp. 341-351, 1992. @end deftypefn @section isobsv @findex isobsv @deftypefn {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{[]}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}, @var{tol}) Logical check for system observability. For numerical reasons, @code{isobsv (sys)} should be used instead of @code{rank (obsv (sys))}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Descriptor state-space models are possible. @item a State matrix (n-by-n). @item c Measurement matrix (p-by-n). @item e Descriptor matrix (n-by-n). If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional roundoff parameter. Default value is 0. @end table @strong{Outputs} @table @var @item bool = 0 System is not observable. @item bool = 1 System is observable. @item nobs Number of observable states. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{isctrb} @end deftypefn @section @@lti/issiso @findex issiso @deftypefn {Function File} {@var{bool} =} issiso (@var{sys}) Determine whether @acronym{LTI} model is single-input/single-output (SISO). @end deftypefn @section isstabilizable @findex isstabilizable @deftypefn {Function File} {@var{bool} =} isstabilizable (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{sys}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}, @var{dflg}) Logical check for system stabilizability. All unstable modes must be controllable or all uncontrollable states must be stable. @strong{Inputs} @table @var @item sys @acronym{LTI} system. If @var{sys} is not a state-space system, it is converted to a minimal state-space realization, so beware of pole-zero cancellations which may lead to wrong results! @item a State transition matrix. @item b Input matrix. @item e Descriptor matrix. If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional tolerance for stability. Default value is 0. @item dflg = 0 Matrices (@var{a}, @var{b}) are part of a continuous-time system. Default Value. @item dflg = 1 Matrices (@var{a}, @var{b}) are part of a discrete-time system. @end table @strong{Outputs} @table @var @item bool = 0 System is not stabilizable. @item bool = 1 System is stabilizable. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @example @group * Calculate staircase form (SLICOT AB01OD) * Extract unobservable part of state transition matrix * Calculate eigenvalues of unobservable part * Check whether real (ev) < -tol*(1 + abs (ev)) continuous-time abs (ev) < 1 - tol discrete-time @end group @end example @seealso{isdetectable, isstable, isctrb, isobsv} @end deftypefn @section @@lti/isstable @findex isstable @deftypefn {Function File} {@var{bool} =} isstable (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isstable (@var{sys}, @var{tol}) Determine whether @acronym{LTI} system is stable. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item tol Optional tolerance for stability. @var{tol} must be a real-valued, non-negative scalar. Default value is 0. @end table @strong{Outputs} @table @var @item bool True if the system is stable and false otherwise. @end table @example @group real (p) < -tol*(1 + abs (p)) continuous-time abs (p) < 1 - tol discrete-time @end group @end example @end deftypefn @section @@lti/norm @findex norm @deftypefn {Function File} {@var{gain} =} norm (@var{sys}, @var{2}) @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}) @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}, @var{tol}) Return H-2 or L-inf norm of @acronym{LTI} model. @strong{Algorithm}@* Uses SLICOT AB13BD and AB13DD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section obsv @findex obsv @deftypefn {Function File} {@var{ob} =} obsv (@var{sys}) @deftypefnx {Function File} {@var{ob} =} obsv (@var{a}, @var{c}) Return observability matrix. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item a State matrix (n-by-n). @item c Measurement matrix (p-by-n). @end table @strong{Outputs} @table @var @item ob Observability matrix. @end table @strong{Equation} @iftex @tex $$ O_b = \left[ \matrix{ C \cr CA \cr CA^2 \cr \vdots \cr CA^{n-1} } \right ] $$ @end tex @end iftex @ifnottex @example @group | C | | CA | Ob = | CA^2 | | ... | | CA^(n-1) | @end group @end example @end ifnottex @end deftypefn @section obsvf @findex obsvf @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}) @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}, @var{tol}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}, @var{TOL}) If Ob=obsv(A,C) has rank r <= n = SIZE(A,1), then there is a similarity transformation Tc such that To = [t1;t2] where t1 is c and t2 is orthogonal to t1 @example @group Abar = To \ A * To , Bbar = To \ B , Cbar = C * To @end group @end example and the transformed system has the form @example @group | Ao 0 | | Bo | Abar = |----------|, Bbar = | --- |, Cbar = [Co | 0 ]. | A21 Ano| | Bno | @end group @end example where (Ao,Bo) is observable, and Co(sI-Ao)^(-1)Bo = C(sI-A)^(-1)B. And system is detectable if Ano has no eigenvalues in the right half plane. The last output K is a vector of length n containing the number of observable states. @end deftypefn @section @@lti/pole @findex pole @deftypefn {Function File} {@var{p} =} pole (@var{sys}) Compute poles of @acronym{LTI} system. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @end table @strong{Outputs} @table @var @item p Poles of @var{sys}. @end table @strong{Algorithm}@* For (descriptor) state-space models, @command{pole} relies on Octave's @command{eig}. For @acronym{SISO} transfer functions, @command{pole} uses Octave's @command{roots}. @acronym{MIMO} transfer functions are converted to a @emph{minimal} state-space representation for the computation of the poles. @end deftypefn @section pzmap @findex pzmap @deftypefn {Function File} {} pzmap (@var{sys}) @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{p}, @var{z}] =} pzmap (@var{sys}) Plot the poles and zeros of an LTI system in the complex plane. If no output arguments are given, the result is plotted on the screen. Otherwise, the poles and zeros are computed and returned. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item p Poles of @var{sys}. @item z Invariant zeros of @var{sys}. @end table @end deftypefn @section @@lti/size @findex size @deftypefn {Function File} {@var{nvec} =} size (@var{sys}) @deftypefnx {Function File} {@var{n} =} size (@var{sys}, @var{dim}) @deftypefnx {Function File} {[@var{p}, @var{m}] =} size (@var{sys}) @acronym{LTI} model size, i.e. number of outputs and inputs. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item dim If given a second argument, @command{size} will return the size of the corresponding dimension. @end table @strong{Outputs} @table @var @item nvec Row vector. The first element is the number of outputs (rows) and the second element the number of inputs (columns). @item n Scalar value. The size of the dimension @var{dim}. @item p Number of outputs. @item m Number of inputs. @end table @end deftypefn @section @@lti/zero @findex zero @deftypefn {Function File} {@var{z} =} zero (@var{sys}) @deftypefnx {Function File} {@var{z} =} zero (@var{sys}, @var{type}) @deftypefnx {Function File} {[@var{z}, @var{k}, @var{info}] =} zero (@var{sys}) Compute zeros and gain of @acronym{LTI} model. By default, @command{zero} computes the invariant zeros, also known as Smith zeros. Alternatively, when called with a second input argument, @command{zero} can also compute the system zeros, transmission zeros, input decoupling zeros and output decoupling zeros. See paper [1] for an explanation of the various zero flavors as well as for further details. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item type String specifying the type of zeros: @table @var @item 'system', 's' Compute the system zeros. The system zeros include in all cases (square, non-square, degenerate or non-degenerate system) all transmission and decoupling zeros. @item 'invariant', 'inv' Compute invariant zeros. Default selection. @item 'transmission', 't' Compute transmission zeros. Transmission zeros are a subset of the invariant zeros. The transmission zeros are the zeros of the Smith-McMillan form of the transfer function matrix. @item 'input', 'inp', 'id' Compute input decoupling zeros. The input decoupling zeros are also known as the uncontrollable eigenvalues of the pair (A,B). @item 'output', 'o', 'od' Compute output decoupling zeros. The output decoupling zeros are also known as the unobservable eigenvalues of the pair (A,C). @end table @end table @strong{Outputs} @table @var @item z Depending on argument @var{type}, @var{z} contains the invariant (default), system, transmission, input decoupling or output decoupling zeros of @var{sys} as defined in [1]. @item k Gain of @acronym{SISO} system @var{sys}. For @acronym{MIMO} systems, an empty matrix @code{[]} is returned. @item info Struct containing additional information. For details, see the documentation of @acronym{SLICOT} routines @acronym{AB08ND} and @acronym{AG08BD}. @item info.rank The normal rank of the transfer function matrix (regular state-space models) or of the system pencil (descriptor state-space models). @item info.infz Contains information on the infinite elementary divisors as follows: the system has info.infz(i) infinite elementary divisors of degree i, where i=1,2,...,length(info.infz). @item info.kronr Right Kronecker (column) indices. @item info.kronl Left Kronecker (row) indices. @end table @strong{Examples} @example @group [z, k, info] = zero (sys) # invariant zeros z = zero (sys, 'system') # system zeros z = zero (sys, 'invariant') # invariant zeros z = zero (sys, 'transmission') # transmission zeros z = zero (sys, 'output') # output decoupling zeros z = zero (sys, 'input') # input decoupling zeros @end group @end example @strong{Algorithm}@* For (descriptor) state-space models, @command{zero} relies on SLICOT AB08ND and AG08BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} For @acronym{SISO} transfer functions, @command{zero} uses Octave's @command{roots}. @acronym{MIMO} transfer functions are converted to a @emph{minimal} state-space representation for the computation of the zeros. @strong{References}@* [1] MacFarlane, A. and Karcanias, N. @cite{Poles and zeros of linear multivariable systems: a survey of the algebraic, geometric and complex-variable theory}. Int. J. Control, vol. 24, pp. 33-74, 1976.@* [2] Rosenbrock, H.H. @cite{Correction to 'The zeros of a system'}. Int. J. Control, vol. 20, no. 3, pp. 525-527, 1974.@* [3] Svaricek, F. @cite{Computation of the structural invariants of linear multivariable systems with an extended version of the program ZEROS}. Systems & Control Letters, vol. 6, pp. 261-266, 1985.@* [4] Emami-Naeini, A. and Van Dooren, P. @cite{Computation of zeros of linear multivariable systems}. Automatica, vol. 26, pp. 415-430, 1982.@* @end deftypefn @chapter Model Simplification @section @@lti/minreal @findex minreal @deftypefn {Function File} {@var{sys} =} minreal (@var{sys}) @deftypefnx {Function File} {@var{sys} =} minreal (@var{sys}, @var{tol}) Minimal realization or zero-pole cancellation of @acronym{LTI} models. @end deftypefn @section @@lti/sminreal @findex sminreal @deftypefn {Function File} {@var{sys} =} sminreal (@var{sys}) @deftypefnx {Function File} {@var{sys} =} sminreal (@var{sys}, @var{tol}) Perform state-space model reduction based on structure. Remove states which have no influence on the input-output behaviour. The physical meaning of the states is retained. @strong{Inputs} @table @var @item sys State-space model. @item tol Optional tolerance for controllability and observability. Entries of the state-space matrices whose moduli are less or equal to @var{tol} are assumed to be zero. Default value is 0. @end table @strong{Outputs} @table @var @item sys Reduced state-space model. @end table @seealso{minreal} @end deftypefn @chapter Time Domain Analysis @section covar @findex covar @deftypefn{Function File} {[@var{p}, @var{q}] =} covar (@var{sys}, @var{w}) Return the steady-state covariance. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item w Intensity of Gaussian white noise inputs which drive @var{sys}. @end table @strong{Outputs} @table @var @item p Output covariance. @item q State covariance. @end table @seealso{lyap, dlyap} @end deftypefn @section gensig @findex gensig @deftypefn{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}) @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}) @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}, @var{tsam}) Generate periodic signal. Useful in combination with lsim. @strong{Inputs} @table @var @item sigtype = "sin" Sine wave. @item sigtype = "cos" Cosine wave. @item sigtype = "square" Square wave. @item sigtype = "pulse" Periodic pulse. @item tau Duration of one period in seconds. @item tfinal Optional duration of the signal in seconds. Default duration is 5 periods. @item tsam Optional sampling time in seconds. Default spacing is tau/64. @end table @strong{Outputs} @table @var @item u Vector of signal values. @item t Time vector of the signal. @end table @seealso{lsim} @end deftypefn @section impulse @findex impulse @deftypefn{Function File} {} impulse (@var{sys}) @deftypefnx{Function File} {} impulse (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx{Function File} {} impulse (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{t}) @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}) @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}, @var{dt}) Impulse response of @acronym{LTI} system. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item t Time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{initial, lsim, step} @end deftypefn @section initial @findex initial @deftypefn{Function File} {} initial (@var{sys}, @var{x0}) @deftypefnx{Function File} {} initial (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{x0}) @deftypefnx{Function File} {} initial (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{x0}) @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{t}) @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}) @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}, @var{dt}) Initial condition response of state-space model. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys State-space model. @item x0 Vector of initial conditions for each state. @item t Optional time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @strong{Example} @example @group . Continuous Time: x = A x , y = C x , x(0) = x0 Discrete Time: x[k+1] = A x[k] , y[k] = C x[k] , x[0] = x0 @end group @end example @seealso{impulse, lsim, step} @end deftypefn @section lsim @findex lsim @deftypefn{Function File} {} lsim (@var{sys}, @var{u}) @deftypefnx{Function File} {} lsim (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{u}) @deftypefnx{Function File} {} lsim (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{u}) @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}) @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}, @var{x0}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}, @var{x0}) Simulate @acronym{LTI} model response to arbitrary inputs. If no output arguments are given, the system response is plotted on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} model. System must be proper, i.e. it must not have more zeros than poles. @item u Vector or array of input signal. Needs @code{length(t)} rows and as many columns as there are inputs. If @var{sys} is a single-input system, row vectors @var{u} of length @code{length(t)} are accepted as well. @item t Time vector. Should be evenly spaced. If @var{sys} is a continuous-time system and @var{t} is a real scalar, @var{sys} is discretized with sampling time @code{tsam = t/(rows(u)-1)}. If @var{sys} is a discrete-time system and @var{t} is not specified, vector @var{t} is assumed to be @code{0 : tsam : tsam*(rows(u)-1)}. @item x0 Vector of initial conditions for each state. If not specified, a zero vector is assumed. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. It is always evenly spaced. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{impulse, initial, step} @end deftypefn @section ramp @findex ramp @deftypefn{Function File} {} ramp (@var{sys}) @deftypefnx{Function File} {} ramp (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx{Function File} {} ramp (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{t}) @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}) @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}, @var{dt}) Ramp response of @acronym{LTI} system. If no output arguments are given, the response is printed on the screen. @iftex @tex $$ r(t) = t \, \cdot \, h(t) $$ @end tex @end iftex @ifnottex @example r(t) = t * h(t) @end example @end ifnottex @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item t Time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{impulse, initial, lsim, step} @end deftypefn @section step @findex step @deftypefn{Function File} {} step (@var{sys}) @deftypefnx{Function File} {} step (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx{Function File} {} step (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{t}) @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}) @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}, @var{dt}) Step response of @acronym{LTI} system. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item t Time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{impulse, initial, lsim} @end deftypefn @chapter Frequency Domain Analysis @section bode @findex bode @deftypefn {Function File} {} bode (@var{sys}) @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} bode (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}, @var{w}) Bode diagram of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item mag Vector of magnitude. Has length of frequency vector @var{w}. @item pha Vector of phase. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{nichols, nyquist, sigma} @end deftypefn @section bodemag @findex bodemag @deftypefn {Function File} {} bodemag (@var{sys}) @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}) @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}, @var{w}) Bode magnitude diagram of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item mag Vector of magnitude. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{bode, nichols, nyquist, sigma} @end deftypefn @section @@lti/freqresp @findex freqresp @deftypefn{Function File} {@var{H} =} freqresp (@var{sys}, @var{w}) Evaluate frequency response at given frequencies. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item w Vector of frequency values. @end table @strong{Outputs} @table @var @item H Array of frequency response. For a system with m inputs and p outputs, the array @var{H} has dimensions [p, m, length (w)]. The frequency response at the frequency w(k) is given by H(:,:,k). @end table @seealso{dcgain} @end deftypefn @section margin @findex margin @deftypefn{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}) @deftypefnx{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}, @var{tol}) Gain and phase margin of a system. If no output arguments are given, both gain and phase margin are plotted on a bode diagram. Otherwise, the margins and their corresponding frequencies are computed and returned. A more robust criterion to assess the stability of a feedback system is the sensitivity Ms computed by function @command{sensitivity}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Must be a single-input and single-output (SISO) system. @item tol Imaginary parts below @var{tol} are assumed to be zero. If not specified, default value @code{sqrt (eps)} is taken. @end table @strong{Outputs} @table @var @item gamma Gain margin (as gain, not dBs). @item phi Phase margin (in degrees). @item w_gamma Frequency for the gain margin (in rad/s). @item w_phi Frequency for the phase margin (in rad/s). @end table @strong{Algorithm}@* Uses function @command{roots} to calculate the frequencies @var{w_gamma}, @var{w_phi} from special polynomials created from the transfer function of @var{sys} as listed below in section @guillemetleft{}Equations@guillemetright{}. @strong{Equations} @example @group CONTINUOUS-TIME SYSTEMS Gain Margin _ _ L(jw) = L(jw) BTW: L(jw) = L(-jw) = conj (L(jw)) num(jw) num(-jw) ------- = -------- den(jw) den(-jw) num(jw) den(-jw) = num(-jw) den(jw) imag (num(jw) den(-jw)) = 0 imag (num(-jw) den(jw)) = 0 @end group @end example @example @group Phase Margin |num(jw)| |L(jw)| = |-------| = 1 |den(jw)| _ 2 2 z z = Re z + Im z num(jw) num(-jw) ------- * -------- = 1 den(jw) den(-jw) num(jw) num(-jw) - den(jw) den(-jw) = 0 real (num(jw) num(-jw) - den(jw) den(-jw)) = 0 @end group @end example @example @group DISCRETE-TIME SYSTEMS Gain Margin jwT log z L(z) = L(1/z) BTW: z = e --> w = ----- j T num(z) num(1/z) ------ = -------- den(z) den(1/z) num(z) den(1/z) - num(1/z) den(z) = 0 @end group @end example @example @group Phase Margin |num(z)| |L(z)| = |------| = 1 |den(z)| @end group @end example @example @group L(z) L(1/z) = 1 num(z) num(1/z) ------ * -------- = 1 den(z) den(1/z) num(z) num(1/z) - den(z) den(1/z) = 0 @end group @end example @example @group PS: How to get L(1/z) 4 3 2 p(z) = a z + b z + c z + d z + e -4 -3 -2 -1 p(1/z) = a z + b z + c z + d z + e -4 2 3 4 = z ( a + b z + c z + d z + e z ) 4 3 2 4 = ( e z + d z + c z + b z + a ) / ( z ) @end group @end example @seealso{sensitivity, roots} @end deftypefn @section nichols @findex nichols @deftypefn {Function File} {} nichols (@var{sys}) @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} nichols (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}, @var{w}) Nichols chart of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item mag Vector of magnitude. Has length of frequency vector @var{w}. @item pha Vector of phase. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{bode, nyquist, sigma} @end deftypefn @section nyquist @findex nyquist @deftypefn {Function File} {} nyquist (@var{sys}) @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}) @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}, @var{w}) Nyquist diagram of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item re Vector of real parts. Has length of frequency vector @var{w}. @item im Vector of imaginary parts. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{bode, nichols, sigma} @end deftypefn @section sensitivity @findex sensitivity @deftypefn{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{L}) @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C}) @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C1}, @var{C2}, @dots{}) Return sensitivity margin @var{Ms}. The quantity @var{Ms} is simply the inverse of the shortest distance from the Nyquist curve to the critical point -1. Reasonable values of @var{Ms} are in the range from 1.3 to 2. @iftex @tex $$ M_s = ||S(j\omega)||_{\infty} $$ @end tex @end iftex @ifnottex @example Ms = ||S(jw)|| inf @end example @end ifnottex If no output arguments are given, the critical distance 1/Ms is plotted on a Nyquist diagram. In contrast to gain and phase margin as computed by function @command{margin}, the sensitivity @var{Ms} is a more robust criterion to assess the stability of a feedback system. @strong{Inputs} @table @var @item L Open loop transfer function. @var{L} can be any type of @acronym{LTI} system, but it must be square. @item P Plant model. Any type of @acronym{LTI} system. @item C Controller model. Any type of @acronym{LTI} system. @item C1, C2, @dots{} If several controllers are specified, function @command{sensitivity} computes the sensitivity @var{Ms} for each of them in combination with plant @var{P}. @end table @strong{Outputs} @table @var @item Ms Sensitivity margin @var{Ms} as defined in [1]. Scalar value. If several controllers are specified, @var{Ms} becomes a row vector with as many entries as controllers. @item ws The frequency [rad/s] corresponding to the sensitivity peak. Scalar value. If several controllers are specified, @var{ws} becomes a row vector with as many entries as controllers. @end table @strong{Algorithm}@* Uses SLICOT AB13DD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} to calculate the infinity norm of the sensitivity function. @strong{References}@* [1] Astr@"om, K. and H@"agglund, T. (1995) PID Controllers: Theory, Design and Tuning, Second Edition. Instrument Society of America. @end deftypefn @section sigma @findex sigma @deftypefn {Function File} {} sigma (@var{sys}) @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} sigma (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}) @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}) Singular values of frequency response. If no output arguments are given, the singular value plot is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Multiple inputs and/or outputs (MIMO systems) make practical sense. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item sv Array of singular values. For a system with m inputs and p outputs, the array sv has @code{min (m, p)} rows and as many columns as frequency points @code{length (w)}. The singular values at the frequency @code{w(k)} are given by @code{sv(:,k)}. @item w Vector of frequency values used. @end table @seealso{bodemag, svd} @end deftypefn @chapter Pole Placement @section place @findex place @deftypefn {Function File} {@var{f} =} place (@var{sys}, @var{p}) @deftypefnx {Function File} {@var{f} =} place (@var{a}, @var{b}, @var{p}) @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{sys}, @var{p}, @var{alpha}) @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{a}, @var{b}, @var{p}, @var{alpha}) Pole assignment for a given matrix pair (@var{A},@var{B}) such that @code{p = eig (A-B*F)}. If parameter @var{alpha} is specified, poles with real parts (continuous-time) or moduli (discrete-time) below @var{alpha} are left untouched. @strong{Inputs} @table @var @item sys Continuous- or discrete-time @acronym{LTI} system. @item a State matrix (n-by-n) of a continuous-time system. @item b Input matrix (n-by-m) of a continuous-time system. @item p Desired eigenvalues of the closed-loop system state-matrix @var{A-B*F}. @code{length (p) <= rows (A)}. @item alpha Specifies the maximum admissible value, either for real parts or for moduli, of the eigenvalues of @var{A} which will not be modified by the eigenvalue assignment algorithm. @code{alpha >= 0} for discrete-time systems. @end table @strong{Outputs} @table @var @item f State feedback gain matrix. @item info Structure containing additional information. @item info.nfp The number of fixed poles, i.e. eigenvalues of @var{A} having real parts less than @var{alpha}, or moduli less than @var{alpha}. These eigenvalues are not modified by @command{place}. @item info.nap The number of assigned eigenvalues. @code{nap = n-nfp-nup}. @item info.nup The number of uncontrollable eigenvalues detected by the eigenvalue assignment algorithm. @item info.z The orthogonal matrix @var{z} reduces the closed-loop system state matrix @code{A + B*F} to upper real Schur form. Note the positive sign in @code{A + B*F}. @end table @strong{Note} @example Place is also suitable to design estimator gains: @group L = place (A.', C.', p).' L = place (sys.', p).' # useful for discrete-time systems @end group @end example @strong{Algorithm}@* Uses SLICOT SB01BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section rlocus @findex rlocus @deftypefn {Function File} {} rlocus (@var{sys}) @deftypefnx {Function File} {[@var{rldata}, @var{k}] =} rlocus (@var{sys}, @var{increment}, @var{min_k}, @var{max_k}) Display root locus plot of the specified @acronym{SISO} system. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Must be a single-input and single-output (SISO) system. @item increment The increment used in computing gain values. @item min_k Minimum value of @var{k}. @item max_k Maximum value of @var{k}. @end table @strong{Outputs} @table @var @item rldata Data points plotted: in column 1 real values, in column 2 the imaginary values. @item k Gains for real axis break points. @end table @strong{Block Diagram} @example @group u + +---+ +------+ y ------>(+)----->| k |----->| SISO |-------+-------> ^ - +---+ +------+ | | | +---------------------------------+ @end group @end example @end deftypefn @chapter Optimal Control @section augstate @findex augstate @deftypefn {Function File} {@var{augsys} =} augstate (@var{sys}) Append state vector x of system @var{sys} to output vector y. @example @group . . x = A x + B u x = A x + B u y = C x + D u => y = C x + D u x = I x + O u @end group @end example @end deftypefn @section dlqe @findex dlqe @deftypefn {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) Kalman filter for discrete-time systems. @example @group x[k] = Ax[k] + Bu[k] + Gw[k] (State equation) y[k] = Cx[k] + Du[k] + v[k] (Measurement Equation) E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S @end group @end example @strong{Inputs} @table @var @item a State transition matrix of discrete-time system (n-by-n). @item g Process noise matrix of discrete-time system (n-by-g). If @var{g} is empty @code{[]}, an identity matrix is assumed. @item c Measurement matrix of discrete-time system (p-by-n). @item q Process noise covariance matrix (g-by-g). @item r Measurement noise covariance matrix (p-by-p). @item s Optional cross term covariance matrix (g-by-p), s = cov(w,v). If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. @end table @strong{Outputs} @table @var @item m Kalman filter gain matrix (n-by-p). @item p Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). Symmetric matrix. @item z Error covariance (n-by-n), cov(x(k|k)-x) @item e Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group x[k|k] = x[k|k-1] + M(y[k] - Cx[k|k-1] - Du[k]) x[k+1|k] = Ax[k|k] + Bu[k] for S=0 x[k+1|k] = Ax[k|k] + Bu[k] + G*S*(C*P*C' + R)^-1*(y[k] - C*x[k|k-1]) for non-zero S E = eig(A - A*M*C) for S=0 E = eig(A - A*M*C - G*S*(C*P*C' + Rv)^-1*C) for non-zero S @end group @end example @seealso{dare, care, dlqr, lqr, lqe} @end deftypefn @section dlqr @findex dlqr @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Linear-quadratic regulator for discrete-time systems. @strong{Inputs} @table @var @item sys Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). @item a State transition matrix of discrete-time system (n-by-n). @item b Input matrix of discrete-time system (n-by-m). @item q State weighting matrix (n-by-n). @item r Input weighting matrix (m-by-m). @item s Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item g State feedback matrix (m-by-n). @item x Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group x[k+1] = A x[k] + B u[k], x[0] = x0 inf J(x0) = SUM (x' Q x + u' R u + 2 x' S u) k=0 L = eig (A - B*G) @end group @end example @seealso{dare, care, lqr} @end deftypefn @section estim @findex estim @deftypefn {Function File} {@var{est} =} estim (@var{sys}, @var{l}) @deftypefnx {Function File} {@var{est} =} estim (@var{sys}, @var{l}, @var{sensors}, @var{known}) Return state estimator for a given estimator gain. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item l State feedback matrix. @item sensors Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. @item known Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} are assumed stochastic (w). If argument @var{known} is omitted, no inputs u are known. @end table @strong{Outputs} @table @var @item est State-space model of estimator. @end table @strong{Block Diagram} @example @group u +-------+ ^ +---------------------------->| |-------> y | +-------+ + y | est | ^ u ----+--->| |----->(+)------>| |-------> x | sys | ^ + +-------+ w -------->| | | +-------+ | v @end group @end example @seealso{kalman, lqe, place} @end deftypefn @section kalman @findex kalman @deftypefn {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{[]}, @var{sensors}, @var{known}) @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}, @var{sensors}, @var{known}) Design Kalman estimator for @acronym{LTI} systems. @strong{Inputs} @table @var @item sys Nominal plant model. @item q Covariance of white process noise. @item r Covariance of white measurement noise. @item s Optional cross term covariance. Default value is 0. @item sensors Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. @item known Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. @end table @strong{Outputs} @table @var @item est State-space model of the Kalman estimator. @item g Estimator gain. @item x Solution of the Riccati equation. @end table @strong{Block Diagram} @example @group u +-------+ ^ +---------------------------->| |-------> y | +-------+ + y | est | ^ u ----+--->| |----->(+)------>| |-------> x | sys | ^ + +-------+ w -------->| | | +-------+ | v Q = cov (w, w') R = cov (v, v') S = cov (w, v') @end group @end example @seealso{care, dare, estim, lqr} @end deftypefn @section lqe @findex lqe @deftypefn {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) Kalman filter for continuous-time systems. @example @group . x = Ax + Bu + Gw (State equation) y = Cx + Du + v (Measurement Equation) E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S @end group @end example @strong{Inputs} @table @var @item sys Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). @item a State matrix of continuous-time system (n-by-n). @item g Process noise matrix of continuous-time system (n-by-g). If @var{g} is empty @code{[]}, an identity matrix is assumed. @item c Measurement matrix of continuous-time system (p-by-n). @item q Process noise covariance matrix (g-by-g). @item r Measurement noise covariance matrix (p-by-p). @item s Optional cross term covariance matrix (g-by-p), s = cov(w,v). If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. @end table @strong{Outputs} @table @var @item l Kalman filter gain matrix (n-by-p). @item p Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). Symmetric matrix. If @var{sys} is a discrete-time model, the solution of the corresponding discrete-time Riccati equation is returned. @item e Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group . x = Ax + Bu + L(y - Cx -Du) E = eig(A - L*C) @end group @end example @seealso{dare, care, dlqr, lqr, dlqe} @end deftypefn @section lqr @findex lqr @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Linear-quadratic regulator. @strong{Inputs} @table @var @item sys Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). @item a State matrix of continuous-time system (n-by-n). @item b Input matrix of continuous-time system (n-by-m). @item q State weighting matrix (n-by-n). @item r Input weighting matrix (m-by-m). @item s Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item g State feedback matrix (m-by-n). @item x Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group . x = A x + B u, x(0) = x0 inf J(x0) = INT (x' Q x + u' R u + 2 x' S u) dt 0 L = eig (A - B*G) @end group @end example @seealso{care, dare, dlqr} @end deftypefn @chapter Robust Control @section augw @findex augw @deftypefn{Function File} {@var{P} =} augw (@var{G}, @var{W1}, @var{W2}, @var{W3}) Extend plant for stacked S/KS/T problem. Subsequently, the robust control problem can be solved by h2syn or hinfsyn. @strong{Inputs} @table @var @item G @acronym{LTI} model of plant. @item W1 @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. Model must be empty @code{[]}, SISO or of appropriate size. @item W2 @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. Model must be empty @code{[]}, SISO or of appropriate size. @item W3 @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. @end table All inputs must be proper/realizable. Scalars, vectors and matrices are possible instead of @acronym{LTI} models. @strong{Outputs} @table @var @item P State-space model of augmented plant. @end table @strong{Block Diagram} @example @group | W1 | -W1*G | z1 = W1 r - W1 G u | 0 | W2 | z2 = W2 u P = | 0 | W3*G | z3 = W3 G u |----+-------| | I | -G | e = r - G u @end group @end example @example @group +------+ z1 +---------------------------------------->| W1 |-----> | +------+ | +------+ z2 | +---------------------->| W2 |-----> | | +------+ r + e | +--------+ u | +--------+ y +------+ z3 ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ^ - +--------+ +--------+ | +------+ | | +----------------------------------------+ @end group @end example @example @group +--------+ | |-----> z1 (p1x1) z1 = W1 e r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u | |-----> z3 (p3x1) z3 = W3 y u (mx1) ----->| |-----> e (px1) e = r - y +--------+ @end group @end example @example @group +--------+ r ----->| |-----> z | P(s) | u +---->| |-----+ e | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ @end group @end example @strong{References}@* [1] Skogestad, S. and Postlethwaite I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley. @seealso{h2syn, hinfsyn, mixsyn} @end deftypefn @section fitfrd @findex fitfrd @deftypefn{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}) @deftypefnx{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}, @var{flag}) Fit frequency response data with a state-space system. If requested, the returned system is stable and minimum-phase. @strong{Inputs} @table @var @item dat @acronym{LTI} model containing frequency response data of a SISO system. @item n The desired order of the system to be fitted. @code{n <= length(dat.w)}. @item flag The flag controls whether the returned system is stable and minimum-phase. @table @var @item 0 The system zeros and poles are not constrained. Default value. @item 1 The system zeros and poles will have negative real parts in the continuous-time case, or moduli less than 1 in the discrete-time case. @end table @end table @strong{Outputs} @table @var @item sys State-space model of order @var{n}, fitted to frequency response data @var{dat}. @item n The order of the obtained system. The value of @var{n} could only be modified if inputs @code{n > 0} and @code{flag = 1}. @end table @strong{Algorithm}@* Uses SLICOT SB10YD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section h2syn @findex h2syn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}, @var{nmeas}, @var{ncon}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}) H-2 control synthesis for @acronym{LTI} plant. @strong{Inputs} @table @var @item P Generalized plant. Must be a proper/realizable @acronym{LTI} model. If @var{P} is constructed with @command{mktito} or @command{augw}, arguments @var{nmeas} and @var{ncon} can be omitted. @item nmeas Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used to calculate the H-2 norm. @item ncon Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited by a harmonic test signal. @end table @strong{Outputs} @table @var @item K State-space model of the H-2 optimal controller. @item N State-space model of the lower LFT of @var{P} and @var{K}. @item info Structure containing additional information. @item info.gamma H-2 norm of @var{N}. @item info.rcond Vector @var{rcond} contains estimates of the reciprocal condition numbers of the matrices which are to be inverted and estimates of the reciprocal condition numbers of the Riccati equations which have to be solved during the computation of the controller @var{K}. For details, see the description of the corresponding SLICOT routine. @end table @strong{Block Diagram} @example @group gamma = min||N(K)|| N = lft (P, K) K 2 +--------+ w ----->| |-----> z | P(s) | u +---->| |-----+ v | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ +--------+ w ----->| N(s) |-----> z +--------+ @end group @end example @strong{Algorithm}@* Uses SLICOT SB10HD and SB10ED by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{augw, lqr, dlqr, kalman} @end deftypefn @section hinfsyn @findex hinfsyn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @dots{}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @dots{}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{opt}, @dots{}) H-infinity control synthesis for @acronym{LTI} plant. @strong{Inputs} @table @var @item P Generalized plant. Must be a proper/realizable @acronym{LTI} model. If @var{P} is constructed with @command{mktito} or @command{augw}, arguments @var{nmeas} and @var{ncon} can be omitted. @item nmeas Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used to calculate the H-infinity norm. @item ncon Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited by a harmonic test signal. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item K State-space model of the H-infinity (sub-)optimal controller. @item N State-space model of the lower LFT of @var{P} and @var{K}. @item info Structure containing additional information. @item info.gamma L-infinity norm of @var{N}. @item info.rcond Vector @var{rcond} contains estimates of the reciprocal condition numbers of the matrices which are to be inverted and estimates of the reciprocal condition numbers of the Riccati equations which have to be solved during the computation of the controller @var{K}. For details, see the description of the corresponding SLICOT routine. @end table @strong{Option Keys and Values} @table @var @item 'method' String specifying the desired kind of controller: @table @var @item 'optimal', 'opt', 'o' Compute optimal controller using gamma iteration. Default selection for compatibility reasons. @item 'suboptimal', 'sub', 's' Compute (sub-)optimal controller. For stability reasons, suboptimal controllers are to be preferred over optimal ones. @end table @item 'gmax' The maximum value of the H-infinity norm of @var{N}. It is assumed that @var{gmax} is sufficiently large so that the controller is admissible. Default value is 1e15. @item 'gmin' Initial lower bound for gamma iteration. Default value is 0. @var{gmin} is only meaningful for optimal discrete-time controllers. @item 'tolgam' Tolerance used for controlling the accuracy of @var{gamma} and its distance to the estimated minimal possible value of @var{gamma}. Default value is 0.01. If @var{tolgam} = 0, then a default value equal to @code{sqrt(eps)} is used, where @var{eps} is the relative machine precision. For suboptimal controllers, @var{tolgam} is ignored. @item 'actol' Upper bound for the poles of the closed-loop system @var{N} used for determining if it is stable. @var{actol} >= 0 for stable systems. For suboptimal controllers, @var{actol} is ignored. @end table @strong{Block Diagram} @example @group gamma = min||N(K)|| N = lft (P, K) K inf +--------+ w ----->| |-----> z | P(s) | u +---->| |-----+ v | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ +--------+ w ----->| N(s) |-----> z +--------+ @end group @end example @strong{Algorithm}@* Uses SLICOT SB10FD, SB10DD and SB10AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{augw, mixsyn} @end deftypefn @section mixsyn @findex mixsyn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} mixsyn (@var{G}, @var{W1}, @var{W2}, @var{W3}, @dots{}) Solve stacked S/KS/T H-infinity problem. Mixed-sensitivity is the name given to transfer function shaping problems in which the sensitivity function @iftex @tex $ S = (I + G K)^{-1} $ @end tex @end iftex @ifnottex @example -1 S = (I + G K) @end example @end ifnottex is shaped along with one or more other closed-loop transfer functions such as @var{K S} or the complementary sensitivity function @iftex @tex $ T = I - S = (I + G K)^{-1} G K $ @end tex @end iftex @ifnottex @example -1 T = I - S = (I + G K) @end example @end ifnottex in a typical one degree-of-freedom configuration, where @var{G} denotes the plant and @var{K} the (sub-)optimal controller to be found. The shaping of multivariable transfer functions is based on the idea that a satisfactory definition of gain (range of gain) for a matrix transfer function is given by the singular values @iftex @tex $\sigma$ @end tex @end iftex @ifnottex @end ifnottex of the transfer function. Hence the classical loop-shaping ideas of feedback design can be generalized to multivariable systems. In addition to the requirement that @var{K} stabilizes @var{G}, the closed-loop objectives are as follows [1]: @enumerate @item For @emph{disturbance rejection} make @iftex @tex $\overline{\sigma}(S)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{noise attenuation} make @iftex @tex $\overline{\sigma}(T)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{reference tracking} make @iftex @tex $\overline{\sigma}(T) \approx \underline{\sigma}(T) \approx 1$. @end tex @end iftex @ifnottex @end ifnottex @item For @emph{input usage (control energy) reduction} make @iftex @tex $\overline{\sigma}(K S)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{robust stability} in the presence of an additive perturbation @iftex @tex $G_p = G + \Delta$, @end tex @end iftex @ifnottex @end ifnottex make @iftex @tex $\overline{\sigma}(K S)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{robust stability} in the presence of a multiplicative output perturbation @iftex @tex $G_p = (I + \Delta) G$, @end tex @end iftex @ifnottex @end ifnottex make @iftex @tex $\overline{\sigma}(T)$ @end tex @end iftex @ifnottex @end ifnottex small. @end enumerate In order to find a robust controller for the so-called stacked @iftex @tex $S/KS/T \ H_{\infty}$ @end tex @end iftex @ifnottex S/KS/T H-infinity @end ifnottex problem, the user function @command{mixsyn} minimizes the following criterion @iftex @tex $$ \underset{K}{\min} || N(K) ||_{\infty}, \quad N = | W_1 S; \ W_2 K S; \ W_3 T |$$ @end tex @end iftex @ifnottex @example | W1 S | min || N(K) || N = | W2 K S | K oo | W3 T | @end example @end ifnottex @code{[K, N] = mixsyn (G, W1, W2, W3)}. The user-defined weighting functions @var{W1}, @var{W2} and @var{W3} bound the largest singular values of the closed-loop transfer functions @var{S} (for performance), @var{K S} (to penalize large inputs) and @var{T} (for robustness and to avoid sensitivity to noise), respectively [1]. A few points are to be considered when choosing the weights. The weigths @var{Wi} must all be proper and stable. Therefore if one wishes, for example, to minimize @var{S} at low frequencies by a weighting @var{W1} including integral action, @iftex @tex ${1 \over s}$ @end tex @end iftex @ifnottex @example 1 - s @end example @end ifnottex needs to be approximated by @iftex @tex ${1 \over s + \epsilon}$, where $\epsilon \ll 1$. @end tex @end iftex @ifnottex @example 1 ----- where e << 1. s + e @end example @end ifnottex Similarly one might be interested in weighting @var{K S} with a non-proper weight @var{W2} to ensure that @var{K} is small outside the system bandwidth. The trick here is to replace a non-proper term such as @iftex @tex $ 1 + \tau_1 s $ by $ {1 + \tau_1 s \over 1 + \tau_2 s} $, where @end tex @end iftex @ifnottex @example 1 + T1 s 1 + T1 s by --------, where T2 << T1. 1 + T2 s @end example @end ifnottex @iftex @tex $\tau_2 \ll \tau_1$ @end tex @end iftex [1, 2]. @strong{Inputs} @table @var @item G @acronym{LTI} model of plant. @item W1 @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. Model must be empty @code{[]}, SISO or of appropriate size. @item W2 @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. Model must be empty @code{[]}, SISO or of appropriate size. @item W3 @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. @item @dots{} Optional arguments of @command{hinfsyn}. Type @command{help hinfsyn} for more information. @end table All inputs must be proper/realizable. Scalars, vectors and matrices are possible instead of @acronym{LTI} models. @strong{Outputs} @table @var @item K State-space model of the H-infinity (sub-)optimal controller. @item N State-space model of the lower LFT of @var{P} and @var{K}. @item info Structure containing additional information. @item info.gamma L-infinity norm of @var{N}. @item info.rcond Vector @var{rcond} contains estimates of the reciprocal condition numbers of the matrices which are to be inverted and estimates of the reciprocal condition numbers of the Riccati equations which have to be solved during the computation of the controller @var{K}. For details, see the description of the corresponding SLICOT routine. @end table @strong{Block Diagram} @example @group | W1 S | gamma = min||N(K)|| N = | W2 K S | = lft (P, K) K inf | W3 T | @end group @end example @example @group +------+ z1 +---------------------------------------->| W1 |-----> | +------+ | +------+ z2 | +---------------------->| W2 |-----> | | +------+ r + e | +--------+ u | +--------+ y +------+ z3 ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ^ - +--------+ +--------+ | +------+ | | +----------------------------------------+ @end group @end example @example @group +--------+ | |-----> z1 (p1x1) z1 = W1 e r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u | |-----> z3 (p3x1) z3 = W3 y u (mx1) ----->| |-----> e (px1) e = r - y +--------+ @end group @end example @example @group +--------+ r ----->| |-----> z | P(s) | u +---->| |-----+ e | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ @end group @end example @example @group +--------+ r ----->| N(s) |-----> z +--------+ @end group @end example @example @group Extended Plant: P = augw (G, W1, W2, W3) Controller: K = mixsyn (G, W1, W2, W3) Entire System: N = lft (P, K) Open Loop: L = G * K Closed Loop: T = feedback (L) @end group @end example @strong{Algorithm}@* Relies on functions @command{augw} and @command{hinfsyn}, which use SLICOT SB10FD, SB10DD and SB10AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @strong{References}@* [1] Skogestad, S. and Postlethwaite I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley, Chichester, England.@* [2] Meinsma, G. (1995) @cite{Unstable and nonproper weights in H-infinity control} Automatica, Vol. 31, No. 11, pp. 1655-1658 @seealso{hinfsyn, augw} @end deftypefn @section mktito @findex mktito @deftypefn{Function File} {@var{P} =} mktito (@var{P}, @var{nmeas}, @var{ncon}) Partition @acronym{LTI} plant @var{P} for robust controller synthesis. If a plant is partitioned this way, one can omit the inputs @var{nmeas} and @var{ncon} when calling the functions @command{hinfsyn} and @command{h2syn}. @strong{Inputs} @table @var @item P Generalized plant. @item nmeas Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used to calculate the H-2/H-infinity norm. @item ncon Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited by a harmonic test signal. @end table @strong{Outputs} @table @var @item P Partitioned plant. The input/output groups and names are overwritten with designations according to [1]. @end table @strong{Block Diagram} @example @group min||N(K)|| N = lft (P, K) K norm +--------+ w ----->| |-----> z | P(s) | u +---->| |-----+ v | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ +--------+ w ----->| N(s) |-----> z +--------+ @end group @end example @strong{Reference}@* [1] Skogestad, S. and Postlethwaite, I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley, Chichester, England. @end deftypefn @section ncfsyn @findex ncfsyn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} ncfsyn (@var{G}, @var{W1}, @var{W2}, @var{factor}) Loop shaping H-infinity synthesis. Compute positive feedback controller using the McFarlane/Glover loop shaping design procedure [1]. Using a precompensator @var{W1} and/or a postcompensator @var{W2}, the singular values of the nominal plant @var{G} are shaped to give a desired open-loop shape. The nominal plant @var{G} and shaping functions @var{W1}, @var{W2} are combined to form the shaped plant, @var{Gs} where @code{Gs = W2 G W1}. We assume that @var{W1} and @var{W2} are such that @var{Gs} contains no hidden modes. It is relatively easy to approximate the closed-loop requirements by the following open-loop objectives [2]: @enumerate @item For @emph{disturbance rejection} make @iftex @tex $\underline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex large; valid for frequencies at which @iftex @tex $\underline{\sigma}(G_S) \gg 1$. @end tex @end iftex @ifnottex @example @end example @end ifnottex @item For @emph{noise attenuation} make @iftex @tex $\overline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex small; valid for frequencies at which @iftex @tex $\overline{\sigma}(G_S) \ll 1$. @end tex @end iftex @ifnottex @example @end example @end ifnottex @item For @emph{reference tracking} make @iftex @tex $\underline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex large; valid for frequencies at which @iftex @tex $\underline{\sigma}(G_S) \gg 1$. @end tex @end iftex @ifnottex @example @end example @end ifnottex @item For @emph{robust stability} to a multiplicative output perturbation @iftex @tex $G_p = (I + \Delta) G$, make @end tex @end iftex @ifnottex @example @end example @end ifnottex @iftex @tex $\overline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex small; valid for frequencies at which @iftex @tex $\overline{\sigma}(G_S) \ll 1$. @end tex @end iftex @ifnottex @example . @end example @end ifnottex @end enumerate Then a stabilizing controller @var{Ks} is synthesized for shaped plant @var{Gs}. The final positive feedback controller @var{K} is then constructed by combining the @iftex @tex $H_{\infty}$ @end tex @end iftex @ifnottex @example H-infinity @end example @end ifnottex controller @var{Ks} with the shaping functions @var{W1} and @var{W2} such that @code{K = W1 Ks W2}. In [1] is stated further that the given robust stabilization objective can be interpreted as a @iftex @tex $H_{\infty}$ @end tex @end iftex @ifnottex @example H-infinity @end example @end ifnottex problem formulation of minimizing the @iftex @tex $H_{\infty}$ @end tex @end iftex @ifnottex @example H-infinity @end example @end ifnottex norm of the frequency weighted gain from disturbances on the plant input and output to the controller input and output as follows: @iftex @tex $$ \underset{K}{\min} \, || N(K) ||_{\infty}, $$ $$ N = | W_{1}^{-1}; W_2 G | \ (I - K G)^{-1} \ | W_1, \ G W_{2}^{-1} | $$ @end tex @end iftex @ifnottex @example -1 -1 -1 min || N(K) || , N = | W1 | (I - K G) | W1 G W2 | K oo | W2 G | @end example @end ifnottex @iftex @tex @end tex @end iftex @code{[K, N] = ncfsyn (G, W1, W2, f)} The function @command{ncfsyn} - the somewhat cryptic name stands for @emph{normalized coprime factorization synthesis} - allows the specification of an additional argument, factor @var{f}. Default value @code{f = 1} implies that an optimal controller is required, whereas @code{f > 1} implies that a suboptimal controller is required, achieving a performance that is @var{f} times less than optimal. @strong{Inputs} @table @var @item G @acronym{LTI} model of plant. @item W1 @acronym{LTI} model of precompensator. Model must be SISO or of appropriate size. An identity matrix is taken if @var{W1} is not specified or if an empty model @code{[]} is passed. @item W2 @acronym{LTI} model of postcompensator. Model must be SISO or of appropriate size. An identity matrix is taken if @var{W2} is not specified or if an empty model @code{[]} is passed. @item factor @code{factor = 1} implies that an optimal controller is required. @code{factor > 1} implies that a suboptimal controller is required, achieving a performance that is @var{factor} times less than optimal. Default value is 1. @end table @strong{Outputs} @table @var @item K State-space model of the H-infinity loop-shaping controller. Note that @var{K} is a @emph{positive} feedback controller. @item N State-space model of the closed loop depicted below. @item info Structure containing additional information. @item info.gamma L-infinity norm of @var{N}. @code{gamma = norm (N, inf)}. @item info.emax Nugap robustness. @code{emax = inv (gamma)}. @item info.Gs Shaped plant. @code{Gs = W2 * G * W1}. @item info.Ks Controller for shaped plant. @code{Ks = ncfsyn (Gs)}. @item info.rcond Estimates of the reciprocal condition numbers of the Riccati equations and a few other things. For details, see the description of the corresponding SLICOT routine. @end table @strong{Block Diagram of N} @example @group ^ z1 ^ z2 | | w1 + | +--------+ | +--------+ ----->(+)---+-->| Ks |----+--->(+)---->| Gs |----+ ^ + +--------+ ^ +--------+ | | w2 | | | | +-------------------------------------------------+ @end group @end example @strong{Algorithm}@* Uses SLICOT SB10ID, SB10KD and SB10ZD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @strong{References}@* [1] D. McFarlane and K. Glover, @cite{A Loop Shaping Design Procedure Using H-infinity Synthesis}, IEEE Transactions on Automatic Control, Vol. 37, No. 6, June 1992.@* [2] S. Skogestad and I. Postlethwaite, @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley, Chichester, England, 2005.@* @end deftypefn @chapter Matrix Equation Solvers @section care @findex care @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Solve continuous-time algebraic Riccati equation (ARE). @strong{Inputs} @table @var @item a Real matrix (n-by-n). @item b Real matrix (n-by-m). @item q Real matrix (n-by-n). @item r Real matrix (m-by-m). @item s Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item x Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @item g Corresponding gain matrix (m-by-n). @end table @strong{Equations} @example @group -1 A'X + XA - XB R B'X + Q = 0 -1 A'X + XA - (XB + S) R (B'X + S') + Q = 0 -1 G = R B'X -1 G = R (B'X + S') L = eig (A - B*G) @end group @end example @example @group -1 A'XE + E'XA - E'XB R B'XE + Q = 0 -1 A'XE + E'XA - (E'XB + S) R (B'XE + S') + Q = 0 -1 G = R B'XE -1 G = R (B'XE + S) L = eig (A - B*G, E) @end group @end example @strong{Algorithm}@* Uses SLICOT SB02OD and SG02AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{dare, lqr, dlqr, kalman} @end deftypefn @section dare @findex dare @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Solve discrete-time algebraic Riccati equation (ARE). @strong{Inputs} @table @var @item a Real matrix (n-by-n). @item b Real matrix (n-by-m). @item q Real matrix (n-by-n). @item r Real matrix (m-by-m). @item s Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item x Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @item g Corresponding gain matrix (m-by-n). @end table @strong{Equations} @example @group -1 A'XA - X - A'XB (B'XB + R) B'XA + Q = 0 -1 A'XA - X - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 -1 G = (B'XB + R) B'XA -1 G = (B'XB + R) (B'XA + S') L = eig (A - B*G) @end group @end example @example @group -1 A'XA - E'XE - A'XB (B'XB + R) B'XA + Q = 0 -1 A'XA - E'XE - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 -1 G = (B'XB + R) B'XA -1 G = (B'XB + R) (B'XA + S') L = eig (A - B*G, E) @end group @end example @strong{Algorithm}@* Uses SLICOT SB02OD and SG02AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{care, lqr, dlqr, kalman} @end deftypefn @section dlyap @findex dlyap @deftypefn{Function File} {@var{x} =} dlyap (@var{a}, @var{b}) @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{c}) @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{[]}, @var{e}) Solve discrete-time Lyapunov or Sylvester equations. @strong{Equations} @example @group AXA' - X + B = 0 (Lyapunov Equation) AXB' - X + C = 0 (Sylvester Equation) AXA' - EXE' + B = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03MD, SB04QD and SG03AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{dlyapchol, lyap, lyapchol} @end deftypefn @section dlyapchol @findex dlyapchol @deftypefn{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}) @deftypefnx{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}, @var{e}) Compute Cholesky factor of discrete-time Lyapunov equations. @strong{Equations} @example @group A U' U A' - U' U + B B' = 0 (Lyapunov Equation) A U' U A' - E U' U E' + B B' = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03OD and SG03BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{dlyap, lyap, lyapchol} @end deftypefn @section lyap @findex lyap @deftypefn{Function File} {@var{x} =} lyap (@var{a}, @var{b}) @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{c}) @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{[]}, @var{e}) Solve continuous-time Lyapunov or Sylvester equations. @strong{Equations} @example @group AX + XA' + B = 0 (Lyapunov Equation) AX + XB + C = 0 (Sylvester Equation) AXE' + EXA' + B = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03MD, SB04MD and SG03AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{lyapchol, dlyap, dlyapchol} @end deftypefn @section lyapchol @findex lyapchol @deftypefn{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}) @deftypefnx{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}, @var{e}) Compute Cholesky factor of continuous-time Lyapunov equations. @strong{Equations} @example @group A U' U + U' U A' + B B' = 0 (Lyapunov Equation) A U' U E' + E U' U A' + B B' = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03OD and SG03BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{lyap, dlyap, dlyapchol} @end deftypefn @chapter Model Reduction @section bstmodred @findex bstmodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by Balanced Stochastic Truncation (BST) method. The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. BST is a relative error method which tries to minimize @iftex @tex $$ || G^{-1} (G-G_r) ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example -1 ||G (G-Gr)|| = min inf @end example @end ifnottex @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values of the phase system corresponding to the @var{alpha}-stable part of the original system @var{G}. The @var{ns} Hankel singular values are ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is the sum of NU and the number of Hankel singular values greater than @code{MAX(TOL1,NS*EPS)}; @var{nr} can be further reduced to ensure that @code{HSV(NR-NU) > HSV(NR+1-NU)}. @item 'method' Approximation method for the H-infinity norm. Valid values corresponding to this key are: @table @var @item 'sr-bta', 'b' Use the square-root Balance & Truncate method. @item 'bfsr-bta', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @item 'sr-spa', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr-spa', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'beta' Use @code{[G, beta*I]} as new system @var{G} to combine absolute and relative error methods. BETA > 0 specifies the absolute/relative error weighting parameter. A large positive value of BETA favours the minimization of the absolute approximation error, while a small value of BETA is appropriate for the minimization of the relative error. BETA = 0 means a pure relative error method and can be used only if rank(G.D) = rows(G.D) which means that the feedthrough matrice must not be rank-deficient. Default value is 0. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of reduced system. For model reduction, the recommended value of @var{tol1} lies in the interval [0.00001, 0.001]. @var{tol1} < 1. If @var{tol1} <= 0 on entry, the used default value is @var{tol1} = NS*EPS, where NS is the number of ALPHA-stable eigenvalues of A and EPS is the machine precision. If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the phase system (see METHOD) corresponding to the ALPHA-stable part of the given system. The recommended value is TOL2 = NS*EPS. TOL2 <= TOL1 < 1. This value is used by default if @var{'tol2'} is not specified or if TOL2 <= 0 on entry. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table BST is often suitable to perform model reduction in order to obtain low order design models for controller synthesis. Approximation Properties: @itemize @bullet @item Guaranteed stability of reduced models @item Approximates simultaneously gain and phase @item Preserves non-minimum phase zeros @item Guaranteed a priori error bound @iftex @tex $$ || G^{-1} (G-G_r) ||_{\infty} \leq 2 \sum_{j=r+1}^{n} {1+\sigma_j \over 1-\sigma_j} - 1 $$ @end tex @end iftex @end itemize @strong{Algorithm}@* Uses SLICOT AB09HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section btamodred @findex btamodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by frequency weighted Balanced Truncation Approximation (BTA) method. The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. BTA is an absolute error method which tries to minimize @iftex @tex $$ || G - G_r ||_{\infty} = \min $$ $$ || V \ (G - G_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||G-Gr|| = min inf ||V (G-Gr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values of the @var{alpha}-stable part of the original system @var{G}, ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'left', 'output' @acronym{LTI} model of the left/output frequency weighting @var{V}. Default value is an identity matrix. @item 'right', 'input' @acronym{LTI} model of the right/input frequency weighting @var{W}. Default value is an identity matrix. @item 'method' Approximation method for the L-infinity norm to be used as follows: @table @var @item 'sr', 'b' Use the square-root Balance & Truncate method. @item 'bfsr', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced model. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ns*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given model. TOL2 <= TOL1. If not specified, ns*eps*info.hsv(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'alpha-ctrb' Combination method parameter for defining the frequency-weighted controllability Grammian. abs(alphac) <= 1. If alphac = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphac = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'alpha-obsv' Combination method parameter for defining the frequency-weighted observability Grammian. abs(alphao) <= 1. If alphao = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphao = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. This is done by state transformations. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table Approximation Properties: @itemize @bullet @item Guaranteed stability of reduced models @item Lower guaranteed error bound @item Guaranteed a priori error bound @iftex @tex $$ \sigma_{r+1} \leq || (G-G_r) ||_{\infty} \leq 2 \sum_{j=r+1}^{n} \sigma_j $$ @end tex @end iftex @end itemize @strong{References}@* [1] Enns, D. @cite{Model reduction with balanced realizations: An error bound and a frequency weighted generalization}. Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. [2] Lin, C.-A. and Chiu, T.-Y. @cite{Model reduction via frequency-weighted balanced realization}. Control Theory and Advanced Technology, vol. 8, pp. 341-351, 1992. [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. @cite{New results on frequency weighted balanced reduction technique}. Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. [4] Varga, A. and Anderson, B.D.O. @cite{Square-root balancing-free methods for the frequency-weighted balancing related model reduction}. (report in preparation) @strong{Algorithm}@* Uses SLICOT AB09ID by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section hnamodred @findex hnamodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by frequency weighted optimal Hankel-norm (HNA) method. The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. HNA is an absolute error method which tries to minimize @iftex @tex $$ || G - G_r ||_H = \min $$ $$ || V \ (G - G_r) \ W ||_H = \min $$ @end tex @end iftex @ifnottex @example ||G-Gr|| = min H ||V (G-Gr) W|| = min H @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{"order"}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values corresponding to the projection @code{op(V)*G1*op(W)}, where G1 denotes the @var{alpha}-stable part of the original system @var{G}. The @var{ns} Hankel singular values are ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is the sum of @var{info.nu} and the number of Hankel singular values greater than @code{max(tol1, ns*eps*info.hsv(1)}; @item 'method' Specifies the computational approach to be used. Valid values corresponding to this key are: @table @var @item 'descriptor' Use the inverse free descriptor system approach. @item 'standard' Use the inversion based standard approach. @item 'auto' Switch automatically to the inverse free descriptor approach in case of badly conditioned feedthrough matrices in V or W. Default method. @end table @item 'left', 'v' @acronym{LTI} model of the left/output frequency weighting. The weighting must be antistable. @iftex @math{|| V \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || V (G-Gr) . || = min H @end example @end ifnottex @item 'right', 'w' @acronym{LTI} model of the right/input frequency weighting. The weighting must be antistable. @iftex @math{|| \dots (G-G_r) \ W ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) W || = min H @end example @end ifnottex @item 'left-inv', 'inv-v' @acronym{LTI} model of the left/output frequency weighting. The weighting must have only antistable zeros. @iftex @math{|| inv(V) \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || inv(V) (G-Gr) . || = min H @end example @end ifnottex @item 'right-inv', 'inv-w' @acronym{LTI} model of the right/input frequency weighting. The weighting must have only antistable zeros. @iftex @math{|| \dots (G-G_r) \ inv(W) ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) inv(W) || = min H @end example @end ifnottex @item 'left-conj', 'conj-v' @acronym{LTI} model of the left/output frequency weighting. The weighting must be stable. @iftex @math{|| conj(V) \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || V (G-Gr) . || = min H @end example @end ifnottex @item 'right-conj', 'conj-w' @acronym{LTI} model of the right/input frequency weighting. The weighting must be stable. @iftex @math{|| \dots (G-G_r) \ conj(W) ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) W || = min H @end example @end ifnottex @item 'left-conj-inv', 'conj-inv-v' @acronym{LTI} model of the left/output frequency weighting. The weighting must be minimum-phase. @iftex @math{|| conj(inv(V)) \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || V (G-Gr) . || = min H @end example @end ifnottex @item 'right-conj-inv', 'conj-inv-w' @acronym{LTI} model of the right/input frequency weighting. The weighting must be minimum-phase. @iftex @math{|| \dots (G-G_r) \ conj(inv(W)) ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) W || = min H @end example @end ifnottex @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced model. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. @var{tol1} < 1. If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given model. @var{tol2} <= @var{tol1} < 1. If not specified, ns*eps*info.hsv(1) is chosen. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table Approximation Properties: @itemize @bullet @item Guaranteed stability of reduced models @item Lower guaranteed error bound @item Guaranteed a priori error bound @iftex @tex $$ \sigma_{r+1} \leq || (G-G_r) ||_{\infty} \leq 2 \sum_{j=r+1}^{n} \sigma_j $$ @end tex @end iftex @end itemize @strong{Algorithm}@* Uses SLICOT AB09JD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section spamodred @findex spamodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by frequency weighted Singular Perturbation Approximation (SPA). The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. SPA is an absolute error method which tries to minimize @iftex @tex $$ || G - G_r ||_{\infty} = \min $$ $$ || V \ (G - G_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||G-Gr|| = min inf ||V (G-Gr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values of the @var{alpha}-stable part of the original system @var{G}, ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'left', 'output' @acronym{LTI} model of the left/output frequency weighting @var{V}. Default value is an identity matrix. @item 'right', 'input' @acronym{LTI} model of the right/input frequency weighting @var{W}. Default value is an identity matrix. @item 'method' Approximation method for the L-infinity norm to be used as follows: @table @var @item 'sr', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. Default method. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced model. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ns*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given model. TOL2 <= TOL1. If not specified, ns*eps*info.hsv(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'alpha-ctrb' Combination method parameter for defining the frequency-weighted controllability Grammian. abs(alphac) <= 1. If alphac = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphac = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'alpha-obsv' Combination method parameter for defining the frequency-weighted observability Grammian. abs(alphao) <= 1. If alphao = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphao = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{References}@* [1] Enns, D. @cite{Model reduction with balanced realizations: An error bound and a frequency weighted generalization}. Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. [2] Lin, C.-A. and Chiu, T.-Y. @cite{Model reduction via frequency-weighted balanced realization}. Control Theory and Advanced Technology, vol. 8, pp. 341-351, 1992. [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. @cite{New results on frequency weighted balanced reduction technique}. Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. [4] Varga, A. and Anderson, B.D.O. @cite{Square-root balancing-free methods for the frequency-weighted balancing related model reduction}. (report in preparation) @strong{Algorithm}@* Uses SLICOT AB09ID by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @chapter Controller Reduction @section btaconred @findex btaconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) Controller reduction by frequency-weighted Balanced Truncation Approximation (BTA). Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced order controller @var{Kr} such that the closed-loop system is stable and closed-loop performance is retained. The algorithm tries to minimize the frequency-weighted error @iftex @tex $$ || V \ (K - K_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||V (K-Kr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model of the plant. It has m inputs, p outputs and n states. @item K @acronym{LTI} model of the controller. It has p inputs, m outputs and nc states. @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.ncr The order of the obtained reduced order controller @var{Kr}. @item info.ncs The order of the alpha-stable part of original controller @var{K}. @item info.hsvc The Hankel singular values of the alpha-stable part of @var{K}. The @var{ncs} Hankel singular values are ordered decreasingly. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsvc} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr', 'b' Use the square-root Balance & Truncate method. @item 'bfsr', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @end table @item 'weight' Specifies the type of frequency-weighting as follows: @table @var @item 'none' No weightings are used (V = I, W = I). @item 'left', 'output' Use stability enforcing left (output) weighting @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = I $$ @end tex @end iftex @ifnottex @example -1 V = (I-G*K) *G , W = I @end example @end ifnottex @item 'right', 'input' Use stability enforcing right (input) weighting @iftex @tex $$ V = I, \qquad W = (I - G K)^{-1} G $$ @end tex @end iftex @ifnottex @example -1 V = I , W = (I-G*K) *G @end example @end ifnottex @item 'both', 'performance' Use stability and performance enforcing weightings @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = (I - G K)^{-1} $$ @end tex @end iftex @ifnottex @example -1 -1 V = (I-G*K) *G , W = (I-G*K) @end example @end ifnottex Default value. @end table @item 'feedback' Specifies whether @var{K} is a positive or negative feedback controller: @table @var @item '+' Use positive feedback controller. Default value. @item '-' Use negative feedback controller. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{K.A}. For a continuous-time controller, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time controller, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time controllers and 1 for discrete-time controllers. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced controller. For model reduction, the recommended value of @var{tol1} is c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ncs*eps*info.hsvc(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given controller. TOL2 <= TOL1. If not specified, ncs*eps*info.hsvc(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on @var{G} and @var{K} prior to order reduction. Default value is false if both @code{G.scaled == true, K.scaled == true} and true otherwise. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{Algorithm}@* Uses SLICOT SB16AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section cfconred @findex cfconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) Reduction of state-feedback-observer based controller by coprime factorization (CF). Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, determine a reduced order controller @var{Kr}. @strong{Inputs} @table @var @item G @acronym{LTI} model of the open-loop plant (A,B,C,D). It has m inputs, p outputs and n states. @item F Stabilizing state feedback matrix (m-by-n). @item L Stabilizing observer gain matrix (n-by-p). @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.hsv The Hankel singular values of the extended system?!?. The @var{n} Hankel singular values are ordered decreasingly. @item info.ncr The order of the obtained reduced order controller @var{Kr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr-bta', 'b' Use the square-root Balance & Truncate method. @item 'bfsr-bta', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @item 'sr-spa', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr-spa', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. @end table @item 'cf' Specifies whether left or right coprime factorization is to be used as follows: @table @var @item 'left', 'l' Use left coprime factorization. Default method. @item 'right', 'r' Use right coprime factorization. @end table @item 'feedback' Specifies whether @var{F} and @var{L} are fed back positively or negatively: @table @var @item '+' A+BK and A+LC are both Hurwitz matrices. @item '-' A-BK and A-LC are both Hurwitz matrices. Default value. @end table @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced system. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is n*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the coprime factorization controller. TOL2 <= TOL1. If not specified, n*eps*info.hsv(1) is chosen. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{Algorithm}@* Uses SLICOT SB16BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section fwcfconred @findex fwcfconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) Reduction of state-feedback-observer based controller by frequency-weighted coprime factorization (FW CF). Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, determine a reduced order controller @var{Kr} by using stability enforcing frequency weights. @strong{Inputs} @table @var @item G @acronym{LTI} model of the open-loop plant (A,B,C,D). It has m inputs, p outputs and n states. @item F Stabilizing state feedback matrix (m-by-n). @item L Stabilizing observer gain matrix (n-by-p). @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.hsv The Hankel singular values of the extended system?!?. The @var{n} Hankel singular values are ordered decreasingly. @item info.ncr The order of the obtained reduced order controller @var{Kr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr', 'b' Use the square-root Balance & Truncate method. @item 'bfsr', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @end table @item 'cf' Specifies whether left or right coprime factorization is to be used as follows: @table @var @item 'left', 'l' Use left coprime factorization. @item 'right', 'r' Use right coprime factorization. Default method. @end table @item 'feedback' Specifies whether @var{F} and @var{L} are fed back positively or negatively: @table @var @item '+' A+BK and A+LC are both Hurwitz matrices. @item '-' A-BK and A-LC are both Hurwitz matrices. Default value. @end table @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced system. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is n*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @end table @strong{Algorithm}@* Uses SLICOT SB16CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section spaconred @findex spaconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) Controller reduction by frequency-weighted Singular Perturbation Approximation (SPA). Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced order controller @var{Kr} such that the closed-loop system is stable and closed-loop performance is retained. The algorithm tries to minimize the frequency-weighted error @iftex @tex $$ || V \ (K - K_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||V (K-Kr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model of the plant. It has m inputs, p outputs and n states. @item K @acronym{LTI} model of the controller. It has p inputs, m outputs and nc states. @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.ncr The order of the obtained reduced order controller @var{Kr}. @item info.ncs The order of the alpha-stable part of original controller @var{K}. @item info.hsvc The Hankel singular values of the alpha-stable part of @var{K}. The @var{ncs} Hankel singular values are ordered decreasingly. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsvc} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. Default method. @end table @item 'weight' Specifies the type of frequency-weighting as follows: @table @var @item 'none' No weightings are used (V = I, W = I). @item 'left', 'output' Use stability enforcing left (output) weighting @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = I $$ @end tex @end iftex @ifnottex @example -1 V = (I-G*K) *G , W = I @end example @end ifnottex @item 'right', 'input' Use stability enforcing right (input) weighting @iftex @tex $$ V = I, \qquad W = (I - G K)^{-1} G $$ @end tex @end iftex @ifnottex @example -1 V = I , W = (I-G*K) *G @end example @end ifnottex @item 'both', 'performance' Use stability and performance enforcing weightings @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = (I - G K)^{-1} $$ @end tex @end iftex @ifnottex @example -1 -1 V = (I-G*K) *G , W = (I-G*K) @end example @end ifnottex Default value. @end table @item 'feedback' Specifies whether @var{K} is a positive or negative feedback controller: @table @var @item '+' Use positive feedback controller. Default value. @item '-' Use negative feedback controller. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{K.A}. For a continuous-time controller, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time controller, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time controllers and 1 for discrete-time controllers. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced controller. For model reduction, the recommended value of @var{tol1} is c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ncs*eps*info.hsvc(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given controller. TOL2 <= TOL1. If not specified, ncs*eps*info.hsvc(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on @var{G} and @var{K} prior to order reduction. Default value is false if both @code{G.scaled == true, K.scaled == true} and true otherwise. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} function because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{Algorithm}@* Uses SLICOT SB16AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @chapter Experimental Data Handling @section iddata @findex iddata @deftypefn{Function File} {@var{dat} =} iddata (@var{y}) @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}) @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{tsam}, @dots{}) @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{[]}, @dots{}) Create identification dataset of output and input signals. @strong{Inputs} @table @var @item y Real matrix containing the output signal in time-domain. For a system with @var{p} outputs and @var{n} samples, @var{y} is a n-by-p matrix. For data from multiple experiments, @var{y} becomes a e-by-1 or 1-by-e cell vector of n(i)-by-p matrices, where @var{e} denotes the number of experiments and n(i) the individual number of samples for each experiment. @item u Real matrix containing the input signal in time-domain. For a system with @var{m} inputs and @var{n} samples, @var{u} is a n-by-m matrix. For data from multiple experiments, @var{u} becomes a e-by-1 or 1-by-e cell vector of n(i)-by-m matrices, where @var{e} denotes the number of experiments and n(i) the individual number of samples for each experiment. If @var{u} is not specified or an empty element @code{[]} is passed, @var{dat} becomes a time series dataset. @item tsam Sampling time. If not specified, default value -1 (unspecified) is taken. For multi-experiment data, @var{tsam} becomes a e-by-1 or 1-by-e cell vector containing individual sampling times for each experiment. If a scalar @var{tsam} is provided, then all experiments have the same sampling time. @item @dots{} Optional pairs of properties and values. @end table @strong{Outputs} @table @var @item dat iddata identification dataset. @end table @strong{Option Keys and Values} @table @var @item 'expname' The name of the experiments in @var{dat}. Cell vector of length e containing strings. Default names are @code{@{'exp1', 'exp2', ...@}} @item 'y' Output signals. See 'Inputs' for details. @item 'outname' The name of the output channels in @var{dat}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'outunit' The units of the output channels in @var{dat}. Cell vector of length p containing strings. @item 'u' Input signals. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{dat}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'inunit' The units of the input channels in @var{dat}. Cell vector of length m containing strings. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'timeunit' The units of the sampling times in @var{dat}. Cell vector of length e containing strings. @item 'name' String containing the name of the dataset. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @end deftypefn @section @@iddata/cat @findex cat @deftypefn {Function File} {@var{dat} =} cat (@var{dim}, @var{dat1}, @var{dat2}, @dots{}) Concatenate iddata sets along dimension @var{dim}. @strong{Inputs} @table @var @item dim Dimension along which the concatenation takes place. @table @var @item 1 Concatenate samples. The samples are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} where @var{e} denotes the experiment. The number of experiments, outputs and inputs must be equal for all datasets. Equivalent to @command{vertcat}. @item 2 Concatenate inputs and outputs. The outputs and inputs are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} where @var{e} denotes the experiment. The number of experiments and samples must be equal for all datasets. Equivalent to @command{horzcat}. @item 3 Concatenate experiments. The experiments are concatenated in the following way: @code{dat.y = [dat1.y; dat2.y; @dots{}]} @code{dat.u = [dat1.u; dat2.u; @dots{}]} The number of outputs and inputs must be equal for all datasets. Equivalent to @command{merge}. @end table @item dat1, dat2, @dots{} iddata sets to be concatenated. @end table @strong{Outputs} @table @var @item dat Concatenated iddata set. @end table @seealso{horzcat, merge, vertcat} @end deftypefn @section @@iddata/detrend @findex detrend @deftypefn {Function File} {@var{dat} =} detrend (@var{dat}) @deftypefnx {Function File} {@var{dat} =} detrend (@var{dat}, @var{ord}) Detrend outputs and inputs of dataset @var{dat} by removing the best fit of a polynomial of order @var{ord}. If @var{ord} is not specified, default value 0 is taken. This corresponds to removing a constant. @end deftypefn @section @@iddata/diff @findex diff @deftypefn {Function File} {@var{dat} =} diff (@var{dat}) @deftypefnx {Function File} {@var{dat} =} diff (@var{dat}, @var{k}) Return @var{k}-th difference of outputs and inputs of dataset @var{dat}. If @var{k} is not specified, default value 1 is taken. @end deftypefn @section @@iddata/fft @findex fft @deftypefn {Function File} {@var{dat} =} fft (@var{dat}) @deftypefnx {Function File} {@var{dat} =} fft (@var{dat}, @var{n}) Transform iddata objects from time to frequency domain using a Fast Fourier Transform (FFT) algorithm. @strong{Inputs} @table @var @item dat iddata set containing signals in time-domain. @item n Length of the FFT transformations. If @var{n} does not match the signal length, the signals in @var{dat} are shortened or padded with zeros. @var{n} is a vector with as many elements as there are experiments in @var{dat} or a scalar with a common length for all experiments. If not specified, the signal lengths are taken as default values. @end table @strong{Outputs} @table @var @item dat iddata identification dataset in frequency-domain. In order to preserve signal power and noise level, the FFTs are normalized by dividing each transform by the square root of the signal length. The frequency values are distributed equally from 0 to the Nyquist frequency. The Nyquist frequency is only included for even signal lengths. @end table @end deftypefn @section @@iddata/filter @findex filter @deftypefn {Function File} {@var{dat} =} filter (@var{dat}, @var{sys}) @deftypefnx {Function File} {@var{dat} =} filter (@var{dat}, @var{b}, @var{a}) Filter output and input signals of dataset @var{dat}. The filter is specified either by @acronym{LTI} system @var{sys} or by transfer function polynomials @var{b} and @var{a} as described in the help text of Octave's built-in filter function. Type @code{help filter} for more information. @strong{Inputs} @table @var @item dat iddata identification dataset containing signals in time-domain. @item sys @acronym{LTI} object containing the discrete-time filter. @item b Numerator polynomial of the discrete-time filter. Must be a row vector containing the coefficients of the polynomial in ascending powers of z^-1. @item a Denominator polynomial of the discrete-time filter. Must be a row vector containing the coefficients of the polynomial in ascending powers of z^-1. @end table @strong{Outputs} @table @var @item dat iddata identification dataset with filtered output and input signals. @end table @end deftypefn @section @@iddata/get @findex get @deftypefn {Function File} {} get (@var{dat}) @deftypefnx {Function File} {@var{value} =} get (@var{dat}, @var{'key'}) @deftypefnx {Function File} {[@var{val1}, @var{val2}, @dots{}] =} get (@var{dat}, @var{'key1'}, @var{'key2'}, @dots{}) Access key values of iddata objects. Type @command{get(dat)} to display a list of available keys. @end deftypefn @section @@iddata/ifft @findex ifft @deftypefn {Function File} {@var{dat} =} ifft (@var{dat}) Transform iddata objects from frequency to time domain. @strong{Inputs} @table @var @item dat iddata set containing signals in frequency domain. The frequency values must be distributed equally from 0 to the Nyquist frequency. The Nyquist frequency is only included for even signal lengths. @end table @strong{Outputs} @table @var @item dat iddata identification dataset in time domain. In order to preserve signal power and noise level, the FFTs are normalized by multiplying each transform by the square root of the signal length. @end table @end deftypefn @section @@iddata/merge @findex merge @deftypefn {Function File} {@var{dat} =} merge (@var{dat1}, @var{dat2}, @dots{}) Concatenate experiments of iddata datasets. The experiments are concatenated in the following way: @code{dat.y = [dat1.y; dat2.y; @dots{}]} @code{dat.u = [dat1.u; dat2.u; @dots{}]} The number of outputs and inputs must be equal for all datasets. @end deftypefn @section @@iddata/nkshift @findex nkshift @deftypefn {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}) @deftypefnx {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}, @var{'append'}) Shift input channels of dataset @var{dat} according to integer @var{nk}. A positive value of @var{nk} means that the input channels are delayed @var{nk} samples. By default, both input and output signals are shortened by @var{nk} samples. If a third argument @var{'append'} is passed, the output signals are left untouched while @var{nk} zeros are appended to the (shortened) input signals such that the number of samples in @var{dat} remains constant. @end deftypefn @section @@iddata/plot @findex plot @deftypefn {Function File} {} plot (@var{dat}) @deftypefnx {Function File} {} plot (@var{dat}, @var{exp}) Plot signals of iddata identification datasets on the screen. The signals are plotted experiment-wise, either in time- or frequency-domain. For multi-experiment datasets, press any key to switch to the next experiment. If the plot of a single experiment should be saved by the @command{print} command, use @code{plot(dat,exp)}, where @var{exp} denotes the desired experiment. @end deftypefn @section @@iddata/resample @findex resample @deftypefn {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}) @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{n}) @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{h}) Change the sample rate of the output and input signals in dataset @var{dat} by a factor of @code{p/q}. This is performed using a polyphase algorithm. The anti-aliasing @acronym{FIR} filter can be specified as follows: Either by order @var{n} (scalar) with default value 0. The band edges are then chosen automatically. Or by impulse response @var{h} (vector). Requires the signal package to be installed. @strong{Algorithm}@* Uses functions @command{fir1} and @command{resample} from the signal package. @strong{References}@* [1] J. G. Proakis and D. G. Manolakis, Digital Signal Processing: Principles, Algorithms, and Applications, 4th ed., Prentice Hall, 2007. Chap. 6 [2] A. V. Oppenheim, R. W. Schafer and J. R. Buck, Discrete-time signal processing, Signal processing series, Prentice-Hall, 1999 @end deftypefn @section @@iddata/set @findex set @deftypefn {Function File} {} set (@var{dat}) @deftypefnx {Function File} {} set (@var{dat}, @var{'key'}, @var{value}, @dots{}) @deftypefnx {Function File} {@var{dat} =} set (@var{dat}, @var{'key'}, @var{value}, @dots{}) Set or modify keys of iddata objects. If no return argument @var{dat} is specified, the modified @acronym{IDDATA} object is stored in input argument @var{dat}. @command{set} can handle multiple keys in one call: @code{set (dat, 'key1', val1, 'key2', val2, 'key3', val3)}. @code{set (dat)} prints a list of the object's key names. @end deftypefn @section @@iddata/size @findex size @deftypefn {Function File} {@var{nvec} =} size (@var{dat}) @deftypefnx {Function File} {@var{ndim} =} size (@var{dat}, @var{dim}) @deftypefnx {Function File} {[@var{n}, @var{p}, @var{m}, @var{e}] =} size (@var{dat}) Return dimensions of iddata set @var{dat}. @strong{Inputs} @table @var @item dat iddata set. @item dim If given a second argument, @command{size} will return the size of the corresponding dimension. @end table @strong{Outputs} @table @var @item nvec Row vector. The first element is the total number of samples (rows of dat.y and dat.u). The second element is the number of outputs (columns of dat.y) and the third element the number of inputs (columns of dat.u). The fourth element is the number of experiments. @item ndim Scalar value. The size of the dimension @var{dim}. @item n Row vector containing the number of samples of each experiment. @item p Number of outputs. @item m Number of inputs. @item e Number of experiments. @end table @end deftypefn @chapter System Identification @section arx @findex arx @deftypefn {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{'na'}, @var{na}, @var{'nb'}, @var{nb}) Estimate ARX model using QR factorization. @iftex @tex $$ A(q) \, y(t) = B(q) \, u(t) \, + \, e(t) $$ @end tex @end iftex @ifnottex @example A(q) y(t) = B(q) u(t) + e(t) @end example @end ifnottex @strong{Inputs} @table @var @item dat iddata identification dataset containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting model @var{sys}. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time transfer function model. If the second output argument @var{x0} is returned, @var{sys} becomes a state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @end table @strong{Option Keys and Values} @table @var @item 'na' Order of the polynomial A(q) and number of poles. @item 'nb' Order of the polynomial B(q)+1 and number of zeros+1. @var{nb} <= @var{na}. @item 'nk' Input-output delay specified as number of sampling instants. Scalar positive integer. This corresponds to a call to function @command{nkshift}, followed by padding the B polynomial with @var{nk} leading zeros. @end table @strong{Algorithm}@* Uses the formulae given in [1] on pages 318-319, 'Solving for the LS Estimate by QR Factorization'. For the initial conditions, SLICOT IB01CD is used by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @strong{References}@* [1] Ljung, L. (1999) @cite{System Identification: Theory for the User: Second Edition}. Prentice Hall, New Jersey, USA. @end deftypefn @section moen4 @findex moen4 @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @var{opt}, @dots{}) Estimate state-space model using combined subspace method: @acronym{MOESP} algorithm for finding the matrices A and C, and @acronym{N4SID} algorithm for finding the matrices B and D. If no output arguments are given, the singular values are plotted on the screen in order to estimate the system order. @strong{Inputs} @table @var @item dat iddata set containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting state-space system @var{sys}. If not specified, @var{n} is chosen automatically according to the singular values and tolerances. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @item info Struct containing additional information. @table @var @item info.K Kalman gain matrix. @item info.Q State covariance matrix. @item info.Ry Output covariance matrix. @item info.S State-output cross-covariance matrix. @item info.L Noise variance matrix factor. LL'=Ry. @end table @end table @strong{Option Keys and Values} @table @var @item 'n' The desired order of the resulting state-space system @var{sys}. @var{s} > @var{n} > 0. @item 's' The number of block rows @var{s} in the input and output block Hankel matrices to be processed. @var{s} > 0. In the MOESP theory, @var{s} should be larger than @var{n}, the estimated dimension of state vector. @item 'alg', 'algorithm' Specifies the algorithm for computing the triangular factor R, as follows: @table @var @item 'C' Cholesky algorithm applied to the correlation matrix of the input-output data. Default method. @item 'F' Fast QR algorithm. @item 'Q' QR algorithm applied to the concatenated block Hankel matrices. @end table @item 'tol' Absolute tolerance used for determining an estimate of the system order. If @var{tol} >= 0, the estimate is indicated by the index of the last singular value greater than or equal to @var{tol}. (Singular values less than @var{tol} are considered as zero.) When @var{tol} = 0, an internally computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, where SV(1) is the maximal singular value, and @var{eps} is the relative machine precision. When @var{tol} < 0, the estimate is indicated by the index of the singular value that has the largest logarithmic gap to its successor. Default value is 0. @item 'rcond' The tolerance to be used for estimating the rank of matrices. If the user sets @var{rcond} > 0, the given value of @var{rcond} is used as a lower bound for the reciprocal condition number; an m-by-n matrix whose estimated condition number is less than 1/@var{rcond} is considered to be of full rank. If the user sets @var{rcond} <= 0, then an implicitly computed, default tolerance, defined by @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the relative machine precision. Default value is 0. @item 'confirm' Specifies whether or not the user's confirmation of the system order estimate is desired, as follows: @table @var @item true User's confirmation. @item false No confirmation. Default value. @end table @item 'noiseinput' The desired type of noise input channels. @table @var @item 'n' No error inputs. Default value. @iftex @tex $$ x_{k+1} = A x_k + B u_k $$ $$ y_k = C x_k + D u_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] y[k] = C x[k] + D u[k] @end example @end ifnottex @item 'e' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and noise channels e with covariance matrix @var{Ry}. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K e_k $$ $$ y_k = C x_k + D u_k + e_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K e[k] y[k] = C x[k] + D u[k] + e[k] @end example @end ifnottex @item 'v' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and white noise channels v with identity covariance matrix. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K L v_k $$ $$ y_k = C x_k + D u_k + L v_k $$ $$ e = L v, \ L L^T = R_y $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K L v[k] y[k] = C x[k] + D u[k] + L v[k] e = L v, L L' = Ry @end example @end ifnottex @item 'k' Return @var{sys} as a Kalman predictor for simulation. @iftex @tex $$ \widehat{x}_{k+1} = A \widehat{x}_k + B u_k + K (y_k - \widehat{y}_k) $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k $$ @end tex @end iftex @ifnottex @example ^ ^ ^ x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ^ ^ y[k] = C x[k] + D u[k] @end example @end ifnottex @iftex @tex $$ \widehat{x}_{k+1} = (A-KC) \widehat{x}_k + (B-KD) u_k + K y_k $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k + 0 y_k $$ @end tex @end iftex @ifnottex @example ^ ^ x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ^ ^ y[k] = C x[k] + D u[k] + 0 y[k] @end example @end ifnottex @end table @end table @strong{Algorithm}@* Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section moesp @findex moesp @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @var{opt}, @dots{}) Estimate state-space model using @acronym{MOESP} algorithm. @acronym{MOESP}: Multivariable Output Error State sPace. If no output arguments are given, the singular values are plotted on the screen in order to estimate the system order. @strong{Inputs} @table @var @item dat iddata set containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting state-space system @var{sys}. If not specified, @var{n} is chosen automatically according to the singular values and tolerances. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @item info Struct containing additional information. @table @var @item info.K Kalman gain matrix. @item info.Q State covariance matrix. @item info.Ry Output covariance matrix. @item info.S State-output cross-covariance matrix. @item info.L Noise variance matrix factor. LL'=Ry. @end table @end table @strong{Option Keys and Values} @table @var @item 'n' The desired order of the resulting state-space system @var{sys}. @var{s} > @var{n} > 0. @item 's' The number of block rows @var{s} in the input and output block Hankel matrices to be processed. @var{s} > 0. In the MOESP theory, @var{s} should be larger than @var{n}, the estimated dimension of state vector. @item 'alg', 'algorithm' Specifies the algorithm for computing the triangular factor R, as follows: @table @var @item 'C' Cholesky algorithm applied to the correlation matrix of the input-output data. Default method. @item 'F' Fast QR algorithm. @item 'Q' QR algorithm applied to the concatenated block Hankel matrices. @end table @item 'tol' Absolute tolerance used for determining an estimate of the system order. If @var{tol} >= 0, the estimate is indicated by the index of the last singular value greater than or equal to @var{tol}. (Singular values less than @var{tol} are considered as zero.) When @var{tol} = 0, an internally computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, where SV(1) is the maximal singular value, and @var{eps} is the relative machine precision. When @var{tol} < 0, the estimate is indicated by the index of the singular value that has the largest logarithmic gap to its successor. Default value is 0. @item 'rcond' The tolerance to be used for estimating the rank of matrices. If the user sets @var{rcond} > 0, the given value of @var{rcond} is used as a lower bound for the reciprocal condition number; an m-by-n matrix whose estimated condition number is less than 1/@var{rcond} is considered to be of full rank. If the user sets @var{rcond} <= 0, then an implicitly computed, default tolerance, defined by @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the relative machine precision. Default value is 0. @item 'confirm' Specifies whether or not the user's confirmation of the system order estimate is desired, as follows: @table @var @item true User's confirmation. @item false No confirmation. Default value. @end table @item 'noiseinput' The desired type of noise input channels. @table @var @item 'n' No error inputs. Default value. @iftex @tex $$ x_{k+1} = A x_k + B u_k $$ $$ y_k = C x_k + D u_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] y[k] = C x[k] + D u[k] @end example @end ifnottex @item 'e' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and noise channels e with covariance matrix @var{Ry}. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K e_k $$ $$ y_k = C x_k + D u_k + e_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K e[k] y[k] = C x[k] + D u[k] + e[k] @end example @end ifnottex @item 'v' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and white noise channels v with identity covariance matrix. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K L v_k $$ $$ y_k = C x_k + D u_k + L v_k $$ $$ e = L v, \ L L^T = R_y $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K L v[k] y[k] = C x[k] + D u[k] + L v[k] e = L v, L L' = Ry @end example @end ifnottex @item 'k' Return @var{sys} as a Kalman predictor for simulation. @iftex @tex $$ \widehat{x}_{k+1} = A \widehat{x}_k + B u_k + K (y_k - \widehat{y}_k) $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k $$ @end tex @end iftex @ifnottex @example ^ ^ ^ x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ^ ^ y[k] = C x[k] + D u[k] @end example @end ifnottex @iftex @tex $$ \widehat{x}_{k+1} = (A-KC) \widehat{x}_k + (B-KD) u_k + K y_k $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k + 0 y_k $$ @end tex @end iftex @ifnottex @example ^ ^ x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ^ ^ y[k] = C x[k] + D u[k] + 0 y[k] @end example @end ifnottex @end table @end table @strong{Algorithm}@* Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section n4sid @findex n4sid @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @var{opt}, @dots{}) Estimate state-space model using @acronym{N4SID} algorithm. @acronym{N4SID}: Numerical algorithm for Subspace State Space System IDentification. If no output arguments are given, the singular values are plotted on the screen in order to estimate the system order. @strong{Inputs} @table @var @item dat iddata set containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting state-space system @var{sys}. If not specified, @var{n} is chosen automatically according to the singular values and tolerances. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @item info Struct containing additional information. @table @var @item info.K Kalman gain matrix. @item info.Q State covariance matrix. @item info.Ry Output covariance matrix. @item info.S State-output cross-covariance matrix. @item info.L Noise variance matrix factor. LL'=Ry. @end table @end table @strong{Option Keys and Values} @table @var @item 'n' The desired order of the resulting state-space system @var{sys}. @var{s} > @var{n} > 0. @item 's' The number of block rows @var{s} in the input and output block Hankel matrices to be processed. @var{s} > 0. In the MOESP theory, @var{s} should be larger than @var{n}, the estimated dimension of state vector. @item 'alg', 'algorithm' Specifies the algorithm for computing the triangular factor R, as follows: @table @var @item 'C' Cholesky algorithm applied to the correlation matrix of the input-output data. Default method. @item 'F' Fast QR algorithm. @item 'Q' QR algorithm applied to the concatenated block Hankel matrices. @end table @item 'tol' Absolute tolerance used for determining an estimate of the system order. If @var{tol} >= 0, the estimate is indicated by the index of the last singular value greater than or equal to @var{tol}. (Singular values less than @var{tol} are considered as zero.) When @var{tol} = 0, an internally computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, where SV(1) is the maximal singular value, and @var{eps} is the relative machine precision. When @var{tol} < 0, the estimate is indicated by the index of the singular value that has the largest logarithmic gap to its successor. Default value is 0. @item 'rcond' The tolerance to be used for estimating the rank of matrices. If the user sets @var{rcond} > 0, the given value of @var{rcond} is used as a lower bound for the reciprocal condition number; an m-by-n matrix whose estimated condition number is less than 1/@var{rcond} is considered to be of full rank. If the user sets @var{rcond} <= 0, then an implicitly computed, default tolerance, defined by @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the relative machine precision. Default value is 0. @item 'confirm' Specifies whether or not the user's confirmation of the system order estimate is desired, as follows: @table @var @item true User's confirmation. @item false No confirmation. Default value. @end table @item 'noiseinput' The desired type of noise input channels. @table @var @item 'n' No error inputs. Default value. @iftex @tex $$ x_{k+1} = A x_k + B u_k $$ $$ y_k = C x_k + D u_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] y[k] = C x[k] + D u[k] @end example @end ifnottex @item 'e' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and noise channels e with covariance matrix @var{Ry}. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K e_k $$ $$ y_k = C x_k + D u_k + e_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K e[k] y[k] = C x[k] + D u[k] + e[k] @end example @end ifnottex @item 'v' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and white noise channels v with identity covariance matrix. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K L v_k $$ $$ y_k = C x_k + D u_k + L v_k $$ $$ e = L v, \ L L^T = R_y $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K L v[k] y[k] = C x[k] + D u[k] + L v[k] e = L v, L L' = Ry @end example @end ifnottex @item 'k' Return @var{sys} as a Kalman predictor for simulation. @iftex @tex $$ \widehat{x}_{k+1} = A \widehat{x}_k + B u_k + K (y_k - \widehat{y}_k) $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k $$ @end tex @end iftex @ifnottex @example ^ ^ ^ x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ^ ^ y[k] = C x[k] + D u[k] @end example @end ifnottex @iftex @tex $$ \widehat{x}_{k+1} = (A-KC) \widehat{x}_k + (B-KD) u_k + K y_k $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k + 0 y_k $$ @end tex @end iftex @ifnottex @example ^ ^ x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ^ ^ y[k] = C x[k] + D u[k] + 0 y[k] @end example @end ifnottex @end table @end table @strong{Algorithm}@* Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @chapter Overloaded LTI Operators @section @@lti/ctranspose @findex ctranspose Conjugate transpose or pertransposition of @acronym{LTI} objects. Used by Octave for "sys'". For a transfer-function matrix G, G' denotes the conjugate of G given by G.'(-s) for a continuous-time system or G.'(1/z) for a discrete-time system. The frequency response of the pertransposition of G is the Hermitian (conjugate) transpose of G(jw), i.e. freqresp (G', w) = freqresp (G, w)'. @strong{WARNING:} Do @strong{NOT} use this for dual problems, use the transpose "sys.'" (note the dot) instead. @section @@lti/end @findex end End indexing for @acronym{LTI} objects. Used by Octave for "sys(1:end, end-1)". @section @@lti/horzcat @findex horzcat Horizontal concatenation of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "[sys1, sys2]". @section @@lti/inv @findex inv Inversion of @acronym{LTI} objects. @section @@lti/minus @findex minus Binary subtraction of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "sys1 - sys2". @section @@lti/mldivide @findex mldivide Matrix left division of @acronym{LTI} objects. If necessary, object conversion is done by sys_group in mtimes. Used by Octave for "sys1 \ sys2". @section @@lti/mpower @findex mpower Matrix power of @acronym{LTI} objects. The exponent must be an integer. Used by Octave for "sys^int". @section @@lti/mrdivide @findex mrdivide Matrix right division of @acronym{LTI} objects. If necessary, object conversion is done by sys_group in mtimes. Used by Octave for "sys1 / sys2". @section @@lti/mtimes @findex mtimes Matrix multiplication of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "sys1 * sys2". @section @@lti/plus @findex plus Binary addition of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "sys1 + sys2". Operation is also known as "parallel connection". @section @@lti/repmat @findex repmat @deftypefn {Function File} {@var{rsys} =} repmat (@var{sys}, @var{m}, @var{n}) @deftypefnx {Function File} {@var{rsys} =} repmat (@var{sys}, [@var{m}, @var{n}]) @deftypefnx {Function File} {@var{rsys} =} repmat (@var{sys}, @var{m}) Form a block transfer matrix of @var{sys} with @var{m} copies vertically and @var{n} copies horizontally. If @var{n} is not specified, it is set to @var{m}. @code{repmat (sys, 2, 3)} is equivalent to @code{[sys, sys, sys; sys, sys, sys]}. @end deftypefn @section @@lti/subsasgn @findex subsasgn Subscripted assignment for @acronym{LTI} objects. Used by Octave for "sys.property = value". @section @@lti/subsref @findex subsref Subscripted reference for @acronym{LTI} objects. Used by Octave for "sys = sys(2:4, :)" or "val = sys.prop". @section @@lti/times @findex times Hadamard/Schur product of transfer function matrices. Also known as element-wise multiplication. Used by Octave for "sys1 .* sys2".@* @strong{Example} @example @group # Compute Relative-Gain Array G = tf (Boeing707) RGA = G .* inv (G).' # Gain at 0 rad/s RGA(0) @end group @end example @section @@lti/transpose @findex transpose Transpose of @acronym{LTI} objects. Used by Octave for "sys.'". Useful for dual problems, i.e. controllability and observability or designing estimator gains with @command{lqr} and @command{place}. @section @@lti/uminus @findex uminus Unary minus of @acronym{LTI} object. Used by Octave for "-sys". @section @@lti/uplus @findex uplus Unary plus of @acronym{LTI} object. Used by Octave for "+sys". @section @@lti/vertcat @findex vertcat Vertical concatenation of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "[sys1; sys2]". @chapter Overloaded IDDATA Operators @section @@iddata/end @findex end End indexing for @acronym{IDDATA} objects. Used by Octave for "dat(1:end)". @section @@iddata/horzcat @findex horzcat @deftypefn {Function File} {@var{dat} =} horzcat (@var{dat1}, @var{dat2}, @dots{}) Horizontal concatenation of iddata datasets. The outputs and inputs are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} where @var{e} denotes the experiment. The number of experiments and samples must be equal for all datasets. @end deftypefn @section @@iddata/subsasgn @findex subsasgn Subscripted assignment for iddata objects. Used by Octave for "dat.property = value". @section @@iddata/subsref @findex subsref Subscripted reference for iddata objects. Used by Octave for "dat = dat(2:4, :)" or "val = dat.prop". @section @@iddata/vertcat @findex vertcat @deftypefn {Function File} {@var{dat} =} vertcat (@var{dat1}, @var{dat2}, @dots{}) Vertical concatenation of iddata datasets. The samples are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} where @var{e} denotes the experiment. The number of experiments, outputs and inputs must be equal for all datasets. @end deftypefn @chapter Miscellaneous @section db2mag @findex db2mag @deftypefn {Function File} {@var{mag} =} db2mag (@var{db}) Convert Decibels (dB) to Magnitude. @strong{Inputs} @table @var @item db Decibel (dB) value(s). Both real-valued scalars and matrices are accepted. @end table @strong{Outputs} @table @var @item mag Magnitude value(s). @end table @seealso{mag2db} @end deftypefn @section mag2db @findex mag2db @deftypefn {Function File} {@var{db} =} mag2db (@var{mag}) Convert Magnitude to Decibels (dB). @strong{Inputs} @table @var @item mag Magnitude value(s). Both real-valued scalars and matrices are accepted. @end table @strong{Outputs} @table @var @item db Decibel (dB) value(s). @end table @seealso{db2mag} @end deftypefn @section options @findex options @deftypefn{Function File} {@var{opt} =} options (@var{'key1'}, @var{value1}, @var{'key2'}, @var{value2}, @dots{}) Create options struct @var{opt} from a number of key and value pairs. For use with order reduction and system identification functions. Option structs are a way to avoid typing the same key and value pairs over and over again. @strong{Inputs} @table @var @item key, property The name of the property. @item value The value of the property. @end table @strong{Outputs} @table @var @item opt Struct with fields for each key. @end table @strong{Example} @example @group octave:1> opt = options ("method", "spa", "tol", 1e-6) opt = scalar structure containing the fields: method = spa tol = 1.0000e-06 @end group @end example @example @group octave:2> save filename opt octave:3> # save the struct 'opt' to file 'filename' for later use octave:4> load filename octave:5> # load struct 'opt' from file 'filename' @end group @end example @end deftypefn @section pid @findex pid @deftypefn{Function File} {@var{C} =} pid (@var{Kp}) @deftypefnx{Function File} {@var{C} =} pid (@var{Kp}, @var{Ki}) @deftypefnx{Function File} {@var{C} =} pid (@var{Kp}, @var{Ki}, @var{Kd}) @deftypefnx{Function File} {@var{C} =} pid (@var{Kp}, @var{Ki}, @var{Kd}, @var{Tf}) Return the transfer function @var{C} of the @acronym{PID} controller in parallel form with first-order roll-off. @example @group Ki Kd s C(s) = Kp + ---- + -------- s Tf s + 1 @end group @end example @end deftypefn @section pidstd @findex pidstd @deftypefn{Function File} {@var{C} =} pidstd (@var{Kp}) @deftypefnx{Function File} {@var{C} =} pidstd (@var{Kp}, @var{Ti}) @deftypefnx{Function File} {@var{C} =} pidstd (@var{Kp}, @var{Ti}, @var{Td}) @deftypefnx{Function File} {@var{C} =} pidstd (@var{Kp}, @var{Ti}, @var{Td}, @var{N}) Return the transfer function @var{C} of the @acronym{PID} controller in standard form with first-order roll-off. @example @group 1 Td s C(s) = Kp (1 + ---- + ----------) Ti s Td/N s + 1 @end group @end example @end deftypefn @section repsys @findex repsys @deftypefn {Function File} {@var{rsys} =} repsys (@var{sys}, @var{m}, @var{n}) @deftypefnx {Function File} {@var{rsys} =} repsys (@var{sys}, [@var{m}, @var{n}]) @deftypefnx {Function File} {@var{rsys} =} repsys (@var{sys}, @var{m}) Form a block transfer matrix of @var{sys} with @var{m} copies vertically and @var{n} copies horizontally. If @var{n} is not specified, it is set to @var{m}. @code{repsys (sys, 2, 3)} is equivalent to @code{[sys, sys, sys; sys, sys, sys]}. @end deftypefn @section strseq @findex strseq @deftypefn {Function File} {@var{strvec} =} strseq (@var{str}, @var{idx}) Return a cell vector of indexed strings by appending the indices @var{idx} to the string @var{str}. @example strseq ("x", 1:3) = @{"x1"; "x2"; "x3"@} strseq ("u", [1, 2, 5]) = @{"u1"; "u2"; "u5"@} @end example @end deftypefn @section test_control @findex test_control @deftypefn {Script File} {} test_control Execute all available tests at once. The Octave control package is based on the @uref{http://www.slicot.org, @acronym{SLICOT}} library. @acronym{SLICOT} needs @acronym{BLAS} and @acronym{LAPACK} libraries which are also prerequisites for Octave itself. In case of failing tests, it is highly recommended to use @uref{http://www.netlib.org/blas/, Netlib's reference @acronym{BLAS}} and @uref{http://www.netlib.org/lapack/, @acronym{LAPACK}} for building Octave. Using @acronym{ATLAS} may lead to sign changes in some entries of the state-space matrices. In general, these sign changes are not 'wrong' and can be regarded as the result of state transformations. Such state transformations (but not input/output transformations) have no influence on the input-output behaviour of the system. For better numerics, the control package uses such transformations by default when calculating the frequency responses and a few other things. However, arguments like the Hankel singular Values (@acronym{HSV}) must not change. Differing @acronym{HSV}s and failing algorithms are known for using Framework Accelerate from Mac OS X 10.7. @end deftypefn @section thiran @findex thiran @deftypefn {Function File} {@var{sys} =} thiran (@var{tau}, @var{tsam}) Approximation of continuous-time delay using a discrete-time allpass Thiran filter. Thiran filters can approximate continuous-time delays that are non-integer multiples of the sampling time (fractional delays). This approximation gives a better matching of the phase shift between the continuous- and the discrete-time system. If there is no fractional part in the delay, then the standard discrete-time delay representation is used. @strong{Inputs} @table @var @item tau A continuous-time delay, given in time units (seconds). @item tsam The sampling time of the resulting Thiran filter. @end table @strong{Outputs} @table @var @item sys Transfer function model of the resulting filter. The order of the filter is determined automatically. @end table @strong{Example} @example @group octave:1> sys = thiran (1.33, 0.5) Transfer function 'sys' from input 'u1' to output ... 0.003859 z^3 - 0.03947 z^2 + 0.2787 z + 1 y1: ----------------------------------------- z^3 + 0.2787 z^2 - 0.03947 z + 0.003859 Sampling time: 0.5 s Discrete-time model. @end group @end example @example @group octave:2> sys = thiran (1, 0.5) Transfer function 'sys' from input 'u1' to output ... 1 y1: --- z^2 Sampling time: 0.5 s Discrete-time model. @end group @end example @seealso{absorbdelay, pade} @end deftypefn @section BMWengine @findex BMWengine @deftypefn{Function File} {@var{sys} =} BMWengine () @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"scaled"}) @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"unscaled"}) Model of the BMW 4-cylinder engine at ETH Zurich's control laboratory. @example @group OPERATING POINT Drosselklappenstellung alpha_DK = 10.3 Grad Saugrohrdruck p_s = 0.48 bar Motordrehzahl n = 860 U/min Lambda-Messwert lambda = 1.000 Relativer Wandfilminhalt nu = 1 @end group @end example @example @group INPUTS U_1 Sollsignal Drosselklappenstellung [Grad] U_2 Relative Einspritzmenge [-] U_3 Zuendzeitpunkt [Grad KW] M_L Lastdrehmoment [Nm] @end group @end example @example @group STATES X_1 Drosselklappenstellung [Grad] X_2 Saugrohrdruck [bar] X_3 Motordrehzahl [U/min] X_4 Messwert Lamba-Sonde [-] X_5 Relativer Wandfilminhalt [-] @end group @end example @example @group OUTPUTS Y_1 Motordrehzahl [U/min] Y_2 Messwert Lambda-Sonde [-] @end group @end example @example @group SCALING U_1N, X_1N 1 Grad U_2N, X_4N, X_5N, Y_2N 0.05 U_3N 1.6 Grad KW X_2N 0.05 bar X_3N, Y_1N 200 U/min @end group @end example @end deftypefn @section Boeing707 @findex Boeing707 @deftypefn {Function File} {@var{sys} =} Boeing707 () Creates a linearized state-space model of a Boeing 707-321 aircraft at @var{v}=80 m/s @iftex @tex ($M = 0.26$, $G_{a0} = -3^{\circ}$, ${\alpha}_0 = 4^{\circ}$, ${\kappa}= 50^{\circ}$). @end tex @end iftex @ifnottex (@var{M} = 0.26, @var{Ga0} = -3 deg, @var{alpha0} = 4 deg, @var{kappa} = 50 deg). @end ifnottex System inputs: (1) thrust and (2) elevator angle. System outputs: (1) airspeed and (2) pitch angle. @strong{Reference}: R. Brockhaus: @cite{Flugregelung} (Flight Control), Springer, 1994. @end deftypefn @section WestlandLynx @findex WestlandLynx @deftypefn{Function File} {@var{sys} =} WestlandLynx () Model of the Westland Lynx Helicopter about hover. @example @group INPUTS main rotor collective longitudinal cyclic lateral cyclic tail rotor collective @end group @end example @example @group STATES pitch attitude theta [rad] roll attitude phi [rad] roll rate (body-axis) p [rad/s] pitch rate (body-axis) q [rad/s] yaw rate xi [rad/s] forward velocity v_x [ft/s] lateral velocity v_y [ft/s] vertical velocity v_z [ft/s] @end group @end example @example @group OUTPUTS heave velocity H_dot [ft/s] pitch attitude theta [rad] roll attitude phi [rad] heading rate psi_dot [rad/s] roll rate p [rad/s] pitch rate q [rad/s] @end group @end example @strong{References}@* [1] Skogestad, S. and Postlethwaite I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley. @url{http://www.nt.ntnu.no/users/skoge/book/2nd_edition/matlab_m/matfiles.html} @end deftypefn control/doc/gpl.texi0000644000076500000240000010433012614620313013761 0ustar lukasstaff@node Copying @appendix GNU General Public License @cindex warranty @cindex copyright @center Version 3, 29 June 2007 @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading 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. @heading TERMS AND CONDITIONS @enumerate 0 @item 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. @item 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. @item 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. @item 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. @item 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. @item 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: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item 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''. @item 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. @item 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. @end enumerate 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. @item 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: @enumerate a @item 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. @item 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. @item 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. @item 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. @item 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. @end enumerate 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. @item 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: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item 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 @item 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 @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item 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. @end enumerate 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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 enumerate @heading END OF TERMS AND CONDITIONS @heading 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. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{year} @var{name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see @url{http://www.gnu.org/licenses/}. @end smallexample 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: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{show c} for details. @end smallexample The hypothetical commands @samp{show w} and @samp{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 @url{http://www.gnu.org/licenses/}. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. control/doc/octave_forge_specific_api.txt0000644000076500000240000000147612614620313020215 0ustar lukasstaffisstable (sys, tol) # feedback (sys) # equivalent to feedback (sys, eye (size (sys))) feedback (sys, "+") # equivalent to feedback (sys, eye (size (sys)), +1) H = sys(w) # equivalent to H = freqresp (sys, w) where w is a frequency vector place (sys, p, alpha) # If parameter alpha is specified, poles with real parts place (a, b, p, alpha) # (continuous time) or moduli (discrete time) below alpha # are left untouched. sminreal (sys, tol) # Optional tolerance for controllability and observability. # Entries of the state-space matrices whose moduli are less or # equal to TOL are assumed to be zero. Default value is 0. frd (sys) # calculate interesting frequency range by the zeros and poles of SYS.control/doc/references.txt0000644000076500000240000000207612614620313015172 0ustar lukasstaffREFERENCES ********** German ****** Geering, H.P. Regelungstechnik Springer 2004 Meyer, M. Signalverarbeitung Vieweg & Teubner 2009 English ******* Anderson, B.D.O. and Moore, J.B. Optimal Control Linear Quadratic Methods Dover Publications 1990 Astrm, K. and Hgglund, T. PID Controllers Theory, Design and Tuning Second Edition Instrument Society of America 1995 Doyle, J.C., Francis, B.A. and Tannenbaum, A.R. Feedback Control Theory Dover Publications 1992 Geering, H.P. Optimal Control with Engineering Applications Springer 2007 Gu, D.W., Petkov, P.Hr. and Konstantinov, M.M. Robust Control with MATLAB Springer 2005 Guzzella, L. Analysis and Design of SISO Control Systems VDF Hochschulverlag ETH Zurich 2007 Kailath, T. Linear Systems Prentice Hall 1980 Leigh, J.R. Applied Digital Control Theory, Design and Implementation Second Edition Dover Publications 1992 Ljung, L. System Identification Theory for the User Second Edition Prentice Hall 1999 Skogestad, S. and Postlethwaite, I. Multivariable Feedback Control Analysis and Design Second Edition Wiley 2005 control/doc/slicot_readme.txt0000644000076500000240000000531612614620313015663 0ustar lukasstaffImportant ********* If you encounter any bugs in the octave control package, please DONT bother the great people behind SLICOT. Most likely it's a problem of the control package, not the proven SLICOT library. Therefore, please send any reports to the octave mailing list and the maintainer of the control package. See the file packinfo/DESCRIPTION for the current maintainer of the control package and his mail address. Acknowledgments *************** LTI SYNCOPE - LTI SYstems aNd COntrol PackagE - is ever-increasingly based on SLICOT subroutines by courtesy of the Numerics In COntrol NETwork NICONET e.V. . Abstract ******** SLICOT is a Fortran 77 subroutine library for systems and control, distributed under GPL, developed by NICONET e.V., and available at . Commercial use requires specialized license models. SLICOT Readme ************* SLICOT - Subroutine Library In COntrol Theory - is a general purpose basic mathematical library for control theoretical computations. The library provides tools to perform essential system analysis and synthesis tasks. The main emphasis in SLICOT is on numerical reliability of implemented algorithms and the numerical robustness and efficiency of routines. Providing algorithmic flexibility and the use of rigorous implementation and documentation standards are other SLICOT features. The SLICOT Library is available as standard Fortran 77 code in double precision. Each user-callable subroutine for control computations is accompanied by an example program which illustrates the use of the subroutine and can act as a template for the user's own routines. The SLICOT Library is organized by chapters, sections and subsections. The following chapters are currently included: A : Analysis Routines B : Benchmark and Test Problems D : Data Analysis F : Filtering I : Identification M : Mathematical Routines N : Nonlinear Systems (not yet available, except for some auxiliary routines for Wiener systems) S : Synthesis Routines T : Transformation Routines U : Utility Routines The SLICOT Library is built on LAPACK (Linear Algebra PACKage) and BLAS (Basic Linear Algebra Subprograms) collections. Therefore, these packages should be available on the platform used. Basic References: 1. P. Benner, V. Mehrmann, V. Sima, S. Van Huffel, and A. Varga, "SLICOT - A Subroutine Library in Systems and Control Theory", Applied and Computational Control, Signals, and Circuits (Birkhauser), Vol. 1, Ch. 10, pp. 505-546, 1999. 2. S. Van Huffel, V. Sima, A. Varga, S. Hammarling, and F. Delebecque, "Development of High Performance Numerical Software for Control", IEEE Control Systems Magazine, Vol. 24, Nr. 1, Feb., pp. 60-76, 2004. control/INDEX0000644000076500000240000000425612614620313012337 0ustar lukasstaffcontrol >> Control Theory Examples MDSSystem optiPID Anderson Madievski VLFamp Linear Time Invariant Models dss filt frd ss tf zpk Model Data Access @lti/dssdata @lti/filtdata @lti/frdata @lti/get @lti/set @lti/ssdata @lti/tfdata @lti/zpkdata Model Conversions @lti/c2d @lti/d2c @lti/d2d @lti/prescale @lti/xperm Model Interconnections append @lti/blkdiag @lti/connect @lti/feedback @lti/lft @lti/mconnect @lti/parallel @lti/series sumblk Model Characteristics ctrb ctrbf @lti/dcgain gram hsvd @lti/isct isctrb isdetectable @lti/isdt @lti/isminimumphase isobsv @lti/issiso isstabilizable @lti/isstable @lti/norm obsv obsvf @lti/pole pzmap @lti/size @lti/zero Model Simplification @lti/minreal @lti/sminreal Time Domain Analysis covar gensig impulse initial lsim ramp step Frequency Domain Analysis bode bodemag @lti/freqresp margin nichols nyquist sensitivity sigma Pole Placement place rlocus Optimal Control augstate dlqe dlqr estim kalman lqe lqr Robust Control augw fitfrd h2syn hinfsyn mixsyn mktito ncfsyn Matrix Equation Solvers care dare dlyap dlyapchol lyap lyapchol Model Reduction bstmodred btamodred hnamodred spamodred Controller Reduction btaconred cfconred fwcfconred spaconred Experimental Data Handling iddata @iddata/cat @iddata/detrend @iddata/diff @iddata/fft @iddata/filter @iddata/get @iddata/ifft @iddata/merge @iddata/nkshift @iddata/plot @iddata/resample @iddata/set @iddata/size System Identification arx moen4 moesp n4sid Overloaded LTI Operators @lti/ctranspose @lti/end @lti/horzcat @lti/inv @lti/minus @lti/mldivide @lti/mpower @lti/mrdivide @lti/mtimes @lti/plus @lti/repmat @lti/subsasgn @lti/subsref @lti/times @lti/transpose @lti/uminus @lti/uplus @lti/vertcat Overloaded IDDATA Operators @iddata/end @iddata/horzcat @iddata/subsasgn @iddata/subsref @iddata/vertcat Miscellaneous db2mag mag2db options pid pidstd repsys strseq test_control thiran BMWengine Boeing707 WestlandLynx control/inst/0000755000076500000240000000000012614620313012513 5ustar lukasstaffcontrol/inst/@frd/0000755000076500000240000000000012614620313013366 5ustar lukasstaffcontrol/inst/@frd/__c2d__.m0000644000076500000240000000211612614620313015010 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the continuous FRD object into its discrete-time equivalent. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __c2d__ (sys, tsam, method = "zoh") error ("frd: c2d: conversion not possible"); ## NOTE: changing just the sampling time wouldn't make sense here endfunction control/inst/@frd/__ctranspose__.m0000644000076500000240000000210412614620313016516 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose of FRD objects. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = __ctranspose__ (sys) [p, m, l] = size (sys.H); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@ctranspose, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__d2c__.m0000644000076500000240000000212012614620313015003 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the discrete FRD object into its continuous-time equivalent. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.1 function sys = __d2c__ (sys, tsam, method = "zoh") error ("frd: d2c: conversion not possible"); ## NOTE: changing just the sampling time wouldn't make sense here endfunction control/inst/@frd/__freqresp__.m0000644000076500000240000000307212614620313016171 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Frequency response of FRD models :-) ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.3 function H = __freqresp__ (sys, w, cellflag = false) [H, w_sys, tsam] = frdata (sys, "array"); if (! isempty (w)) # freqresp (frdsys, w), sigma (frdsys, w), ... tol = sqrt (eps); w_idx = arrayfun (@(x) find (abs (w_sys - x) < tol), w, "uniformoutput", false); w_idx = vertcat (w_idx{:}); ## NOTE: There are problems when cellfun uses "uniformoutput", true ## and find returns an empty matrix, if (length (w_idx) != numel (w)) error ("frd: freqresp: some frequencies are not within tolerance %g", tol); endif H = H(:, :, w_idx); endif if (cellflag) [p, m, l] = size (H); H = mat2cell (H, p, m, ones (1, l))(:); endif endfunction control/inst/@frd/__get__.m0000644000076500000240000000220512614620313015116 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Access key values of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.2 function val = __get__ (sys, key) switch (key) # {, } case {"h", "response"} val = sys.H; case {"w", "frequency"} val = sys.w; otherwise error ("frd: get: invalid key name '%s'", key); endswitch endfunction control/inst/@frd/__minreal__.m0000644000076500000240000000176012614620313015773 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Minimal realization of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __minreal__ (sys, tol) warning ("frd: minreal: frequency responses are always minimal"); endfunction control/inst/@frd/__pole__.m0000644000076500000240000000170212614620313015277 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Poles of FRD object. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function pol = __pole__ (sys) error ("frd: pole: this is not possible"); endfunction control/inst/@frd/__set__.m0000644000076500000240000000245412614620313015140 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Set or modify keys of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.2 function sys = __set__ (sys, key, val) switch (key) # {, } case {"h", "response"} val = __adjust_frd_data__ (val, sys.w); __frd_dim__ (val, sys.w); sys.H = val; case {"w", "frequency"} [~, val] = __adjust_frd_data__ (sys.H, val); __frd_dim__ (sys.H, val); sys.w = val; otherwise error ("frd: set: invalid key name '%s'", key); endswitch endfunction control/inst/@frd/__sys2ss__.m0000644000076500000240000000207212614620313015607 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## FRD to SS conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2ss__ (sys) error ("frd: frd2ss: system identification not implemented yet"); retsys = dss (a, b, c, d, e); retlti = sys.lti; # preserve lti properties endfunction control/inst/@frd/__sys2tf__.m0000644000076500000240000000220712614620313015573 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## FRD to TF conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2tf__ (sys) error ("frd: frd2tf: system identification not implemented yet"); retsys = tf (num, den, get (sys, "tsam")); # tsam needed to set appropriate tfvar retlti = sys.lti; # preserve lti properties endfunction control/inst/@frd/__sys_connect__.m0000644000076500000240000000323212614620313016667 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) ## This function is part of the Model Abstraction Layer. No argument checking. ## For internal use only. ## @example ## @group ## Problem: Solve the system equations of ## Y(s) = G(s) E(s) ## E(s) = U(s) + M Y(s) ## in order to build ## Y(s) = H(s) U(s) ## Solution: ## Y(s) = G(s) [U(s) + M Y(s)] ## Y(s) = G(s) U(s) + G(s) M Y(s) ## Y(s) = [I - G(s) M]^-1 G(s) U(s) ## \_______ _______/ ## H(s) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __sys_connect__ (sys, M) ## FIXME: feedback (frd (ss (1)), frd (ss (-1))) [p, m, l] = size (sys.H); I = eye (p); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@(x) (I - x*M) \ x, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__sys_data__.m0000644000076500000240000000171712614620313016155 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by frdata instead of multiple get calls. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [H, w] = __sys_data__ (sys) H = sys.H; w = sys.w; endfunction control/inst/@frd/__sys_group__.m0000644000076500000240000000440612614620313016376 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two FRD models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.2 function retsys = __sys_group__ (sys1, sys2) if (! isa (sys1, "frd")) sys1 = frd (sys1, sys2.w); endif if (! isa (sys2, "frd")) sys2 = frd (sys2, sys1.w); endif retsys = frd (); retsys.lti = __lti_group__ (sys1.lti, sys2.lti); lw1 = length (sys1.w); lw2 = length (sys2.w); [p1, m1, l1] = size (sys1.H); [p2, m2, l2] = size (sys2.H); ## TODO: tolerances for frequencies, i.e. don't check for equality ## find intersection of frequency vectors if (lw1 == lw2 && all (sys1.w == sys2.w)) # identical frequency vectors retsys.w = sys1.w; H1 = sys1.H; H2 = sys2.H; else # differing frequency vectors ## find common frequencies retsys.w = w = intersect (sys1.w, sys2.w); ## indices of common frequencies w1_idx = arrayfun (@(x) find (sys1.w == x), w); w2_idx = arrayfun (@(x) find (sys2.w == x), w); ## extract common responses H1 = sys1.H(:, :, w1_idx); H2 = sys2.H(:, :, w2_idx); endif ## block-diagonal concatenation lw = length (retsys.w); z12 = zeros (p1, m2); z21 = zeros (p2, m1); H1 = mat2cell (H1, p1, m1, ones (1, lw))(:); H2 = mat2cell (H2, p2, m2, ones (1, lw))(:); H = cellfun (@(x, y) [x, z12; z21, y], H1, H2, "uniformoutput", false); retsys.H = cat (3, H{:}); endfunction control/inst/@frd/__sys_inverse__.m0000644000076500000240000000207012614620313016710 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __sys_inverse__ (sys) [p, m, l] = size (sys.H); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@inv, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__sys_keys__.m0000644000076500000240000000274512614620313016221 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## 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 . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{keys}, @var{vals}] =} __sys_keys__ (@var{sys}) ## @deftypefnx {Function File} {[@var{keys}, @var{vals}] =} __sys_keys__ (@var{sys}, @var{aliases}) ## Return the list of keys as well as the assignable values for a frd object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.3 function [keys, vals] = __sys_keys__ (sys, aliases = false) ## cell vector of frd-specific keys keys = {"H"; "w"}; ## cell vector of frd-specific assignable values vals = {"p-by-m-by-l array of complex frequency responses"; "l-by-1 vector of real frequencies (l = length (w))"}; if (aliases) ka = {"response"; "frequency"}; keys = [keys; ka]; endif endfunction control/inst/@frd/__sys_prune__.m0000644000076500000240000000226412614620313016373 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for FRD objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.2 function sys = __sys_prune__ (sys, out_idx, in_idx, w_idx = ":") [sys.lti, out_idx, in_idx] = __lti_prune__ (sys.lti, out_idx, in_idx); sys.H = sys.H(out_idx, in_idx, w_idx); sys.w = sys.w(w_idx); endfunction control/inst/@frd/__times__.m0000644000076500000240000000205612614620313015464 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Hadamard/Schur product of @acronym{FRD} objects. ## Used by Octave for "sys1 .* sys2". ## Author: Lukas Reichlin ## Created: May 2014 ## Version: 0.1 function sys = __times__ (sys1, sys2) error ("frd: times: Hadamard/Schur product is not implemented for FRD objects"); endfunction control/inst/@frd/__transpose__.m0000644000076500000240000000207412614620313016361 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __transpose__ (sys) [p, m, l] = size (sys.H); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@transpose, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__zero__.m0000644000076500000240000000173512614620313015325 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transmission zeros of FRD object. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [zer, gain, info] = __zero__ (sys) error ("frd: zero: this is not possible"); endfunction control/inst/@frd/display.m0000644000076500000240000000710612614620313015215 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for FRD objects. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function display (sys) sysname = inputname (1); [inname, outname, tsam] = __lti_data__ (sys.lti); [inname, m] = __labels__ (inname, "u"); [outname, p] = __labels__ (outname, "y"); w = __freq2str__ (sys.w); disp (""); for k = 1 : m disp (["Frequency response '", sysname, "' from input '", inname{k}, "' to output ..."]); disp (""); __disp_resp__ (sys.H(:,k,:), w, outname); endfor display (sys.lti); # display sampling time if (tsam == -2) disp ("Static gain."); elseif (tsam == 0) disp ("Continuous-time frequency response."); else disp ("Discrete-time frequency response."); endif endfunction function __disp_resp__ (H, w, outname) p = rows (H); # number of outputs len = size (H, 3); # number of frequencies H = mat2cell (H, ones (1, p), 1, len)(:); H = cellfun (@__resp2str__, H, outname, "uniformoutput", false); tsize = terminal_size (); col_freq = columns (w); col_resp = cellfun (@columns, H); col_max = tsize(2) - col_freq; width = cumsum (col_resp); start = 0; stop = col_max; while (start < width(end)) idx = find (width > start & width <= stop); disp ([w, H{idx}]); disp (""); start = width(idx(end)); stop = start + col_max; endwhile ## FIXME: Handle case where tsize(2) is not enough ## to display frequencies and one output. endfunction function str = __freq2str__ (w, title = "w [rad/s]") len = rows (w); str = __vec2str__ (w); line = repmat ("-", 1, max (columns (str), columns (title))); str = strvcat (title, line, str); space = repmat (" ", len+2, 1); str = [space, str]; endfunction function str = __resp2str__ (H, outname) H = H(:); len = length (H); real_str = __vec2str__ (real (H)); im = imag (H); if (any (im)) imag_str = __vec2str__ (abs (im), "i"); sign_str = repmat (" + ", len, 1); neg = im < 0; sign_str(neg, 2) = "-"; str = [real_str, sign_str, imag_str]; else str = real_str; endif line = repmat ("-", 1, max (columns (str), columns (outname))); str = strvcat (outname, line, str); space = repmat (" ", len+2, 1); str = [space, str]; endfunction function str = __vec2str__ (vec, post) vec = vec(:); tmp = isfinite (vec); tmp = abs (vec(tmp & vec != 0)); if (isempty (tmp) || min (tmp) < 1e-3 || max (tmp) > 1e4) str = arrayfun (@(x) sprintf ("%.3e", x), vec, "uniformoutput", false); elseif (all (floor (tmp) == tmp)) str = arrayfun (@(x) sprintf ("%d", x), vec, "uniformoutput", false); else str = arrayfun (@(x) sprintf ("%.4f", x), vec, "uniformoutput", false); endif str = strjust (char (str), "right"); if (nargin > 1) str = [str, repmat(post, length (vec), 1)]; endif endfunction control/inst/@frd/frd.m0000644000076500000240000001270612614620313014325 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} frd (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} frd (@var{sys}, @var{w}) ## @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @var{tsam}, @dots{}) ## Create or convert to frequency response data. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to frequency response data. ## If second argument @var{w} is omitted, the interesting ## frequency range is calculated by the zeros and poles of @var{sys}. ## @item H ## Frequency response array (p-by-m-by-lw). H(i,j,k) contains the ## response from input j to output i at frequency k. In the SISO case, ## a vector (lw-by-1) or (1-by-lw) is accepted as well. ## @item w ## Frequency vector (lw-by-1) in radian per second [rad/s]. ## Frequencies must be in ascending order. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (frd)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Frequency response data object. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'H' ## Frequency response array. See 'Inputs' for details. ## ## @item 'w' ## Frequency vector. See 'Inputs' for details. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @seealso{dss, ss, tf} ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function sys = frd (varargin) ## NOTE: * There's no such thing as a static gain ## because FRD objects are measurements, ## not models. ## * If something like sys1 = frd (5) existed, ## it would cause troubles in cases like ## sys2 = ss (...), sys = sys1 * sys2 ## because sys2 needs to be converted to FRD, ## but sys1 contains no valid frequencies. ## * However, things like frd (ss (5)) should ## be possible. ## model precedence: frd > ss > zpk > tf > double superiorto ("ss", "zpk", "tf", "double"); if (nargin == 1 && isa (varargin{1}, "frd")) sys = varargin{1}; return; elseif (nargin != 0 && nargin <= 2 ... && isa (varargin{1}, "lti")) [sys, lti] = __sys2frd__ (varargin{:}); sys.lti = lti; # preserve lti properties return; endif H = []; w = []; # default frequency response data tsam = -2; # default sampling time [mat_idx, opt_idx, obj_flg] = __lti_input_idx__ (varargin); switch (numel (mat_idx)) case 2 # frd (H, w), frd (H, w, ...) [H, w] = varargin{mat_idx}; tsam = 0; case 3 # frd (H, w, tsam), frd (H, w, tsam, ...) [H, w, tsam] = varargin{mat_idx}; if (isempty (tsam) && is_real_matrix (tsam)) tsam = -1; elseif (! issample (tsam, -10)) error ("frd: invalid sampling time"); endif case 0 # frd () ## nothing to do here, just prevent case 'otherwise' otherwise # sys = frd (H) *must* fail print_usage (); endswitch varargin = varargin(opt_idx); if (obj_flg) varargin = horzcat ({"lti"}, varargin); endif [H, w] = __adjust_frd_data__ (H, w); [p, m] = __frd_dim__ (H, w); # determine number of outputs and inputs frdata = struct ("H", H, "w", w); # struct for frd-specific data ltisys = lti (p, m, tsam); # parent class for general lti data sys = class (frdata, "frd", ltisys); # create frd object if (numel (varargin) > 0) # if there are any properties and values, ... sys = set (sys, varargin{:}); # use the general set function endif endfunction control/inst/@iddata/0000755000076500000240000000000012614620313014041 5ustar lukasstaffcontrol/inst/@iddata/__iddata_keys__.m0000644000076500000240000000455212614620313017302 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{keys}, @var{vals}] =} __iddata_keys__ (@var{dat}) ## Return the list of keys as well as the assignable values for an iddata set. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.2 function [keys, vals] = __iddata_keys__ (dat, aliases = false) [n, p, m, e] = size (dat); ## cell vector of iddata-specific keys keys = {"y"; "outname"; "outunit"; "u"; "inname"; "inunit"; "tsam"; "timeunit"; "expname"; "name"; "notes"; "userdata"}; ## cell vector of iddata-specific assignable values vals = {sprintf("(%dx1) cell vector of (nx%d) matrices", e, p); sprintf("(%dx1) cell vector of strings", p); sprintf("(%dx1) cell vector of strings", p); sprintf("(%dx1) cell vector of (nx%d) matrices", e, m); sprintf("(%dx1) cell vector of strings", m); sprintf("(%dx1) cell vector of strings", m); sprintf("(%dx1) cell vector of scalars", e); "string"; sprintf("(%dx1) cell vector of strings", e); "string"; "string or cell of strings"; "any data type"}; if (aliases) ka = {"outdata"; "outputdata"; "outputname"; "outputunit"; "indata"; "inputdata"; "inputname"; "inputunit"; "experimentname"; "w"; "frequency"; "samplinginstants"; "domain"; "timedomain"}; keys = [keys; ka]; endif endfunction control/inst/@iddata/cat.m0000644000076500000240000001600512614620313014770 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} cat (@var{dim}, @var{dat1}, @var{dat2}, @dots{}) ## Concatenate iddata sets along dimension @var{dim}. ## ## @strong{Inputs} ## @table @var ## @item dim ## Dimension along which the concatenation takes place. ## @table @var ## @item 1 ## Concatenate samples. ## The samples are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments, outputs and inputs must be equal for all datasets. ## Equivalent to @command{vertcat}. ## ## @item 2 ## Concatenate inputs and outputs. ## The outputs and inputs are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments and samples must be equal for all datasets. ## Equivalent to @command{horzcat}. ## ## @item 3 ## Concatenate experiments. ## The experiments are concatenated in the following way: ## @code{dat.y = [dat1.y; dat2.y; @dots{}]} ## @code{dat.u = [dat1.u; dat2.u; @dots{}]} ## The number of outputs and inputs must be equal for all datasets. ## Equivalent to @command{merge}. ## @end table ## ## @item dat1, dat2, @dots{} ## iddata sets to be concatenated. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## Concatenated iddata set. ## @end table ## ## @seealso{horzcat, merge, vertcat} ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = cat (dim, varargin) ## I think this code is pretty elegant because it works for ## any number of arguments and without a single for-loop :-) ## if this overloaded cat method is called, it is guaranteed that ## * nargin > 0 ## * at least one argument is an iddata object if (! is_real_scalar (dim)) print_usage (); endif ## store all datasets in a single struct 'tmp' ## tmp is not a valid iddata set anymore, ## but it doesn't matter, we want just a ## temporary struct containing all the data tmp = cellfun (@iddata, varargin); [n, p, m, e] = cellfun (@size, varargin, "uniformoutput", false); ## TODO: dat = iddata (ones (100, 3)); ## dat = cat (1, dat, zeros (4, 3), dat) ## default values for metadata ## some of them are overwritten in the switch statement below tsam = tmp(1).tsam; expname = tmp(1).expname; outname = tmp(1).outname; outunit = tmp(1).outunit; inname = tmp(1).inname; inunit = tmp(1).inunit; check_domain (tmp, e); switch (dim) case 1 # vertcat - catenate samples check_experiments (tmp, e); check_outputs (tmp, p); check_inputs (tmp, m); y = cellfun (@vertcat, tmp.y, "uniformoutput", false); u = cellfun (@vertcat, tmp.u, "uniformoutput", false); ## note that this also works for time series (u = {}) case 2 # horzcat - catenate channels check_experiments (tmp, e); check_samples (n); y = cellfun (@horzcat, tmp.y, "uniformoutput", false); u = cellfun (@horzcat, tmp.u, "uniformoutput", false); outname = vertcat (tmp.outname); outunit = vertcat (tmp.outunit); inname = vertcat (tmp.inname); inunit = vertcat (tmp.inunit); case 3 # merge - catenate experiments check_outputs (tmp, p); check_inputs (tmp, m); y = vertcat (tmp.y); u = vertcat (tmp.u); tsam = vertcat (tmp.tsam); expname = vertcat (tmp.expname); otherwise error ("iddata: cat: '%d' is an invalid dimension", dim); endswitch dat = iddata (y, u, tsam); ## copy metadata dat.expname = expname; dat.outname = outname; dat.outunit = outunit; dat.inname = inname; dat.inunit = inunit; % TODO: handle w endfunction function check_experiments (tmp, e) if (numel (e) > 1 && ! isequal (e{:})) # isequal doesn't work with less than 2 arguments error ("iddata: cat: number of experiments don't match [%s]", ... num2str (cell2mat (e), "%d ")); endif if (! compare_strings (tmp.expname)) warning ("iddata: cat: experiment names don't match") endif if (numel (e) > 1 && ! isequal (tmp.tsam)) warning ("iddata: cat: sampling times don't match"); endif endfunction function check_outputs (tmp, p) if (numel (p) > 1 && ! isequal (p{:})) error ("iddata: cat: number of outputs don't match [%s]", ... num2str (cell2mat (p), "%d ")); endif if (! compare_strings (tmp.outname)) warning ("iddata: cat: output names don't match") endif if (! compare_strings (tmp.outunit)) warning ("iddata: cat: output units don't match") endif endfunction function check_inputs (tmp, m) if (numel (m) > 1 && ! isequal (m{:})) error ("iddata: cat: number of inputs don't match [%s]", ... num2str (cell2mat (m), "%d ")); endif if (! compare_strings (tmp.inname)) warning ("iddata: cat: input names don't match") endif if (! compare_strings (tmp.inunit)) warning ("iddata: cat: input units don't match") endif endfunction function check_samples (n) if (numel (n) > 1 && ! isequal (n{:})) error ("iddata: cat: number of samples don't match %s", ... mat2str (vertcat (n{:}), 10)); endif endfunction function check_domain (tmp, e) if (numel (e) > 1 && ! isequal (tmp.timedomain)) # isequal doesn't work with less than 2 arguments error ("iddata: cat: can't mix time- and frequency-domain datasets"); endif endfunction ## kind of strcmp for more than two arguments ## return true if all cells of strings are equal ## and false otherwise function bool = compare_strings (str, varargin) if (nargin > 1) ## compare n-th string of first cell with n-th string of remaining cells tmp = cellfun (@strcmp, {str}, varargin, "uniformoutput", false); ## check whether all strings of each pair are equal tmp = cellfun (@all, tmp); ## check whether all pairs are equal bool = all (tmp); else ## one or no cell at all is always equal to itself bool = true; endif endfunction %!error (cat (1, iddata (1, 1), iddata ({2, 3}, {2, 3}))); control/inst/@iddata/detrend.m0000644000076500000240000000440612614620313015650 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} detrend (@var{dat}) ## @deftypefnx {Function File} {@var{dat} =} detrend (@var{dat}, @var{ord}) ## Detrend outputs and inputs of dataset @var{dat} by ## removing the best fit of a polynomial of order @var{ord}. ## If @var{ord} is not specified, default value 0 is taken. ## This corresponds to removing a constant. ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function dat = detrend (dat, ord = 0) if (nargin > 2) # no need to test nargin == 0, this is handled by built-in detrend print_usage (); endif if ((! is_real_scalar (ord) || fix (ord) != ord) && ! ischar (ord)) # chars are handled by built-in detrend error ("iddata: detrend: second argument must be a positve integer"); endif [n, p, m] = size (dat); dat.y = cellfun (@detrend, dat.y, {ord}, "uniformoutput", false); dat.u = cellfun (@detrend, dat.u, {ord}, "uniformoutput", false); ## if a MIMO experiment has only 1 sample, detrend works ## row-wisely instead of column-wisely ## therefore we set these experiments to zero idx = (n == 1); dat.y(idx) = zeros (1, p); dat.u(idx) = zeros (1, m); endfunction %!shared DATD, Z %! DAT = iddata ({[(1:10).', (1:2:20).'], [(10:-1:1).', (20:-2:1).']}, {[(41:50).', (46:55).'], [(61:70).', (-66:-1:-75).']}); %! DATD = detrend (DAT, "linear"); %! Z = zeros (10, 2); %!assert (DATD.y{1}, Z, 1e-10); %!assert (DATD.y{2}, Z, 1e-10); %!assert (DATD.u{1}, Z, 1e-10); %!assert (DATD.u{2}, Z, 1e-10); control/inst/@iddata/diff.m0000644000076500000240000000262712614620313015136 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} diff (@var{dat}) ## @deftypefnx {Function File} {@var{dat} =} diff (@var{dat}, @var{k}) ## Return @var{k}-th difference of outputs and inputs of dataset @var{dat}. ## If @var{k} is not specified, default value 1 is taken. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = diff (dat, k = 1) if (nargin > 2) # no need to test nargin == 0, this is handled by built-in diff print_usage (); endif dat.y = cellfun (@diff, dat.y, {k}, {1}, "uniformoutput", false); dat.u = cellfun (@diff, dat.u, {k}, {1}, "uniformoutput", false); endfunction control/inst/@iddata/display.m0000644000076500000240000000574512614620313015677 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for iddata objects. ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function display (dat) datname = inputname (1); [outname, p] = __labels__ (dat.outname, "y"); [inname, m] = __labels__ (dat.inname, "u"); [expname, e] = __labels__ (dat.expname, "exp"); [n, p, m, e] = size (dat); if (dat.timedomain) domain = "Time"; sf = "Samples"; else domain = "Frequency"; sf = "Frequencies"; endif str = [domain, " domain dataset '", datname, "' containing ", num2str(sum(n)), " ", lower(sf)]; disp (""); disp (str); disp (""); disp (__horzcat__ (__col2str__ (expname, "Experiment"), ... __vec2str__ (n, sf), ... __vec2str__ (cell2mat (dat.tsam), "Sampling Interval"))); disp (""); disp (__horzcat__ (__col2str__ (outname, "Outputs"), ... __col2str__ (dat.outunit, "Unit (if specified)"))); disp (""); disp (__horzcat__ (__col2str__ (inname, "Inputs"), ... __col2str__ (dat.inunit, "Unit (if specified)"))); disp (""); endfunction function str = __horzcat__ (col, varargin) len = rows (col); sp2 = repmat (" ", len, 1); sp4 = repmat (" ", len, 1); str = [sp2, col]; for k = 2 : nargin str = [str, sp4, varargin{k-1}]; endfor endfunction function str = __col2str__ (col, title) len = rows (col); str = strjust (strvcat (col), "left"); if (columns (str) == 0) str = repmat (" ", len, 1); endif line = repmat ("-", 1, max (columns (str), columns (title))); str = strvcat (title, line, str); endfunction function str = __vec2str__ (vec, title) vec = vec(:); tmp = isfinite (vec); tmp = abs (vec(tmp & vec != 0)); if (isempty (tmp) || min (tmp) < 1e-3 || max (tmp) > 1e4) str = arrayfun (@(x) sprintf ("%.3e", x), vec, "uniformoutput", false); elseif (all (floor (tmp) == tmp)) str = arrayfun (@(x) sprintf ("%d", x), vec, "uniformoutput", false); else str = arrayfun (@(x) sprintf ("%.4f", x), vec, "uniformoutput", false); endif str = strjust (char (str), "right"); line = repmat ("-", 1, max (columns (str), columns (title))); %str = strvcat (title, str) str = strvcat (title, line, str); endfunction control/inst/@iddata/end.m0000644000076500000240000000302212614620313014762 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## End indexing for @acronym{IDDATA} objects. ## Used by Octave for "dat(1:end)". ## Author: Lukas Reichlin ## Created: December 2013 ## Version: 0.1 function ret = end (dat, k, n) if (n > 4) error ("iddata: end: require at most 4 indices in the expression"); endif switch (k) case 1 # selecting samples ret = size (dat, 1); if (numel (ret) != 1 && ! isequal (num2cell (ret){:})) error ("iddata: end: for multi-experiment datasets, require equal number of samples when selecting samples with 'end'"); endif ret = ret(1); case {2, 3, 4} # selecting outputs, inputs or experiments ret = size (dat, k); otherwise error ("iddata: end: invalid expression index k = %d", k); endswitch endfunction control/inst/@iddata/fft.m0000644000076500000240000000662012614620313015002 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} fft (@var{dat}) ## @deftypefnx {Function File} {@var{dat} =} fft (@var{dat}, @var{n}) ## Transform iddata objects from time to frequency domain ## using a Fast Fourier Transform (FFT) algorithm. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing signals in time-domain. ## @item n ## Length of the FFT transformations. If @var{n} does not match ## the signal length, the signals in @var{dat} are shortened or ## padded with zeros. @var{n} is a vector with as many elements ## as there are experiments in @var{dat} or a scalar with a common ## length for all experiments. ## If not specified, the signal lengths are taken as default values. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset in frequency-domain. ## In order to preserve signal power and noise level, ## the FFTs are normalized by dividing each transform ## by the square root of the signal length. ## The frequency values are distributed equally from 0 ## to the Nyquist frequency. The Nyquist frequency is ## only included for even signal lengths. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function dat = fft (dat, n = []) if (nargin > 2 || ! isa (dat, "iddata")) # no need to test nargin == 0, this is handled by built-in fft print_usage (); endif if (! dat.timedomain) return; endif [x, ~, ~, e] = size (dat); if (isempty (n)) # default case, n not specified n = num2cell (x(:)); elseif (is_real_vector (n) && length (n) == e && fix (n) == n) # individual n for each experiment n = num2cell (n(:)); elseif (is_real_scalar (n) && fix (n) == n) # common n for all experiments n = num2cell (repmat (n, e, 1)); else error ("iddata: fft: second argument invalid"); endif dat.y = cellfun (@(y, n) fft (y, n, 1)(1:fix(n/2)+1, :) / sqrt (n), dat.y, n, "uniformoutput", false); dat.u = cellfun (@(u, n) fft (u, n, 1)(1:fix(n/2)+1, :) / sqrt (n), dat.u, n, "uniformoutput", false); ## fft (x, n, dim=1) because x could be a row vector (n=1) dat.w = cellfun (@(n, tsam) (0:fix(n/2)).' * (2*pi/abs(tsam)/n), n, dat.tsam, "uniformoutput", false); ## abs(tsam) because of -1 for undefined sampling times dat.timedomain = false; endfunction %!shared DATD, Y, U %! Y = 1:10; %! U = 20:-2:1; %! W = warning ("query", "iddata:transpose"); %! warning ("off", W.identifier); %! DAT = iddata (Y, U); %! DATD = fft (DAT); %! warning (W.identifier, W.state); %!assert (DATD.y{1}, Y, 1e-10); %!assert (DATD.u{1}, U, 1e-10); control/inst/@iddata/filter.m0000644000076500000240000000716512614620313015515 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} filter (@var{dat}, @var{sys}) ## @deftypefnx {Function File} {@var{dat} =} filter (@var{dat}, @var{b}, @var{a}) ## Filter output and input signals of dataset @var{dat}. ## The filter is specified either by @acronym{LTI} system @var{sys} ## or by transfer function polynomials @var{b} and @var{a} as described ## in the help text of Octave's built-in filter function. Type @code{help filter} ## for more information. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata identification dataset containing signals in time-domain. ## @item sys ## @acronym{LTI} object containing the discrete-time filter. ## @item b ## Numerator polynomial of the discrete-time filter. ## Must be a row vector containing the coefficients ## of the polynomial in ascending powers of z^-1. ## @item a ## Denominator polynomial of the discrete-time filter. ## Must be a row vector containing the coefficients ## of the polynomial in ascending powers of z^-1. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset with filtered ## output and input signals. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: August 2012 ## Version: 0.1 function dat = filter (dat, b, a = [], si = []) if (nargin < 2 || nargin > 4) print_usage (); endif if (! isa (dat, "iddata")) # there's at least one iddata set, but not as the first argument error ("iddata: filter: first argument must be an iddata set"); endif if (! dat.timedomain) error ("iddata: filter: require iddata set in time-domain"); endif if (isa (b, "lti")) # filter (dat, sys) if (nargin > 3) # filter (dat, sys, si) has at most 3 inputs print_usage (); endif if (! issiso (b)) error ("iddata: filter: second argument must be a SISO LTI system"); endif si = a; # filter (dat, sys, si) if (isct (b)) # sys is continuous-time b = c2d (b, dat.tsam{1}); # does this discretization/tsam make sense? endif [b, a] = filtdata (b, "vector"); # convert LTI system to transfer function elseif (nargin < 3) print_usage (); endif ## use Octave's filter function for each experiment ## the fifth argument '1' specifies the dimension in case of datasets with only 1 sample dat.y = cellfun (@(y) filter (b, a, y, si, 1), dat.y, "uniformoutput", false); dat.u = cellfun (@(u) filter (b, a, u, si, 1), dat.u, "uniformoutput", false); endfunction ## TODO: adapt test %!shared DATD, Z %! DAT = iddata ({[(1:10).', (1:2:20).'], [(10:-1:1).', (20:-2:1).']}, {[(41:50).', (46:55).'], [(61:70).', (-66:-1:-75).']}); %! DATD = detrend (DAT, "linear"); %! Z = zeros (10, 2); %!assert (DATD.y{1}, Z, 1e-10); %!assert (DATD.y{2}, Z, 1e-10); %!assert (DATD.u{1}, Z, 1e-10); %!assert (DATD.u{2}, Z, 1e-10); control/inst/@iddata/get.m0000644000076500000240000000530012614620313014774 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} get (@var{dat}) ## @deftypefnx {Function File} {@var{value} =} get (@var{dat}, @var{'key'}) ## @deftypefnx {Function File} {[@var{val1}, @var{val2}, @dots{}] =} get (@var{dat}, @var{'key1'}, @var{'key2'}, @dots{}) ## Access key values of iddata objects. ## Type @command{get(dat)} to display a list of available keys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.2 function varargout = get (dat, varargin) if (nargin == 1) [keys, vals] = __iddata_keys__ (dat); nrows = numel (keys); str = strjust (strvcat (keys), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); else if (! isa (dat, "iddata")) print_usage (); endif keys = __iddata_keys__ (dat, true); for k = 1 : (nargin-1) key = __match_key__ (varargin{k}, keys, "iddata: get"); switch (key) case {"y", "outdata", "outputdata"} val = dat.y; case {"u", "indata", "inputdata"} val = dat.u; case {"outname", "outputname"} val = dat.outname; case {"inname", "inputname"} val = dat.inname; case {"outunit", "outputunit"} val = dat.outunit; case {"inunit", "inputunit"} val = dat.inunit; case {"tsam"} val = dat.tsam; case {"timeunit"} val = dat.timeunit; case {"expname", "experimentname"} val = dat.expname; case "name" val = dat.name; case "notes" val = dat.notes; case "userdata" val = dat.userdata; case {"domain", "timedomain"} val = dat.timedomain; case {"w", "frequency", "samplinginstants"} val = dat.w; otherwise error ("iddata: get: invalid key name '%s'", varargin{k}); endswitch varargout{k} = val; endfor endif endfunctioncontrol/inst/@iddata/horzcat.m0000644000076500000240000000253612614620313015677 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} horzcat (@var{dat1}, @var{dat2}, @dots{}) ## Horizontal concatenation of iddata datasets. ## The outputs and inputs are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments and samples must be equal for all datasets. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = horzcat (varargin) dat = cat (2, varargin{:}); endfunction control/inst/@iddata/iddata.m0000644000076500000240000001171012614620313015445 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{dat} =} iddata (@var{y}) ## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}) ## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{tsam}, @dots{}) ## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{[]}, @dots{}) ## Create identification dataset of output and input signals. ## ## @strong{Inputs} ## @table @var ## @item y ## Real matrix containing the output signal in time-domain. ## For a system with @var{p} outputs and @var{n} samples, ## @var{y} is a n-by-p matrix. ## For data from multiple experiments, @var{y} becomes a ## e-by-1 or 1-by-e cell vector of n(i)-by-p matrices, ## where @var{e} denotes the number of experiments ## and n(i) the individual number of samples for each experiment. ## @item u ## Real matrix containing the input signal in time-domain. ## For a system with @var{m} inputs and @var{n} samples, ## @var{u} is a n-by-m matrix. ## For data from multiple experiments, @var{u} becomes a ## e-by-1 or 1-by-e cell vector of n(i)-by-m matrices, ## where @var{e} denotes the number of experiments ## and n(i) the individual number of samples for each experiment. ## If @var{u} is not specified or an empty element @code{[]} is passed, ## @var{dat} becomes a time series dataset. ## @item tsam ## Sampling time. If not specified, default value -1 (unspecified) is taken. ## For multi-experiment data, @var{tsam} becomes a ## e-by-1 or 1-by-e cell vector containing individual ## sampling times for each experiment. If a scalar @var{tsam} ## is provided, then all experiments have the same sampling time. ## @item @dots{} ## Optional pairs of properties and values. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'expname' ## The name of the experiments in @var{dat}. ## Cell vector of length e containing strings. ## Default names are @code{@{'exp1', 'exp2', ...@}} ## ## @item 'y' ## Output signals. See 'Inputs' for details. ## ## @item 'outname' ## The name of the output channels in @var{dat}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'outunit' ## The units of the output channels in @var{dat}. ## Cell vector of length p containing strings. ## ## @item 'u' ## Input signals. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{dat}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'inunit' ## The units of the input channels in @var{dat}. ## Cell vector of length m containing strings. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'timeunit' ## The units of the sampling times in @var{dat}. ## Cell vector of length e containing strings. ## ## @item 'name' ## String containing the name of the dataset. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function dat = iddata (y = {}, u = {}, tsam = {}, varargin) if (nargin == 1 && isa (y, "iddata")) dat = y; return; elseif (nargin < 1) print_usage (); endif [y, u] = __adjust_iddata__ (y, u); [p, m, e] = __iddata_dim__ (y, u); tsam = __adjust_iddata_tsam__ (tsam, e); outname = repmat ({""}, p, 1); inname = repmat ({""}, m, 1); expname = repmat ({""}, e, 1); dat = struct ("y", {y}, "outname", {outname}, "outunit", {outname}, "u", {u}, "inname", {inname}, "inunit", {inname}, "tsam", {tsam}, "timeunit", {""}, "timedomain", true, "w", {{}}, "expname", {expname}, "name", "", "notes", {{}}, "userdata", []); dat = class (dat, "iddata"); if (nargin > 3) dat = set (dat, varargin{:}); endif if (dat.timedomain && ! is_real_matrix (dat.y{:}, dat.u{:})) error ("iddata: require real-valued input and output signals for time domain datasets"); endif endfunction %!error (iddata); %!error (iddata ((1:10).', (1:11).')); %!warning (iddata (1:10)); %!warning (iddata (1:10, 1:10)); control/inst/@iddata/ifft.m0000644000076500000240000000505312614620313015152 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} ifft (@var{dat}) ## Transform iddata objects from frequency to time domain. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing signals in frequency domain. ## The frequency values must be distributed equally from 0 ## to the Nyquist frequency. The Nyquist frequency is ## only included for even signal lengths. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset in time domain. ## In order to preserve signal power and noise level, ## the FFTs are normalized by multiplying each transform ## by the square root of the signal length. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.2 function dat = ifft (dat) if (nargin > 1) # no need to test nargin == 0, this is handled by built-in ifft print_usage (); endif if (dat.timedomain) # dat is always an iddata set, otherwise built-in ifft would be called return; endif if (any (cellfun (@(w) w(1) >= eps, dat.w))) error ("iddata: ifft: first frequency must be zero"); endif if (any (cellfun (@(w) any (abs (diff (w, 2)) > 1e-4*w(2:end-1)), dat.w))) error ("iddata: ifft: require linearly spaced frequency vectors"); endif [x, ~, ~, e] = size (dat); x = x(:); n = num2cell (x); nconj = num2cell (x - rem (x, 2)); dat.y = cellfun (@(y, n, nconj) real (ifft ([y; conj(y(nconj:-1:2, :))], [], 1)) * sqrt (n+nconj), dat.y, n, nconj, "uniformoutput", false); dat.u = cellfun (@(u, n, nconj) real (ifft ([u; conj(u(nconj:-1:2, :))], [], 1)) * sqrt (n+nconj), dat.u, n, nconj, "uniformoutput", false); ## ifft (x, n, dim=1) because x could be a row vector (n=1) dat.w = {}; % dat.w = repmat ({[]}, e, 1); ??? dat.timedomain = true; endfunction control/inst/@iddata/merge.m0000644000076500000240000000240612614620313015320 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} merge (@var{dat1}, @var{dat2}, @dots{}) ## Concatenate experiments of iddata datasets. ## The experiments are concatenated in the following way: ## @code{dat.y = [dat1.y; dat2.y; @dots{}]} ## @code{dat.u = [dat1.u; dat2.u; @dots{}]} ## The number of outputs and inputs must be equal for all datasets. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = merge (varargin) dat = cat (3, varargin{:}); endfunction control/inst/@iddata/nkshift.m0000644000076500000240000000474012614620313015672 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}) ## @deftypefnx {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}, @var{'append'}) ## Shift input channels of dataset @var{dat} according to integer @var{nk}. ## A positive value of @var{nk} means that the input channels are delayed ## @var{nk} samples. By default, both input and output signals are shortened ## by @var{nk} samples. ## If a third argument @var{'append'} is passed, the output signals are left ## untouched while @var{nk} zeros are appended to the (shortened) input signals ## such that the number of samples in @var{dat} remains constant. ## @end deftypefn ## Author: Lukas Reichlin ## Created: July 2012 ## Version: 0.1 function dat = nkshift (dat, nk = 0) if (nargin > 3) print_usage (); endif if (! is_real_scalar (nk)) error ("iddata: nkshift: 'nk' must be a scalar integer"); endif ## TODO: - nk per inputs ## - frequency-domain data snk = sign (nk); nk = abs (nk); if (nargin == 2) # default: shortening y and u by nk if (snk >= 0) dat.y = cellfun (@(y) y(nk+1:end, :), dat.y, "uniformoutput", false); dat.u = cellfun (@(u) u(1:end-nk, :), dat.u, "uniformoutput", false); else dat.y = cellfun (@(y) y(1:end-nk, :), dat.y, "uniformoutput", false); dat.u = cellfun (@(u) u(nk+1:end, :), dat.u, "uniformoutput", false); endif else # append: keep y, padding u with nk zeros [~, ~, m] = size (dat); if (snk >= 0) dat.u = cellfun (@(u) [zeros(nk, m), u(1:end-nk, :)], dat.u, "uniformoutput", false); else dat.u = cellfun (@(u) [u(nk+1:end, :), zeros(nk, m)], dat.u, "uniformoutput", false); endif endif endfunction control/inst/@iddata/plot.m0000644000076500000240000000711712614620313015203 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} plot (@var{dat}) ## @deftypefnx {Function File} {} plot (@var{dat}, @var{exp}) ## Plot signals of iddata identification datasets on the screen. ## The signals are plotted experiment-wise, either in time- or ## frequency-domain. For multi-experiment datasets, ## press any key to switch to the next experiment. ## If the plot of a single experiment should be saved by the ## @command{print} command, use @code{plot(dat,exp)}, ## where @var{exp} denotes the desired experiment. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.2 function plot (dat, exp = ":") if (nargin > 2) # nargin == 0 is handled by built-in plot print_usage (); endif if (nargin == 2 && ! is_real_vector (exp)) error ("iddata: plot: second argument must be a vector of indices"); endif expname = __labels__ (dat.expname, "exp"); expname = expname(exp); idx = substruct ("()", {":", ":", ":", exp}); dat = subsref (dat, idx); [n, p, m, e] = size (dat); if (dat.timedomain) if (m == 0) # time series for k = 1 : e if (k > 1) pause endif plot (dat.y{k}) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) xlabel ("Time") ylabel ("Output Signal") endfor else # inputs present for k = 1 : e if (k > 1) pause endif subplot (2, 1, 1) plot (dat.y{k}) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) ylabel ("Output Signal") subplot (2, 1, 2) stairs (dat.u{k}) legend (__labels__ (dat.inname, "u"){:}) xlabel ("Time") ylabel ("Input Signal") endfor endif else # frequency domain if (m == 0) # time series for k = 1 : e if (k > 1) pause endif bar (dat.w{k}, 20*log10 (abs (dat.y{k}))) xlim ([dat.w{k}(1), dat.w{k}(end)]) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) xlabel ("Frequency") ylabel ("Output Magnitude [dB]") endfor else # inputs present for k = 1 : e if (k > 1) pause endif subplot (2, 1, 1) bar (dat.w{k}, 20*log10 (abs (dat.y{k}))) xlim ([dat.w{k}(1), dat.w{k}(end)]) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) ylabel ("Output Magnitude [dB]") subplot (2, 1, 2) bar (dat.w{k}, 20*log10(abs (dat.u{k}))) xlim ([dat.w{k}(1), dat.w{k}(end)]) legend (__labels__ (dat.inname, "u"){:}) xlabel ("Frequency") ylabel ("Input Magnitude [dB]") endfor endif endif ## TODO: think about the 20*log10 and the bars in general endfunction control/inst/@iddata/resample.m0000644000076500000240000000567112614620313016040 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}) ## @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{n}) ## @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{h}) ## Change the sample rate of the output and input signals in dataset @var{dat} ## by a factor of @code{p/q}. This is performed using a polyphase algorithm. ## The anti-aliasing @acronym{FIR} filter can be specified as follows: ## Either by order @var{n} (scalar) with default value 0. The band edges ## are then chosen automatically. Or by impulse response @var{h} (vector). ## Requires the signal package to be installed. ## ## @strong{Algorithm}@* ## Uses functions @command{fir1} and @command{resample} ## from the signal package. ## ## @strong{References}@* ## [1] J. G. Proakis and D. G. Manolakis, ## Digital Signal Processing: Principles, Algorithms, and Applications, ## 4th ed., Prentice Hall, 2007. Chap. 6 ## ## [2] A. V. Oppenheim, R. W. Schafer and J. R. Buck, ## Discrete-time signal processing, Signal processing series, ## Prentice-Hall, 1999 ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: June 2012 ## Version: 0.3 function dat = resample (dat, p, q, n = 0) if (nargin < 3 || nargin > 4) print_usage (); endif ## requires signal package try pkg load signal; catch error ("iddata: resample: please install signal package to proceed"); end_try_catch if (is_real_scalar (n)) # fourth scalar argument n is the order of the anti-aliasing filter h = fir1 (n, 1/q); elseif (is_real_vector (n)) # fourth vector argument is the (impulse response of the) anti-aliasing filter h = n; else error ("iddata: resample: fourth argument invalid"); endif dat.y = cellfun (@resample, dat.y, {p}, {q}, {h}, "uniformoutput", false); dat.u = cellfun (@resample, dat.u, {p}, {q}, {h}, "uniformoutput", false); dat.tsam = cellfun (@sampling_time, dat.tsam, {p}, {q}, "uniformoutput", false); endfunction function tsam = sampling_time (tsam, p, q) if (issample (tsam, 1)) # unspecified sampling times (-1) are left untouched tsam = (tsam*q)/p; endif endfunction control/inst/@iddata/set.m0000644000076500000240000001303212614620313015011 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} set (@var{dat}) ## @deftypefnx {Function File} {} set (@var{dat}, @var{'key'}, @var{value}, @dots{}) ## @deftypefnx {Function File} {@var{dat} =} set (@var{dat}, @var{'key'}, @var{value}, @dots{}) ## Set or modify keys of iddata objects. ## If no return argument @var{dat} is specified, the modified @acronym{IDDATA} object is stored ## in input argument @var{dat}. @command{set} can handle multiple keys in one call: ## @code{set (dat, 'key1', val1, 'key2', val2, 'key3', val3)}. ## @code{set (dat)} prints a list of the object's key names. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.4 function retdat = set (dat, varargin) if (nargin == 1) # set (dat), dat = set (dat) [keys, vals] = __iddata_keys__ (dat); nrows = numel (keys); str = strjust (strvcat (keys), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); if (nargout != 0) # function dat = set (dat, varargin) retdat = dat; # would lead to unwanted output when using endif # set (dat) else # set (dat, 'key', val1, ...), dat = set (dat, 'key1', val1, ...) if (! isa (dat, "iddata")) print_usage (); endif if (rem (nargin-1, 2)) error ("iddata: set: keys and values must come in pairs"); endif [n, p, m, e] = size (dat); keys = __iddata_keys__ (dat, true); for k = 1 : 2 : (nargin-1) key = __match_key__ (varargin{k}, keys, "iddata: set"); val = varargin{k+1}; switch (key) case {"y", "outdata", "outputdata"} val = __adjust_iddata__ (val, dat.u); [pval, ~, eval] = __iddata_dim__ (val, dat.u); if (pval != p) error ("iddata: set: argument '%s' has %d instead of %d outputs", key, pval, p); endif if (eval != e) # iddata_dim is not sufficient if dat.u = [] error ("iddata: set: argument '%s' has %d instead of %d experiments", key, eval, e); endif if (dat.timedomain && ! is_real_matrix (val{:})) error ("iddata: set: require real-valued output signals for time domain datasets"); endif dat.y = val; case {"u", "indata", "inputdata"} [~, val] = __adjust_iddata__ (dat.y, val); [~, mval] = __iddata_dim__ (dat.y, val); if (mval != m) error ("iddata: set: argument '%s' has %d instead of %d inputs", key, mval, m); endif if (dat.timedomain && ! is_real_matrix (val{:})) error ("iddata: set: require real-valued input signals for time domain datasets"); endif dat.u = val; case {"outname", "outputname"} dat.outname = __adjust_labels__ (val, p); case {"inname", "inputname"} dat.inname = __adjust_labels__ (val, m); case {"outunit", "outputunit"} dat.outunit = __adjust_labels__ (val, p); case {"inunit", "inputunit"} dat.inunit = __adjust_labels__ (val, m); case {"timeunit"} if (ischar (val)) dat.timeunit = val; else error ("iddata: set: key 'timeunit' requires a string"); endif case {"expname", "experimentname"} dat.expname = __adjust_labels__ (val, e); case {"tsam"} dat.tsam = __adjust_iddata_tsam__ (val, e); case {"w", "frequency"} if (! iscell (val)) val = {val}; endif if (any (cellfun (@(w) ! isempty (w) && (! is_real_vector (w) || any (w < 0) ... || ! issorted (w) || w(1) > w(end) ... || length (unique (w)) != length (w)), val))) error ("iddata: set: argument '%s' must be a vector of positive real values in ascending order", key); endif dat.w = val; dat.timedomain = false; case "name" if (ischar (val)) dat.name = val; else error ("iddata: set: key 'name' requires a string"); endif case "notes" if (iscellstr (val)) dat.notes = val; elseif (ischar (val)) dat.notes = {val}; else error ("lti: set: key 'notes' requires string or cell of strings"); endif case "userdata" dat.userdata = val; otherwise error ("iddata: set: invalid key name '%s'", varargin{k}); endswitch endfor if (nargout == 0) # set (dat, 'key1', val1, ...) assignin ("caller", inputname (1), dat); else # dat = set (dat, 'key1', val1, ...) retdat = dat; endif endif endfunction control/inst/@iddata/size.m0000644000076500000240000000657312614620313015204 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{nvec} =} size (@var{dat}) ## @deftypefnx {Function File} {@var{ndim} =} size (@var{dat}, @var{dim}) ## @deftypefnx {Function File} {[@var{n}, @var{p}, @var{m}, @var{e}] =} size (@var{dat}) ## Return dimensions of iddata set @var{dat}. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set. ## @item dim ## If given a second argument, @command{size} will return the size of the ## corresponding dimension. ## @end table ## ## @strong{Outputs} ## @table @var ## @item nvec ## Row vector. The first element is the total number of samples (rows of dat.y and dat.u). ## The second element is the number of outputs (columns of dat.y) and the third element ## the number of inputs (columns of dat.u). The fourth element is the number of experiments. ## @item ndim ## Scalar value. The size of the dimension @var{dim}. ## @item n ## Row vector containing the number of samples of each experiment. ## @item p ## Number of outputs. ## @item m ## Number of inputs. ## @item e ## Number of experiments. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [x, p, m, e] = size (dat, dim = 0) if (nargin > 2) print_usage (); endif n = cellfun (@rows, dat.y).'; # number of samples p = numel (dat.outname); # number of output channels m = numel (dat.inname); # number of input channels e = numel (dat.y); # number of experiments switch (dim) case 0 # ... size (dat) switch (nargout) case 0 # size (dat) stry = stru = stre = ""; if (p != 1) stry = "s"; endif if (m != 1) stru = "s"; endif if (e != 1) stre = "s"; endif printf ("IDDATA set with [%s] samples, %d output%s, %d input%s and %d experiment%s.\n", ... num2str (n, "%d "), p, stry, m, stru, e, stre); case 1 # x = size (dat) x = [sum(n), p, m, e]; case {2, 3, 4} # [n, p, m, e] = size (dat) x = n; otherwise # more than 4 return values print_usage (); endswitch case 1 # nvec = size (dat, 1) x = n; case 2 # p = size (dat, 2) x = p; case 3 # m = size (dat, 3) x = m; case 4 # e = size (dat, 4) x = e; otherwise # invalid dimension print_usage (); endswitch endfunction control/inst/@iddata/subsasgn.m0000644000076500000240000000370212614620313016046 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted assignment for iddata objects. ## Used by Octave for "dat.property = value". ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function dat = subsasgn (dat, idx, val) switch (idx(1).type) case "()" # dat(...) = val if (length (idx(1).subs) == 1 && isa (val, "iddata")) # dat(x) = dat, required by cat for ... dat(idx.subs{:}) = val; # dat = cellfun (@iddata, varargin) else # dat(...) = val, general case error ("iddata: subsasgn type not implemented yet"); endif case "." # dat.y... = val if (length (idx) == 1) # dat.y = val dat = set (dat, idx.subs, val); else # dat.y(...) = val, dat.expname{3} = val key = idx(1).subs; dat = set (dat, key, subsasgn (get (dat, key), idx(2:end), val)); endif otherwise error ("iddata: subsasgn: invalid subscripted assignment type"); endswitch endfunctioncontrol/inst/@iddata/subsref.m0000644000076500000240000000520212614620313015667 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted reference for iddata objects. ## Used by Octave for "dat = dat(2:4, :)" or "val = dat.prop". ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.3 function a = subsref (a, s) if (numel (s) == 0) return; endif switch (s(1).type) case "()" idx = s(1).subs; if (numel (idx) > 4) error ("iddata: subsref: need four or less indices"); else a = __dat_prune__ (a, idx{:}); endif case "." fld = s(1).subs; a = get (a, fld); otherwise error ("iddata: subsref: invalid subscript type"); endswitch a = subsref (a, s(2:end)); endfunction function dat = __dat_prune__ (dat, spl_idx = ":", out_idx = ":", in_idx = ":", exp_idx = ":") out_idx = __handle_idx__ (dat.outname, out_idx, "outname"); in_idx = __handle_idx__ (dat.inname, in_idx, "inname"); exp_idx = __handle_idx__ (dat.expname, exp_idx, "expname"); dat.y = dat.y(exp_idx); dat.y = cellfun (@(y) y(spl_idx, out_idx), dat.y, "uniformoutput", false); dat.outname = dat.outname(out_idx); dat.outunit = dat.outunit(out_idx); if (! isempty (dat.u)) dat.u = dat.u(exp_idx); dat.u = cellfun (@(u) u(spl_idx, in_idx), dat.u, "uniformoutput", false); dat.inname = dat.inname(in_idx); dat.inunit = dat.inunit(in_idx); endif dat.expname = dat.expname(exp_idx); dat.tsam = dat.tsam(exp_idx); endfunction function idx = __handle_idx__ (name, idx, id) if (ischar (idx) && ! strcmp (idx, ":")) idx = {idx}; endif if (iscell (idx)) idx = cellfun (@(x) __str2idx__ (name, x, id), idx); endif endfunction function idx = __str2idx__ (name, str, id) tmp = strcmp (name, str)(:); switch (nnz (tmp)) case 1 idx = find (tmp); case 0 error ("iddata: %s '%s' not found", id, str); otherwise error ("iddata: %s '%s' is ambiguous", id, str); endswitch endfunction control/inst/@iddata/vertcat.m0000644000076500000240000000253112614620313015670 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} vertcat (@var{dat1}, @var{dat2}, @dots{}) ## Vertical concatenation of iddata datasets. ## The samples are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments, outputs and inputs must be equal for all datasets. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = vertcat (varargin) dat = cat (1, varargin{:}); endfunction control/inst/@lti/0000755000076500000240000000000012614620313013403 5ustar lukasstaffcontrol/inst/@lti/__lti_data__.m0000644000076500000240000000202512614620313016135 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by display routines instead of multiple get calls. ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.1 function [inname, outname, tsam] = __lti_data__ (sys) inname = sys.inname; outname = sys.outname; tsam = sys.tsam; endfunction control/inst/@lti/__lti_group__.m0000644000076500000240000000634512614620313016371 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two LTI models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function retlti = __lti_group__ (lti1, lti2, dim = "blkdiag") retlti = lti (:, :, :); if (any (strcmpi (dim, {"blkdiag", "horzcat"}))) # blkdiag, horzcat retlti.inname = [lti1.inname; lti2.inname]; if (nfields2 (lti1.ingroup) || nfields2 (lti2.ingroup)) m1 = numel (lti1.inname); lti2_ingroup = structfun (@(x) x + m1, lti2.ingroup, "uniformoutput", false); retlti.ingroup = __merge_struct__ (lti1.ingroup, lti2_ingroup); endif else # times, vertcat retlti.inname = repmat ({""}, numel (lti1.inname), 1); ## retlti.ingroup remains empty struct endif if (any (strcmpi (dim, {"blkdiag", "vertcat"}))) # blkdiag, vertcat retlti.outname = [lti1.outname; lti2.outname]; if (nfields2 (lti1.outgroup) || nfields2 (lti2.outgroup)) p1 = numel (lti1.outname); lti2_outgroup = structfun (@(x) x + p1, lti2.outgroup, "uniformoutput", false); retlti.outgroup = __merge_struct__ (lti1.outgroup, lti2_outgroup); endif else # times, horzcat retlti.outname = repmat ({""}, numel (lti1.outname), 1); ## retlti.outgroup remains empty struct endif if (lti1.tsam == lti2.tsam) retlti.tsam = lti1.tsam; elseif (lti1.tsam == -2) retlti.tsam = lti2.tsam; elseif (lti2.tsam == -2) retlti.tsam = lti1.tsam; elseif (lti1.tsam == -1 && lti2.tsam > 0) retlti.tsam = lti2.tsam; elseif (lti2.tsam == -1 && lti1.tsam > 0) retlti.tsam = lti1.tsam; else error ("lti_group: systems must have identical sampling times"); endif endfunction function ret = __merge_struct__ (a, b) ## FIXME: this is too complicated; ## isn't there a simple function for this task? ## bug #40224: orderfields (struct ()) errors out in Octave 3.6.4 ## therefore use nfields2 to check for empty structs if (nfields2 (a)) a = orderfields (a); endif if (nfields2 (b)) b = orderfields (b); endif fa = fieldnames (a); fb = fieldnames (b); [fi, ia, ib] = intersect (fa, fb); ca = struct2cell (a); cb = struct2cell (b); for k = numel (fi) : -1 : 1 ca{ia(k)} = vertcat (ca{ia(k)}(:), cb{ib(k)}(:)); fb(ib(k)) = []; cb(ib(k)) = []; endfor ret = cell2struct ([ca; cb], [fa; fb]); endfunction control/inst/@lti/__lti_keys__.m0000644000076500000240000000367712614620313016215 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{keys}, @var{vals}] =} __lti_keys__ (@var{sys}) ## Return the list of keys as well as the assignable values for an LTI object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function [keys, vals] = __lti_keys__ (sys, aliases = false, subclasses = true) ## cell vector of lti-specific keys keys = {"tsam"; "inname"; "outname"; "ingroup"; "outgroup"; "name"; "notes"; "userdata"}; ## cell vector of lti-specific assignable values vals = {"scalar (sample time in seconds)"; "m-by-1 cell vector of strings"; "p-by-1 cell vector of strings"; "struct with indices as fields"; "struct with indices as fields"; "string"; "string or cell of strings"; "any data type"}; if (aliases) ka = {"inputname"; "outputname"; "inputgroup"; "outputgroup"; "lti"}; keys = [keys; ka]; endif if (subclasses) [syskeys, sysvals] = __sys_keys__ (sys, aliases); keys = [syskeys; keys]; vals = [sysvals; vals]; endif endfunction control/inst/@lti/__lti_prune__.m0000644000076500000240000000524312614620313016362 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for LTI objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function [lti, out_idx, in_idx] = __lti_prune__ (lti, out_idx, in_idx) if (ischar (out_idx) && ! strcmp (out_idx, ":")) # sys("grp", :) out_idx = {out_idx}; endif if (ischar (in_idx) && ! strcmp (in_idx, ":")) # sys(:, "grp") in_idx = {in_idx}; endif if (iscell (out_idx)) # sys({"grp1", "grp2"}, :) tmp = cellfun (@(x) __str2idx__ (lti.outgroup, lti.outname, x, "out"), out_idx, "uniformoutput", false); out_idx = vertcat (tmp{:}); endif if (iscell (in_idx)) # sys(:, {"grp1", "grp2"}) tmp = cellfun (@(x) __str2idx__ (lti.ingroup, lti.inname, x, "in"), in_idx, "uniformoutput", false); in_idx = vertcat (tmp{:}); endif if (nfields2 (lti.outgroup)) p = numel (lti.outname); # get size before pruning outnames! [lti.outgroup, empty] = structfun (@(x) __group_prune__ (x, out_idx, p), lti.outgroup, "uniformoutput", false); empty = cell2mat (struct2cell (empty)); fields = fieldnames (lti.outgroup); lti.outgroup = rmfield (lti.outgroup, fields(empty)); endif if (nfields2 (lti.ingroup)) m = numel (lti.inname); [lti.ingroup, empty] = structfun (@(x) __group_prune__ (x, in_idx, m), lti.ingroup, "uniformoutput", false); empty = cell2mat (struct2cell (empty)); fields = fieldnames (lti.ingroup); lti.ingroup = rmfield (lti.ingroup, fields(empty)); endif lti.outname = lti.outname(out_idx); lti.inname = lti.inname(in_idx); endfunction function [group, empty] = __group_prune__ (group, idx, n) lg = length (group); group = sparse (group, 1:lg, 1, n, lg); group = group(idx, :); [group, ~] = find (group); empty = isempty (group); endfunction control/inst/@lti/__sys_keys__.m0000644000076500000240000000217012614620313016226 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Stub function whose sole purpose is that function __lti_keys__ ## terminates correctly for pure LTI objects. This is needed in ## LTI subclasses for calls like @code{sys.lti.tsam}. For internal use only. ## Author: Lukas Reichlin ## Created: October 2015 ## Version: 0.1 function [keys, vals] = __sys_keys__ (sys) keys = vals = cell (0, 1); endfunction control/inst/@lti/blkdiag.m0000644000076500000240000000222012614620313015152 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} blkdiag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## Block-diagonal concatenation of @acronym{LTI} models. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = blkdiag (varargin) sys = varargin{1}; for k = 2 : nargin sys = __sys_group__ (sys, varargin{k}); endfor endfunction control/inst/@lti/c2d.m0000644000076500000240000001360012614620313014231 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{method}) ## @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) ## Convert the continuous @acronym{LTI} model into its discrete-time equivalent. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous-time @acronym{LTI} model. ## @item tsam ## Sampling time in seconds. ## @item method ## Optional conversion method. If not specified, default method @var{"zoh"} ## is taken. ## @table @var ## @item 'zoh' ## Zero-order hold or matrix exponential. ## @item 'tustin', 'bilin' ## Bilinear transformation or Tustin approximation. ## @item 'prewarp' ## Bilinear transformation with pre-warping at frequency @var{w0}. ## @item 'matched' ## Matched pole/zero method. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time @acronym{LTI} model. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = c2d (sys, tsam, method = "std", w0 = 0) if (nargin < 2 || nargin > 4) print_usage (); endif if (! isa (sys, "lti")) error ("c2d: first argument is not an LTI model"); endif if (isdt (sys)) error ("c2d: system is already discrete-time"); endif if (! issample (tsam)) error ("c2d: second argument is not a valid sample time"); endif if (! ischar (method)) error ("c2d: third argument is not a string"); endif if (! issample (w0, 0)) error ("c2d: fourth argument is not a valid pre-warping frequency"); endif sys = __c2d__ (sys, tsam, lower (method), w0); sys.tsam = tsam; endfunction ## bilinear transformation ## using oct-file directly %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ].'; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ].'; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ].'; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ].'; %! %! [Ao, Bo, Co, Do] = __sl_ab04md__ (A, B, C, D, 1.0, 1.0, false); %! %! Ae = [ -1.0000 -4.0000 %! -4.0000 -1.0000 ]; %! %! Be = [ 2.8284 0.0000 %! 0.0000 -2.8284 ]; %! %! Ce = [ 0.0000 2.8284 %! -2.8284 0.0000 ]; %! %! De = [ -1.0000 0.0000 %! 0.0000 -3.0000 ]; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation ## user function %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ].'; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ].'; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ].'; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ].'; %! %! [Ao, Bo, Co, Do] = ssdata (c2d (ss (A, B, C, D), 2, "tustin")); %! %! Ae = [ -1.0000 -4.0000 %! -4.0000 -1.0000 ]; %! %! Be = [ 2.8284 0.0000 %! 0.0000 -2.8284 ]; %! %! Ce = [ 0.0000 2.8284 %! -2.8284 0.0000 ]; %! %! De = [ -1.0000 0.0000 %! 0.0000 -3.0000 ]; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "tustin"), "tustin")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## zero-order hold ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "zoh"), "zoh")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation with pre-warping ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "prewarp", 1000), "prewarp", 1000)); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## matrix exponential %!shared Aex, Aexint, Aex_exp, Aexint_exp %! A = [ 5.0 4.0 3.0 2.0 1.0 %! 1.0 6.0 0.0 4.0 3.0 %! 2.0 0.0 7.0 6.0 5.0 %! 1.0 3.0 1.0 8.0 7.0 %! 2.0 5.0 7.0 1.0 9.0 ]; %! %! Aex_exp = [ 1.8391 0.9476 0.7920 0.8216 0.7811 %! 0.3359 2.2262 0.4013 1.0078 1.0957 %! 0.6335 0.6776 2.6933 1.6155 1.8502 %! 0.4804 1.1561 0.9110 2.7461 2.0854 %! 0.7105 1.4244 1.8835 1.0966 3.4134 ]; %! %! Aexint_exp = [ 0.1347 0.0352 0.0284 0.0272 0.0231 %! 0.0114 0.1477 0.0104 0.0369 0.0368 %! 0.0218 0.0178 0.1624 0.0580 0.0619 %! 0.0152 0.0385 0.0267 0.1660 0.0732 %! 0.0240 0.0503 0.0679 0.0317 0.1863 ]; %! %! [Aex, Aexint] = __sl_mb05nd__ (A, 0.1, 0.0001); %! %!assert (Aex, Aex_exp, 1e-4); %!assert (Aexint, Aexint_exp, 1e-4); control/inst/@lti/connect.m0000644000076500000240000001527212614620313015221 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} connect (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{inputs}, @var{outputs}) ## @deftypefnx {Function File} {@var{sys} =} connect (@var{sys}, @var{cm}, @var{inputs}, @var{outputs}) ## Name-based or index-based interconnections between the inputs and outputs of @acronym{LTI} models. ## ## @strong{Inputs} ## @table @var ## @item sys1, @dots{}, sysN ## @acronym{LTI} models to be connected. The properties 'inname' and 'outname' ## of each model should be set according to the desired input-output connections. ## @item inputs ## For name-based interconnections, string or cell of strings containing the names ## of the inputs to be kept. The names must be part of the properties 'ingroup' or ## 'inname'. For index-based interconnections, vector containing the indices of the ## inputs to be kept. ## @item outputs ## For name-based interconnections, string or cell of strings containing the names ## of the outputs to be kept. The names must be part of the properties 'outgroup' ## or 'outname'. For index-based interconnections, vector containing the indices of ## the outputs to be kept. ## @item cm ## Connection matrix (not name-based). Each row of the matrix represents a summing ## junction. The first column holds the indices of the inputs to be summed with ## outputs of the subsequent columns. The output indices can be negative, if the output ## is to be substracted, or zero. For example, the row ## @example ## [2 0 3 -4 0] ## @end example ## or ## @example ## [2 -4 3] ## @end example ## will sum input u(2) with outputs y(3) and y(4) as ## @example ## u(2) + y(3) - y(4). ## @end example ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resulting interconnected system with outputs @var{outputs} and ## inputs @var{inputs}. ## @end table ## ## @seealso{sumblk} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = connect (varargin) if (nargin < 2) print_usage (); endif if (is_real_matrix (varargin{2})) # connect (sys, cm, in_idx, out_idx) if (nargin != 4) print_usage (); endif sys = varargin{1}; cm = varargin{2}; in_idx = varargin{3}; out_idx = varargin{4}; [p, m] = size (sys); [cmrows, cmcols] = size (cm); ## if (! is_real_matrix (cm)) ## error ("connect: second argument must be a matrix with real-valued coefficients"); ## endif M = zeros (m, p); in = cm(:, 1); out = cm(:, 2:cmcols); ## check sizes and integer values if (! isequal (cm, floor (cm))) error ("connect: matrix 'cm' must contain integer values (index-based interconnection)"); endif if ((min (in) <= 0) || (max (in) > m)) error ("connect: 'cm' input index in out of range (index-based interconnection)"); endif if (max (abs (out(:))) > p) error ("connect: 'cm' output index out of range (index-based interconnection)"); endif if ((! is_real_vector (in_idx)) || (! isequal (in_idx, floor (in_idx)))) error ("connect: 'inputs' must be a vector of integer values (index-based interconnection)"); endif if ((max (in_idx) > m) || (min (in_idx) <= 0)) error ("connect: index in vector 'inputs' out of range (index-based interconnection)"); endif if ((! is_real_vector (out_idx)) || (! isequal (out_idx, floor (out_idx)))) error ("connect: 'outputs' must be a vector of integer values (index-based interconnection)"); endif if ((max (out_idx) > p) || (min (out_idx) <= 0)) error ("connect: index in vector 'outputs' out of range (index-based interconnection)"); endif for a = 1 : cmrows out_tmp = out(a, (out(a,:) != 0)); if (! isempty (out_tmp)) M(in(a,1), abs (out_tmp)) = sign (out_tmp); endif endfor sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); else # connect (sys1, sys2, ..., sysN, in_idx, out_idx) lti_idx = cellfun (@isa, varargin, {"lti"}); sys = blkdiag (varargin{lti_idx}); io_idx = ! lti_idx; if (nnz (io_idx) == 2) in_idx = varargin(io_idx){1}; out_idx = varargin(io_idx){2}; else in_idx = ":"; out_idx = ":"; endif inname = sys.inname; if (any (cellfun (@isempty, inname))) error ("connect: all inputs must have names"); endif outname = sys.outname; if (any (cellfun (@isempty , outname))) error ("connect: all outputs must have names"); endif ioname = intersect (inname, outname); tmp = cellfun (@(x) find (strcmp (inname, x)(:)), ioname, "uniformoutput", false); inputs = vertcat (tmp{:}); # there could be more than one input with the same name [p, m] = size (sys); M = zeros (m, p); for k = 1 : length (inputs) outputs = strcmp (outname, inname(inputs(k))); M(inputs(k), :) = outputs; endfor sys = __sys_connect__ (sys, M); ## sys_prune will error out if names in out_idx and in_idx are not unique ## the dark side handles cases with common in_idx names - so do we inname_u = unique (inname); if (numel (inname_u) != numel (inname)) tmp = cellfun (@(u) strcmp (u, inname), inname_u, "uniformoutput", false); mat = double (horzcat (tmp{:})); scl = ss (mat, "inname", inname_u, "outname", inname); sys = sys * scl; if (is_real_vector (in_idx)) warning ("connect: use names instead of indices for argument 'inputs'"); endif endif sys = __sys_prune__ (sys, out_idx, in_idx); if (isa (sys, "ss")) sys = sminreal (sys); endif endif endfunction %!shared T, Texp %! P = Boeing707; %! I = ss (-eye (2)); %! I.inname = P.outname; %! I.outname = P.inname; %! T = connect (P, I, P.inname, P.outname); %! Texp = feedback (P); %!assert (T.a, Texp.a, 1e-4); %!assert (T.b, Texp.b, 1e-4); %!assert (T.c, Texp.c, 1e-4); %!assert (T.d, Texp.d, 1e-4); control/inst/@lti/ctranspose.m0000644000076500000240000000334312614620313015745 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose or pertransposition of @acronym{LTI} objects. ## Used by Octave for "sys'". ## For a transfer-function matrix G, G' denotes the conjugate ## of G given by G.'(-s) for a continuous-time system or G.'(1/z) ## for a discrete-time system. ## The frequency response of the pertransposition of G is the ## Hermitian (conjugate) transpose of G(jw), i.e. ## freqresp (G', w) = freqresp (G, w)'. ## @strong{WARNING:} Do @strong{NOT} use this for dual problems, ## use the transpose "sys.'" (note the dot) instead. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.2 function sys = ctranspose (sys) if (nargin != 1) # prevent sys = ctranspose (sys1, sys2, sys3, ...) error ("lti: ctranspose: this is an unary operator"); endif [p, m] = size (sys); ct = isct (sys); sys = __ctranspose__ (sys, ct); sys.inname = repmat ({""}, p, 1); sys.outname = repmat ({""}, m, 1); sys.ingroup = struct (); sys.outgroup = struct (); endfunction control/inst/@lti/d2c.m0000644000076500000240000000675412614620313014245 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} d2c (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{method}) ## @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{'prewarp'}, @var{w0}) ## Convert the discrete @acronym{LTI} model into its continuous-time equivalent. ## ## @strong{Inputs} ## @table @var ## @item sys ## Discrete-time @acronym{LTI} model. ## @item method ## Optional conversion method. If not specified, default method @var{"zoh"} ## is taken. ## @table @var ## @item 'zoh' ## Zero-order hold or matrix logarithm. ## @item 'tustin', 'bilin' ## Bilinear transformation or Tustin approximation. ## @item 'prewarp' ## Bilinear transformation with pre-warping at frequency @var{w0}. ## @item 'matched' ## Matched pole/zero method. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Continuous-time @acronym{LTI} model. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.2 function sys = d2c (sys, method = "std", w0 = 0) if (nargin == 0 || nargin > 3) print_usage (); endif if (! isa (sys, "lti")) error ("d2c: first argument is not an LTI model"); endif if (isct (sys)) error ("d2c: system is already continuous-time"); endif if (! ischar (method)) error ("d2c: second argument is not a string"); endif if (! issample (w0, 0)) error ("d2c: third argument is not a valid pre-warping frequency"); endif sys = __d2c__ (sys, sys.tsam, lower (method), w0); sys.tsam = 0; endfunction ## bilinear transformation ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "tustin"), "tustin")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## zero-order hold ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "zoh"), "zoh")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation with pre-warping ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "prewarp", 1000), "prewarp", 1000)); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); control/inst/@lti/d2d.m0000644000076500000240000000460212614620313014234 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{method}) ## @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) ## Resample discrete-time @acronym{LTI} model to sampling time @var{tsam}. ## ## @strong{Inputs} ## @table @var ## @item sys ## Discrete-time @acronym{LTI} model. ## @item tsam ## Desired sampling time in seconds. ## @item method ## Optional conversion method. If not specified, default method @var{"zoh"} ## is taken. ## @table @var ## @item 'zoh' ## Zero-order hold or matrix logarithm. ## @item 'tustin', 'bilin' ## Bilinear transformation or Tustin approximation. ## @item 'prewarp' ## Bilinear transformation with pre-warping at frequency @var{w0}. ## @item 'matched' ## Matched pole/zero method. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resampled discrete-time @acronym{LTI} model with sampling time @var{tsam}. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2013 ## Version: 0.1 function sys = d2d (sys, tsam, method = "std", w0 = 0) if (nargin < 2) print_usage (); endif tmp = d2c (sys, method, w0); sys = c2d (tmp, tsam, method, w0); endfunction %!shared num, den, z, p, k %! H1 = zpk (0.7, 0.5, 1, 0.1); %! H2 = d2d (H1, 0.05); %! H3 = d2d (H2, 0.1); %! [num, den] = tfdata (H2, "vector"); %! [z, p, k] = zpkdata (H3, "vector"); %!assert (num, [1.00000 -0.82426], 1e-4); %!assert (den, [1.00000 -0.70711], 1e-4); %!assert (z, 0.7, 1e-4); %!assert (p, 0.5, 1e-4); %!assert (k, 1.0, 1e-4); control/inst/@lti/dcgain.m0000644000076500000240000000257012614620313015012 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{k} =} dcgain (@var{sys}) ## DC gain of @acronym{LTI} model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item k ## DC gain matrice. For a system with m inputs and p outputs, the array @var{k} ## has dimensions [p, m]. ## @end table ## ## @seealso{freqresp} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function gain = dcgain (sys) if (nargin != 1) # sys is always an LTI model print_usage (); endif gain = __freqresp__ (sys, 0); endfunction control/inst/@lti/display.m0000644000076500000240000000312412614620313015226 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for LTI objects. Called by its child classes. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function display (sys) if (nfields2 (sys.ingroup) > 0) __disp_group__ (sys.ingroup, "Input"); endif if (nfields2 (sys.outgroup) > 0) __disp_group__ (sys.outgroup, "Output"); endif if (! isempty (sys.name)) disp (["Name: ", sys.name]); endif if (sys.tsam > 0) disp (sprintf ("Sampling time: %g s", sys.tsam)); elseif (sys.tsam == -1) disp ("Sampling time: unspecified"); endif endfunction function __disp_group__ (group, io) name = fieldnames (group); idx = struct2cell (group); cellfun (@(name, idx) printf ("%s group '%s' = %s\n", io, name, mat2str (idx(:).')), ... name, idx, "uniformoutput", false); endfunction control/inst/@lti/dssdata.m0000644000076500000240000000473512614620313015215 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}) ## @deftypefnx {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}, @var{[]}) ## Access descriptor state-space model data. ## Argument @var{sys} is not limited to descriptor state-space models. ## If @var{sys} is not a descriptor state-space model, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item [] ## In case @var{sys} is not a dss model (descriptor matrix @var{e} empty), ## @code{dssdata (sys, [])} returns the empty element @code{e = []} whereas ## @code{dssdata (sys)} returns the identity matrix @code{e = eye (size (a))}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Measurement matrix (p-by-n). ## @item d ## Feedthrough matrix (p-by-m). ## @item e ## Descriptor matrix (n-by-n). ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.2 function [a, b, c, d, e, tsam, scaled] = dssdata (sys, flg = 0) ## NOTE: In case sys is not a dss model (matrice e empty), ## dssdata (sys, []) returns e = [] whereas ## dssdata (sys) returns e = eye (size (a)) if (nargin > 2) print_usage (); endif if (! isa (sys, "ss")) sys = ss (sys); endif [a, b, c, d, e, ~, scaled] = __sys_data__ (sys); if (isempty (e) && ! isempty (flg)) e = eye (size (a)); # return eye for ss models endif tsam = sys.tsam; endfunction control/inst/@lti/eig.m0000644000076500000240000000201712614620313014325 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{p} =} eig (@var{sys}) ## Compute poles of @acronym{LTI} system. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function pol = eig (varargin) pol = pole (varargin{:}); endfunction control/inst/@lti/end.m0000644000076500000240000000233212614620313014327 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## End indexing for @acronym{LTI} objects. ## Used by Octave for "sys(1:end, end-1)". ## Author: Lukas Reichlin ## Created: December 2013 ## Version: 0.1 function ret = end (sys, k, n) if (n != 2) error ("lti: end: require 2 indices in the expression"); endif [p, m] = size (sys); switch (k) case 1 ret = p; case 2 ret = m; otherwise error ("lti: end: invalid expression index k = %d", k); endswitch endfunction control/inst/@lti/feedback.m0000644000076500000240000002027312614620313015311 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} feedback (@var{sys1}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{"+"}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{"+"}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}, @var{"+"}) ## Feedback connection of two @acronym{LTI} models. ## ## @strong{Inputs} ## @table @var ## @item sys1 ## @acronym{LTI} model of forward transmission. @code{[p1, m1] = size (sys1)}. ## @item sys2 ## @acronym{LTI} model of backward transmission. ## If not specified, an identity matrix of appropriate size is taken. ## @item feedin ## Vector containing indices of inputs to @var{sys1} which are involved in the feedback loop. ## The number of @var{feedin} indices and outputs of @var{sys2} must be equal. ## If not specified, @code{1:m1} is taken. ## @item feedout ## Vector containing indices of outputs from @var{sys1} which are to be connected to @var{sys2}. ## The number of @var{feedout} indices and inputs of @var{sys2} must be equal. ## If not specified, @code{1:p1} is taken. ## @item "+" ## Positive feedback sign. If not specified, @var{"-"} for a negative feedback interconnection ## is assumed. @var{+1} and @var{-1} are possible as well, but only from the third argument ## onward due to ambiguity. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resulting @acronym{LTI} model. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u + +--------+ y ## ------>(+)----->| sys1 |-------+-------> ## ^ - +--------+ | ## | | ## | +--------+ | ## +-------| sys2 |<------+ ## +--------+ ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.7 function sys = feedback (sys1, sys2, feedin, feedout, fbsign = -1) [p1, m1] = size (sys1); switch (nargin) case 1 # sys = feedback (sys) if (p1 != m1) error ("feedback: argument must be a square system"); endif sys2 = eye (p1); feedin = 1 : m1; feedout = 1 : p1; case 2 if (ischar (sys2)) # sys = feedback (sys, "+") if (p1 != m1) error ("feedback: first argument must be a square system"); endif fbsign = __check_fbsign__ (sys2); sys2 = eye (p1); endif # sys = feedback (sys1, sys2) feedin = 1 : m1; feedout = 1 : p1; case 3 # sys = feedback (sys1, sys2, "+") fbsign = __check_fbsign__ (feedin); feedin = 1 : m1; feedout = 1 : p1; case 4 # sys = feedback (sys1, sys2, feedin, feedout) ## nothing needs to be done here ## case 4 required to prevent "otherwise" case 5 # sys = feedback (sys1, sys2, feedin, feedout, "+") fbsign = __check_fbsign__ (fbsign); otherwise print_usage (); endswitch if (ischar (feedin)) feedin = {feedin}; endif if (ischar (feedout)) feedout = {feedout}; endif if (iscell (feedin)) tmp = cellfun (@(x) __str2idx__ (sys1.ingroup, sys1.inname, x, "in"), feedin, "uniformoutput", false); feedin = vertcat (tmp{:}); endif if (iscell (feedout)) tmp = cellfun (@(x) __str2idx__ (sys1.outgroup, sys1.outname, x, "out"), feedout, "uniformoutput", false); feedout = vertcat (tmp{:}); endif if (! is_real_vector (feedin) || ! isequal (feedin, abs (fix (feedin)))) error ("feedback: require 'feedin' to be a vector of integers"); endif if (! is_real_vector (feedout) || ! isequal (feedout, abs (fix (feedout)))) error ("feedback: require 'feedout' to be a vector of integers"); endif [p2, m2] = size (sys2); l_feedin = length (feedin); l_feedout = length (feedout); if (l_feedin != p2) error ("feedback: feedin indices: %d, outputs sys2: %d", l_feedin, p2); endif if (l_feedout != m2) error ("feedback: feedout indices: %d, inputs sys2: %d", l_feedout, m2); endif if (any (feedin > m1 | feedin < 1)) error ("feedback: range of feedin indices exceeds dimensions of sys1"); endif if (any (feedout > p1 | feedout < 1)) error ("feedback: range of feedout indices exceeds dimensions of sys1"); endif M11 = zeros (m1, p1); M22 = zeros (m2, p2); M12 = full (sparse (feedin, 1:l_feedin, fbsign, m1, p2)); M21 = full (sparse (1:l_feedout, feedout, 1, m2, p1)); ## NOTE: for-loops do NOT the same as ## M12(feedin, 1:l_feedin) = fbsign; ## M21(1:l_feedout, feedout) = 1; ## ## M12 = zeros (m1, p2); ## M21 = zeros (m2, p1); ## ## for k = 1 : l_feedin ## M12(feedin(k), k) = fbsign; ## endfor ## ## for k = 1 : l_feedout ## M21(k, feedout(k)) = 1; ## endfor M = [M11, M12; M21, M22]; in_idx = 1 : m1; out_idx = 1 : p1; sys = __sys_group__ (sys1, sys2); sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); endfunction function fbsign = __check_fbsign__ (fbsign) if (is_real_scalar (fbsign)) fbsign = sign (fbsign); elseif (ischar (fbsign)) if (strcmp (fbsign, "+")) fbsign = +1; elseif (strcmp (fbsign, "-")) fbsign = -1; else error ("feedback: invalid feedback sign string"); endif else error ("feedback: invalid feedback sign type"); endif endfunction ## Feedback inter-connection of two systems in state-space form ## Test from SLICOT AB05ND %!shared M, Me %! A1 = [ 1.0 0.0 -1.0 %! 0.0 -1.0 1.0 %! 1.0 1.0 2.0 ]; %! %! B1 = [ 1.0 1.0 0.0 %! 2.0 0.0 1.0 ].'; %! %! C1 = [ 3.0 -2.0 1.0 %! 0.0 1.0 0.0 ]; %! %! D1 = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! A2 = [-3.0 0.0 0.0 %! 1.0 0.0 1.0 %! 0.0 -1.0 2.0 ]; %! %! B2 = [ 0.0 -1.0 0.0 %! 1.0 0.0 2.0 ].'; %! %! C2 = [ 1.0 1.0 0.0 %! 1.0 1.0 -1.0 ]; %! %! D2 = [ 1.0 1.0 %! 0.0 1.0 ]; %! %! sys1 = ss (A1, B1, C1, D1); %! sys2 = ss (A2, B2, C2, D2); %! sys = feedback (sys1, sys2); %! [A, B, C, D] = ssdata (sys); %! M = [A, B; C, D]; %! %! Ae = [-0.5000 -0.2500 -1.5000 -1.2500 -1.2500 0.7500 %! -1.5000 -0.2500 0.5000 -0.2500 -0.2500 -0.2500 %! 1.0000 0.5000 2.0000 -0.5000 -0.5000 0.5000 %! 0.0000 0.5000 0.0000 -3.5000 -0.5000 0.5000 %! -1.5000 1.2500 -0.5000 1.2500 0.2500 1.2500 %! 0.0000 1.0000 0.0000 -1.0000 -2.0000 3.0000 ]; %! %! Be = [ 0.5000 0.7500 %! 0.5000 -0.2500 %! 0.0000 0.5000 %! 0.0000 0.5000 %! -0.5000 0.2500 %! 0.0000 1.0000 ]; %! %! Ce = [ 1.5000 -1.2500 0.5000 -0.2500 -0.2500 -0.2500 %! 0.0000 0.5000 0.0000 -0.5000 -0.5000 0.5000 ]; %! %! De = [ 0.5000 -0.2500 %! 0.0000 0.5000 ]; %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); ## sensitivity function %!shared S1, S2 %! P = ss (-2, 3, 4, 5); # meaningless numbers %! C = ss (-1, 1, 1, 0); # ditto %! L = P * C; %! I = eye (size (L)); %! S1 = feedback (I, L); %! S2 = inv (I + L); %!assert (S1.a, S2.a, 1e-4); %!assert (S1.b, S2.b, 1e-4); %!assert (S1.c, S2.c, 1e-4); %!assert (S1.d, S2.d, 1e-4); control/inst/@lti/filtdata.m0000644000076500000240000000621312614620313015353 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}) ## @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}, @var{"vector"}) ## Access discrete-time transfer function data in DSP format. ## Argument @var{sys} is not limited to transfer function models. ## If @var{sys} is not a transfer function, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of discrete-time @acronym{LTI} model. ## @item "v", "vector" ## For SISO models, return @var{num} and @var{den} directly as column vectors ## instead of cells containing a single column vector. ## @end table ## ## @strong{Outputs} ## @table @var ## @item num ## Cell of numerator(s). Each numerator is a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item den ## Cell of denominator(s). Each denominator is a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, -1 is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [num, den, tsam] = filtdata (sys, rtype = "cell") if (nargin > 2) print_usage (); endif if (! isdt (sys)) error ("lti: filtdata: require discrete-time system"); endif [num, den, tsam] = tfdata (sys); ## make numerator and denominator polynomials equally long ## by adding leading zeros lnum = cellfun (@length, num, "uniformoutput", false); lden = cellfun (@length, den, "uniformoutput", false); lmax = cellfun (@max, lnum, lden, "uniformoutput", false); num = cellfun (@prepad, num, lmax, "uniformoutput", false); den = cellfun (@prepad, den, lmax, "uniformoutput", false); ## remove trailing zeros ## such that polynomials are as short as possible num = cellfun (@__remove_trailing_zeros__, num, "uniformoutput", false); den = cellfun (@__remove_trailing_zeros__, den, "uniformoutput", false); if (strncmpi (rtype, "v", 1) && issiso (sys)) num = num{1}; den = den{1}; endif endfunction control/inst/@lti/frdata.m0000644000076500000240000000426012614620313015024 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}) ## @deftypefnx {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}, @var{"vector"}) ## Access frequency response data. ## Argument @var{sys} is not limited to frequency response data objects. ## If @var{sys} is not a frd object, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item "v", "vector" ## In case @var{sys} is a SISO model, this option returns the frequency response ## as a column vector (lw-by-1) instead of an array (p-by-m-by-lw). ## @end table ## ## @strong{Outputs} ## @table @var ## @item H ## Frequency response array (p-by-m-by-lw). H(i,j,k) contains the ## response from input j to output i at frequency k. In the SISO case, ## a vector (lw-by-1) is possible as well. ## @item w ## Frequency vector (lw-by-1) in radian per second [rad/s]. ## Frequencies are in ascending order. ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.3 function [H, w, tsam] = frdata (sys, rtype = "array") if (! isa (sys, "frd")) sys = frd (sys); endif [H, w] = __sys_data__ (sys); tsam = sys.tsam; if (strncmpi (rtype, "v", 1) && issiso (sys)) H = reshape (H, [], 1); endif endfunction control/inst/@lti/freqresp.m0000644000076500000240000000334012614620313015410 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{H} =} freqresp (@var{sys}, @var{w}) ## Evaluate frequency response at given frequencies. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item w ## Vector of frequency values. ## @end table ## ## @strong{Outputs} ## @table @var ## @item H ## Array of frequency response. For a system with m inputs and p outputs, the array @var{H} ## has dimensions [p, m, length (w)]. ## The frequency response at the frequency w(k) is given by H(:,:,k). ## @end table ## ## @seealso{dcgain} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function H = freqresp (sys, w) if (nargin != 2) # case freqresp () not possible print_usage (); endif if (! is_real_vector (w)) # catches freqresp (sys, sys) and freqresp (w, sys) as well error ("freqresp: second argument 'w' must be a real-valued vector of frequencies"); endif H = __freqresp__ (sys, w); endfunction control/inst/@lti/get.m0000644000076500000240000000433312614620313014343 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} get (@var{sys}) ## @deftypefnx {Function File} {@var{value} =} get (@var{sys}, @var{"key"}) ## @deftypefnx {Function File} {[@var{val1}, @var{val2}, @dots{}] =} get (@var{sys}, @var{"key1"}, @var{"key2"}, @dots{}) ## Access key values of @acronym{LTI} objects. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function varargout = get (sys, varargin) if (nargin == 1) [keys, vals] = __lti_keys__ (sys); nrows = numel (keys); str = strjust (strvcat (keys), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); else if (! isa (sys, "lti")) print_usage (); endif keys = __lti_keys__ (sys, true); for k = 1 : (nargin-1) key = __match_key__ (varargin{k}, keys, [class(sys), ": get"]); switch (key) case {"inname", "inputname"} val = sys.inname; case {"outname", "outputname"} val = sys.outname; case {"ingroup", "inputgroup"} val = sys.ingroup; case {"outgroup", "outputgroup"} val = sys.outgroup; case "tsam" val = sys.tsam; case "name" val = sys.name; case "notes" val = sys.notes; case "userdata" val = sys.userdata; otherwise val = __get__ (sys, key); endswitch varargout{k} = val; endfor endif endfunction control/inst/@lti/horzcat.m0000644000076500000240000000603312614620313015235 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Horizontal concatenation of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "[sys1, sys2]". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = horzcat (sys, varargin) for k = 1 : (nargin-1) sys1 = sys; sys2 = varargin{k}; [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2) error ("lti: horzcat: number of system outputs incompatible: [(%dx%d), (%dx%d)]", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); out_scl = [eye(p1), eye(p2)]; sys = out_scl * sys; endfor endfunction ## Rowwise concatenation of two systems in state-space form ## Test from SLICOT AB05OD %!shared M, Me %! A1 = [ 1.0 0.0 -1.0 %! 0.0 -1.0 1.0 %! 1.0 1.0 2.0 ]; %! %! B1 = [ 1.0 1.0 0.0 %! 2.0 0.0 1.0 ].'; %! %! C1 = [ 3.0 -2.0 1.0 %! 0.0 1.0 0.0 ]; %! %! D1 = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! A2 = [-3.0 0.0 0.0 %! 1.0 0.0 1.0 %! 0.0 -1.0 2.0 ]; %! %! B2 = [ 0.0 -1.0 0.0 %! 1.0 0.0 2.0 ].'; %! %! C2 = [ 1.0 1.0 0.0 %! 1.0 1.0 -1.0 ]; %! %! D2 = [ 1.0 1.0 %! 0.0 1.0 ]; %! %! sys1 = ss (A1, B1, C1, D1); %! sys2 = ss (A2, B2, C2, D2); %! sys = [sys1, sys2]; %! [A, B, C, D] = ssdata (sys); %! M = [A, B; C, D]; %! %! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 %! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 -1.0000 2.0000 ]; %! %! Be = [ 1.0000 2.0000 0.0000 0.0000 %! 1.0000 0.0000 0.0000 0.0000 %! 0.0000 1.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 %! 0.0000 0.0000 -1.0000 0.0000 %! 0.0000 0.0000 0.0000 2.0000 ]; %! %! Ce = [ 3.0000 -2.0000 1.0000 1.0000 1.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; %! %! De = [ 1.0000 0.0000 1.0000 1.0000 %! 0.0000 1.0000 0.0000 1.0000 ]; %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); control/inst/@lti/inv.m0000644000076500000240000000426712614620313014366 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of @acronym{LTI} objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function retsys = inv (sys) if (nargin != 1) # prevent sys = inv (sys1, sys2, sys3, ...) error ("lti: inv: this is an unary operator"); endif [p, m] = size (sys); if (p != m) error ("lti: inv: system must be square"); endif retsys = __sys_inverse__ (sys); ## handle i/o names retsys.inname = sys.outname; retsys.outname = sys.inname; retsys.ingroup = sys.outgroup; retsys.outgroup = sys.ingroup; endfunction ## inverse of state-space models ## test from SLICOT AB07ND ## result differs intentionally from slicot ## to prevent states x_inv = -x %!shared M, Me %! A = [ 1.0 2.0 0.0 %! 4.0 -1.0 0.0 %! 0.0 0.0 1.0 ]; %! %! B = [ 1.0 0.0 %! 0.0 1.0 %! 1.0 0.0 ]; %! %! C = [ 0.0 1.0 -1.0 %! 0.0 0.0 1.0 ]; %! %! D = [ 4.0 0.0 %! 0.0 1.0 ]; %! %! sys = ss (A, B, C, D); %! sysinv = inv (sys); %! [Ai, Bi, Ci, Di] = ssdata (sysinv); %! M = [Ai, Bi; Ci, Di]; %! %! Ae = [ 1.0000 1.7500 0.2500 %! 4.0000 -1.0000 -1.0000 %! 0.0000 -0.2500 1.2500 ]; %! %! Be = [-0.2500 0.0000 %! 0.0000 -1.0000 %! -0.2500 0.0000 ]; %! %! Ce = [ 0.0000 0.2500 -0.2500 %! 0.0000 0.0000 1.0000 ]; %! %! De = [ 0.2500 0.0000 %! 0.0000 1.0000 ]; %! %! Me = [Ae, -Be; -Ce, De]; %! %!assert (M, Me, 1e-4); control/inst/@lti/isct.m0000644000076500000240000000261312614620313014525 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isct (@var{sys}) ## Determine whether @acronym{LTI} model is a continuous-time system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## @var{sys} is a discrete-time system. ## @item bool = 1 ## @var{sys} is a continuous-time system or a static gain. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = isct (ltisys) if (nargin != 1) print_usage (); endif bool = (ltisys.tsam == 0 || ltisys.tsam == -2); endfunction control/inst/@lti/isdt.m0000644000076500000240000000256412614620313014533 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isdt (@var{sys}) ## Determine whether @acronym{LTI} model is a discrete-time system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## @var{sys} is a continuous-time system. ## @item bool = 1 ## @var{sys} is a discrete-time system or a static gain. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = isdt (ltisys) if (nargin != 1) print_usage (); endif bool = (ltisys.tsam != 0); endfunction control/inst/@lti/isminimumphase.m0000644000076500000240000000666712614620313016630 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isminimumphase (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isminimumphase (@var{sys}, @var{tol}) ## Determine whether @acronym{LTI} system has asymptotically stable zero dynamics. ## According to the definition of Byrnes/Isidori [1], the zeros ## of a minimum-phase system must be strictly ## inside the left complex half-plane (continuous-time case) ## or inside the unit circle (discrete-time case). ## Note that the poles are not tested. ## ## M. Zeitz [2] discusses the inconsistent definitions of the minimum-phase property ## in a German paper. The abstract in English states the following [2]: ## ## Originally, the minimum phase property has been defined by H. W. Bode [3] ## in order to characterize the unique relationship between gain and phase of ## the frequency response. ## With regard to the design of digital filters, another definition of minimum ## phase is used and a filter is said to be minimum phase if both the filter ## and its inverse are asymptotically stable. ## Finally, systems with asymptotically stable zero dynamics are named as ## minimum phase by C. I. Byrnes and A. Isidori [1]. ## Due to the inconsistent definitions, avoiding the minimum phase property ## for control purposes is advocated and the well-established criteria of ## Hurwitz or Ljapunow to describe the stability of filters and zero dynamics ## are recommended. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item tol ## Optional tolerance. ## @var{tol} must be a real-valued, non-negative scalar. ## Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool ## True if the system is minimum-phase and false otherwise. ## @end table ## ## @example ## @group ## real (z) < -tol*(1 + abs (z)) continuous-time ## abs (z) < 1 - tol discrete-time ## @end group ## @end example ## ## @strong{References}@* ## [1] Byrnes, C.I. and Isidori, A. ## @cite{A Frequency Domain Philosophy for Nonlinear Systems}. ## IEEE Conf. Dec. Contr. 23, pp. 1569–1573, 1984. ## ## [2] Zeitz, M. ## @cite{Minimum phase – no relevant property of automatic control!}. ## at – Automatisierungstechnik. Volume 62, Issue 1, pp. 3–10, 2014. ## ## [3] Bode, H.W. ## @cite{Network Analysis and Feedback Amplifier Design}. ## D. Van Nostrand Company, pp. 312-318, 1945. ## pp. 341-351, 1992. ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2011 ## Version: 0.3 function bool = isminimumphase (sys, tol = 0) if (nargin > 2) print_usage (); endif z = zero (sys); ct = isct (sys); bool = __is_stable__ (z, ct, tol); endfunction %!assert (isminimumphase (tf (1, [1, 0])), true); control/inst/@lti/issiso.m0000644000076500000240000000215712614620313015077 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} issiso (@var{sys}) ## Determine whether @acronym{LTI} model is single-input/single-output (SISO). ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = issiso (sys) if (nargin != 1) print_usage (); endif bool = all (size (sys) == 1); endfunction control/inst/@lti/isstable.m0000644000076500000240000000331712614620313015373 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isstable (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isstable (@var{sys}, @var{tol}) ## Determine whether @acronym{LTI} system is stable. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item tol ## Optional tolerance for stability. ## @var{tol} must be a real-valued, non-negative scalar. ## Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool ## True if the system is stable and false otherwise. ## @end table ## ## @example ## @group ## real (p) < -tol*(1 + abs (p)) continuous-time ## abs (p) < 1 - tol discrete-time ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function bool = isstable (sys, tol = 0) if (nargin > 2) print_usage (); endif pol = pole (sys); ct = isct (sys); bool = __is_stable__ (pol, ct, tol); endfunction control/inst/@lti/lft.m0000644000076500000240000001131512614620313014347 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}) ## @deftypefnx {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}, @var{nu}, @var{ny}) ## Linear fractional tranformation, also known as Redheffer star product. ## ## @strong{Inputs} ## @table @var ## @item sys1 ## Upper @acronym{LTI} model. ## @item sys2 ## Lower @acronym{LTI} model. ## @item nu ## The last nu inputs of @var{sys1} are connected with the first nu outputs of @var{sys2}. ## If not specified, @code{min (m1, p2)} is taken. ## @item ny ## The last ny outputs of @var{sys1} are connected with the first ny inputs of @var{sys2}. ## If not specified, @code{min (p1, m2)} is taken. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resulting @acronym{LTI} model. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## .............sys.............. ## : +--------+ : ## w1 ------------>| |------------> z1 ## : | sys1 | : ## : u +---->| |-----+ y : ## : | +--------+ | : Lower LFT ## : | | : ## : | +--------+ | : lft (sys1, sys2) ## : +-----| sys2 |<----+ : ## : +--------+ : ## :............................: ## @end group ## @end example ## @example ## @group ## .............sys.............. ## : +--------+ : ## : u +---->| sys1 |-----+ y : ## : | +--------+ | : Upper LFT ## : | | : ## : | +--------+ | : lft (sys1, sys2) ## : +-----| |<----+ : ## : | sys2 | : ## z2 <------------| |<------------ w2 ## : +--------+ : ## :............................: ## @end group ## @end example ## @example ## @group ## .............sys.............. ## : +--------+ : ## w1 ------------>| |------------> z1 ## : | sys1 | : ## : u +---->| |-----+ y : ## : | +--------+ | : ## : | | : lft (sys1, sys2, nu, ny) ## : | +--------+ | : ## : +-----| |<----+ : ## : | sys2 | : ## z2 <------------| |<------------ w2 ## : +--------+ : ## :............................: ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = lft (sys1, sys2, nu, ny) if (nargin != 2 && nargin != 4) print_usage (); endif ## object conversion done by sys_group if necessary [p1, m1] = size (sys1); [p2, m2] = size (sys2); nu_max = min (m1, p2); ny_max = min (m2, p1); if (nargin == 2) # sys = lft (sys1, sys2) nu = nu_max; ny = ny_max; else # sys = lft (sys1, sys2, nu, ny) if (! is_real_scalar (nu) || nu < 0) error ("lft: argument 'nu' must be a positive integer"); endif if (! is_real_scalar (ny) || ny < 0) error ("lft: argument 'ny' must be a positive integer"); endif if (nu > nu_max) error ("lft: argument 'nu' (%d) must be at most %d", nu, nu_max); endif if (ny > ny_max) error ("lft: argument 'ny' (%d) must be at most %d", ny, ny_max); endif endif M11 = zeros (m1, p1); M12 = [zeros(m1-nu, p2); eye(nu), zeros(nu, p2-nu)]; M21 = [zeros(ny, p1-ny), eye(ny); zeros(m2-ny, p1)]; M22 = zeros (m2, p2); M = [M11, M12; M21, M22]; in_idx = [1 : (m1-nu), m1 + (ny+1 : m2)]; out_idx = [1 : (p1-ny), p1 + (nu+1 : p2)]; sys = __sys_group__ (sys1, sys2); sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); [p, m] = size (sys); if (m == 0) warning ("lft: resulting system has no inputs"); endif if (p == 0) warning ("lft: resulting system has no outputs"); endif endfunction control/inst/@lti/lti.m0000644000076500000240000000274412614620313014360 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Constructor for LTI objects. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function ltisys = lti (p = 0, m = 0, tsam = -2) if (nargin != 3 || ! is_real_scalar (p, m, tsam)) error ("lti: constructor for 'lti' class, intended for internal use only"); endif inname = repmat ({""}, m, 1); outname = repmat ({""}, p, 1); ltisys = struct ("tsam", tsam, "inname", {inname}, "outname", {outname}, "ingroup", struct (), "outgroup", struct (), "name", "", "notes", {{}}, "userdata", []); ltisys = class (ltisys, "lti"); endfunction control/inst/@lti/mconnect.m0000644000076500000240000000503212614620313015367 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}) ## @deftypefnx {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}, @var{inputs}, @var{outputs}) ## Arbitrary interconnections between the inputs and outputs of an @acronym{LTI} model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item m ## Connection matrix. Each row belongs to an input and each column represents an output. ## @item inputs ## Vector of indices of those inputs which are retained. If not specified, all inputs are kept. ## @item outputs ## Vector of indices of those outputs which are retained. If not specified, all outputs are kept. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Interconnected system. ## @end table ## ## @strong{Example} ## @example ## @group ## Solve the system equations of ## y(t) = G e(t) ## e(t) = u(t) + M y(t) ## in order to build ## y(t) = H u(t) ## The matrix M for a (p-by-m) system G ## has m rows and p columns (m-by-p). ## ## Example for a 3x2 system: ## u1 = -1*y1 + 5*y2 + 0*y3 ## u2 = pi*y1 + 0*y2 - 7*y3 ## ## | -1 5 0 | ## M = | pi 0 7 | ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = mconnect (sys, M, in_idx, out_idx = ":") if (nargin < 2 || nargin > 4) print_usage (); endif [p, m] = size (sys); [mrows, mcols] = size (M); if (p != mcols || m != mrows) error ("mconnect: second argument must be a (%dx%d) matrix", m, p); endif if (! is_real_matrix (M)) error ("mconnect: second argument must be a matrix with real-valued coefficients"); endif sys = __sys_connect__ (sys, M); if (nargin > 2) sys = __sys_prune__ (sys, out_idx, in_idx); endif endfunction control/inst/@lti/minreal.m0000644000076500000240000001325612614620313015217 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} minreal (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} minreal (@var{sys}, @var{tol}) ## Minimal realization or zero-pole cancellation of @acronym{LTI} models. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = minreal (sys, tol = "def") if (nargin > 2) # nargin == 0 not possible because minreal is inside @lti print_usage (); endif if (! is_real_scalar (tol) && tol != "def") error ("minreal: second argument must be a real-valued scalar"); endif sys = __minreal__ (sys, tol); endfunction ## ss: minreal (SLICOT TB01PD) %!shared C, D %! %! A = ss (-2, 3, 4, 5); %! B = A / A; %! C = minreal (B, 1e-15); %! D = ss (1); %! %!assert (C.a, D.a); %!assert (C.b, D.b); %!assert (C.c, D.c); %!assert (C.d, D.d); %!shared M, Me %! A = [ 1.0 2.0 0.0 %! 4.0 -1.0 0.0 %! 0.0 0.0 1.0 ]; %! %! B = [ 1.0 %! 0.0 %! 1.0 ]; %! %! C = [ 0.0 1.0 -1.0 %! 0.0 0.0 1.0 ]; %! %! D = zeros (2, 1); %! %! [Ar, Br, Cr] = __sl_tb01pd__ (A, B, C, 0.0, true); %! M = [Ar, Br; Cr, D]; %! %! Ae = [ 1.0000 -1.4142 1.4142 %! -2.8284 0.0000 1.0000 %! 2.8284 1.0000 0.0000 ]; %! %! Be = [-1.0000 %! 0.7071 %! 0.7071 ]; %! %! Ce = [ 0.0000 0.0000 -1.4142 %! 0.0000 0.7071 0.7071 ]; %! %! De = zeros (2, 1); %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); ## dss: minreal (SLICOT TG01JD) ## FIXME: Test fails with larger ldwork in sltg01jd.cc %!shared Ar, Br, Cr, Dr, Er, Ae, Be, Ce, De, Ee %! A = [ -2 -3 0 0 0 0 0 0 0 %! 1 0 0 0 0 0 0 0 0 %! 0 0 -2 -3 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 0 0 1 ]; %! %! E = [ 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 ]; %! %! B = [ 1 0 %! 0 0 %! 0 1 %! 0 0 %! -1 0 %! 0 0 %! 0 -1 %! 0 0 %! 0 0 ]; %! %! C = [ 1 0 1 -3 0 1 0 2 0 %! 0 1 1 3 0 1 0 0 1 ]; %! %! D = zeros (2, 2); %! %! sys = dss (A, B, C, D, E, "scaled", true); %! sysmin = minreal (sys, 0.0); %! [Ar, Br, Cr, Dr, Er] = dssdata (sysmin); %! %! Ae = [ 1.0000 -0.0393 -0.0980 -0.1066 0.0781 -0.2330 0.0777 %! 0.0000 1.0312 0.2717 0.2609 -0.1533 0.6758 -0.3553 %! 0.0000 0.0000 1.3887 0.6699 -0.4281 1.6389 -0.7615 %! 0.0000 0.0000 0.0000 -1.2147 0.2423 -0.9792 0.4788 %! 0.0000 0.0000 0.0000 0.0000 -1.0545 0.5035 -0.2788 %! 0.0000 0.0000 0.0000 0.0000 0.0000 1.6355 -0.4323 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; %! %! Ee = [ 0.4100 0.2590 0.5080 -0.3109 0.0705 0.1429 -0.1477 %! -0.7629 -0.3464 0.0992 -0.3007 0.0619 0.2483 -0.0152 %! 0.1120 -0.2124 -0.4184 -0.1288 0.0569 -0.4213 -0.6182 %! 0.0000 0.1122 -0.0039 0.2771 -0.0758 0.0975 0.3923 %! 0.0000 0.0000 0.3708 -0.4290 0.1006 0.1402 -0.2699 %! 0.0000 0.0000 0.0000 0.0000 0.9458 -0.2211 0.2378 %! 0.0000 0.0000 0.0000 0.5711 0.2648 0.5948 -0.5000 ]; %! %! Be = [ -0.5597 0.2363 %! -0.4843 -0.0498 %! -0.4727 -0.1491 %! 0.1802 1.1574 %! 0.5995 0.1556 %! -0.1729 -0.3999 %! 0.0000 0.2500 ]; %! %! Ce = [ 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 3.1524 -1.7500 ]; %! %! De = zeros (2, 2); %! %!assert (Ar, Ae, 1e-4); %!assert (Br, Be, 1e-4); %!assert (Cr, Ce, 1e-4); %!assert (Dr, De, 1e-4); %!assert (Er, Ee, 1e-4); ## tf: minreal %!shared a, b, c, d %! s = tf ("s"); %! G1 = (s+1)*s*5/(s+1)/(s^2+s+1); %! G2 = tf ([1, 1, 1], [2, 2, 2]); %! G1min = minreal (G1); %! G2min = minreal (G2); %! a = G1min.num{1, 1}; %! b = G1min.den{1, 1}; %! c = G2min.num{1, 1}; %! d = G2min.den{1, 1}; %!assert (a, [5, 0], 1e-4); %!assert (b, [1, 1, 1], 1e-4); %!assert (c, 0.5, 1e-4); %!assert (d, 1, 1e-4); control/inst/@lti/minus.m0000644000076500000240000000273112614620313014717 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Binary subtraction of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "sys1 - sys2". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = minus (sys1, sys2) if (nargin != 2) # prevent sys = minus (sys1, sys2, sys3, ...) error ("lti: minus: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2 || m1 != m2) error ("lti: minus: system dimensions incompatible: (%dx%d) - (%dx%d)", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; out_scl = [eye(p1), -eye(p2)]; sys = out_scl * sys * in_scl; endfunction control/inst/@lti/mldivide.m0000644000076500000240000000271412614620313015362 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix left division of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group in mtimes. Used by Octave for "sys1 \\ sys2". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = mldivide (sys1, sys2) if (nargin != 2) # prevent sys = mldivide (sys1, sys2, sys3, ...) error ("lti: mldivide: this is a binary operator"); endif sys1 = inv (sys1); # let octave decide which inv() it uses ## [p1, m1] = size (sys1); ## [p2, m2] = size (sys2); ## ## if (m1 != p2) ## error ("lti: mldivide: system dimensions incompatible: (%dx%d) \\ (%dx%d)", ## p1, m1, p2, m2); ## endif sys = sys1 * sys2; endfunction control/inst/@lti/mpower.m0000644000076500000240000000344712614620313015102 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix power of @acronym{LTI} objects. The exponent must be an integer. ## Used by Octave for "sys^int". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function retsys = mpower (sys, e) if (nargin != 2) # prevent sys = mpower (a, b, c, ...) error ("lti: mpower: this is a binary operator"); endif if (! is_real_scalar (e) || e != round (e)) error ("lti: mpower: exponent must be an integer"); endif [p, m] = size (sys); if (p != m) error ("lti: mpower: system must be square"); endif mimo_tf = (p*m > 1) && isa (sys, "tf"); if (mimo_tf) sys = ss (sys); endif ex = round (abs (e)); # make sure ex is a positive integer switch (sign (e)) case -1 # lti^-ex sys = inv (sys); retsys = sys; case 0 # lti^0 retsys = eye (p); return; case 1 # lti^ex retsys = sys; endswitch for k = 2 : ex retsys = retsys * sys; endfor if (mimo_tf) retsys = tf (retsys); endif endfunction control/inst/@lti/mrdivide.m0000644000076500000240000000271312614620313015367 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix right division of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group in mtimes. Used by Octave for "sys1 / sys2". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = mrdivide (sys1, sys2) if (nargin != 2) # prevent sys = mrdivide (sys1, sys2, sys3, ...) error ("lti: mrdivide: this is a binary operator"); endif sys2 = inv (sys2); # let octave decide which inv() it uses ## [p1, m1] = size (sys1); ## [p2, m2] = size (sys2); ## ## if (m1 != p2) ## error ("lti: mrdivide: system dimensions incompatible: (%dx%d) / (%dx%d)", ## p1, m1, p2, m2); ## endif sys = sys1 * sys2; endfunction control/inst/@lti/mtimes.m0000644000076500000240000001117412614620313015063 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix multiplication of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "sys1 * sys2". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function sys = mtimes (sys2, sys1) if (nargin != 2) # prevent sys = mtimes (sys1, sys2, sys3, ...) error ("lti: mtimes: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (m2 != p1) # innner dimensions don't match if (p1 == 1 && m1 == 1 && m2 > 1) # sys1 is SISO, m2 != 0 [sys1, p1, m1] = __siso_expansion__ (sys1, m2); elseif (p2 == 1 && m2 == 1 && p1 > 1) # sys2 is SISO, p1 != 0 [sys2, p2, m2] = __siso_expansion__ (sys2, p1); else error ("lti: mtimes: system dimensions incompatible: (%dx%d) * (%dx%d)", p2, m2, p1, m1); endif endif M22 = zeros (m2, p2); M21 = eye (m2, p1); M12 = zeros (m1, p2); M11 = zeros (m1, p1); M = [M22, M21; M12, M11]; out_idx = 1 : p2; in_idx = m2 + (1 : m1); sys = __sys_group__ (sys2, sys1); sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); endfunction ## concatenate lti or matrix sys s times block-diagonally ## despite its name, it also works for MIMO systems. function [sys, p, m] = __siso_expansion__ (sys, s) tmp = cell (s, 1); tmp(1:s) = sys; sys = blkdiag (tmp{:}); [p, m] = size (sys); endfunction ## Alternative code: consistency vs. compatibility #{ M11 = zeros (m1, p1); M12 = zeros (m1, p2); M21 = eye (m2, p1); M22 = zeros (m2, p2); M = [M11, M12; M21, M22]; out_idx = p1 + (1 : p2); in_idx = 1 : m1; sys = __sys_group__ (sys1, sys2); #} ## Don't forget to adapt @tf/__sys_connect__.m draft code ## mtimes %!shared sysmat, sysmat_exp %! sys1 = ss ([0, 1; -3, -2], [0; 1], [-5, 1], [2]); %! sys2 = ss ([-10], [1], [-40], [5]); %! sys3 = sys2 * sys1; %! [A, B, C, D] = ssdata (sys3); %! sysmat = [A, B; C, D]; %! A_exp = [ -10 -5 1 %! 0 0 1 %! 0 -3 -2 ]; %! B_exp = [ 2 %! 0 %! 1 ]; %! C_exp = [ -40 -25 5 ]; %! D_exp = [ 10 ]; %! sysmat_exp = [A_exp, B_exp; C_exp, D_exp]; %!assert (sysmat, sysmat_exp) ## Cascade inter-connection of two systems in state-space form ## Test from SLICOT AB05MD ## TODO: order of united state vector: consistency vs. compatibility? #%!shared M, Me #%! A1 = [ 1.0 0.0 -1.0 #%! 0.0 -1.0 1.0 #%! 1.0 1.0 2.0 ]; #%! #%! B1 = [ 1.0 1.0 0.0 #%! 2.0 0.0 1.0 ].'; #%! #%! C1 = [ 3.0 -2.0 1.0 #%! 0.0 1.0 0.0 ]; #%! #%! D1 = [ 1.0 0.0 #%! 0.0 1.0 ]; #%! #%! A2 = [-3.0 0.0 0.0 #%! 1.0 0.0 1.0 #%! 0.0 -1.0 2.0 ]; #%! #%! B2 = [ 0.0 -1.0 0.0 #%! 1.0 0.0 2.0 ].'; #%! #%! C2 = [ 1.0 1.0 0.0 #%! 1.0 1.0 -1.0 ]; #%! #%! D2 = [ 1.0 1.0 #%! 0.0 1.0 ]; #%! #%! sys1 = ss (A1, B1, C1, D1); #%! sys2 = ss (A2, B2, C2, D2); #%! sys = sys2 * sys1; #%! [A, B, C, D] = ssdata (sys); #%! M = [A, B; C, D]; #%! #%! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 #%! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 #%! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 #%! 0.0000 1.0000 0.0000 -3.0000 0.0000 0.0000 #%! -3.0000 2.0000 -1.0000 1.0000 0.0000 1.0000 #%! 0.0000 2.0000 0.0000 0.0000 -1.0000 2.0000 ]; #%! #%! Be = [ 1.0000 2.0000 #%! 1.0000 0.0000 #%! 0.0000 1.0000 #%! 0.0000 1.0000 #%! -1.0000 0.0000 #%! 0.0000 2.0000 ]; #%! #%! Ce = [ 3.0000 -1.0000 1.0000 1.0000 1.0000 0.0000 #%! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; #%! #%! De = [ 1.0000 1.0000 #%! 0.0000 1.0000 ]; #%! #%! Me = [Ae, Be; Ce, De]; #%! #%!assert (M, Me, 1e-4); control/inst/@lti/norm.m0000644000076500000240000000701512614620313014537 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{gain} =} norm (@var{sys}, @var{2}) ## @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}) ## @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}, @var{tol}) ## Return H-2 or L-inf norm of @acronym{LTI} model. ## ## @strong{Algorithm}@* ## Uses SLICOT AB13BD and AB13DD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5 function [gain, varargout] = norm (sys, ntype = "2", tol = 0.01) if (nargin > 3) # norm () is caught by built-in function print_usage (); endif if (is_real_scalar (ntype)) if (ntype == 2) ntype = "2"; elseif (isinf (ntype)) ntype = "inf"; else error ("lti: norm: invalid norm type"); endif elseif (ischar (ntype)) ntype = lower (ntype); else error ("lti: norm: invalid norm type"); endif switch (ntype) case "2" gain = h2norm (sys); case "inf" [gain, varargout{1}] = linfnorm (sys, tol); otherwise error ("lti: norm: invalid norm type"); endswitch endfunction function gain = h2norm (sys) if (isstable (sys)) [a, b, c, d] = ssdata (sys); discrete = ! isct (sys); if (! discrete && any (d(:))) # continuous and non-zero feedthrough gain = inf; else gain = __sl_ab13bd__ (a, b, c, d, discrete); endif else gain = inf; endif endfunction function [gain, wpeak] = linfnorm (sys, tol = 0.01) [a, b, c, d, e, tsam, scaled] = dssdata (sys, []); discrete = ! isct (sys); tol = max (tol, 100*eps); if (isempty (e)) [fpeak, gpeak] = __sl_ab13dd__ (a, a, b, c, d, discrete, false, tol, scaled); # TODO: avoid dummy argument else if (rcond (e) < eps) gain = inf; wpeak = inf; return; else [fpeak, gpeak] = __sl_ab13dd__ (a, e, b, c, d, discrete, true, tol, scaled); endif endif if (fpeak(2) > 0) if (discrete) wpeak = fpeak(1) / abs (tsam); # tsam could be -1 else wpeak = fpeak(1); endif else wpeak = inf; endif if (gpeak(2) > 0) gain = gpeak(1); else gain = inf; endif endfunction ## norm ct %!shared H2, Hinf %! sys = ss (-1, 1, 1, 0); %! H2 = norm (sys, 2); %! Hinf = norm (sys, inf); %!assert (H2, 0.7071, 1.5e-5); %!assert (Hinf, 1, 5e-4); ## norm dt %!shared H2, Hinf %! a = [ 2.417 -1.002 0.5488 %! 2 0 0 %! 0 0.5 0 ]; %! b = [ 1 %! 0 %! 0 ]; %! c = [-0.424 0.436 -0.4552 ]; %! d = [ 1 ]; %! sys = ss (a, b, c, d, 0.1); %! H2 = norm (sys, 2); %! Hinf = norm (sys, inf); %!assert (H2, 1.2527, 1.5e-5); %!assert (Hinf, 2.7, 0.1); control/inst/@lti/parallel.m0000644000076500000240000000321212614620313015353 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{sys} =} parallel (@var{sys1}, @var{sys2}) ## Parallel connection of two @acronym{LTI} systems. ## ## @strong{Block Diagram} ## @example ## @group ## .......................... ## : +--------+ : ## : +-->| sys1 |---+ : ## u : | +--------+ | + : y ## -------+ O---------> ## : | +--------+ | + : ## : +-->| sys2 |---+ : ## : +--------+ : ## :.........sys............: ## ## sys = parallel (sys1, sys2) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = parallel (sys1, sys2) if (nargin == 2) sys = sys1 + sys2; ## elseif (nargin == 6) ## TODO: implement "complicated" case sys = parallel (sys1, sys2, in1, in2, out1, out2) else print_usage (); endif endfunction control/inst/@lti/plus.m0000644000076500000240000000577312614620313014560 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Binary addition of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "sys1 + sys2". ## Operation is also known as "parallel connection". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = plus (sys1, sys2) if (nargin != 2) # prevent sys = plus (sys1, sys2, sys3, ...) error ("lti: plus: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2 || m1 != m2) error ("lti: plus: system dimensions incompatible: (%dx%d) + (%dx%d)", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; out_scl = [eye(p1), eye(p2)]; sys = out_scl * sys * in_scl; endfunction ## Parallel inter-connection of two systems in state-space form ## Test from SLICOT AB05PD %!shared M, Me %! A1 = [ 1.0 0.0 -1.0 %! 0.0 -1.0 1.0 %! 1.0 1.0 2.0 ]; %! %! B1 = [ 1.0 1.0 0.0 %! 2.0 0.0 1.0 ].'; %! %! C1 = [ 3.0 -2.0 1.0 %! 0.0 1.0 0.0 ]; %! %! D1 = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! A2 = [-3.0 0.0 0.0 %! 1.0 0.0 1.0 %! 0.0 -1.0 2.0 ]; %! %! B2 = [ 0.0 -1.0 0.0 %! 1.0 0.0 2.0 ].'; %! %! C2 = [ 1.0 1.0 0.0 %! 1.0 1.0 -1.0 ]; %! %! D2 = [ 1.0 1.0 %! 0.0 1.0 ]; %! %! sys1 = ss (A1, B1, C1, D1); %! sys2 = ss (A2, B2, C2, D2); %! sys = sys1 + sys2; %! [A, B, C, D] = ssdata (sys); %! M = [A, B; C, D]; %! %! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 %! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 -1.0000 2.0000 ]; %! %! Be = [ 1.0000 2.0000 %! 1.0000 0.0000 %! 0.0000 1.0000 %! 0.0000 1.0000 %! -1.0000 0.0000 %! 0.0000 2.0000 ]; %! %! Ce = [ 3.0000 -2.0000 1.0000 1.0000 1.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; %! %! De = [ 2.0000 1.0000 %! 0.0000 2.0000 ]; %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); control/inst/@lti/pole.m0000644000076500000240000000707712614620313014533 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{p} =} pole (@var{sys}) ## Compute poles of @acronym{LTI} system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @end table ## ## @strong{Outputs} ## @table @var ## @item p ## Poles of @var{sys}. ## @end table ## ## @strong{Algorithm}@* ## For (descriptor) state-space models, @command{pole} ## relies on Octave's @command{eig}. ## For @acronym{SISO} transfer functions, @command{pole} ## uses Octave's @command{roots}. ## @acronym{MIMO} transfer functions are converted to ## a @emph{minimal} state-space representation for the ## computation of the poles. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function pol = pole (sys) if (nargin > 1) print_usage (); endif pol = __pole__ (sys); endfunction ## Poles of descriptor state-space model %!shared pol, pol_exp, infp, kronr, kronl, infp_exp, kronr_exp, kronl_exp %! A = [ 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 0 0 1 ]; %! %! E = [ 0 0 0 0 0 0 0 0 0 %! 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 ]; %! %! B = [ -1 0 0 %! 0 0 0 %! 0 0 0 %! 0 -1 0 %! 0 0 0 %! 0 0 0 %! 0 0 -1 %! 0 0 0 %! 0 0 0 ]; %! %! C = [ 0 1 1 0 3 4 0 0 2 %! 0 1 0 0 4 0 0 2 0 %! 0 0 1 0 -1 4 0 -2 2 ]; %! %! D = [ 1 2 -2 %! 0 -1 -2 %! 0 0 0 ]; %! %! sys = dss (A, B, C, D, E, "scaled", true); %! [pol, ~, infp, kronr, kronl] = __sl_ag08bd__ (A, E, [], [], [], true); %! %! pol_exp = zeros (0,1); %! %! infp_exp = [0, 3]; %! kronr_exp = zeros (1,0); %! kronl_exp = zeros (1,0); %! %!assert (pol, pol_exp, 1e-4); %!assert (infp, infp_exp); %!assert (kronr, kronr_exp); %!assert (kronl, kronl_exp); control/inst/@lti/prescale.m0000644000076500000240000002502212614620313015360 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{scaledsys}, @var{info}] =} prescale (@var{sys}) ## Scale state-space model. The scaled model @var{scaledsys} is equivalent to ## @var{sys}, but the state vector is scaled by diagonal transformation matrices ## in order to increase the accuracy of subsequent numerical computations. ## Frequency response commands perform automatic scaling unless model property ## @var{scaled} is set to @var{true}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @end table ## ## @strong{Outputs} ## @table @var ## @item scaledsys ## Scaled state-space model. ## @item info ## Structure containing additional information. ## @item info.SL ## Left scaling factors. @code{Tl = diag (info.SL)}. ## @item info.SR ## Right scaling factors. @code{Tr = diag (info.SR)}. ## @end table ## ## @strong{Equations} ## @example ## @group ## Es = Tl * E * Tr ## As = Tl * A * Tr ## Bs = Tl * B ## Cs = C * Tr ## Ds = D ## @end group ## @end example ## ## For proper state-space models, @var{Tl} and @var{Tr} are inverse of each other. ## ## @strong{Algorithm}@* ## Uses SLICOT TB01ID and TG01AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.}. ## @end deftypefn ## Author: Lukas Reichlin ## Created: June 2011 ## Version: 0.2 function [retsys, varargout] = prescale (sys) if (nargin != 1) print_usage (); endif if (! isa (sys, "ss")) warning ("prescale: system not in state-space form"); sys = ss (sys); endif [retsys, lscale, rscale] = __prescale__ (sys); if (nargout > 1) varargout{1} = struct ("SL", lscale, "SR", rscale); endif endfunction ## Scaling of state-space models, direct access to TB01ID %!shared Ao, Bo, Co, SCALEo, MAXREDo, Ae, Be, Ce, SCALEe, MAXREDe %! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 %! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 %! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 %! 0.0 0.0 0.0 0.0 1.0000e+000 %! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; %! %! B = [ 0.0 0.0 %! 1.1030e+002 0.0 %! 0.0 0.0 %! 0.0 0.0 %! 0.0 8.3330e-003 ]; %! %! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 %! 0.0 0.0 1.0000e+000 0.0 0.0 %! 0.0 0.0 0.0 1.0000e+000 0.0 %! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 %! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; %! %! MAXRED = 0.0; %! %! [Ao, Bo, Co, MAXREDo, SCALEo] = __sl_tb01id__ (A, B, C, MAXRED); %! %! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; %! %! Be = [ 0.0000000D+00 0.0000000D+00 %! 0.1103000D+04 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.8333000D+02 ]; %! %! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 %! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; %! %! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; %! %! MAXREDe = 0.3488E+10; %! %!assert (Ao, Ae, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (MAXREDo, MAXREDe, 1e6); %!assert (SCALEo, SCALEe.', 1e-4); ## Scaling of descriptor state-space models, direct access to TG01AD %!shared Ao, Eo, Bo, Co, LSCALEo, RSCALEo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe %! A = [ -1 0 0 0.003 %! 0 0 0.1000 0.02 %! 100 10 0 0.4 %! 0 0 0 0.0]; %! %! E = [ 1 0.2 0 0.0 %! 0 1 0 0.01 %! 300 90 6 0.3 %! 0 0 20 0.0]; %! %! B = [ 10 0 %! 0 0 %! 0 1000 %! 10000 10000]; %! %! C = [ -0.1 0.0 0.001 0.0 %! 0.0 0.01 -0.001 0.0001]; %! %! TRESH = 0.0; %! %! [Ao, Eo, Bo, Co, LSCALEo, RSCALEo] = __sl_tg01ad__ (A, E, B, C, TRESH); %! %! Ae = [ -1.0000 0.0000 0.0000 0.3000 %! 0.0000 0.0000 1.0000 2.0000 %! 1.0000 0.1000 0.0000 0.4000 %! 0.0000 0.0000 0.0000 0.0000]; %! %! Ee = [ 1.0000 0.2000 0.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 %! 3.0000 0.9000 0.6000 0.3000 %! 0.0000 0.0000 0.2000 0.0000 ]; %! %! Be = [100.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 100.0000 %! 100.0000 100.0000 ]; %! %! Ce = [ -0.0100 0.0000 0.0010 0.0000 %! 0.0000 0.0010 -0.0010 0.0010]; %! %! LSCALEe = [ 10.0000 10.0000 0.1000 0.0100 ]; %! %! RSCALEe = [ 0.1000 0.1000 1.0000 10.0000 ]; %! %!assert (Ao, Ae, 1e-4); %!assert (Eo, Ee, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (LSCALEo, LSCALEe.', 1e-4); %!assert (RSCALEo, RSCALEe.', 1e-4); ## Scaling of state-space models, user function %!shared Ao, Bo, Co, INFOo, Ae, Be, Ce, SCALEe %! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 %! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 %! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 %! 0.0 0.0 0.0 0.0 1.0000e+000 %! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; %! %! B = [ 0.0 0.0 %! 1.1030e+002 0.0 %! 0.0 0.0 %! 0.0 0.0 %! 0.0 8.3330e-003 ]; %! %! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 %! 0.0 0.0 1.0000e+000 0.0 0.0 %! 0.0 0.0 0.0 1.0000e+000 0.0 %! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 %! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; %! %! SYS = ss (A, B, C); %! %! [SYSo, INFOo] = prescale (SYS); %! %! [Ao, Bo, Co] = ssdata (SYSo); %! %! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; %! %! Be = [ 0.0000000D+00 0.0000000D+00 %! 0.1103000D+04 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.8333000D+02 ]; %! %! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 %! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; %! %! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; %! %!assert (Ao, Ae, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (INFOo.SL.^-1, SCALEe.', 1e-4); %!assert (INFOo.SR, SCALEe.', 1e-4); ## Scaling of descriptor state-space models, user function %!shared Ao, Eo, Bo, Co, INFOo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe %! A = [ -1 0 0 0.003 %! 0 0 0.1000 0.02 %! 100 10 0 0.4 %! 0 0 0 0.0]; %! %! E = [ 1 0.2 0 0.0 %! 0 1 0 0.01 %! 300 90 6 0.3 %! 0 0 20 0.0]; %! %! B = [ 10 0 %! 0 0 %! 0 1000 %! 10000 10000]; %! %! C = [ -0.1 0.0 0.001 0.0 %! 0.0 0.01 -0.001 0.0001]; %! %! SYS = dss (A, B, C, [], E); %! %! [SYSo, INFOo] = prescale (SYS); %! %! [Ao, Bo, Co, ~, Eo] = dssdata (SYSo); %! %! Ae = [ -1.0000 0.0000 0.0000 0.3000 %! 0.0000 0.0000 1.0000 2.0000 %! 1.0000 0.1000 0.0000 0.4000 %! 0.0000 0.0000 0.0000 0.0000]; %! %! Ee = [ 1.0000 0.2000 0.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 %! 3.0000 0.9000 0.6000 0.3000 %! 0.0000 0.0000 0.2000 0.0000 ]; %! %! Be = [100.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 100.0000 %! 100.0000 100.0000 ]; %! %! Ce = [ -0.0100 0.0000 0.0010 0.0000 %! 0.0000 0.0010 -0.0010 0.0010]; %! %! LSCALEe = [ 10.0000 10.0000 0.1000 0.0100 ]; %! %! RSCALEe = [ 0.1000 0.1000 1.0000 10.0000 ]; %! %!assert (Ao, Ae, 1e-4); %!assert (Eo, Ee, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (INFOo.SL, LSCALEe.', 1e-4); %!assert (INFOo.SR, RSCALEe.', 1e-4); control/inst/@lti/repmat.m0000644000076500000240000000406712614620313015060 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{rsys} =} repmat (@var{sys}, @var{m}, @var{n}) ## @deftypefnx {Function File} {@var{rsys} =} repmat (@var{sys}, [@var{m}, @var{n}]) ## @deftypefnx {Function File} {@var{rsys} =} repmat (@var{sys}, @var{m}) ## Form a block transfer matrix of @var{sys} with @var{m} copies vertically ## and @var{n} copies horizontally. If @var{n} is not specified, it is set to @var{m}. ## @code{repmat (sys, 2, 3)} is equivalent to @code{[sys, sys, sys; sys, sys, sys]}. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2014 ## Version: 0.1 function sys = repmat (sys, x, y) switch (nargin) case 2 if (is_real_scalar (x)) # repmat (sys, m) y = x; elseif (is_real_vector (x) && length (x) == 2) # repmat (sys, [m, n]) y = x(2); x = x(1); else error ("lti: repmat: second argument invalid"); endif case 3 # repmat (sys, m, n) if (! is_real_scalar (x, y)) error ("lti: repmat: dimensions 'm' and 'n' must be real integers"); endif otherwise print_usage (); endswitch [p, m] = size (sys); out_idx = repmat (1:p, 1, x); in_idx = repmat (1:m, 1, y); sys = __sys_prune__ (sys, out_idx, in_idx); endfunction control/inst/@lti/series.m0000644000076500000240000000672112614620313015061 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}) ## @deftypefnx {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}, @var{outputs1}, @var{inputs2}) ## Series connection of two @acronym{LTI} models. ## ## @strong{Block Diagram} ## @example ## @group ## ..................................... ## u : +--------+ y1 u2 +--------+ : y ## ------>| sys1 |---------->| sys2 |-------> ## : +--------+ +--------+ : ## :................sys................. ## ## sys = series (sys1, sys2) ## @end group ## @end example ## @example ## @group ## ..................................... ## : v2 +--------+ : ## : ---------->| | : y ## : +--------+ y1 u2 | sys2 |-------> ## u : | |---------->| | : ## ------>| sys1 | z1 +--------+ : ## : | |----------> : ## : +--------+ : ## :................sys................. ## ## outputs1 = [1] ## inputs2 = [2] ## sys = series (sys1, sys2, outputs1, inputs2) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function sys = series (sys1, sys2, out1, in2) if (nargin == 2) sys = sys2 * sys1; elseif (nargin == 4) [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (! is_real_vector (out1)) error ("series: argument 3 (outputs1) invalid"); endif if (! is_real_vector (in2)) error ("series: argument 4 (inputs2) invalid"); endif l_out1 = length (out1); l_in2 = length (in2); if (l_out1 > p1) error ("series: 'outputs1' has too many indices for 'sys1'"); endif if (l_in2 > m2) error ("series: 'inputs2' has too many indices for 'sys2'"); endif if (l_out1 != l_in2) error ("series: number of 'outputs1' and 'inputs2' indices must be equal"); endif if (any (out1 > p1 | out1 < 1)) error ("series: range of 'outputs1' indices exceeds dimensions of 'sys1'"); endif if (any (in2 > m2 | in2 < 1)) error ("series: range of 'inputs2' indices exceeds dimensions of 'sys2'"); endif out_scl = full (sparse (1:l_out1, out1, 1, l_out1, p1)); in_scl = full (sparse (in2, 1:l_in2, 1, m2, l_in2)); ## NOTE: for-loop does NOT the same as ## out_scl(1:l_out1, out1) = 1; ## in_scl(in2, 1:l_out1) = 1; ## ## out_scl = zeros (l_out1, p1); ## in_scl = zeros (m2, l_in2); ## ## for k = 1 : l_out1 ## out_scl(k, out1(k)) = 1; ## in_scl(in2(k), k) = 1; ## endfor scl = in_scl * out_scl; sys = sys2 * scl * sys1; else print_usage (); endif endfunction control/inst/@lti/set.m0000644000076500000240000001242312614620313014356 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} set (@var{sys}) ## @deftypefnx {Function File} {} set (@var{sys}, @var{"key"}, @var{value}, @dots{}) ## @deftypefnx {Function File} {@var{retsys} =} set (@var{sys}, @var{"key"}, @var{value}, @dots{}) ## Set or modify properties of @acronym{LTI} objects. ## If no return argument @var{retsys} is specified, the modified @acronym{LTI} object is stored ## in input argument @var{sys}. @command{set} can handle multiple properties in one call: ## @code{set (sys, 'key1', val1, 'key2', val2, 'key3', val3)}. ## @code{set (sys)} prints a list of the object's key names. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.7 function retsys = set (sys, varargin) if (nargin == 1) # set (sys), sys = set (sys) [keys, vals] = __lti_keys__ (sys); nrows = numel (keys); str = strjust (strvcat (keys), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); if (nargout != 0) # function sys = set (sys, varargin) retsys = sys; # would lead to unwanted output when using endif # set (sys) else # set (sys, "key1", val1, ...), sys = set (sys, "key1", val1, ...) if (! isa (sys, "lti")); print_usage (); endif if (rem (nargin-1, 2)) error ("lti: set: keys and values must come in pairs"); endif [p, m] = size (sys); keys = __lti_keys__ (sys, true); for k = 1 : 2 : (nargin-1) key = __match_key__ (varargin{k}, keys, [class(sys), ": set"]); val = varargin{k+1}; switch (key) case {"inname", "inputname"} sys.inname = __adjust_labels__ (val, m); case {"outname", "outputname"} sys.outname = __adjust_labels__ (val, p); case "tsam" if (issample (val, -1) && isdt (sys)) sys.tsam = val; elseif (is_real_scalar (val) && val == 0 && isct (sys)) sys.tsam = 0; elseif (is_real_matrix (val) && isempty (val) && isdt (sys)) sys.tsam = -1; else error ("lti: set: invalid sampling time"); endif case {"ingroup", "inputgroup"} if (isstruct (val) && all (size (val) == 1) ... && all (structfun (@(x) is_group_idx (x, m), val))) empty = structfun (@isempty, val); fields = fieldnames (val); sys.ingroup = rmfield (val, fields(empty)); else error ("lti: set: key 'ingroup' requires a scalar struct containing valid input indices in the range [1, %d]", m); endif case {"outgroup", "outputgroup"} if (isstruct (val) && all (size (val) == 1) ... && all (structfun (@(x) is_group_idx (x, p), val))) empty = structfun (@isempty, val); fields = fieldnames (val); sys.outgroup = rmfield (val, fields(empty)); else error ("lti: set: key 'outgroup' requires a scalar struct containing valid output indices in the range [1, %d]", p); endif case "name" if (ischar (val) && ndims (val) == 2 && (rows (val) == 1 || isempty (val))) sys.name = val; else error ("lti: set: key 'name' requires a string"); endif case "notes" if (iscellstr (val)) sys.notes = val; elseif (ischar (val)) sys.notes = {val}; else error ("lti: set: key 'notes' requires string or cell of strings"); endif case "userdata" sys.userdata = val; case "lti" if (isa (val, "lti")) lti_keys = __lti_keys__ (val, false, false); n = numel (lti_keys); lti_vals = cell (n, 1); [lti_vals{1:n}] = get (val, lti_keys{:}); for k = 1:n try sys = set (sys, lti_keys{k}, lti_vals{k}); end_try_catch endfor else error ("lti: set: key 'lti' requires an LTI model"); endif otherwise sys = __set__ (sys, key, val); endswitch endfor if (nargout == 0) # set (sys, "key1", val1, ...) assignin ("caller", inputname (1), sys); else # sys = set (sys, "key1", val1, ...) retsys = sys; endif endif endfunction function bool = is_group_idx (idx, n) bool = (isempty (idx) || (is_real_vector (idx) && all (idx > 0) && all (idx <= n) && all (abs (fix (idx)) == idx))); endfunction control/inst/@lti/size.m0000644000076500000240000000474512614620313014545 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{nvec} =} size (@var{sys}) ## @deftypefnx {Function File} {@var{n} =} size (@var{sys}, @var{dim}) ## @deftypefnx {Function File} {[@var{p}, @var{m}] =} size (@var{sys}) ## @acronym{LTI} model size, i.e. number of outputs and inputs. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item dim ## If given a second argument, @command{size} will return the size of the ## corresponding dimension. ## @end table ## ## @strong{Outputs} ## @table @var ## @item nvec ## Row vector. The first element is the number of outputs (rows) and the second ## element the number of inputs (columns). ## @item n ## Scalar value. The size of the dimension @var{dim}. ## @item p ## Number of outputs. ## @item m ## Number of inputs. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function [n, varargout] = size (sys, dim = 0) if (nargin > 2) print_usage (); endif p = numel (sys.outname); # WARNING: system matrices may change without m = numel (sys.inname); # being noticed by the i/o names! switch (dim) case 0 switch (nargout) case 0 if (p == 1) stry = ""; else stry = "s"; endif if (m == 1) stru = ""; else stru = "s"; endif disp (sprintf ("LTI model with %d output%s and %d input%s.", p, stry, m, stru)); case 1 n = [p, m]; case 2 n = p; varargout{1} = m; otherwise print_usage (); endswitch case 1 n = p; case 2 n = m; otherwise print_usage (); endswitch endfunction control/inst/@lti/size_equal.m0000644000076500000240000000244012614620313015722 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} size_equal (@var{a}, @var{b}, @dots{}) ## Return true if @acronym{LTI} models (and matrices) @var{a}, @var{b}, @dots{} ## are of equal size and false otherwise. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2012 ## Version: 0.1 function bool = size_equal (varargin) s = cellfun (@size, varargin, "uniformoutput", false); bool = (nargin == 1 || isequal (s{:})); # isequal errors out with only 1 argument, nargin==0 handled by built-in size_equal endfunction control/inst/@lti/sminreal.m0000644000076500000240000000740312614620313015377 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} sminreal (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} sminreal (@var{sys}, @var{tol}) ## Perform state-space model reduction based on structure. ## Remove states which have no influence on the input-output behaviour. ## The physical meaning of the states is retained. ## ## @strong{Inputs} ## @table @var ## @item sys ## State-space model. ## @item tol ## Optional tolerance for controllability and observability. ## Entries of the state-space matrices whose moduli are less or equal to @var{tol} ## are assumed to be zero. Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Reduced state-space model. ## @end table ## ## @seealso{minreal} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = sminreal (sys, tol = 0) if (nargin > 2) # sminreal () not possible (inside @lti) print_usage (); endif if (! isa (sys, "ss")) warning ("sminreal: system not in state-space form"); sys = ss (sys); # needed by __sys_prune__ endif if (! (is_real_scalar (tol) && tol >= 0)) error ("sminreal: second argument is not a valid tolerance"); endif [a, b, c, d, e] = dssdata (sys, []); a = abs (a) > tol; b = abs (b) > tol; c = abs (c) > tol; if (! isempty (e)) e = abs (e) > tol; a = a | e; endif co_idx = __controllable_states__ (a, b); ob_idx = __controllable_states__ (a.', c.'); st_idx = intersect (co_idx, ob_idx); sys = __sys_prune__ (sys, ":", ":", st_idx); endfunction function c_idx = __controllable_states__ (a, b) n = rows (a); # number of states a = a & ! eye (n); # set diagonal entries to zero c_vec = any (b, 2); # states directly controllable c_idx = find (c_vec); # indices of directly controllable states c_idx_new = 0; # any vector of length > 0 possible while (all (length (c_idx) != [0, n]) && length(c_idx_new) != 0) u_idx = find (! c_vec); # indices of uncontrollable states #{ ## debug code a(u_idx, :) repmat (c_vec.', length (u_idx), 1) a(u_idx, :) & repmat (c_vec.', length (u_idx), 1) any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2) find (any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2)) #} c_idx_new = u_idx (find (any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2))); c_idx = union (c_idx, c_idx_new); c_vec(c_idx_new) = 1; endwhile endfunction ## ss: sminreal %!shared B, C %! %! A = ss (-2, 3, 4, 5); %! B = A / A; %! C = sminreal (B); # no states should be removed %! %!assert (C.a, B.a); %!assert (C.b, B.b); %!assert (C.c, B.c); %!assert (C.d, B.d); %!shared A, B, D, E %! %! A = ss (-1, 1, 1, 0); %! B = ss (-2, 3, 4, 5); %! C = [A, B]; %! D = sminreal (C(:, 1)); %! E = sminreal (C(:, 2)); %! %!assert (D.a, A.a); %!assert (D.b, A.b); %!assert (D.c, A.c); %!assert (D.d, A.d); %!assert (E.a, B.a); %!assert (E.b, B.b); %!assert (E.c, B.c); %!assert (E.d, B.d); control/inst/@lti/ssdata.m0000644000076500000240000000340712614620313015044 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}] =} ssdata (@var{sys}) ## Access state-space model data. ## Argument @var{sys} is not limited to state-space models. ## If @var{sys} is not a state-space model, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @end table ## ## @strong{Outputs} ## @table @var ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Measurement matrix (p-by-n). ## @item d ## Feedthrough matrix (p-by-m). ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function [a, b, c, d, tsam, scaled] = ssdata (sys) if (! isa (sys, "ss")) sys = ss (sys); endif [a, b, c, d, e, ~, scaled] = __sys_data__ (sys); [a, b, c, d, e] = __dss2ss__ (a, b, c, d, e); tsam = sys.tsam; endfunction control/inst/@lti/subsasgn.m0000644000076500000240000000376612614620313015422 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted assignment for @acronym{LTI} objects. ## Used by Octave for "sys.property = value". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = subsasgn (sys, idx, val) ## TODO: enable *more* stuff like sys.a(2, 1:3) = [4, 5, 6] ## warning ("lti: subsasgn: do not use subsasgn for development"); switch (idx(1).type) case "." if (length (idx) == 1) sys = set (sys, idx.subs, val); else key = idx(1).subs; sys = set (sys, key, subsasgn (get (sys, key), idx(2:end), val)); endif case "()" if (numel (idx(1).subs) > 2) # sys(:, :, ...) = ltisys ## bug #45314 error (["lti: subsasgn: arrays of linear models are not supported (yet). ", ... "as a workaround, try to use cells of LTI models instead."]); else # sys(out_idx, in_idx).a = mat error (["lti: subsasgn: invalid subscripted assignment type '()'. ", ... "you must select an LTI key first, i.e. sys.keyname(...) = ..."]); endif otherwise error ("lti: subsasgn: invalid subscripted assignment type '%s'", idx(1).type); endswitch endfunction control/inst/@lti/subsref.m0000644000076500000240000000431212614620313015232 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted reference for @acronym{LTI} objects. ## Used by Octave for "sys = sys(2:4, :)" or "val = sys.prop". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.5 function a = subsref (a, s) if (numel (s) == 0) return; endif switch (s(1).type) case "()" idx = s(1).subs; switch (numel (idx)) case 2 a = __sys_prune__ (a, idx{1}, idx{2}); case 1 a = freqresp (a, idx{1}); case 0 ## NOTE: for example, Octave returns a = a() for a = rand (2, 2) ## so we do the same for LTI models. ## a = a; # superfluous ## error (["lti: subsref: invalid subscripted reference of type '()'. ", ... ## "need one or two arguments inside the brackets."]); otherwise ## bug #45314 error (["lti: subsref: arrays of linear models are not supported (yet). ", ... "as a workaround, try to use cells of LTI models instead."]); endswitch case "." fld = s(1).subs; a = get (a, fld); ## warning ("lti: subsref: do not use subsref for development"); otherwise error ("lti: subsref: invalid subscript type '%s'", s(1).type); endswitch a = subsref (a, s(2:end)); endfunction ## lti: subsref %!shared a %! s = tf ("s"); %! G = (s+1)*s*5/(s+1)/(s^2+s+1); %! a = G(1,1).num{1,1}(1); %!assert (a, 5, 1e-4); control/inst/@lti/tfdata.m0000644000076500000240000000544312614620313015032 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}) ## @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"vector"}) ## @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"tfpoly"}) ## Access transfer function data. ## Argument @var{sys} is not limited to transfer function models. ## If @var{sys} is not a transfer function, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item "v", "vector" ## For SISO models, return @var{num} and @var{den} directly as column vectors ## instead of cells containing a single column vector. ## @end table ## ## @strong{Outputs} ## @table @var ## @item num ## Cell of numerator(s). Each numerator is a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item den ## Cell of denominator(s). Each denominator is a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.5 function [num, den, tsam] = tfdata (sys, rtype = "cell") if (! isa (sys, "tf")) sys = tf (sys); endif [num, den] = __sys_data__ (sys); tsam = sys.tsam; if (! strncmpi (rtype, "t", 1)) # != tfpoly num = cellfun (@get, num, "uniformoutput", false); den = cellfun (@get, den, "uniformoutput", false); endif if (strncmpi (rtype, "v", 1) && issiso (sys)) # == vector num = num{1}; den = den{1}; endif endfunction control/inst/@lti/times.m0000644000076500000240000000350312614620313014703 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Hadamard/Schur product of transfer function matrices. ## Also known as element-wise multiplication. ## Used by Octave for "sys1 .* sys2".@* ## @strong{Example} ## @example ## @group ## # Compute Relative-Gain Array ## G = tf (Boeing707) ## RGA = G .* inv (G).' ## # Gain at 0 rad/s ## RGA(0) ## @end group ## @end example ## Author: Lukas Reichlin ## Created: April 2014 ## Version: 0.2 function sys = times (sys1, sys2) if (nargin != 2) # prevent sys = times (sys1, sys2, sys3, ...) error ("lti: times: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2 || m1 != m2) if (p1 == 1 && m1 == 1 && p2*m2 > 1) # sys1 SISO, sys2 non-empty sys1 = repmat (sys1, p2, m2); elseif (p2 == 1 && m2 == 1 && p1*m1 > 1) # sys2 SISO, sys1 non-empty sys2 = repmat (sys2, p1, m1); else error ("lti: times: system dimensions incompatible: (%dx%d) .* (%dx%d)", ... p1, m1, p2, m2); endif endif sys = __times__ (sys1, sys2); endfunction control/inst/@lti/transpose.m0000644000076500000240000000261512614620313015603 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of @acronym{LTI} objects. Used by Octave for "sys.'". ## Useful for dual problems, i.e. controllability and observability ## or designing estimator gains with @command{lqr} and @command{place}. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function sys = transpose (sys) if (nargin != 1) # prevent sys = transpose (sys1, sys2, sys3, ...) error ("lti: transpose: this is an unary operator"); endif [p, m] = size (sys); sys = __transpose__ (sys); sys.inname = repmat ({""}, p, 1); sys.outname = repmat ({""}, m, 1); sys.ingroup = struct (); sys.outgroup = struct (); endfunction control/inst/@lti/uminus.m0000644000076500000240000000221212614620313015076 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unary minus of @acronym{LTI} object. Used by Octave for "-sys". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = uminus (sys) if (nargin != 1) # prevent sys = uminus (sys1, sys2, sys3, ...) error ("lti: uminus: this is an unary operator"); endif [p, m] = size (sys); out_scl = - eye (p); sys = out_scl * sys; endfunction control/inst/@lti/uplus.m0000644000076500000240000000207112614620313014731 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unary plus of @acronym{LTI} object. Used by Octave for "+sys". ## Author: Lukas Reichlin ## Created: June 2012 ## Version: 0.1 function sys = uplus (sys) if (nargin != 1) # prevent sys = uplus (sys1, sys2, sys3, ...) error ("lti: uplus: this is an unary operator"); endif endfunction control/inst/@lti/vertcat.m0000644000076500000240000000262412614620313015235 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Vertical concatenation of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "[sys1; sys2]". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = vertcat (sys, varargin) for k = 1 : (nargin-1) sys1 = sys; sys2 = varargin{k}; [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (m1 != m2) error ("lti: vertcat: number of system inputs incompatible: [(%dx%d); (%dx%d)]", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; sys = sys * in_scl; endfor endfunction control/inst/@lti/xperm.m0000644000076500000240000000370312614620313014717 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} xperm (@var{sys}, @var{idx}) ## Reorder states in state-space models. ## ## @strong{Inputs} ## @table @var ## @item sys ## State-space model. ## @item idx ## Vector containing the state indices in the desired order. ## Alternatively, a cell vector containing the state names ## is possible as well. See @code{sys.stname}. State names ## only work if they were assigned explicitly before, i.e. ## @code{sys.stname} contains no empty strings. ## Note that if certain state indices of @var{sys} are ## missing or appear multiple times in @var{idx}, these ## states will be pruned or duplicated accordingly in the ## resulting state-space model @var{retsys}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item retsys ## Resulting state-space model with states reordered according to @var{idx}. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function sys = xperm (sys, st_idx) if (nargin != 2) print_usage (); endif if (! isa (sys, "ss")) warning ("xperm: system not in state-space form"); sys = ss (sys); endif sys = __sys_prune__ (sys, ":", ":", st_idx); endfunction control/inst/@lti/zero.m0000644000076500000240000003562212614620313014550 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## Copyright (C) 2011 Ferdinand Svaricek, UniBw Munich. ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{z} =} zero (@var{sys}) ## @deftypefnx {Function File} {@var{z} =} zero (@var{sys}, @var{type}) ## @deftypefnx {Function File} {[@var{z}, @var{k}, @var{info}] =} zero (@var{sys}) ## Compute zeros and gain of @acronym{LTI} model. ## By default, @command{zero} computes the invariant zeros, ## also known as Smith zeros. Alternatively, when called with ## a second input argument, @command{zero} can also compute ## the system zeros, transmission zeros, input decoupling zeros ## and output decoupling zeros. See paper [1] for an explanation ## of the various zero flavors as well as for further details. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item type ## String specifying the type of zeros: ## @table @var ## @item 'system', 's' ## Compute the system zeros. ## The system zeros include in all cases ## (square, non-square, degenerate or non-degenerate system) ## all transmission and decoupling zeros. ## @item 'invariant', 'inv' ## Compute invariant zeros. Default selection. ## @item 'transmission', 't' ## Compute transmission zeros. Transmission zeros ## are a subset of the invariant zeros. ## The transmission zeros are the zeros of the ## Smith-McMillan form of the transfer function matrix. ## @item 'input', 'inp', 'id' ## Compute input decoupling zeros. The input decoupling zeros are ## also known as the uncontrollable eigenvalues of the pair (A,B). ## @item 'output', 'o', 'od' ## Compute output decoupling zeros. The output decoupling zeros are ## also known as the unobservable eigenvalues of the pair (A,C). ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item z ## Depending on argument @var{type}, @var{z} contains the ## invariant (default), system, transmission, input decoupling ## or output decoupling zeros of @var{sys} as defined in [1]. ## @item k ## Gain of @acronym{SISO} system @var{sys}. For @acronym{MIMO} ## systems, an empty matrix @code{[]} is returned. ## @item info ## Struct containing additional information. For details, ## see the documentation of @acronym{SLICOT} routines ## @acronym{AB08ND} and @acronym{AG08BD}. ## @item info.rank ## The normal rank of the transfer function matrix (regular state-space models) ## or of the system pencil (descriptor state-space models). ## @item info.infz ## Contains information on the infinite elementary divisors as follows: ## the system has info.infz(i) infinite elementary divisors of degree i, ## where i=1,2,...,length(info.infz). ## @item info.kronr ## Right Kronecker (column) indices. ## @item info.kronl ## Left Kronecker (row) indices. ## @end table ## ## @strong{Examples} ## @example ## @group ## [z, k, info] = zero (sys) # invariant zeros ## z = zero (sys, 'system') # system zeros ## z = zero (sys, 'invariant') # invariant zeros ## z = zero (sys, 'transmission') # transmission zeros ## z = zero (sys, 'output') # output decoupling zeros ## z = zero (sys, 'input') # input decoupling zeros ## @end group ## @end example ## ## @strong{Algorithm}@* ## For (descriptor) state-space models, @command{zero} ## relies on SLICOT AB08ND and AG08BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## For @acronym{SISO} transfer functions, @command{zero} ## uses Octave's @command{roots}. ## @acronym{MIMO} transfer functions are converted to ## a @emph{minimal} state-space representation for the ## computation of the zeros. ## ## @strong{References}@* ## [1] MacFarlane, A. and Karcanias, N. ## @cite{Poles and zeros of linear multivariable systems: ## a survey of the algebraic, geometric and complex-variable ## theory}. Int. J. Control, vol. 24, pp. 33-74, 1976.@* ## [2] Rosenbrock, H.H. ## @cite{Correction to 'The zeros of a system'}. ## Int. J. Control, vol. 20, no. 3, pp. 525-527, 1974.@* ## [3] Svaricek, F. ## @cite{Computation of the structural invariants of linear ## multivariable systems with an extended version of the ## program ZEROS}. ## Systems & Control Letters, vol. 6, pp. 261-266, 1985.@* ## [4] Emami-Naeini, A. and Van Dooren, P. ## @cite{Computation of zeros of linear multivariable systems}. ## Automatica, vol. 26, pp. 415-430, 1982.@* ## ## @end deftypefn ## TODO: write a short summary about the characteristics of the ## various zero flavors and add it to the docstring. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [zer, gain, info] = zero (sys, type = "invariant") if (nargin > 2) print_usage (); endif if (strncmpi (type, "invariant", 3)) # invariant zeros, default [zer, gain, info] = __zero__ (sys, nargout); elseif (strncmpi (type, "transmission", 1)) # transmission zeros [zer, gain, info] = zero (minreal (sys)); elseif (strncmpi (type, "input", 3) || strncmpi (type, "id", 2)) # input decoupling zeros [a, b, c, d, e, tsam] = dssdata (sys, []); tmp = dss (a, b, zeros (0, columns (a)), zeros (0, columns (b)), e, tsam); [zer, gain, info] = zero (tmp); elseif (strncmpi (type, "output", 1)) # output decoupling zeros [a, b, c, d, e, tsam] = dssdata (sys, []); tmp = dss (a, zeros (rows (a), 0), c, zeros (rows (c), 0), e, tsam); [zer, gain, info] = zero (tmp); elseif (strncmpi (type, "system", 1)) # system zeros [zer, gain, info] = __szero__ (sys); else error ("zero: type '%s' invalid", type); endif endfunction ## Function for computing the system zeros. ## Adapted from Ferdinand Svaricek's szero.m function [z, gain, info] = __szero__ (sys) ## TODO: support descriptor state-space models ## with singular 'E' matrices [a, b, c, d] = ssdata (sys); [pp, mm] = size (sys); nn = rows (a); ## Tolerance for intersection of zeros Zeps = 10 * sqrt ((nn+pp)*(nn+mm)) * eps * norm (a,'fro'); [z, gain, info] = zero (ss (a, b, c, d)); # zero (sys) lets descriptor test fail Rank = info.rank; ## System is not degenerated and square if (Rank == 0 || (Rank == min(pp,mm) && mm == pp)) return; endif ## System (A,B,C,D) is degenerated and/or non-square z = []; ## Computation of the greatest common divisor of all minors of the ## Rosenbrock system matrix that have the following form ## ## 1, 2, ..., n, n+i_1, n+i_2, ..., n+i_k ## P ## 1, 2, ..., n, n+j_1, n+j_2, ..., n+j_k ## ## with k = Rank. NKP = nchoosek (1:pp, Rank); [IP, JP] = size (NKP); NKM = nchoosek (1:mm, Rank); [IM, JM] = size (NKM); for i = 1:IP for j = 1:JP k = NKP(i,j); C1(j,:) = c(k,:); # Build C of dimension (Rank x n) endfor for ii = 1:IM for jj = 1:JM k = NKM(ii,jj); B1(:,jj) = b(:,k); # Build B of dimension (n x Rank) endfor [z1, ~, info1] = zero (ss (a, B1, C1, zeros (Rank, Rank))); rank1 = info1.rank; if (rank1 == Rank) if (isempty (z1)) z = z1; # Subsystem has no zeros -> system has no system zeros return; else if (isempty (z)) z = z1; # Zeros of the first subsystem else # Compute intersection of z and z1 with tolerance Zeps z2 = []; for ii=1:length(z) for jj=1:length(z1) if (abs (z(ii)-z1(jj)) < Zeps) z2(end+1) = z(ii); z1(jj) = []; break; endif endfor endfor z = z2; # System zeros are the common zeros of all subsystems endif endif endif endfor endfor endfunction ## Invariant zeros of state-space models ## ## Results from the "Dark Side" 7.5 and 7.8 ## ## -13.2759 ## 12.5774 ## -0.0155 ## ## Results from Scilab 5.2.0b1 (trzeros) ## ## - 13.275931 ## 12.577369 ## - 0.0155265 ## %!shared z, z_exp %! A = [ -0.7 -0.0458 -12.2 0 %! 0 -0.014 -0.2904 -0.562 %! 1 -0.0057 -1.4 0 %! 1 0 0 0 ]; %! %! B = [ -19.1 -3.1 %! -0.0119 -0.0096 %! -0.14 -0.72 %! 0 0 ]; %! %! C = [ 0 0 -1 1 %! 0 0 0.733 0 ]; %! %! D = [ 0 0 %! 0.0768 0.1134 ]; %! %! sys = ss (A, B, C, D, "scaled", true); %! z = sort (zero (sys)); %! %! z_exp = sort ([-13.2759; 12.5774; -0.0155]); %! %!assert (z, z_exp, 1e-4); ## Invariant zeros of regular state-space models %!shared z, z_exp, info, rank_exp, infz_exp, kronr_exp, kronl_exp %! A = [ 1.0 0.0 0.0 0.0 0.0 0.0 %! 0.0 1.0 0.0 0.0 0.0 0.0 %! 0.0 0.0 3.0 0.0 0.0 0.0 %! 0.0 0.0 0.0 -4.0 0.0 0.0 %! 0.0 0.0 0.0 0.0 -1.0 0.0 %! 0.0 0.0 0.0 0.0 0.0 3.0 ]; %! %! B = [ 0.0 -1.0 %! -1.0 0.0 %! 1.0 -1.0 %! 0.0 0.0 %! 0.0 1.0 %! -1.0 -1.0 ]; %! %! C = [ 1.0 0.0 0.0 1.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 1.0 %! 0.0 0.0 1.0 0.0 0.0 1.0 ]; %! %! D = [ 0.0 0.0 %! 0.0 0.0 %! 0.0 0.0 ]; %! %! sys = ss (A, B, C, D, "scaled", true); %! [z, ~, info] = zero (sys); %! %! z_exp = [ 2.0000 %! -1.0000 ]; %! %! rank_exp = 2; %! infz_exp = 2; %! kronr_exp = zeros (1, 0); %! kronl_exp = 2; %! %!assert (z, z_exp, 1e-4); %!assert (info.rank, rank_exp); %!assert (info.infz, infz_exp); %!assert (info.kronr, kronr_exp); %!assert (info.kronl, kronl_exp); ## Invariant zeros of descriptor state-space models %!shared z, z_exp, info, rank_exp, infz_exp, kronr_exp, kronl_exp %! A = [ 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 0 0 1 ]; %! %! E = [ 0 0 0 0 0 0 0 0 0 %! 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 ]; %! %! B = [ -1 0 0 %! 0 0 0 %! 0 0 0 %! 0 -1 0 %! 0 0 0 %! 0 0 0 %! 0 0 -1 %! 0 0 0 %! 0 0 0 ]; %! %! C = [ 0 1 1 0 3 4 0 0 2 %! 0 1 0 0 4 0 0 2 0 %! 0 0 1 0 -1 4 0 -2 2 ]; %! %! D = [ 1 2 -2 %! 0 -1 -2 %! 0 0 0 ]; %! %! sys = dss (A, B, C, D, E, "scaled", true); %! [z, ~, info] = zero (sys); %! %! z_exp = 1; %! %! rank_exp = 11; %! infz_exp = [0, 1]; %! kronr_exp = 2; %! kronl_exp = 1; %! %!assert (z, z_exp, 1e-4); %!assert (info.rank, rank_exp); %!assert (info.infz, infz_exp); %!assert (info.kronr, kronr_exp); %!assert (info.kronl, kronl_exp); ## Gain of descriptor state-space models %!shared p, pi, z, zi, k, ki, p_tf, pi_tf, z_tf, zi_tf, k_tf, ki_tf %! P = ss (-2, 3, 4, 5); %! Pi = inv (P); %! %! p = pole (P); %! [z, k] = zero (P); %! %! pi = pole (Pi); %! [zi, ki] = zero (Pi); %! %! P_tf = tf (P); %! Pi_tf = tf (Pi); %! %! p_tf = pole (P_tf); %! [z_tf, k_tf] = zero (P_tf); %! %! pi_tf = pole (Pi_tf); %! [zi_tf, ki_tf] = zero (Pi_tf); %! %!assert (p, zi, 1e-4); %!assert (z, pi, 1e-4); %!assert (k, inv (ki), 1e-4); %!assert (p_tf, zi_tf, 1e-4); %!assert (z_tf, pi_tf, 1e-4); %!assert (k_tf, inv (ki_tf), 1e-4); ## Example taken from Paper [1] ## Regular state-space system %!shared z_inv, z_tra, z_inp, z_out, z_sys, z_inv_e, z_tra_e, z_inp_e, z_out_e, z_sys_e %! A = diag ([1, 1, 3, -4, -1, 3]); %! %! B = [ 0, -1 %! -1, 0 %! 1, -1 %! 0, 0 %! 0, 1 %! -1, -1 ]; %! %! C = [ 1, 0, 0, 1, 0, 0 %! 0, 1, 0, 1, 0, 1 %! 0, 0, 1, 0, 0, 1 ]; %! %! D = zeros (3, 2); %! %! SYS = ss (A, B, C, D); %! %! z_inv = zero (SYS); %! z_tra = zero (SYS, "transmission"); %! z_inp = zero (SYS, "input decoupling"); %! z_out = zero (SYS, "output decoupling"); %! z_sys = zero (SYS, "system"); %! %! z_inv_e = [2; -1]; %! z_tra_e = [2]; %! z_inp_e = [-4]; %! z_out_e = [-1]; %! z_sys_e = [-4, -1, 2]; %! %!assert (z_inv, z_inv_e, 1e-4); %!assert (z_tra, z_tra_e, 1e-4); %!assert (z_inp, z_inp_e, 1e-4); %!assert (z_out, z_out_e, 1e-4); %!assert (z_sys, z_sys_e, 1e-4); ## Example taken from Paper [1] ## Well, this is not exactly a descriptor state-space model, ## but it is the best thing I have right now and it is better ## than no test at all. The routine for the system zeros works ## only for descriptor state-space models with regular 'E' matrices. %!shared z_inv, z_tra, z_inp, z_out, z_sys, z_inv_e, z_tra_e, z_inp_e, z_out_e, z_sys_e %! A = diag ([1, 1, 3, -4, -1, 3]); %! %! B = [ 0, -1 %! -1, 0 %! 1, -1 %! 0, 0 %! 0, 1 %! -1, -1 ]; %! %! C = [ 1, 0, 0, 1, 0, 0 %! 0, 1, 0, 1, 0, 1 %! 0, 0, 1, 0, 0, 1 ]; %! %! D = zeros (3, 2); %! %! E = eye (6); %! %! SYS = dss (A, B, C, D, E); %! %! z_inv = zero (SYS); %! z_tra = zero (SYS, "transmission"); %! z_inp = zero (SYS, "input decoupling"); %! z_out = zero (SYS, "output decoupling"); %! z_sys = zero (SYS, "system"); %! %! z_inv_e = [2; -1]; %! z_tra_e = [2]; %! z_inp_e = [-4]; %! z_out_e = [-1]; %! z_sys_e = [-4, -1, 2]; %! %!assert (z_inv, z_inv_e, 1e-4); %!assert (z_tra, z_tra_e, 1e-4); %!assert (z_inp, z_inp_e, 1e-4); %!assert (z_out, z_out_e, 1e-4); %!assert (z_sys, z_sys_e, 1e-4); control/inst/@lti/zpkdata.m0000644000076500000240000000427212614620313015224 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}) ## @deftypefnx {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}, @var{"v"}) ## Access zero-pole-gain data. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item "v", "vector" ## For SISO models, return @var{z} and @var{p} directly as column vectors ## instead of cells containing a single column vector. ## @end table ## ## @strong{Outputs} ## @table @var ## @item z ## Cell of column vectors containing the zeros for each channel. ## z@{i,j@} contains the zeros from input j to output i. ## @item p ## Cell of column vectors containing the poles for each channel. ## p@{i,j@} contains the poles from input j to output i. ## @item k ## Matrix containing the gains for each channel. ## k(i,j) contains the gain from input j to output i. ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.1 function [z, p, k, tsam] = zpkdata (sys, rtype = "cell") [num, den, tsam] = tfdata (sys); z = cellfun (@roots, num, "uniformoutput", false); p = cellfun (@roots, den, "uniformoutput", false); k = cellfun (@(n,d) n(1)/d(1), num, den); if (strncmpi (rtype, "v", 1) && issiso (sys)) z = z{1}; p = p{1}; endif endfunction control/inst/@ss/0000755000076500000240000000000012614620313013240 5ustar lukasstaffcontrol/inst/@ss/__c2d__.m0000644000076500000240000000373212614620313014667 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the continuous SS model into its discrete-time equivalent. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function sys = __c2d__ (sys, tsam, method = "zoh", w0 = 0) switch (method(1)) case {"z", "s"} # {"zoh", "std"} [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss2ss__ (sys.a, sys.b, sys.c, sys.d, sys.e); [sys.a, tmp] = __sl_mb05nd__ (sys.a, tsam, eps); sys.b = tmp * sys.b; # G case {"t", "b", "p"} # {"tustin", "bilin", "prewarp"} if (method(1) == "p") # prewarping beta = w0 / tan (w0*tsam/2); else beta = 2/tsam; endif if (isempty (sys.e)) [sys.a, sys.b, sys.c, sys.d] = __sl_ab04md__ (sys.a, sys.b, sys.c, sys.d, 1, beta, false); else [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss_bilin__ (sys.a, sys.b, sys.c, sys.d, sys.e, beta, false); endif case "m" # "matched" tmp = ss (c2d (zpk (sys), tsam, method)); sys.e = tmp.e; sys.a = tmp.a; sys.b = tmp.b; sys.c = tmp.c; sys.d = tmp.d; otherwise error ("ss: c2d: '%s' is an invalid or missing method", method); endswitch endfunction control/inst/@ss/__ctranspose__.m0000644000076500000240000000273312614620313016400 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose of SS models. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = __ctranspose__ (sys, ct) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; if (ct) # continuous-time sys.a = -a.'; sys.b = -c.'; sys.c = b.'; sys.d = d.'; sys.e = e.'; sys.stname = repmat ({""}, rows (a), 1); else # discrete-time [n, m] = size (b); p = rows (c); if (isempty (e)) e = eye (n); endif sys.a = blkdiag (e.', eye (p)); sys.b = [zeros(n, p); -eye(p)]; sys.c = [b.', zeros(m, p)]; sys.d = d.'; sys.e = [a.', c.'; zeros(p, n+p)]; sys.stname = repmat ({""}, n+p, 1); endif endfunction control/inst/@ss/__d2c__.m0000644000076500000240000000425612614620313014671 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the discrete SS model into its continuous-time equivalent. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.3 function sys = __d2c__ (sys, tsam, method = "zoh", w0 = 0) switch (method(1)) case {"z", "s"} # {"zoh", "std"} [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss2ss__ (sys.a, sys.b, sys.c, sys.d, sys.e); [n, m] = size (sys.b); # n: states, m: inputs tmp = logm ([sys.a, sys.b; zeros(m,n), eye(m)]) / tsam; if (norm (imag (tmp), inf) > sqrt (eps)) warning ("ss: d2c: possibly inaccurate results"); endif sys.a = real (tmp(1:n, 1:n)); sys.b = real (tmp(1:n, n+1:n+m)); case {"t", "b", "p"} # {"tustin", "bilin", "prewarp"} if (method(1) == "p") # prewarping beta = w0 / tan (w0*tsam/2); else beta = 2/tsam; endif if (isempty (sys.e)) [sys.a, sys.b, sys.c, sys.d] = __sl_ab04md__ (sys.a, sys.b, sys.c, sys.d, 1, beta, true); else [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss_bilin__ (sys.a, sys.b, sys.c, sys.d, sys.e, beta, true); endif case "m" # "matched" tmp = ss (d2c (zpk (sys), method)); sys.e = tmp.e; sys.a = tmp.a; sys.b = tmp.b; sys.c = tmp.c; sys.d = tmp.d; otherwise error ("ss: d2c: '%s' is an invalid or missing method", method); endswitch endfunction control/inst/@ss/__freqresp__.m0000644000076500000240000000243412614620313016044 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Frequency response of SS models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.6 function H = __freqresp__ (sys, w, cellflag = false) if (sys.scaled == false) sys = prescale (sys); endif [a, b, c, d, e, tsam] = dssdata (sys); if (isct (sys)) # continuous system s = i * w; else # discrete system s = exp (i * w * abs (tsam)); endif H = arrayfun (@(x) c/(x*e - a)*b + d, s, "uniformoutput", false); if (! cellflag) H = cat (3, H{:}); endif endfunction control/inst/@ss/__get__.m0000644000076500000240000000245112614620313014773 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Access key values of SS objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function val = __get__ (sys, key) switch (key) # {, } case "a" val = sys.a; case "b" val = sys.b; case "c" val = sys.c; case "d" val = sys.d; case "e" val = sys.e; case {"stname", "statename"} val = sys.stname; case "scaled" val = sys.scaled; otherwise error ("ss: get: invalid key name '%s'", key); endswitch endfunction control/inst/@ss/__minreal__.m0000644000076500000240000000331212614620313015640 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Minimal realization of SS models. The physical meaning of states is lost. ## Uses SLICOT TB01PD and TG01JD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function retsys = __minreal__ (sys, tol) if (strcmpi (tol, "def")) tol = 0; elseif (tol > 1) error ("ss: minreal: require tol <= 1"); endif if (isempty (sys.e)) [a, b, c] = __sl_tb01pd__ (sys.a, sys.b, sys.c, tol, sys.scaled); if (rows (a) == rows (sys.a)) retsys = sys; else retsys = ss (a, b, c, sys.d); retsys.lti = sys.lti; # retain i/o names and tsam endif else [a, e, b, c] = __sl_tg01jd__ (sys.a, sys.e, sys.b, sys.c, tol, sys.scaled, 0, 0); if (rows (a) == rows (sys.a)) retsys = sys; else retsys = dss (a, b, c, sys.d, e); retsys.lti = sys.lti; # retain i/o names and tsam endif endif endfunction control/inst/@ss/__pole__.m0000644000076500000240000000236512614620313015157 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Poles of SS object. ## Special thanks to Peter Benner for his advice. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function pol = __pole__ (sys) if (isempty (sys.e)) pol = eig (sys.a); else ## pol = eig (sys.a, sys.e); ## tol = norm ([sys.a, sys.e], 2); ## idx = find (abs (pol) < tol/eps); ## pol = pol(idx); ## do not scale, matrices B, C & D missing pol = __sl_ag08bd__ (sys.a, sys.e, [], [], [], true); endif endfunction control/inst/@ss/__prescale__.m0000644000076500000240000000264612614620313016020 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Prescale state-space model. ## Uses SLICOT TB01ID and TG01AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## Author: Lukas Reichlin ## Created: June 2011 ## Version: 0.1 function [retsys, lscale, rscale] = __prescale__ (sys, optarg = 0.0) if (isempty (sys.e)) [a, b, c, ~, scale] = __sl_tb01id__ (sys.a, sys.b, sys.c, optarg); retsys = ss (a, b, c, sys.d); lscale = scale.^-1; rscale = scale; else [a, e, b, c, lscale, rscale] = __sl_tg01ad__ (sys.a, sys.e, sys.b, sys.c, optarg); retsys = dss (a, b, c, sys.d, e); endif retsys.scaled = true; retsys.lti = sys.lti; # retain i/o names and tsam endfunction control/inst/@ss/__set__.m0000644000076500000240000000353712614620313015015 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Set or modify keys of SS objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = __set__ (sys, key, val) switch (key) # {, } case "a" __ss_dim__ (val, sys.b, sys.c, sys.d); sys.a = val; case "b" __ss_dim__ (sys.a, val, sys.c, sys.d); sys.b = val; case "c" __ss_dim__ (sys.a, sys.b, val, sys.d); sys.c = val; case "d" __ss_dim__ (sys.a, sys.b, sys.c, val); sys.d = val; case "e" if (isempty (val)) sys.e = []; # avoid [](nx0) or [](0xn) else __ss_dim__ (sys.a, sys.b, sys.c, sys.d, val); sys.e = val; endif case {"stname", "statename"} n = rows (sys.a); sys.stname = __adjust_labels__ (val, n); case "scaled" if (islogical (val) && isscalar (val) || is_real_scalar (val)) sys.scaled = logical (val); else error ("ss: set: key 'scaled' must be a scalar logical"); endif otherwise error ("ss: set: invalid key name '%s'", key); endswitch endfunction control/inst/@ss/__sys2frd__.m0000644000076500000240000000220212614620313015602 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## SS to FRD conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2frd__ (sys, w = []) if (isempty (w)) # case sys = frd (sys) w = __frequency_vector__ (sys); endif H = freqresp (sys, w); retsys = frd (H, w); # tsam is set below retlti = sys.lti; # preserve lti properties endfunction control/inst/@ss/__sys2tf__.m0000644000076500000240000000506012614620313015445 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## SS to TF conversion. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.7 function [retsys, retlti] = __sys2tf__ (sys) sg_flag = false; # static gain flag try [a, b, c, d, tsam, scaled] = ssdata (sys); # system could be a descriptor model if (tsam == -2 || isempty (a)) # static gain sg_flag = true; else [num, den] = __sl_tb04bd__ (a, b, c, d, scaled); endif catch if (strcmp (lasterror.identifier, "dss:improper")) ## sys is non-realizable, therefore ssdata failed. if (issiso (sys)) [num, den] = __siso_ss2tf__ (sys); else [p, m] = size (sys); num = cell (p, m); den = cell (p, m); for i = 1 : p for j = 1 : m idx = substruct ("()", {i, j}); tmp = subsref (sys, idx); # extract siso model tmp = sminreal (tmp); # sminreal is more suitable than minreal here [n, d] = __siso_ss2tf__ (tmp); num(i, j) = n; den(i, j) = d; endfor endfor endif tsam = get (sys, "tsam"); else ## something else happened rethrow (lasterror); endif end_try_catch if (sg_flag) retsys = tf (d); else retsys = tf (num, den, tsam); # tsam needed to set appropriate tfvar endif retlti = sys.lti; # preserve lti properties endfunction function [num, den] = __siso_ss2tf__ (sys) if (isempty (sys.a)) # static gain num = sys.d; den = 1; else # default case [zer, gain] = zero (sys); pol = pole (sys); num = gain * real (poly (zer)); den = real (poly (pol)); endif endfunction control/inst/@ss/__sys_connect__.m0000644000076500000240000000731612614620313016550 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) ## This function is part of the Model Abstraction Layer. No argument checking. ## For internal use only. ## @example ## @group ## Problem: Solve the system equations of ## . ## E x(t) = A x(t) + B e(t) ## ## y(t) = C x(t) + D e(t) ## ## e(t) = u(t) + M y(t) ## ## in order to build ## . ## K x(t) = F x(t) + G u(t) ## ## y(t) = H x(t) + J u(t) ## ## Solution: Laplace Transformation ## E s X(s) = A X(s) + B U(s) + B M Y(s) [1] ## ## Y(s) = C X(s) + D U(s) + D M Y(s) [2] ## ## solve [2] for Y(s) ## Y(s) = [I - D M]^(-1) C X(s) + [I - D M]^(-1) D U(s) ## ## substitute Z = [I - D M]^(-1) ## Y(s) = Z C X(s) + Z D U(s) [3] ## ## insert [3] in [1], solve for X(s) ## X(s) = [s E - (A + B M Z C)]^(-1) (B + B M Z D) U(s) [4] ## ## inserting [4] in [3] finally yields ## Y(s) = Z C [s E - (A + B M Z C)]^(-1) (B + B M Z D) U(s) + Z D U(s) ## \ / | \_____ _____/ \_____ _____/ \ / ## H K F G J ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function sys = __sys_connect__ (sys, m) ## FIXME: error for nonsensical stuff like feedback (ss (1), ss (-1)) ## how to detect this? all-zero descriptor matrix? ! any (sys.e(:)) ## TODO: investigate whether all-zero sys.e make sense, ## before disabling them in a rash decision. a = sys.a; b = sys.b; c = sys.c; d = sys.d; z = eye (rows (d)) - d*m; if (rcond (z) >= eps) # check for singularity sys.a = a + b*m/z*c; # F sys.b = b + b*m/z*d; # G sys.c = z\c; # H sys.d = z\d; # J ## sys.e remains constant: [] for ss models, e for dss models else ## construct descriptor model ## try to introduce the least states [pp, mm] = size (d); n = rows (a); if (isempty (sys.e)) sys.e = eye (n); endif if (mm <= pp) ## Introduce state variable e = u + My ## . ## E x = A x + B e + 0 u ## . ## 0 e = MC x + (MD-I) e + I u ## ## y = C x + D e + 0 u ## sys.a = [a, b; m*c, m*d-eye(mm)]; sys.b = [zeros(n,mm); eye(mm)]; sys.c = [c, d]; sys.d = zeros (pp,mm); sys.e = blkdiag (sys.e, zeros (mm)); sys.stname = [sys.stname; repmat({""}, mm, 1)]; else ## Introduce state variable y ## . ## E x = A x + BM y + B u ## . ## 0 y = C x - Z y + D u ## ## y = 0 x + I y + 0 u ## sys.a = [a, b*m; c, -z]; sys.b = [b; d]; sys.c = [zeros(pp, n), eye(pp)]; sys.d = zeros (pp, mm); sys.e = blkdiag (sys.e, zeros (pp)); sys.stname = [sys.stname; repmat({""}, pp, 1)]; endif endif endfunction control/inst/@ss/__sys_data__.m0000644000076500000240000000207712614620313016027 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by ssdata instead of multiple get calls. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function [a, b, c, d, e, stname, scaled] = __sys_data__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; stname = sys.stname; scaled = sys.scaled; endfunction control/inst/@ss/__sys_group__.m0000644000076500000240000000361612614620313016252 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two SS models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function retsys = __sys_group__ (sys1, sys2) if (! isa (sys1, "ss")) sys1 = ss (sys1); endif if (! isa (sys2, "ss")) sys2 = ss (sys2); endif retsys = ss (); retsys.lti = __lti_group__ (sys1.lti, sys2.lti); n1 = rows (sys1.a); n2 = rows (sys2.a); [p1, m1] = size (sys1.d); [p2, m2] = size (sys2.d); retsys.a = [sys1.a, zeros(n1,n2); zeros(n2,n1), sys2.a]; retsys.b = [sys1.b, zeros(n1,m2); zeros(n2,m1), sys2.b]; retsys.c = [sys1.c, zeros(p1,n2); zeros(p2,n1), sys2.c]; retsys.d = [sys1.d, zeros(p1,m2); zeros(p2,m1), sys2.d]; e1 = ! isempty (sys1.e); e2 = ! isempty (sys2.e); if (e1 || e2) if (e1 && e2) retsys.e = [sys1.e, zeros(n1,n2); zeros(n2,n1), sys2.e]; elseif (e1) retsys.e = [sys1.e, zeros(n1,n2); zeros(n2,n1), eye(n2)]; else retsys.e = [eye(n1), zeros(n1,n2); zeros(n2,n1), sys2.e]; endif endif retsys.stname = [sys1.stname; sys2.stname]; endfunction control/inst/@ss/__sys_inverse__.m0000644000076500000240000000312712614620313016566 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of SS models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = __sys_inverse__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; if (! isempty (e) || rcond (d) < eps) # dss or strictly proper ss n = rows (a); m = columns (b); # p = m (square system) if (isempty (e)) # avoid testing twice? e = eye (n); endif sys.a = [a, b; c, d]; sys.b = [zeros(n, m); -eye(m)]; sys.c = [zeros(m, n), eye(m)]; sys.d = zeros (m); sys.e = [e, zeros(n, m); zeros(m, n+m)]; sys.stname = [sys.stname; repmat({""}, m, 1)]; else # proper ss bid = b / d; sys.a = a - bid * c; sys.b = bid; sys.c = -d \ c; sys.d = inv (d); endif endfunction control/inst/@ss/__sys_keys__.m0000644000076500000240000000334612614620313016071 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{keys}, @var{vals}] =} __sys_keys__ (@var{sys}) ## @deftypefnx {Function File} {[@var{keys}, @var{vals}] =} __sys_keys__ (@var{sys}, @var{aliases}) ## Return the list of keys as well as the assignable values for a ss object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function [keys, vals] = __sys_keys__ (sys, aliases = false) ## cell vector of ss-specific keys keys = {"a"; "b"; "c"; "d"; "e"; "stname"; "scaled"}; ## cell vector of ss-specific assignable values vals = {"n-by-n matrix (n = number of states)"; "n-by-m matrix (m = number of inputs)"; "p-by-n matrix (p = number of outputs)"; "p-by-m matrix"; "n-by-n matrix"; "n-by-1 cell vector of strings"; "scalar logical value"}; if (aliases) ka = {"statename"}; keys = [keys; ka]; endif endfunction control/inst/@ss/__sys_prune__.m0000644000076500000240000000413112614620313016240 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for SS objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function sys = __sys_prune__ (sys, out_idx, in_idx, st_idx = ":") [sys.lti, out_idx, in_idx] = __lti_prune__ (sys.lti, out_idx, in_idx); if (ischar (st_idx) && ! strcmp (st_idx, ":")) st_idx = {st_idx}; endif if (iscell (st_idx)) st_idx = cellfun (@(x) __str2idx__ (sys.stname, x), st_idx); endif sys.a = sys.a(st_idx, st_idx); sys.b = sys.b(st_idx, in_idx); sys.c = sys.c(out_idx, st_idx); sys.d = sys.d(out_idx, in_idx); if (! isempty (sys.e)) sys.e = sys.e(st_idx, st_idx); endif sys.stname = sys.stname(st_idx); endfunction ## NOTE: This local '__str2idx__' function is different from ## the one defined in the file '__str2idx__.m'. Why? ## There are input and output groups, but no state groups. ## At least the 'dark side' does not have state groups. ## However, I do contemplate 'stgroup'. function idx = __str2idx__ (name, str) tmp = strcmp (name, str)(:); switch (nnz (tmp)) case 1 idx = find (tmp); case 0 error ("ss: state name '%s' not found", str); otherwise error ("ss: state name '%s' is ambiguous", str); endswitch endfunction control/inst/@ss/__times__.m0000644000076500000240000000206212614620313015333 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Hadamard/Schur product of @acronym{SS} objects. ## Used by Octave for "sys1 .* sys2". ## Author: Lukas Reichlin ## Created: May 2014 ## Version: 0.1 function sys = __times__ (sys1, sys2) error ("ss: times: Hadamard/Schur product is only supported for transfer functions"); endfunction control/inst/@ss/__transpose__.m0000644000076500000240000000213112614620313016225 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of SS models. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function sys = __transpose__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; sys.stname = repmat ({""}, rows (a), 1); sys.a = a.'; sys.b = c.'; sys.c = b.'; sys.d = d.'; sys.e = e.'; endfunction control/inst/@ss/__zero__.m0000644000076500000240000000307112614620313015172 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Invariant zeros of SS object. ## Uses SLICOT AB08ND and AG08BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function [zer, gain, info] = __zero__ (sys, argc) if (isempty (sys.e)) [zer, gain, rank, infz, kronr, kronl] = __sl_ab08nd__ (sys.a, sys.b, sys.c, sys.d, sys.scaled); else [zer, rank, infz, kronr, kronl] = __sl_ag08bd__ (sys.a, sys.e, sys.b, sys.c, sys.d, sys.scaled); if (argc > 1 && issiso (sys)) pol = pole (sys); gain = __sl_tg04bx__ (sys.a, sys.e, sys.b, sys.c, sys.d, ... real (pol), imag (pol), real (zer), imag (zer)); else gain = []; endif endif info = struct ("rank", rank, "infz", infz, "kronr", kronr, "kronl", kronl); endfunction control/inst/@ss/display.m0000644000076500000240000000530612614620313015067 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for SS objects. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function display (sys) sysname = inputname (1); [inname, outname, tsam] = __lti_data__ (sys.lti); stname = sys.stname; inname = __labels__ (inname, "u"); outname = __labels__ (outname, "y"); stname = __labels__ (stname, "x"); disp (""); if (! isempty (sys.e)) __disp_mat__ (sys.e, [sysname, ".e"], stname, stname); endif if (! isempty (sys.a)) __disp_mat__ (sys.a, [sysname, ".a"], stname, stname); __disp_mat__ (sys.b, [sysname, ".b"], stname, inname); __disp_mat__ (sys.c, [sysname, ".c"], outname, stname); endif __disp_mat__ (sys.d, [sysname, ".d"], outname, inname); display (sys.lti); # display sampling time if (tsam == -2) disp ("Static gain."); elseif (tsam == 0) disp ("Continuous-time model."); else disp ("Discrete-time model."); endif endfunction function __disp_mat__ (m, mname, rname, cname) MAX_LEN = 12; # max length of row name and column name [mrows, mcols] = size (m); row_name = strjust (strvcat (" ", rname), "left"); row_name = row_name(:, 1 : min (MAX_LEN, end)); row_name = horzcat (repmat (" ", mrows+1, 3), row_name); mat = cell (1, mcols); for k = 1 : mcols cname{k} = cname{k}(:, 1 : min (MAX_LEN, end)); acol = vertcat (cname(k), cellstr (deblank (num2str (m(:, k), 4)))); mat{k} = strjust (strvcat (acol{:}), "right"); endfor lcols = cellfun (@columns, mat); lcols_max = 2 + max (horzcat (lcols, 1)); for k = 1 : mcols mat{k} = horzcat (repmat (" ", mrows+1, lcols_max-lcols(k)), mat{k}); endfor tsize = terminal_size (); dispcols = max (1, floor ((tsize(2) - columns (row_name)) / lcols_max)); disprows = max (1, ceil (mcols / dispcols)); disp ([mname, " ="]); for k = 1 : disprows disp (horzcat (row_name, mat{1+(k-1)*dispcols : min (mcols, k*dispcols)})); disp (""); endfor endfunction control/inst/@ss/ss.m0000644000076500000240000001620612614620313014050 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} ss (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{d}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}, @dots{}) ## Create or convert to state-space model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to state-space. ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Output matrix (p-by-n). ## If @var{c} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item d ## Feedthrough matrix (p-by-m). ## If @var{d} is empty @code{[]} or not specified, a zero matrix is assumed. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (ss)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## State-space model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'a', 'b', 'c', 'd', 'e' ## State-space matrices. See 'Inputs' for details. ## ## @item 'stname' ## The name of the states in @var{sys}. ## Cell vector containing strings for each state. ## Default names are @code{@{'x1', 'x2', ...@}} ## ## @item 'scaled' ## Logical. If set to true, no automatic scaling is used, ## e.g. for frequency response plots. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## x = A x + B u ## y = C x + D u ## @end group ## @end example ## ## @strong{Example} ## @example ## @group ## octave:1> a = [1 2 3; 4 5 6; 7 8 9]; ## octave:2> b = [10; 11; 12]; ## octave:3> stname = @{'V', 'A', 'kJ'@}; ## octave:4> sys = ss (a, b, 'stname', stname) ## @end group ## @end example ## ## @example ## @group ## sys.a = ## V A kJ ## V 1 2 3 ## A 4 5 6 ## kJ 7 8 9 ## @end group ## @end example ## ## @example ## @group ## sys.b = ## u1 ## V 10 ## A 11 ## kJ 12 ## @end group ## @end example ## ## @example ## @group ## sys.c = ## V A kJ ## y1 1 0 0 ## y2 0 1 0 ## y3 0 0 1 ## @end group ## @end example ## ## @example ## @group ## sys.d = ## u1 ## y1 0 ## y2 0 ## y3 0 ## ## Continuous-time model. ## octave:5> ## @end group ## @end example ## ## @seealso{tf, dss} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function sys = ss (varargin) ## model precedence: frd > ss > zpk > tf > double ## inferiorto ("frd"); superiorto ("zpk", "tf", "double"); if (nargin == 1) # shortcut for lti objects if (isa (varargin{1}, "ss")) # already in ss form sys = ss (sssys) sys = varargin{1}; return; elseif (isa (varargin{1}, "lti")) # another lti object sys = ss (sys) [sys, lti] = __sys2ss__ (varargin{1}); sys.lti = lti; # preserve lti properties return; endif elseif (nargin == 2) # shortcut for lti objects plus if (ischar (varargin{2}) && isa (varargin{1}, "lti")) candidates = {"minimal", "explicit"}; key = __match_key__ (varargin{2}, candidates, "ss"); switch (key) case "minimal" # ss (sys, 'minimal') sys = minreal (ss (varargin{1})); return; case "explicit" # ss (sys, 'explicit') sys = dss2ss (ss (varargin{1})); return; otherwise # this would be a silly bug endswitch endif endif a = []; b = []; c = []; d = []; # default state-space matrices tsam = 0; # default sampling time [mat_idx, opt_idx, obj_flg] = __lti_input_idx__ (varargin); switch (numel (mat_idx)) case 1 d = varargin{mat_idx}; case 2 [a, b] = varargin{mat_idx}; case 3 [a, b, c] = varargin{mat_idx}; case 4 [a, b, c, d] = varargin{mat_idx}; case 5 [a, b, c, d, tsam] = varargin{mat_idx}; if (isempty (tsam) && is_real_matrix (tsam)) tsam = -1; elseif (! issample (tsam, -10)) error ("ss: invalid sampling time"); endif case 0 ## nothing to do here, just prevent case 'otherwise' otherwise print_usage (); endswitch varargin = varargin(opt_idx); if (obj_flg) varargin = horzcat ({"lti"}, varargin); endif [a, b, c, d, tsam] = __adjust_ss_data__ (a, b, c, d, tsam); [p, m, n] = __ss_dim__ (a, b, c, d); # determine number of outputs, inputs and states stname = repmat ({""}, n, 1); # cell with empty state names ssdata = struct ("a", a, "b", b, "c", c, "d", d, "e", [], "stname", {stname}, "scaled", false); # struct for ss-specific data ltisys = lti (p, m, tsam); # parent class for general lti data sys = class (ssdata, "ss", ltisys); # create ss object if (numel (varargin) > 0) # if there are any properties and values, ... sys = set (sys, varargin{:}); # use the general set function endif endfunction ## TODO: create a separate function @lti/dss2ss.m function G = dss2ss (G) [G.a, G.b, G.c, G.d, G.e] = __dss2ss__ (G.a, G.b, G.c, G.d, G.e); endfunction control/inst/@tf/0000755000076500000240000000000012614620313013224 5ustar lukasstaffcontrol/inst/@tf/__c2d__.m0000644000076500000240000000544512614620313014656 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the continuous TF model into its discrete-time equivalent. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = __c2d__ (sys, tsam, method = "zoh", w0 = 0) if (strncmpi (method, "m", 1)) # "matched" ## TODO: move this code to @zpk/__c2d__.m once ZPK models are implemented if (! issiso (sys)) error ("tf: c2d: require SISO system for matched pole/zero method"); endif [z_c, p_c, k_c] = zpkdata (sys, "vector"); p_d = exp (p_c * tsam); z_d = exp (z_c * tsam); if (any (! isfinite (p_d)) || any (! isfinite (z_d))) error ("tf: c2d: discrete-time poles and zeros are not finite"); endif ## continuous-time zeros at infinity are mapped to -1 in discrete-time ## except for one. for non-proper transfer functions, no zeros at -1 are added. np = length (p_c); # number of poles nz = length (z_c); # number of finite zeros, np-nz number of infinite zeros z_d = vertcat (z_d, repmat (-1, np-nz-1, 1)); ## the discrete-time gain k_d is matched at a certain frequency (w_c, w_d) ## to continuous-time gain k_c. the dc gain is taken (w_c=0, w_d=1) unless ## there are continuous-time poles/zeros near 0. then w_c=1/tsam is taken. w_c = 0; # dc gain tol = sqrt (eps); # poles/zeros below tol are assumed to be zero while (any (abs ([p_c; z_c] - w_c) < tol)) w_c += 0.1 / tsam; endwhile w_d = exp (w_c * tsam); k_d = real (k_c * prod (w_c - z_c) / prod (w_c - p_c) * prod (w_d - p_d) / prod (w_d - z_d)); tmp = zpk (z_d, p_d, k_d, tsam); sys.num = tmp.num; sys.den = tmp.den; else [p, m] = size (sys); for i = 1 : p for j = 1 : m idx = substruct ("()", {i, j}); tmp = subsref (sys, idx); tmp = c2d (ss (tmp), tsam, method, w0); [num, den] = tfdata (tmp, "tfpoly"); sys.num(i, j) = num; sys.den(i, j) = den; endfor endfor endif sys.tfvar = "z"; endfunction control/inst/@tf/__ctranspose__.m0000644000076500000240000000252612614620313016364 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose of TF models. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = __ctranspose__ (sys, ct) num = sys.num; den = sys.den; if (ct) # continuous-time num = cellfun (@conj_ct, num, "uniformoutput", false); den = cellfun (@conj_ct, den, "uniformoutput", false); else # discrete-time num = cellfun (@conj_dt, num, "uniformoutput", false); den = cellfun (@conj_dt, den, "uniformoutput", false); ## TODO: shall I make "den" a monic polynomial? endif sys.num = num.'; sys.den = den.'; endfunction control/inst/@tf/__d2c__.m0000644000076500000240000000432612614620313014653 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the discrete TF model into its continuous-time equivalent. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.2 function sys = __d2c__ (sys, tsam, method = "zoh", w0 = 0) if (strncmpi (method, "m", 1)) # "matched" ## TODO: move this code to @zpk/__d2c__.m once ZPK models are implemented if (! issiso (sys)) error ("tf: d2c: require SISO system for matched pole/zero method"); endif [z_d, p_d, k_d] = zpkdata (sys, "vector"); if (any (abs (p_d) < eps) || any (abs (z_d) < eps)) error ("tf: d2c: discrete-time poles and zeros at 0 not supported because log(0) is -Inf"); endif z_d_orig = z_d; z_d(abs (z_d+1) < sqrt (eps)) = []; p_c = log (p_d) / tsam; z_c = log (z_d) / tsam; w_c = 0; w_d = 1; tol = sqrt (eps); while (any (abs ([p_d; z_d_orig] - w_d) < tol)) w_c += 0.1 / tsam; endwhile w_d = exp (w_c * tsam); k_c = real (k_d * prod (w_d - z_d_orig) / prod (w_d - p_d) * prod (w_c - p_c) / prod (w_c - z_c)); tmp = zpk (z_c, p_c, k_c); sys.num = tmp.num; sys.den = tmp.den; else [p, m] = size (sys); for i = 1 : p for j = 1 : m idx = substruct ("()", {i, j}); tmp = subsref (sys, idx); tmp = d2c (ss (tmp), method, w0); [num, den] = tfdata (tmp, "tfpoly"); sys.num(i, j) = num; sys.den(i, j) = den; endfor endfor endif sys.tfvar = "s"; endfunction control/inst/@tf/__freqresp__.m0000644000076500000240000000270312614620313016027 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Frequency response of TF models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function H = __freqresp__ (sys, w, cellflag = false) [num, den, tsam] = tfdata (sys, "vector"); if (isct (sys)) # continuous system s = i * w; else # discrete system s = exp (i * w * abs (tsam)); endif s = reshape (s, 1, 1, []); if (issiso (sys)) H = polyval (num, s) ./ polyval (den, s); else H = cellfun (@(x, y) polyval (x, s) ./ polyval (y, s), num, den, "uniformoutput", false); H = cell2mat (H); endif if (cellflag) [p, m] = size (sys); l = length (s); H = mat2cell (H, p, m, ones (1, l))(:); endif endfunction control/inst/@tf/__get__.m0000644000076500000240000000254512614620313014763 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Access key values of TF objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function val = __get__ (sys, key) switch (key) # {, } case "num" val = cellfun (@get, sys.num, "uniformoutput", false); case "den" val = cellfun (@get, sys.den, "uniformoutput", false); case {"tfvar", "variable"} val = sys.tfvar; if (sys.inv && isdt (sys)) val = [val, "^-1"]; endif case "inv" val = sys.inv; otherwise error ("tf: get: invalid key name '%s'", key); endswitch endfunction control/inst/@tf/__minreal__.m0000644000076500000240000000407312614620313015631 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Minimal realization of TF models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = __minreal__ (sys, tol) sqrt_eps = sqrt (eps); # treshold for zero [p, m] = size (sys); for ny = 1 : p for nu = 1 : m sisosys = __sys_prune__ (sys, ny, nu); [zer, gain] = zero (sisosys); pol = pole (sisosys); for k = length (zer) : -1 : 1 # reversed because of deleted zeros [~, idx] = min (abs (zer(k) - pol)); # find best match if (strcmpi (tol, "def")) if (abs (zer(k)) < sqrt_eps) # catch case zer(k) = 0 t = 1000 * eps; else t = 1000 * abs (zer(k)) * sqrt_eps; endif else t = tol; endif if (abs (zer(k) - pol(idx)) < t) zer(k) = []; pol(idx) = []; endif endfor num = real (gain * poly (zer)); den = real (poly (pol)); [n, d] = tfdata (sisosys, "vector"); if (size_equal (num, n) && size_equal (den, d)) if (d(1) != 1) n /= d(1); d /= d(1); endif num = n; den = d; endif sys.num{ny, nu} = tfpoly (num); sys.den{ny, nu} = tfpoly (den); endfor endfor endfunction control/inst/@tf/__pole__.m0000644000076500000240000000211512614620313015134 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Poles of TF object. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function pol = __pole__ (sys) if (issiso (sys)) pol = roots (sys.den{1}); else warning ("tf: pole: converting to minimal state-space for pole computation of mimo tf"); pol = pole (ss (sys)); endif endfunction control/inst/@tf/__set__.m0000644000076500000240000000666112614620313015002 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Set or modify keys of TF objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = __set__ (sys, key, val) switch (key) # {, } case "num" if (get (sys, "tsam") == -2) # NOTE: sys.lti.tsam would call 'get' via 'subsref' error (["tf: set: tinkering with numerators of static gains is disabled on purpose. " ... "to avoid this error, set the sampling time of your LTI model first."]); elseif (sys.inv) # FIXME: f = filt (1, [1 0 0 1]), f.num = 1 warning ("tf:num-inv", ... "tf: although system is displayed in '%s^-1', numerator 'num' must be specified in '%s'", ... sys.tfvar, sys.tfvar); endif num = __adjust_tf_data__ (val, sys.den); __tf_dim__ (num, sys.den); sys.num = num; case "den" if (get (sys, "tsam") == -2) error (["tf: set: tinkering with denominators of static gains is disabled on purpose. " ... "to avoid this error, set the sampling time of your LTI model first."]); elseif (sys.inv) # FIXME: f = filt ([1 0 0 1], 1), f.den = 1 warning ("tf:den-inv", ... "tf: although system is displayed in '%s^-1', denominator 'den' must be specified in '%s'", ... sys.tfvar, sys.tfvar); endif [~, den] = __adjust_tf_data__ (sys.num, val); __tf_dim__ (sys.num, den); sys.den = den; case {"tfvar", "variable"} if (ischar (val)) candidates = {"s", "p", "z", "q", "z^-1", "q^-1"}; idx = strcmpi (val, candidates); if (any (idx)) val = candidates{idx}; n = find (idx); if (n > 2 && isct (sys)) error ("tf: set: variable '%s' not allowed for static gains and continuous-time models", val); elseif (n < 3 && isdt (sys)) error ("tf: set: variable '%s' not allowed for static gains and discrete-time models", val); endif if (isscalar (val)) sys.tfvar = val; sys.inv = false; else sys.tfvar = val(1); sys.inv = true; endif else error ("tf: set: the string '%s' is not a valid transfer function variable", val); endif else error ("tf: set: key '%s' requires a string", prop); endif case "inv" if (islogical (val) && isscalar (val) || is_real_scalar (val)) sys.inv = logical (val); else error ("tf: set: key 'inv' must be a scalar logical"); endif otherwise error ("tf: set: invalid key name '%s'", key); endswitch endfunction control/inst/@tf/__sys2frd__.m0000644000076500000240000000220212614620313015566 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## TF to FRD conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2frd__ (sys, w = []) if (isempty (w)) # case sys = frd (sys) w = __frequency_vector__ (sys); endif H = freqresp (sys, w); retsys = frd (H, w); # tsam is set below retlti = sys.lti; # preserve lti properties endfunction control/inst/@tf/__sys2ss__.m0000644000076500000240000001211112614620313015440 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## TF to SS conversion. ## Reference: ## Varga, A.: Computation of irreducible generalized state-space realizations. ## Kybernetika, 26:89-106, 1990 ## Special thanks to Vasile Sima and Andras Varga for their advice. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.8 function [retsys, retlti] = __sys2ss__ (sys) ## TODO: determine appropriate tolerance from number of inputs ## (since we multiply all denominators in a row), index, ... ## default tolerance from TB01UD is TOLDEF = N*N*EPS ## SECRET WISH: a routine which accepts individual denominators for ## each channel and which supports descriptor systems [p, m] = size (sys); [num, den] = tfdata (sys); len_num = cellfun (@length, num); len_den = cellfun (@length, den); ## check for properness ## tfpoly ensures that there are no leading zeros tmp = len_num > len_den; if (any (tmp(:))) # non-proper transfer function ## separation into strictly proper and polynomial part [numq, numr] = cellfun (@deconv, num, den, "uniformoutput", false); numr = cellfun (@(num_v, len_d) num_v(max(1,end-len_d+2):end), ... numr, num2cell (len_den), "uniformoutput", false); numq = cellfun (@__remove_leading_zeros__, numq, "uniformoutput", false); numr = cellfun (@__remove_leading_zeros__, numr, "uniformoutput", false); ## minimal state-space realization for the proper part [a1, b1, c1] = __proper_tf2ss__ (numr, den, p, m); e1 = eye (size (a1)); ## minimal realization for the polynomial part [e2, a2, b2, c2] = __polynomial_tf2ss__ (numq, p, m); ## assemble irreducible descriptor realization e = blkdiag (e1, e2); a = blkdiag (a1, a2); b = vertcat (b1, b2); c = horzcat (c1, c2); retsys = dss (a, b, c, [], e); else # proper transfer function [a, b, c, d] = __proper_tf2ss__ (num, den, p, m); retsys = ss (a, b, c, d); endif retlti = sys.lti; # preserve lti properties such as tsam endfunction ## transfer function to state-space conversion for proper models function [a, b, c, d] = __proper_tf2ss__ (num, den, p, m) ## new cells for the TF of same row denominators numc = cell (p, m); denc = cell (p, 1); ## multiply all denominators in a row and ## update each numerator accordingly ## except for single-input models and those ## with equal denominators in a row for i = 1 : p if (m == 1 || isequal (den{i,:})) denc(i) = den{i,1}; numc(i,:) = num(i,:); else denc(i) = __conv__ (den{i,:}); for j = 1 : m idx = setdiff (1:m, j); numc(i,j) = __conv__ (num{i,j}, den{i,idx}); endfor endif endfor len_numc = cellfun (@length, numc); len_denc = cellfun (@length, denc); ## create arrays and fill in the data ## in a way that Slicot TD04AD can use max_len_denc = max (len_denc(:)); ucoeff = zeros (p, m, max_len_denc); dcoeff = zeros (p, max_len_denc); index = len_denc-1; for i = 1 : p len = len_denc(i); dcoeff(i, 1:len) = denc{i}; for j = 1 : m ucoeff(i, j, len-len_numc(i,j)+1 : len) = numc{i,j}; endfor endfor tol = min (sqrt (eps), eps*prod (index)); [a, b, c, d] = __sl_td04ad__ (ucoeff, dcoeff, index, tol); endfunction ## realization of the polynomial part according to Andras' paper function [e2, a2, b2, c2] = __polynomial_tf2ss__ (numq, p, m) len_numq = cellfun (@length, numq); max_len_numq = max (len_numq(:)); numq = cellfun (@(x) prepad (x, max_len_numq, 0, 2), numq, "uniformoutput", false); f = @(y) cellfun (@(x) x(y), numq); s = 1 : max_len_numq; D = arrayfun (f, s, "uniformoutput", false); e2 = diag (ones (p*(max_len_numq-1), 1), -p); a2 = eye (p*max_len_numq); b2 = vertcat (D{:}); c2 = horzcat (zeros (p, p*(max_len_numq-1)), -eye (p)); ## remove uncontrollable part [a2, e2, b2, c2] = __sl_tg01jd__ (a2, e2, b2, c2, 0.0, true, 1, 2); endfunction ## convolution for more than two arguments function vec = __conv__ (vec, varargin) if (nargin == 1) return; else for k = 1 : nargin-1 vec = conv (vec, varargin{k}); endfor endif endfunction ## remove leading zeros from polynomial vector function p = __remove_leading_zeros__ (p) idx = find (p != 0, 1); if (isempty (idx)) p = 0; else p = p(idx : end); endif endfunction control/inst/@tf/__sys_connect__.m0000644000076500000240000000721512614620313016532 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) ## This function is part of the Model Abstraction Layer. No argument checking. ## For internal use only. ## @example ## @group ## Problem: Solve the system equations of ## Y(s) = G(s) E(s) ## E(s) = U(s) + M Y(s) ## in order to build ## Y(s) = H(s) U(s) ## Solution: ## Y(s) = G(s) [I - M G(s)]^-1 U(s) ## = [I - G(s) M]^-1 G(s) U(s) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = __sys_connect__ (sys, M) [p, m] = size (sys); num = sys.num; den = sys.den; ## WARNING: The code below is a cheap hack to quickly enable SISO TF connections. ## FIXME: Check for den = 0, e.g. in feedback (tf (1), tf (-1)) if (p == 2 && m == 2 && num{1,2} == 0 && num{2,1} == 0 ... && M(1,1) == 0 && M(2,2) == 0) ## mtimes, feedback sys.num(1,1) = num{1,1} * den{2,2}; sys.num(1,2) = M(1,2) * num{1,1} * num{2,2}; sys.num(2,1) = M(2,1) * num{1,1} * num{2,2}; sys.num(2,2) = num{2,2} * den{1,1}; sys.den(:) = den{1,1} * den{2,2} - M(1,2) * M(2,1) * num{1,1} * num{2,2}; elseif (p == 3 && m == 4 && num{1,3} == 0 && num{1,4} == 0 ... && num{2,1} == 0 && num{2,2} == 0 && num{2,4} == 0 ... && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 0 ... && isequal (M, [0, 1, 0; 0, 0, 1; 0, 0, 0; 0, 0, 0])) ## horzcat [sys1, sys2], plus, minus sys.num(:) = tfpoly (0); sys.den(:) = tfpoly (1); sys.num(1,1) = num{1,1}; sys.num(1,2) = num{1,2}; sys.num(1,3) = num{1,1} * num{2,3}; sys.num(1,4) = num{1,2} * num{3,4}; sys.num(2,3) = num{2,3}; sys.num(3,4) = num{3,4}; sys.den(1,3) = den{2,3}; sys.den(1,4) = den{3,4}; sys.den(2,3) = den{2,3}; sys.den(3,4) = den{3,4}; elseif (p == 3 && m == 3 && num{1,3} == 0 ... && num{2,1} == 0 && num{2,2} == 0 && num{2,3} == 1 && den{2,3} == 1 ... && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 && den{3,3} == 1 ... && isequal (M, [0, 1, 0; 0, 0, 1; 0, 0, 0])) ## plus, minus sys.num(1,3) = num{1,1} * den{1,2} + num{1,2} * den{1,1}; sys.den(1,3) = den{1,1} * den{1,2}; elseif (p == 4 && m == 3 && num{1,2} == 0 && num{1,3} == 0 ... && num{2,1} == 0 && num{2,3} == 0 ... && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 && den{3,3} == 1 ... && num{4,1} == 0 && num{4,2} == 0 && num{4,3} == 1 && den{4,3} == 1 ... && isequal (M, [0, 0, 1, 0; 0, 0, 0, 1; 0, 0, 0, 0])) ## vertcat [sys1; sys2] sys.num(1,3) = num{1,1}; sys.num(2,3) = num{2,2}; sys.den(1,3) = den{1,1}; sys.den(2,3) = den{2,2}; else ## MIMO case, convert to state-space and back. warning ("tf: converting to minimal state-space for MIMO TF interconnections"); sys = tf (__sys_connect__ (ss (sys), M)); endif endfunction control/inst/@tf/__sys_data__.m0000644000076500000240000000176712614620313016020 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by tfdata instead of multiple get calls. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function [num, den, tfvar] = __sys_data__ (sys) num = sys.num; den = sys.den; tfvar = sys.tfvar; endfunction control/inst/@tf/__sys_group__.m0000644000076500000240000000337612614620313016241 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two TF models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function retsys = __sys_group__ (sys1, sys2) if (! isa (sys1, "tf")) sys1 = tf (sys1); endif if (! isa (sys2, "tf")) sys2 = tf (sys2); endif retsys = tf (); retsys.lti = __lti_group__ (sys1.lti, sys2.lti); [p1, m1] = size (sys1); [p2, m2] = size (sys2); empty12 = tfpolyzeros (p1, m2); empty21 = tfpolyzeros (p2, m1); retsys.num = [sys1.num, empty12 ; empty21, sys2.num]; empty12 = tfpolyones (p1, m2); empty21 = tfpolyones (p2, m1); retsys.den = [sys1.den, empty12 ; empty21, sys2.den]; if (sys1.tfvar == sys2.tfvar) retsys.tfvar = sys1.tfvar; elseif (sys1.tfvar == "x") retsys.tfvar = sys2.tfvar; else retsys.tfvar = sys1.tfvar; endif if (sys1.inv || sys2.inv) retsys.inv = true; endif endfunction control/inst/@tf/__sys_inverse__.m0000644000076500000240000000275112614620313016554 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of TF models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = __sys_inverse__ (sys) if (issiso (sys)) # SISO num = sys.num; den = sys.den; if (num{1,1} == 0) # catch case num = 0 sys.num(1,1) = tfpoly (0); sys.den(1,1) = tfpoly (1); else sys.num = den; sys.den = num; endif else # MIMO ## I've calculated TF inversion of 2x2 and 3x3 systems with Sage CAS, ## but the formulae give systems with very high orders, therefore ## I always use the conversion to state-space and back. [num, den] = tfdata (inv (ss (sys)), "tfpoly"); sys.num = num; sys.den = den; endif endfunction control/inst/@tf/__sys_keys__.m0000644000076500000240000000321312614620313016046 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{keys}, @var{vals}] =} __sys_keys__ (@var{sys}) ## @deftypefnx {Function File} {[@var{keys}, @var{vals}] =} __sys_keys__ (@var{sys}, @var{aliases}) ## Return the list of keys as well as the assignable values for a tf object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [keys, vals] = __sys_keys__ (sys, aliases = false) ## cell vector of tf-specific keys keys = {"num"; "den"; "tfvar"; "inv"}; ## cell vector of tf-specific assignable values vals = {"p-by-m cell array of row vectors (m = number of inputs)"; "p-by-m cell array of row vectors (p = number of outputs)"; "string (usually s or z)"; "logical (true for negative powers of TF variable)"}; if (aliases) ka = {"variable"}; keys = [keys; ka]; endif endfunction control/inst/@tf/__sys_prune__.m0000644000076500000240000000225612614620313016232 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for TF objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function sys = __sys_prune__ (sys, out_idx, in_idx) [sys.lti, out_idx, in_idx] = __lti_prune__ (sys.lti, out_idx, in_idx); sys.num = sys.num(out_idx, in_idx); sys.den = sys.den(out_idx, in_idx); endfunction control/inst/@tf/__times__.m0000644000076500000240000000301112614620313015312 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Hadamard/Schur product of @acronym{TF} objects. ## Used by Octave for "sys1 .* sys2". ## Author: Lukas Reichlin ## Created: April 2014 ## Version: 0.1 function sys = __times__ (sys1, sys2) if (! isa (sys1, "tf")) sys1 = tf (sys1); endif if (! isa (sys2, "tf")) sys2 = tf (sys2); endif sys = tf (); sys.lti = __lti_group__ (sys1.lti, sys2.lti, "times"); sys.num = cellfun (@mtimes, sys1.num, sys2.num, "uniformoutput", false); sys.den = cellfun (@mtimes, sys1.den, sys2.den, "uniformoutput", false); if (sys1.tfvar == sys2.tfvar) sys.tfvar = sys1.tfvar; elseif (sys1.tfvar == "x") sys.tfvar = sys2.tfvar; else sys.tfvar = sys1.tfvar; endif if (sys1.inv || sys2.inv) sys.inv = true; endif endfunction control/inst/@tf/__transpose__.m0000644000076500000240000000174712614620313016225 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of TF models. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.1 function sys = __transpose__ (sys) num = sys.num; den = sys.den; sys.num = num.'; sys.den = den.'; endfunction control/inst/@tf/__zero__.m0000644000076500000240000000232212614620313015154 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transmission zeros of TF object. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [zer, gain, info] = __zero__ (sys) if (issiso (sys)) num = get (sys.num{1}); den = get (sys.den{1}); zer = roots (num); gain = num(1) / den(1); info = []; else warning ("tf: zero: converting to minimal state-space for zero computation of mimo tf"); [zer, gain, info] = zero (ss (sys)); endif endfunction control/inst/@tf/display.m0000644000076500000240000000623412614620313015054 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for TF objects. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function display (sys) sysname = inputname (1); [inname, outname, tsam] = __lti_data__ (sys.lti); [inname, m] = __labels__ (inname, "u"); [outname, p] = __labels__ (outname, "y"); disp (""); if (sys.inv && ! isct (sys)) [num, den] = filtdata (sys); # 'num' and 'den' are cells of real-valued vectors else num = sys.num; # 'num' and 'den' are cells of 'tfpoly' objects den = sys.den; endif for nu = 1 : m disp (["Transfer function '", sysname, "' from input '", inname{nu}, "' to output ..."]); disp (""); for ny = 1 : p __disp_frac__ (num{ny, nu}, den{ny, nu}, sys.tfvar, outname{ny}); endfor endfor display (sys.lti); # display sampling time if (tsam == -2) disp ("Static gain."); elseif (tsam == 0) disp ("Continuous-time model."); else disp ("Discrete-time model."); endif endfunction ## NOTE: * Function handles both 'tfpoly' objects and real-valued vectors. ## * The general 'tfpoly2str' function returns strings with ## negative powers of 'tfvar'. ## * The overloaded 'tfpoly2str' function returns strings with ## positive powers of 'tfvar'. function __disp_frac__ (num, den, tfvar, name) MAX_LEN = 12; # max length of output name tfp = isa (num, "tfpoly"); if (num == tfpoly (0)) str = [" ", name, ": 0"]; elseif ((tfp && den == 1) || (! tfp && isequal (den, 1))) ## elseif (den == tfpoly (1)) doesn't work because it ## would mistakingly accept non-tfpoly denominators like [0, 1] str = [" ", name, ": "]; numstr = tfpoly2str (num, tfvar); str = [str, numstr]; ##elseif (length (den) == 1) # de-comment for non-development use ## str = [" ", name, ": "]; ## num = num * (1/get (den)); ## numstr = tfpoly2str (num, tfvar); ## str = [str, numstr]; else numstr = tfpoly2str (num, tfvar); denstr = tfpoly2str (den, tfvar); fracstr = repmat ("-", 1, max (length (numstr), length (denstr))); str = strjust (strvcat (numstr, fracstr, denstr), "center"); namestr = name(:, 1 : min (MAX_LEN, end)); namestr = [namestr, ": "]; namestr = strjust (strvcat (" ", namestr, " "), "left"); namestr = horzcat (repmat (" ", 3, 1), namestr); str = [namestr, str]; endif disp (str); disp (""); endfunction control/inst/@tf/horzcat.m0000644000076500000240000000356012614620313015060 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Horizontal concatenation of @acronym{TF} objects. ## Used by Octave for "[sys1, sys2]". ## Avoids conversion to state-space and back by overriding ## the general horzcat function for @acronym{LTI} objects. ## Author: Lukas Reichlin ## Created: April 2014 ## Version: 0.1 function sys = horzcat (sys, varargin) sys = tf (sys); varargin = cellfun (@tf, varargin, "uniformoutput", false); for k = 1 : (nargin-1) sys1 = sys; sys2 = varargin{k}; sys = tf (); sys.lti = __lti_group__ (sys1.lti, sys2.lti, "horzcat"); [p1, m1] = size (sys1.num); [p2, m2] = size (sys2.num); if (p1 != p2) error ("tf: horzcat: number of system outputs incompatible: [(%dx%d), (%dx%d)]", p1, m1, p2, m2); endif sys.num = [sys1.num, sys2.num]; sys.den = [sys1.den, sys2.den]; if (strcmp (sys1.tfvar, sys2.tfvar)) sys.tfvar = sys1.tfvar; elseif (strcmp (sys1.tfvar, "x")) sys.tfvar = sys2.tfvar; else sys.tfvar = sys1.tfvar; endif if (sys1.inv || sys2.inv) sys.inv = true; endif endfor endfunction control/inst/@tf/tf.m0000644000076500000240000001633212614620313014020 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{s} =} tf (@var{'s'}) ## @deftypefnx {Function File} {@var{z} =} tf (@var{'z'}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{mat}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @var{tsam}, @dots{}) ## Create or convert to transfer function model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to transfer function. ## @item mat ## Gain matrix to be converted to static transfer function. ## @item num ## Numerator or cell of numerators. Each numerator must be a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item den ## Denominator or cell of denominators. Each denominator must be a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, a continuous-time ## model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (tf)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Transfer function model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'num' ## Numerator. See 'Inputs' for details. ## ## @item 'den' ## Denominator. See 'Inputs' for details. ## ## @item 'tfvar' ## String containing the transfer function variable. ## ## @item 'inv' ## Logical. True for negative powers of the transfer function variable. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> s = tf ('s'); ## octave:2> G = 1/(s+1) ## ## Transfer function 'G' from input 'u1' to output ... ## ## 1 ## y1: ----- ## s + 1 ## ## Continuous-time model. ## @end group ## @end example ## @example ## @group ## octave:3> z = tf ('z', 0.2); ## octave:4> H = 0.095/(z-0.9) ## ## Transfer function 'H' from input 'u1' to output ... ## ## 0.095 ## y1: ------- ## z - 0.9 ## ## Sampling time: 0.2 s ## Discrete-time model. ## @end group ## @end example ## @example ## @group ## octave:5> num = @{[1, 5, 7], [1]; [1, 7], [1, 5, 5]@}; ## octave:6> den = @{[1, 5, 6], [1, 2]; [1, 8, 6], [1, 3, 2]@}; ## octave:7> sys = tf (num, den) ## @end group ## @end example ## ## @example ## @group ## Transfer function 'sys' from input 'u1' to output ... ## ## s^2 + 5 s + 7 ## y1: ------------- ## s^2 + 5 s + 6 ## ## s + 7 ## y2: ------------- ## s^2 + 8 s + 6 ## @end group ## @end example ## ## @example ## @group ## Transfer function 'sys' from input 'u2' to output ... ## ## 1 ## y1: ----- ## s + 2 ## ## s^2 + 5 s + 5 ## y2: ------------- ## s^2 + 3 s + 2 ## ## Continuous-time model. ## octave:8> ## @end group ## @end example ## ## @seealso{filt, ss, dss} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function sys = tf (varargin) ## model precedence: frd > ss > zpk > tf > double ## inferiorto ("frd", "ss", "zpk"); # error if de-commented. bug in octave? superiorto ("double"); if (nargin == 1) if (isa (varargin{1}, "tf")) # tf (tfsys) sys = varargin{1}; return; elseif (isa (varargin{1}, "lti")) # tf (ltisys) [sys, lti] = __sys2tf__ (varargin{1}); sys.lti = lti; return; elseif (ischar (varargin{1})) # s = tf ('s') sys = tf ([1, 0], 1, "tfvar", varargin{:}); return; endif elseif (nargin == 2 ... && ischar (varargin{1}) ... && is_zp_vector (varargin{2}) ... && length (varargin{2}) <= 1) # z = tf ('z', tsam) sys = tf ([1, 0], 1, varargin{2}, "tfvar", varargin{[1,3:end]}); return; endif num = {}; den = {}; # default transfer matrix tsam = -2; # default sampling time [mat_idx, opt_idx, obj_flg] = __lti_input_idx__ (varargin); switch (numel (mat_idx)) case 1 num = varargin{mat_idx}; case 2 [num, den] = varargin{mat_idx}; tsam = 0; case 3 [num, den, tsam] = varargin{mat_idx}; if (isempty (tsam) && is_real_matrix (tsam)) tsam = -1; elseif (! issample (tsam, -10)) error ("tf: invalid sampling time"); endif case 0 ## nothing to do here, just prevent case 'otherwise' otherwise print_usage (); endswitch varargin = varargin(opt_idx); if (obj_flg) varargin = horzcat ({"lti"}, varargin); endif [num, den, tsam, tfvar] = __adjust_tf_data__ (num, den, tsam); [p, m] = __tf_dim__ (num, den); # determine number of outputs and inputs tfdata = struct ("num", {num}, "den", {den}, "tfvar", tfvar, "inv", false); # struct for tf-specific data ltisys = lti (p, m, tsam); # parent class for general lti data sys = class (tfdata, "tf", ltisys); # create tf object if (numel (varargin) > 0) # if there are any properties and values, ... sys = set (sys, varargin{:}); # use the general set function endif endfunction control/inst/@tf/vertcat.m0000644000076500000240000000355312614620313015060 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Vertical concatenation of @acronym{TF} objects. ## Used by Octave for "[sys1; sys2]". ## Avoids conversion to state-space and back by overriding ## the general vertcat function for @acronym{LTI} objects. ## Author: Lukas Reichlin ## Created: May 2014 ## Version: 0.1 function sys = vertcat (sys, varargin) sys = tf (sys); varargin = cellfun (@tf, varargin, "uniformoutput", false); for k = 1 : (nargin-1) sys1 = sys; sys2 = varargin{k}; sys = tf (); sys.lti = __lti_group__ (sys1.lti, sys2.lti, "vertcat"); [p1, m1] = size (sys1.num); [p2, m2] = size (sys2.num); if (m1 != m2) error ("tf: vertcat: number of system inputs incompatible: [(%dx%d); (%dx%d)]", p1, m1, p2, m2); endif sys.num = [sys1.num; sys2.num]; sys.den = [sys1.den; sys2.den]; if (strcmp (sys1.tfvar, sys2.tfvar)) sys.tfvar = sys1.tfvar; elseif (strcmp (sys1.tfvar, "x")) sys.tfvar = sys2.tfvar; else sys.tfvar = sys1.tfvar; endif if (sys1.inv || sys2.inv) sys.inv = true; endif endfor endfunction control/inst/@tfpoly/0000755000076500000240000000000012614620313014130 5ustar lukasstaffcontrol/inst/@tfpoly/__make_equally_long__.m0000644000076500000240000000222412614620313020572 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Make two polynomials equally long by adding leading zeros ## to the shorter one. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function [a, b] = __make_equally_long__ (a, b) la = length (a.poly); lb = length (b.poly); lmax = max (la, lb); a.poly = [zeros(1, lmax-la), a.poly]; b.poly = [zeros(1, lmax-lb), b.poly]; endfunction control/inst/@tfpoly/__remove_leading_zeros__.m0000644000076500000240000000223112614620313021302 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Remove leading zeros from a polynomial, except for polynomials ## which are of length 1. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function p = __remove_leading_zeros__ (p) idx = find (p.poly != 0); if (isempty (idx)) p.poly = 0; else p.poly = p.poly(idx(1) : end); # p.poly(idx) would remove all zeros endif endfunction control/inst/@tfpoly/conj_ct.m0000644000076500000240000000176212614620313015733 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate of continuous-time polynomial. Replace s by -s. ## For internal use only. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function p = conj_ct (p) p.poly(2:2:end) = -p.poly(2:2:end); endfunction control/inst/@tfpoly/conj_dt.m0000644000076500000240000000174712614620313015737 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate of discrete-time polynomial. Replace z by 1/z. ## For internal use only. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function p = conj_dt (p) p.poly = fliplr (p.poly); endfunction control/inst/@tfpoly/display.m0000644000076500000240000000167012614620313015757 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function display (p) tfpoly2str (p, "s") endfunction control/inst/@tfpoly/eq.m0000644000076500000240000000202712614620313014714 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Test for equal coefficients. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = eq (a, b) a = tfpoly (a); b = tfpoly (b); bool = (length (a) == length (b)) && all (a.poly == b.poly); endfunction control/inst/@tfpoly/get.m0000644000076500000240000000171412614620313015070 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return coefficients as a row vector. For internal use only. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function coeffs = get (p) coeffs = p.poly; endfunction control/inst/@tfpoly/is_zero.m0000644000076500000240000000171712614620313015766 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Check whether tfpoly is zero. For internal use only. ## Author: Lukas Reichlin ## Created: September 2013 ## Version: 0.1 function bool = is_zero (p) bool = ! any (p.poly); endfunction control/inst/@tfpoly/length.m0000644000076500000240000000170312614620313015570 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of coefficients. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function l = length (p) l = length (p.poly); endfunction control/inst/@tfpoly/minus.m0000644000076500000240000000222112614620313015436 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subtraction of two polynomials. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = minus (a, b) if (! isa (a, "tfpoly")) a = tfpoly (a); endif if (! isa (b, "tfpoly")) b = tfpoly (b); endif [a, b] = __make_equally_long__ (a, b); a.poly = a.poly - b.poly; a = __remove_leading_zeros__ (a); endfunction control/inst/@tfpoly/mpower.m0000644000076500000240000000242412614620313015621 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Power of a polynomial. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function p = mpower (a, b) if (! isa (b, "double") && ! is_real_scalar (b)) error ("tfpoly: mpower: power must be a natural number"); endif c = uint64 (b); if (c != b) error ("tfpoly: mpower: power must be a positive integer"); endif if (c == 0) p = tfpoly (1); return; endif p = a; for k = 1 : (c-1) p.poly = conv (p.poly, a.poly); endfor endfunction control/inst/@tfpoly/mtimes.m0000644000076500000240000000211412614620313015602 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Multiplication of two polynomials. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = mtimes (a, b) if (! isa (a, "tfpoly")) a = tfpoly (a); endif if (! isa (b, "tfpoly")) b = tfpoly (b); endif a.poly = conv (a.poly, b.poly); endfunction control/inst/@tfpoly/ne.m0000644000076500000240000000204412614620313014710 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return true if polynomials are not equal. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = ne (a, b) a = tfpoly (a); b = tfpoly (b); bool = (length (a) != length (b)) || any (a.poly != b.poly); endfunction control/inst/@tfpoly/numel.m0000644000076500000240000000170112614620313015425 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of coefficients. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function n = numel (p) n = numel (p.poly); endfunction control/inst/@tfpoly/plus.m0000644000076500000240000000221512614620313015271 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Addition of two polynomials. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = plus (a, b) if (! isa (a, "tfpoly")) a = tfpoly (a); endif if (! isa (b, "tfpoly")) b = tfpoly (b); endif [a, b] = __make_equally_long__ (a, b); a.poly = a.poly + b.poly; a = __remove_leading_zeros__ (a); endfunction control/inst/@tfpoly/roots.m0000644000076500000240000000166512614620313015464 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Compute the roots of a TFPOLY object. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function r = roots (p) r = roots (p.poly); endfunction control/inst/@tfpoly/subsref.m0000644000076500000240000000237712614620313015770 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Evaluate polynomial. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function b = subsref (a, s) if (isempty (s)) error ("tfpoly: missing index"); endif switch (s(1).type) case "()" idx = s(1).subs; if (numel (idx) == 1) b = polyval (a.poly, idx{1}); else error ("tfpoly: need exactly one index"); endif otherwise error ("tfpoly: invalid subscript type"); endswitch endfunction control/inst/@tfpoly/tfpoly.m0000644000076500000240000000260012614620313015621 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Class constructor. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function p = tfpoly (a) superiorto ("double"); switch (nargin) case 0 p = struct ("poly", []); p = class (p, "tfpoly"); case 1 if (isa (a, "tfpoly")) p = a; return; elseif (is_real_vector (a)) p.poly = reshape (a, 1, []); p = class (p, "tfpoly"); p = __remove_leading_zeros__ (p); else error ("tfpoly: argument must be a real-valued vector"); endif otherwise print_usage (); endswitch endfunction control/inst/@tfpoly/tfpoly2str.m0000644000076500000240000000473012614620313016442 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{str} =} tfpoly2str (@var{p}) ## @deftypefnx {Function File} {@var{str} =} tfpoly2str (@var{p}, @var{tfvar}) ## Return the string of a polynomial with string @var{tfvar} as variable. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function str = tfpoly2str (p, tfvar = "x") str = ""; lp = numel (p.poly); if (lp > 0) ## first element (highest order) a = p.poly(1); if (a < 0) cs = "-"; else cs = ""; endif if (lp == 1) str = [cs, num2str(abs (a), 4)]; else if (abs (a) == 1) str = [cs, __variable__(tfvar, lp-1)]; else str = [cs, __coefficient__(a), " ", __variable__(tfvar, lp-1)]; endif endif if (lp > 1) ## elements in the middle for k = 2 : lp-1 a = p.poly(k); if (a != 0) if (a < 0) cs = " - "; else cs = " + "; endif if (abs (a) == 1) str = [str, cs, __variable__(tfvar, lp-k)]; else str = [str, cs, __coefficient__(a), " ", __variable__(tfvar, lp-k)]; endif endif endfor ## last element (lowest order) a = p.poly(lp); if (a != 0) if (a < 0) cs = " - "; else cs = " + "; endif str = [str, cs, num2str(abs (a), 4)]; endif endif endif endfunction function str = __coefficient__ (a) b = abs (a); if (b == 1) str = ""; else str = num2str (b, 4); endif endfunction function str = __variable__ (tfvar, n) if (n == 1) str = tfvar; else str = [tfvar, "^", num2str(n)]; endif endfunction control/inst/@tfpoly/uminus.m0000644000076500000240000000170012614620313015624 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unitary minus operator. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = uminus (a) a.poly = -a.poly; endfunction control/inst/@tfpoly/uplus.m0000644000076500000240000000167612614620313015470 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unitary plus operator. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = uplus (a) a.poly = +a.poly; endfunction control/inst/__adjust_frd_data__.m0000644000076500000240000000322612614620313016606 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for adjusting FRD model data. ## Used by @frd/frd.m and @frd/__set__.m ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [H, w] = __adjust_frd_data__ (H, w); w = reshape (w, [], 1); lw = length (w); if (ndims (H) != 3 && ! isempty (H)) if (isscalar (H)) H = reshape (H, 1, 1, []); if (lw > 1) H = repmat (H, [1, 1, lw]); # needed for "frd1 + scalar2" or "scalar1 * frd2) endif elseif (isvector (H) && length (H) == lw) # SISO system (H is a vector) H = reshape (H, 1, 1, []); elseif (ismatrix (H)) H = reshape (H, rows (H), []); if (lw > 1) H = repmat (H, [1, 1, lw]); # needed for "frd1 + matrix2" or "matrix1 * frd2) endif else error ("frd: first argument H invalid"); endif elseif (isempty (H)) H = zeros (0, 0, 0); endif endfunction control/inst/__adjust_iddata__.m0000644000076500000240000000212212614620313016262 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function [y, u] = __adjust_iddata__ (y, u) if (iscell (y)) y = reshape (y, [], 1); else y = {y}; endif if (isempty (u)) u = {}; # avoid [](nx0) and the like elseif (iscell (u)) u = reshape (u, [], 1); else u = {u}; endif endfunction control/inst/__adjust_iddata_tsam__.m0000644000076500000240000000302012614620313017304 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Check whether tsam is a e-by-1 cell array of valid sampling times. ## If not, it tries to convert tsam accordingly. ## Empty tsam are filled with default value -1. ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function tsam = __adjust_iddata_tsam__ (tsam, e) if (isempty (tsam)) tsam = num2cell (-ones (e, 1)); elseif (iscell (tsam)) tsam = reshape (tsam, [], 1); else tsam = {tsam}; endif tmp = cellfun (@issample, tsam, {-1}); if (any (! tmp)) error ("iddata: invalid sampling time"); endif nt = numel (tsam); if (nt == 1 && e > 1) tsam = repmat (tsam, e, 1); elseif (nt != e) error ("iddata: there are %d experiments, but only %d sampling times", ... e, nt); endif endfunction control/inst/__adjust_labels__.m0000644000076500000240000000313512614620313016303 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Check whether a cell contains the required number of strings. ## Used by set and __set__. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function name = __adjust_labels__ (name, req_len) if (iscell (name)) name = reshape (name, [], 1); else # catch the siso case, name = {name}; # e.g. sys = set (sys, "inname", "u_1") endif if (! iscellstr (name)) error ("lti: set: require string or cell of strings"); endif if (numel (name) != req_len) if (numel (name) == 1 && req_len > 1) if (isempty (name{1})) # delete names quickly name = repmat ({""}, req_len, 1); else name = strseq (name{1}, 1:req_len); endif else error ("lti: set: cell must contain %d strings", req_len); endif endif endfunction control/inst/__adjust_ss_data__.m0000644000076500000240000000345512614620313016464 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for adjusting SS model data. ## Used by @ss/ss.m, others possibly follow. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.3 function [a, b, c, d, tsam] = __adjust_ss_data__ (a, b, c, d, tsam); if (isempty (a)) # static system a = []; # avoid [](nx0) or [](0xn) tsam = -2; endif if (isempty (d)) if (all (size (c) == 0)) # ss (a, b), ss (a, b, [], [], ...), but allow c(0xn) and d(0xm) c = eye (size (a)); d = zeros (rows (a), columns (b)); else # ss (a, b, c), ss (a, b, c, [], ...) d = zeros (rows (c), columns (b)); endif endif if (isempty (b) && isempty (c)) # sys = ss ([], [], [], d) b = zeros (0, columns (d)); c = zeros (rows (d), 0); tsam = -2; endif if (is_real_scalar (d) && d == 0) # ss (a, b, c, 0) (for matlab compatibility) d = zeros (rows (c), columns (b)); # test d == 0 to avoid ss (0) returning 0x0 model endif endfunction control/inst/__adjust_tf_data__.m0000644000076500000240000000553412614620313016450 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for adjusting TF model data. ## Used by tf and __set__. ## Author: Lukas Reichlin ## Created: October 2015 ## Version: 0.1 function [num, den, tsam, tfvar] = __adjust_tf_data__ (num, den, tsam = -2) if (isempty (den)) # tf (num, []), where [] could be {} as well if (isempty (num)) # tf ([], []) num = den = {}; tsam = -2; elseif (is_real_matrix (num)) # static gain tf (matrix), tf (matrix, []) num = num2cell (num); den = num2cell (ones (size (num))); tsam = -2; endif endif if (! iscell (num)) num = {num}; endif if (! iscell (den)) den = {den}; endif ## NOTE: the 'tfpoly' constructor checks its vector as well, ## but its error message would make little sense for users ## and would make it hard for them to identify the invalid argument. ## NOTE: this code is nicer, but there would be conflicts in @tf/__set__.m ## e.g. sys = tf ([5, 22], [1, 2]), sys.num = 5 ## ## if (! is_real_vector (num{:}, 1)) # dummy argument 1 needed if num is empty cell ## error ("tf: first argument 'num' requires a real-valued, non-empty vector or a cell of such vectors"); ## endif ## if (! is_real_vector (den{:}, 1)) ## error ("tf: second argument 'den' requires a real-valued, non-empty vector or a cell of such vectors"); ## endif ## ## num = cellfun (@tfpoly, num, "uniformoutput", false); ## den = cellfun (@tfpoly, den, "uniformoutput", false); try num = cellfun (@tfpoly, num, "uniformoutput", false); catch error ("tf: numerator 'num' must be a real-valued, non-empty vector or a cell of such vectors"); end_try_catch try den = cellfun (@tfpoly, den, "uniformoutput", false); catch error ("tf: denominator 'den' must be a real-valued, non-empty vector or a cell of such vectors"); end_try_catch if (any (cellfun (@is_zero, den)(:))) error ("tf: denominator(s) cannot be zero"); endif if (tsam == 0) tfvar = "s"; elseif (tsam == -2) tfvar = "x"; else tfvar = "z"; endif endfunction control/inst/__axis_limits__.m0000644000076500000240000000426712614620313016023 0ustar lukasstaff## Copyright (C) 1998, 2000, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {} __axis_limits__ (@var{axdata}) ## Determine axis limits for 2-D data (column vectors); leaves a 10% ## margin around the plots. ## Inserts margins of +/- 0.1 if data is one-dimensional ## (or a single point). ## ## @strong{Input} ## @table @var ## @item axdata ## @var{n} by 2 matrix of data [@var{x}, @var{y}]. ## @end table ## ## @strong{Output} ## @table @var ## @item axvec ## Vector of axis limits appropriate for call to @command{axis} function. ## @end table ## @end deftypefn function axvec = __axis_limits__ (axdata) if (nargin < 1 || isempty (axdata)) axdata = 0; endif ## compute axis limits minv = min (axdata); maxv = max (axdata); delv = (maxv-minv)/2; # breadth of the plot midv = (minv + maxv)/2; # midpoint of the plot axmid = [midv(1), midv(1), midv(2), midv(2)]; axdel = [-0.1, 0.1, -0.1, 0.1]; # default plot width (if less than 2-d data) if (max (delv) == 0) if (midv(1) != 0) axdel(1:2) = [-0.1*midv(1), 0.1*midv(1)]; endif if (midv(2) != 0) axdel(3:4) = [-0.1*midv(2), 0.1*midv(2)]; endif else ## they're at least one-dimensional tolv = max(1e-8, 1e-8*abs(midv)); if (abs (delv(1)) >= tolv(1)) axdel(1:2) = 1.1*[-delv(1),delv(1)]; endif if (abs (delv(2)) >= tolv(2)) axdel(3:4) = 1.1*[-delv(2),delv(2)]; endif endif axvec = axmid + axdel; endfunction control/inst/__axis_margin__.m0000644000076500000240000000362412614620313015773 0ustar lukasstaff## Copyright (C) 1998, 2000, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {} __axis_margin__ (@var{axdata}) ## Determine axis limits for 2-D data (column vectors); leaves a 10% ## margin around the plots. ## Inserts margins of +/- 0.1 if data is one-dimensional ## (or a single point). ## ## @strong{Input} ## @table @var ## @item axdata ## @var{n} by 2 matrix of data [@var{x}, @var{y}]. ## @end table ## ## @strong{Output} ## @table @var ## @item axvec ## Vector of axis limits appropriate for call to @command{axis} function. ## @end table ## @end deftypefn function axvec = __axis_margin__ (axdata) ## compute axis limits minv = axdata(1); maxv = axdata(2); delv = (maxv-minv)/2; # breadth of the plot midv = (minv + maxv)/2; # midpoint of the plot axmid = [midv, midv]; axdel = [-0.1, 0.1]; # default plot width (if less than 2-d data) if (delv == 0) if (midv != 0) axdel = [-0.1*midv, 0.1*midv]; endif else ## they're at least one-dimensional tolv = max(1e-8, 1e-8*abs(midv)); if (abs (delv) >= tolv) axdel = 1.1*[-delv,delv]; endif endif axvec = axmid + axdel; endfunction control/inst/__conred_check_feedback_sign__.m0000644000076500000240000000231712614620313020723 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check the feedback sign. ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function negfb = __conred_check_feedback_sign__ (fbsign, key = "feedback") if (! ischar (fbsign)) error ("conred: key '%s' requires string value", key); endif switch (fbsign) case "+" negfb = false; case "-" negfb = true; otherwise error ("conred: key '%s' has an invalid value", key); endswitch endfunction control/inst/__conred_sb16ad__.m0000644000076500000240000001351312614620313016102 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} __conred_sb16ad__ (@var{method}, @dots{}) ## Backend for btaconred and spaconred. ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = __conred_sb16ad__ (method, varargin) if (nargin < 3) print_usage (); endif if (method != "bta" && method != "spa") error ("modred: invalid method"); endif G = varargin{1}; K = varargin{2}; varargin = varargin(3:end); if (! isa (G, "lti")) error ("%sconred: first argument must be an LTI system", method); endif if (! isa (K, "lti")) error ("%sconred: second argument must be an LTI system", method); endif if (nargin > 3) # *conred (G, K, ...) if (is_real_scalar (varargin{1})) # *conred (G, K, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # *conred (G, K, opt, ...), *conred (G, K, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from *conred (G, K, nr, ...) ## and *conred (G, K, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("%sconred: keys and values must come in pairs", method); endif [a, b, c, d, tsam, scaled] = ssdata (G); [ac, bc, cc, dc, tsamc, scaledc] = ssdata (K); [p, m] = size (G); [pc, mc] = size (K); dt = isdt (G); if (p != mc || m != pc) error ("%sconred: dimensions of controller (%dx%d) and plant (%dx%d) don't match", ... method, pc, mc, p, c); endif ## default arguments alpha = __modred_default_alpha__ (dt); tol1 = 0.0; tol2 = 0.0; jobc = jobo = 0; bf = true; # balancing-free weight = 3; equil = scaled && scaledc; ordsel = 1; ncr = 0; negfb = false; # positive feedback controller ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case "weight" switch (lower (val(1))) case "n" # none weight = 0; case {"l", "o"} # left, output weight = 1; case {"r", "i"} # right, input weight = 2; case {"b", "p"} # both, performance weight = 3; otherwise error ("%sconred: '%s' is an invalid value for key weight", method, val); endswitch case {"order", "ncr", "nr"} [ncr, ordsel] = __modred_check_order__ (val, rows (ac)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "method" switch (tolower (val)) case "sr" bf = false; case "bfsr" bf = true; otherwise error ("modred: '%s' is an invalid approach", val); endswitch case {"jobc", "gram-ctrb"} jobc = __modred_check_gram__ (val, "gram-ctrb"); case {"jobo", "gram-obsv"} jobo = __modred_check_gram__ (val, "gram-obsv"); case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); case "feedback" negfb = __conred_check_feedback_sign__ (val); otherwise warning ("%sconred: invalid property name '%s' ignored", method, key); endswitch endfor ## handle model reduction approach if (strcmpi (method, "bta") && ! bf) # 'B': use the square-root Balance & Truncate method jobmr = 0; elseif (strcmpi (method, "bta") && bf) # 'F': use the balancing-free square-root Balance & Truncate method jobmr = 1; elseif (strcmpi (method, "spa") && ! bf) # 'S': use the square-root Singular Perturbation Approximation method jobmr = 2; elseif (strcmpi (method, "spa") && bf) # 'P': use the balancing-free square-root Singular Perturbation Approximation method jobmr = 3; else error ("%smodred: invalid jobmr option"); # this should never happen endif ## handle negative feedback controllers if (negfb) [ac, bc, cc, dc] = ssdata (-K); endif ## perform model order reduction [acr, bcr, ccr, dcr, ncr, hsvc, ncs] = __sl_sb16ad__ (a, b, c, d, dt, equil, ncr, ordsel, alpha, jobmr, ... ac, bc, cc, dc, ... weight, jobc, jobo, tol1, tol2); ## assemble reduced order controller Kr = ss (acr, bcr, ccr, dcr, tsamc); ## handle negative feedback controllers if (negfb) Kr = -Kr; endif ## assemble info struct info = struct ("ncr", ncr, "ncs", ncs, "hsvc", hsvc); endfunction control/inst/__dss2ss__.m0000644000076500000240000000665112614620313014716 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert descriptor state-space system into regular state-space form. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.3 function [a, b, c, d, e] = __dss2ss__ (a, b, c, d, e) if (isempty (e)) return; elseif (rcond (e) < eps) # check for singularity ## check whether regular state-space representation is possible [~, ~, ~, ~, ranke, rnka22] = __sl_tg01fd__ (a, e, b, c, false, 0); if (ranke+rnka22 < rows (a)) error ("dss:improper", "ss: dss2ss: this descriptor system cannot be converted to regular state-space form"); endif endif [a, b, c, d] = __sl_sb10jd__ (a, b, c, d, e); e = []; endfunction ## Test from SLICOT TG01FD %!shared a, b, c, e, ranke, rnka22, q, z, a_exp, b_exp, c_exp, e_exp, q_exp, z_exp %! %! e = [1, 2, 0, 0; 0, 1, 0, 1; 3, 9, 6, 3; 0, 0, 2, 0]; %! a = [-1, 0, 0, 3; 0, 0, 1, 2; 1, 1, 0, 4; 0, 0, 0, 0]; %! b = [1, 0; 0, 0; 0, 1; 1, 1]; %! c = [-1, 0, 1, 0; 0, 1, -1, 1]; %! %! [a, e, b, c, ranke, rnka22, q, z] = __sl_tg01fd__ (a, e, b, c, true, 0.0); %! %! e_exp = [10.1587 5.8230 1.3021 0.0000; %! 0.0000 -2.4684 -0.1896 0.0000; %! 0.0000 0.0000 1.0338 0.0000; %! 0.0000 0.0000 0.0000 0.0000]; %! %! a_exp = [ 2.0278 0.1078 3.9062 -2.1571; %! -0.0980 0.2544 1.6053 -0.1269; %! 0.2713 0.7760 -0.3692 -0.4853; %! 0.0690 -0.5669 -2.1974 0.3086]; %! %! b_exp = [-0.2157 -0.9705; %! 0.3015 0.9516; %! 0.7595 0.0991; %! 1.1339 0.3780]; %! %! c_exp = [ 0.3651 -1.0000 -0.4472 -0.8165; %! -1.0954 1.0000 -0.8944 0.0000]; %! %! q_exp = [-0.2157 -0.5088 0.6109 0.5669; %! -0.1078 -0.2544 -0.7760 0.5669; %! -0.9705 0.1413 -0.0495 -0.1890; %! 0.0000 0.8102 0.1486 0.5669]; %! %! z_exp = [-0.3651 0.0000 0.4472 0.8165; %! -0.9129 0.0000 0.0000 -0.4082; %! 0.0000 -1.0000 0.0000 0.0000; %! -0.1826 0.0000 -0.8944 0.4082]; %! %!assert (a, a_exp, 1e-4); %!assert (e, e_exp, 1e-4); %!assert (b, b_exp, 1e-4); %!assert (c, c_exp, 1e-4); %!assert (q, q_exp, 1e-4); %!assert (z, z_exp, 1e-4); %!assert (ranke, 3); %!assert (rnka22, 1); ## test error %!shared mms %! %! mm = tf ([3, 5, 0], [4, 1]); %! mms = ss (mm); %!error (__dss2ss__ (mms.a, mms.b, mms.c, mms.d, mms.e)); ## Realizable descriptor system with singular E matrix %!test %! A = [1 0; 0 1]; %! B = [1; 0]; %! C = [1 0]; %! D = 0; %! E = [1 0; 0 0]; %! %! sys = dss (A, B, C, D, E); %! [Ao, Bo, Co, Do] = ssdata (sys); %! %! assert (Ao, 1, 1e-4); %! assert (Bo, 1, 1e-4); %! assert (Co, 1, 1e-4); %! assert (Do, 0, 1e-4); control/inst/__dss_bilin__.m0000644000076500000240000000460312614620313015436 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## 1. Discrete -> continuous ## _ ## E = alpha*E + A ## _ ## A = beta (A - alpha*E) ## _ ## B = sqrt(2*alpha*beta) * B ## _ -1 ## C = sqrt(2*alpha*beta) * C * (alpha*E + A) * E ## _ -1 ## D = D - C * (alpha*E + A) * B ## ## ## 2. Continuous -> discrete ## _ ## E = beta*E - A ## _ ## A = alpha (beta*E + A) ## _ ## B = sqrt(2*alpha*beta) * B ## _ -1 ## C = sqrt(2*alpha*beta) * C * (beta*E - A) * E ## _ -1 ## D = D + C * (beta*E - A) * B ## Special thanks to Andras Varga for the formulae. ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [Ar, Br, Cr, Dr, Er] = __dss_bilin__ (A, B, C, D, E, beta, discrete) if (discrete) EpA = E + A; s2b = sqrt (2*beta); if (rcond (EpA) < eps) error ("d2c: E+A singular"); endif CiEpA = C / EpA; Er = EpA; Ar = beta * (A - E); Br = s2b * B; Cr = s2b * CiEpA * E; Dr = D - CiEpA * B; ## Er = E + A; ## Ar = beta * (A - E); ## Br = sqrt (2*beta) * B; ## Cr = sqrt (2*beta) * C / (E + A) * E; ## Dr = D - C / (E + A) * B; else bEmA = beta*E - A; s2b = sqrt (2*beta); if (rcond (bEmA) < eps) error ("c2d: beta*E-A singular"); endif CibEmA = C / bEmA; Er = bEmA; Ar = beta*E + A; Br = s2b * B; Cr = s2b * CibEmA * E; Dr = D + CibEmA * B; ## Er = beta*E - A; ## Ar = beta*E + A; ## Br = sqrt (2*beta) * B; ## Cr = sqrt (2*beta) * C / (beta*E - A) * E; ## Dr = D + C / (beta*E - A) * B; endif endfunction control/inst/__frd_dim__.m0000644000076500000240000000304512614620313015073 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of outputs and inputs of transfer function numerator and ## denominator. For internal use only. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function [p, m, l] = __frd_dim__ (H, w) if (! isnumeric (H)) error ("frd: argument 'H' must be a 3-dimensional numeric array"); endif lw = length (w); if (! isempty (w) && (! is_real_vector (w) || any (w < 0) ... || ! issorted (w) || w(1) > w(end) ... || length (unique (w)) != lw)) error ("frd: argument 'w' must be a vector of positive real numbers in ascending order"); endif [p, m, l] = size (H); if (l != lw) error ("frd: arguments 'H' (%dx%dx%d) and 'w' (%d) must have equal length", p, m, l, lw); endif endfunction control/inst/__frequency_response__.m0000644000076500000240000001104012614620313017400 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return frequency response H and frequency vector w. ## If w is empty, it will be calculated by __frequency_vector__. ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.7 function [H, w, sty, leg] = __frequency_response__ (caller, args, nout = 0) ## CALLER | MIMO | RANGE | CELL | ## ---------------+-------+-------+-------+ ## bode | false | std | false | ## bodemag | false | std | false | ## margin | false | std | false | ## nichols | false | ext | false | ## nyquist | false | ext | false | ## sensitivity | false | ext | false | ## sigma | true | std | true | mimoflag = false; cellflag = false; wbounds = "std"; if (strcmp (caller, {"sigma"})) mimoflag = true; cellflag = true; endif if (any (strcmp (caller, {"nyquist", "nichols", "sensitivity"}))) wbounds = "ext"; endif sys_idx = cellfun (@isa, args, {"lti"}); # look for LTI models frd_idx = cellfun (@isa, args, {"frd"}); # look for FRD models w_idx = cellfun (@is_real_vector, args); # look for frequency vectors r_idx = cellfun (@iscell, args); # look for frequency ranges {wmin, wmax} s_idx = cellfun (@ischar, args); # look for strings (style arguments) inv_idx = ! (sys_idx | w_idx | r_idx | s_idx); # look for invalid arguments if (any (inv_idx)) warning ("%s: argument(s) number %s are invalid and are being ignored", ... caller, mat2str (find (inv_idx)(:).')); endif if (nnz (sys_idx) == 0) error ("%s: require at least one LTI model", caller); endif if (nout > 0 && (nnz (sys_idx) > 1 || any (s_idx))) evalin ("caller", "print_usage ()"); endif if (! mimoflag && ! all (cellfun (@issiso, args(sys_idx)))) error ("%s: require SISO systems", caller); endif if (any (find (s_idx) < find (sys_idx)(1))) warning ("%s: strings in front of first LTI model are being ignored", caller); endif ## determine frequency vectors if (any (r_idx)) # if there are frequency ranges if (nnz (r_idx) > 1) warning ("%s: several frequency ranges specified, taking the last one", caller); endif r = args(r_idx){end}; if (numel (r) == 2 && issample (r{1}) && issample (r{2}) && r{1} < r{2}) w = __frequency_vector__ (args(sys_idx), wbounds, r{1}, r{2}); else error ("%s: the cell defining the desired frequency range is invalid", caller); endif elseif (any (w_idx)) # are there any frequency vectors? if (nnz (r_idx) > 1) warning ("%s: several frequency vectors specified, taking the last one", caller); endif w = args(w_idx){end}; w = repmat ({w}, 1, nnz (sys_idx)); else # there are neither frequency ranges nor vectors w = __frequency_vector__ (args(sys_idx), wbounds); endif ## temporarily save frequency vectors of FRD models w_frd = cellfun (@(x) get (x, "w"), args(frd_idx), "uniformoutput", false); w(frd_idx) = {[]}; # freqresp returns all frequencies of FRD models for w=[] ## compute frequency response H for all LTI models H = cellfun (@__freqresp__, args(sys_idx), w, {cellflag}, "uniformoutput", false); ## restore frequency vectors of FRD models in w w(frd_idx) = w_frd; ## extract plotting styles tmp = cumsum (sys_idx); tmp(sys_idx | ! s_idx) = 0; n = nnz (sys_idx); sty = arrayfun (@(x) args(tmp == x), 1:n, "uniformoutput", false); ## get system names for legend ## "''" needed for bode (lticell{:}) leg = cell (1, n); idx = find (sys_idx); for k = 1:n leg{k} = evalin ("caller", sprintf ("inputname(%d)", idx(k)), "''"); endfor endfunction control/inst/__frequency_vector__.m0000644000076500000240000001331212614620313017050 0ustar lukasstaff## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 ## Auburn University. All rights reserved. ## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{w} =} __frequency_vector__ (@var{sys}) ## Get default range of frequencies based on cutoff frequencies of system ## poles and zeros. ## Frequency range is the interval ## @iftex ## @tex ## $ [ 10^{w_{min}}, 10^{w_{max}} ] $ ## @end tex ## @end iftex ## @ifnottex ## [10^@var{wmin}, 10^@var{wmax}] ## @end ifnottex ## ## Used by @command{__frequency_response__} ## @end deftypefn ## Adapted-By: Lukas Reichlin ## Date: October 2009 ## Version: 0.4 function w = __frequency_vector__ (sys_cell, wbounds = "std", wmin, wmax) isc = iscell (sys_cell); if (! isc) # __sys2frd__ methods pass LTI models not in cells sys_cell = {sys_cell}; endif idx = cellfun (@(x) isa (x, "lti"), sys_cell); sys_cell = sys_cell(idx); len = numel (sys_cell); [dec_min, dec_max, zp] = cellfun (@__frequency_range__, sys_cell, {wbounds}, "uniformoutput", false); if (strcmpi (wbounds, "std")) # plots with explicit frequencies if (nargin == 4) # w = {wmin, wmax} dec_min = log10 (wmin); dec_max = log10 (wmax); else dec_min = min (cell2mat (dec_min)); dec_max = max (cell2mat (dec_max)); endif zp = horzcat (zp{:}); ## include zeros and poles for nice peaks in plots idx = find (zp > 10^dec_min & zp < 10^dec_max); zp = zp(idx); w = logspace (dec_min, dec_max, 500); w = unique ([w, zp]); # unique also sorts frequency vector w = repmat ({w}, 1, len); # return cell of frequency vectors elseif (strcmpi (wbounds, "ext")) # plots with implicit frequencies if (nargin == 4) dec_min = repmat ({log10(wmin)}, 1, len); dec_max = repmat ({log10(wmax)}, 1, len); endif idx = cellfun (@(zp, dec_min, dec_max) find (zp > 10^dec_min & zp < 10^dec_max), ... zp, dec_min, dec_max, "uniformoutput", false); zp = cellfun (@(zp, idx) zp(idx), zp, idx, "uniformoutput", false); w = cellfun (@logspace, dec_min, dec_max, {500}, "uniformoutput", false); w = cellfun (@(w, zp) unique ([w, zp]), w, zp, "uniformoutput", false); ## unique also sorts frequency vector else error ("frequency_vector: invalid argument 'wbounds'"); endif if (! isc) # for __sys2frd__ methods w = w{1}; endif endfunction function [dec_min, dec_max, zp] = __frequency_range__ (sys, wbounds = "std") if (isa (sys, "frd")) w = get (sys, "w"); dec_min = log10 (w(1)); dec_max = log10 (w(end)); zp = []; return; endif zer = zero (sys); pol = pole (sys); tsam = abs (get (sys, "tsam")); # tsam could be -1 discrete = ! isct (sys); # static gains (tsam = -2) are assumed continuous ## make sure zer, pol are row vectors pol = reshape (pol, 1, []); zer = reshape (zer, 1, []); ## check for natural frequencies away from omega = 0 if (discrete) ## The 2nd conditions prevents log(0) in the next log command iiz = find (abs(zer-1) > norm(zer)*eps && abs(zer) > norm(zer)*eps); iip = find (abs(pol-1) > norm(pol)*eps && abs(pol) > norm(pol)*eps); ## avoid dividing empty matrices, it would work but looks nasty if (! isempty (iiz)) czer = log (zer(iiz))/tsam; else czer = []; endif if (! isempty (iip)) cpol = log (pol(iip))/tsam; else cpol = []; endif else ## continuous iip = find (abs(pol) > norm(pol)*eps); iiz = find (abs(zer) > norm(zer)*eps); if (! isempty (zer)) czer = zer(iiz); else czer = []; endif if (! isempty (pol)) cpol = pol(iip); else cpol = []; endif endif if (isempty (iip) && isempty (iiz)) ## no poles/zeros away from omega = 0; pick defaults dec_min = 0; # -1 dec_max = 2; # 3 else dec_min = floor (log10 (min (abs ([cpol, czer])))); dec_max = ceil (log10 (max (abs ([cpol, czer])))); endif ## expand to show the entirety of the "interesting" portion of the plot switch (wbounds) case "std" # standard if (dec_min == dec_max) dec_min -= 2; dec_max += 2; else dec_min--; dec_max++; endif case "ext" # extended (for nyquist) if (any (abs (pol) < sqrt (eps))) # look for integrators ## dec_min -= 0.5; dec_max += 2; else dec_min -= 2; dec_max += 2; endif otherwise error ("frequency_range: second argument invalid"); endswitch ## run discrete frequency all the way to pi if (discrete) dec_max = log10 (pi/tsam); endif ## include zeros and poles for nice peaks in plots zp = [abs(zer), abs(pol)]; endfunction control/inst/__iddata_dim__.m0000644000076500000240000000437312614620313015553 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [p, m, e] = __iddata_dim__ (y, u) e = numel (y); # number of experiments if (isempty (u)) # time series data, outputs only [p, m] = cellfun (@__experiment_dim__, y, "uniformoutput", false); elseif (e == numel (u)) # outputs and inputs present [p, m] = cellfun (@__experiment_dim__, y, u, "uniformoutput", false); else error ("iddata: require input and output data with matching number of experiments"); endif if (e > 1 && ! isequal (p{:})) error ("iddata: require identical number of output channels for all experiments"); endif if (e > 1 && ! isequal (m{:})) error ("iddata: require identical number of input channels for all experiments"); endif p = p{1}; m = m{1}; endfunction function [p, m] = __experiment_dim__ (y, u = []) if (! is_matrix (y, u)) error ("iddata: inputs and outputs must be real or complex matrices"); endif [ly, p] = size (y); [lu, m] = size (u); if (! isempty (u) && ly != lu) error ("iddata: matrices 'y' (%dx%d) and 'u' (%dx%d) must have the same number of samples (rows)", ... ly, p, lu, m); endif if (ly < p) warning ("iddata:transpose", "iddata: more outputs than samples - matrice 'y' should probably be transposed"); endif if (lu < m) warning ("iddata:transpose", "iddata: more inputs than samples - matrice 'u' should probably be transposed"); endif endfunction control/inst/__is_stable__.m0000644000076500000240000000235112614620313015433 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Determine whether all poles in a vector are stable. ## Author: Lukas Reichlin ## Created: December 2010 ## Version: 0.2 function bool = __is_stable__ (pol, ct = true, tol = 0) if (! is_real_scalar (tol) || tol < 0) error ("isstable: tolerance must be a real-valued, non-negative scalar"); endif if (ct) # continuous-time bool = all (real (pol) < -tol*(1 + abs (pol))); else # discrete-time bool = all (abs (pol) < 1 - tol); endif endfunction control/inst/__labels__.m0000644000076500000240000000240112614620313014724 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return default labels if cell "name" contains only empty strings. ## If not, check whether individual strings of the cell "name" are ## empty and mark them with "?". Used by display routines. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [name, n] = __labels__ (name, variable = "x") n = numel (name); if (n == 0 || isequal ("", name{:})) name = strseq (variable, 1:n); else idx = cellfun (@isempty, name); name(idx) = "?"; endif endfunction control/inst/__match_key__.m0000644000076500000240000000373612614620313015442 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Check whether string @var{str} matches one of the candidates ## in cell @var{props} exactly and return the matching property/key ## name. If no exact match is found, check whether there is a ## candidate name in @var{props} which starts with @var{str} and ## return the partial match. In case of ambiguity or a mismatch, ## raise an error. ## Author: Lukas Reichlin ## Created: June 2015 ## Version: 0.1 function key = __match_key__ (str, props, caller = "match_key") if (! ischar (str)) error ("%s: key name must be a string", caller); endif ## exact matching - needed for e.g. iddata properties "u" and "userdata" idx = strcmpi (str, props); n = sum (idx); if (n == 1) # 1 exact match key = lower (str); return; elseif (n > 1) # props are not unique, this would be a bug in the control package error ("%s: key name '%s' is ambiguous", caller, str); endif ## partial matching - n was zero idx = strncmpi (str, props, length (str)); n = sum (idx); if (n == 1) key = lower (props{idx}); return; elseif (n > 1) error ("%s: key name '%s' is ambiguous", caller, str); endif error ("%s: key name '%s' is unknown", caller, str); endfunction control/inst/__modred_ab09id__.m0000644000076500000240000001327612614620313016100 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} __modred_ab09id__ (@var{method}, @dots{}) ## Backend for btamodred and spamodred. ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [Gr, info] = __modred_ab09id__ (method, varargin) if (nargin < 2) print_usage (); endif if (method != "bta" && method != "spa") error ("modred: invalid method"); endif G = varargin{1}; varargin = varargin(2:end); if (! isa (G, "lti")) error ("%smodred: first argument must be an LTI system", method); endif if (nargin > 2) # *modred (G, ...) if (is_real_scalar (varargin{1})) # *modred (G, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # *modred (G, opt, ...), *modred (G, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from *modred (G, nr, ...) ## and *modred (G, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("%smodred: keys and values must come in pairs", method); endif [a, b, c, d, tsam, scaled] = ssdata (G); [p, m] = size (G); dt = isdt (G); ## default arguments alpha = __modred_default_alpha__ (dt); av = bv = cv = dv = []; jobv = 0; aw = bw = cw = dw = []; jobw = 0; alphac = alphao = 0.0; tol1 = 0.0; tol2 = 0.0; jobc = jobo = 0; bf = true; # balancing-free weight = 1; equil = 0; ordsel = 1; nr = 0; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"left", "output", "v"} [av, bv, cv, dv, jobv] = __modred_check_weight__ (val, dt, p, []); case {"right", "input", "w"} [aw, bw, cw, dw, jobw] = __modred_check_weight__ (val, dt, [], m); case {"order", "n", "nr"} [nr, ordsel] = __modred_check_order__ (val, rows (a)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "method" switch (tolower (val)) case "sr" bf = false; case "bfsr" bf = true; otherwise error ("modred: '%s' is an invalid approach", val); endswitch case {"jobc", "gram-ctrb"} jobc = __modred_check_gram__ (val, "gram-ctrb"); case {"jobo", "gram-obsv"} jobo = __modred_check_gram__ (val, "gram-obsv"); case {"alphac", "alpha-ctrb"} alphac = __modred_check_alpha_gram__ (val, "alpha-ctrb"); case {"alphao", "alpha-obsv"} alphao = __modred_check_alpha_gram__ (val, "alpha-obsv"); case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); otherwise warning ("%smodred: invalid property name '%s' ignored", method, key); endswitch endfor ## handle type of frequency weighting if (jobv && jobw) weight = 3; # 'B': both left and right weightings V and W are used elseif (jobv) weight = 1; # 'L': only left weighting V is used (W = I) elseif (jobw) weight = 2; # 'R': only right weighting W is used (V = I) else weight = 0; # 'N': no weightings are used (V = I, W = I) endif ## handle model reduction approach if (strcmpi (method, "bta") && ! bf) # 'B': use the square-root Balance & Truncate method job = 0; elseif (strcmpi (method, "bta") && bf) # 'F': use the balancing-free square-root Balance & Truncate method job = 1; elseif (strcmpi (method, "spa") && ! bf) # 'S': use the square-root Singular Perturbation Approximation method job = 2; elseif (strcmpi (method, "spa") && bf) # 'P': use the balancing-free square-root Singular Perturbation Approximation method job = 3; else error ("modred: invalid job option"); # this should never happen endif ## perform model order reduction [ar, br, cr, dr, nr, hsv, ns] = __sl_ab09id__ (a, b, c, d, dt, equil, nr, ordsel, alpha, job, ... av, bv, cv, dv, ... aw, bw, cw, dw, ... weight, jobc, jobo, alphac, alphao, ... tol1, tol2); ## assemble reduced order model Gr = ss (ar, br, cr, dr, tsam); ## assemble info struct info = struct ("nr", nr, "ns", ns, "hsv", hsv); endfunction control/inst/__modred_check_alpha__.m0000644000076500000240000000241012614620313017236 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check alpha for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function alpha = __modred_check_alpha__ (alpha, dt) if (! is_real_scalar (alpha)) error ("modred: argument alpha must be a real scalar"); endif if (dt) # discrete-time if (alpha < 0 || alpha > 1) error ("modred: require 0 <= ALPHA <= 1"); endif else # continuous-time if (alpha > 0) error ("modred: require ALPHA <= 0"); endif endif endfunction control/inst/__modred_check_alpha_gram__.m0000644000076500000240000000221212614620313020244 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check alpha for combination methods of grammians ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function alpha = __modred_check_alpha_gram__ (alpha, key) if (! is_real_scalar (alpha)) error ("modred: argument '%s' must be a real scalar", key); endif if (abs (alpha) > 1) error ("modred: require -1 <= %s <= 1", key); endif endfunction control/inst/__modred_check_equil__.m0000644000076500000240000000211412614620313017271 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check equilibration for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function scaled = __modred_check_equil__ (equil) if (isscalar (equil)) scaled = ! logical (equil); else error ("modred: property 'equil' must be a logical value"); endif endfunction control/inst/__modred_check_gram__.m0000644000076500000240000000235512614620313017107 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check choice of frequency-weighted grammians. ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function job = __modred_check_gram__ (choice, key) if (! ischar (choice)) error ("modred: key '%s' requires string value", key); endif switch (tolower (choice (1))) case "s" # standard job = 0; case "e" # enhanced job = 1; otherwise error ("modred: key '%s' has an invalid value", key); endswitch endfunction control/inst/__modred_check_order__.m0000644000076500000240000000233312614620313017270 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check order for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [nr, ordsel] = __modred_check_order__ (nr, n) if (! issample (nr, 0) || nr != round (nr)) error ("modred: order of reduced model must be an integer >= 0"); endif if (nr > n) error ("modred: order of reduced model (%d) can't be larger than the original one (%d)", ... nr, n); endif ordsel = 0; endfunction control/inst/__modred_check_tol__.m0000644000076500000240000000205012614620313016747 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check tolerance for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function tol = __modred_check_tol__ (tol, str = "") if (! is_real_scalar (tol)) error ("modred: argument %s must be a real scalar", str); endif endfunction control/inst/__modred_check_weight__.m0000644000076500000240000000265212614620313017450 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check weightings for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [a, b, c, d, job] = __modred_check_weight__ (sys, dt, p = [], m = []) sys = ss (sys); # could be non-lti, therefore ssdata would fail if (dt != isdt (sys)) error ("modred: ct/dt"); # TODO: error message endif [pw, mw] = size (sys); if (! isempty (p) && mw != p) error ("modred: left weight requires %d inputs", p); endif if (! isempty (m) && pw != m) error ("modred: right weight requires %d outputs", m); endif [a, b, c, d] = ssdata (sys); job = 1; ## TODO: check system size endfunction control/inst/__modred_default_alpha__.m0000644000076500000240000000210612614620313017607 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## default alpha for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function alpha = __modred_default_alpha__ (dt) if (dt) # discrete-time alpha = 1; # ALPHA <= 0 else # continuous-time alpha = 0; # 0 <= ALPHA <= 1 endif endfunction control/inst/__opt2cell__.m0000644000076500000240000000225612614620313015216 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert option struct to a cell with field names as keys and ## field values as values. ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function c = __opt2cell__ (opt) if (! isstruct (opt)) error ("opt2cell: argument must be a struct"); endif key = fieldnames (opt); val = struct2cell (opt); c = [key.'; val.'](:).'; # reshape to {key1, val1, key2, val2, ...} endfunction control/inst/__remove_trailing_zeros__.m0000644000076500000240000000213712614620313020100 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Remove trailing zeros from a polynomial, except for polynomials ## which are of length 1. For internal use only. ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function p = __remove_trailing_zeros__ (p) idx = find (p != 0); if (isempty (idx)) p = 0; else p = p(1 : idx(end)); endif endfunction control/inst/__slicot_identification__.m0000644000076500000240000001676712614620313020054 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sys}, @var{x0}], @var{info} =} __slicot_identification__ (@var{method}, @var{dat}, @dots{}) ## Backend for moesp, moen4 and n4sid. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = __slicot_identification__ (method, nout, dat, varargin) ## determine identification method switch (method) case "moesp" meth = 0; case "n4sid" meth = 1; case "moen4" meth = 2; otherwise error ("ident: invalid method"); # should never happen endswitch if (! isa (dat, "iddata") || ! dat.timedomain) error ("%s: first argument must be a time-domain 'iddata' dataset", method); endif if (nargin > 3) # ident (dat, ...) if (is_real_scalar (varargin{1})) # ident (dat, n, ...) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # ident (dat, opt, ...), ident (dat, n, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("%s: keys and values must come in pairs", method); endif [ns, p, m, e] = size (dat); # dataset dimensions tsam = dat.tsam; ## multi-experiment data requires equal sampling times if (e > 1 && ! isequal (tsam{:})) error ("%s: require equally sampled experiments", method); else tsam = tsam{1}; endif ## default arguments alg = 0; conct = 1; # no connection between experiments ctrl = 1; # don't confirm order n rcond = 0.0; tol = 0.0; # -1.0; s = []; n = []; conf = []; noise = "n"; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"n", "order"} if (! issample (val, 0) || val != round (val)) error ("%s: 'n' must be a positive integer", method); endif n = val; case "s" if (! issample (val, 0) || val != round (val)) error ("%s: 's' must be a positive integer", method); endif s = val; case {"alg", "algorithm"} if (strncmpi (val, "c", 1)) alg = 0; # Cholesky algorithm applied to correlation matrix elseif (strncmpi (val, "f", 1)) alg = 1; # fast QR algorithm elseif (strncmpi (val, "q", 1)) alg = 2; # QR algorithm applied to block Hankel matrices else error ("%s: invalid algorithm", method); endif case "tol" if (! is_real_scalar (val)) error ("%s: tolerance 'tol' must be a real scalar", method); endif tol = val; case "rcond" if (! is_real_scalar (val)) error ("%s: 'rcond' must be a real scalar", method); endif rcond = val; case "confirm" conf = logical (val); case {"noiseinput", "noiseinputs", "noise", "input", "inputs"} noise = val; otherwise warning ("%s: invalid property name '%s' ignored", method, key); endswitch endfor ## handle s/nobr and n nsmp = sum (ns); # total number of samples nobr = fix ((nsmp+1)/(2*(m+p+1))); if (e > 1) nobr = min (nobr, fix (min (ns) / 2)); endif if (nobr < 1) error ("%s: for the given system dimensions (%dx%d), the iddata dataset does not contain enough samples per experiment", ... method, p, m); endif if (isempty (s) && isempty (n)) ctrl = 0; # confirm system order estimate n = 0; elseif (isempty (s)) s = min (2*n, n+10); # upper bound for n nobr = min (nobr, s); elseif (isempty (n)) nobr = __check_s__ (s, nobr, method); ctrl = 0; # confirm system order estimate n = 0; else # s & n non-empty nobr = __check_s__ (s, nobr, method); if (n >= nobr) error ("%s: n=%d, but require n < %d (s)", method, n, nobr); endif endif if (! isempty (conf)) ctrl = ! conf; endif if (nout == 0) ## compute singular values [sv, nrec] = __sl_ib01ad__ (dat.y, dat.u, nobr, n, meth, alg, conct, ctrl, rcond, tol); ## there is no 'logbar' function svl = log10 (sv); base = floor (min (svl)); clf bar (svl, "basevalue", base) xlim ([0, length(sv)+1]) yl = ylim; ylim ([base, yl(2)]) title ("Singular Values") ylabel ("Logarithm of Singular Values") xlabel (sprintf ("Estimated System Order with current Tolerance: %d", nrec)) grid on else ## perform system identification [a, b, c, d, q, ry, s, k, x0] = __sl_ident__ (dat.y, dat.u, nobr, n, meth, alg, conct, ctrl, rcond, tol); ## compute noise variance matrix factor L ## L L' = Ry, e = L v ## v becomes white noise with identity covariance matrix l = chol (ry, "lower"); ## assemble model [inname, outname] = get (dat, "inname", "outname"); if (strncmpi (noise, "e", 1)) # add error inputs e, not normalized sys = ss (a, [b, k], c, [d, eye(p)], tsam); in_u = __labels__ (inname, "u"); in_e = __labels__ (outname, "y"); in_e = cellfun (@(x) ["e@", x], in_e, "uniformoutput", false); inname = [in_u; in_e]; elseif (strncmpi (noise, "v", 1)) # add error inputs v, normalized sys = ss (a, [b, k*l], c, [d, l], tsam); in_u = __labels__ (inname, "u"); in_v = __labels__ (outname, "y"); in_v = cellfun (@(x) ["v@", x], in_v, "uniformoutput", false); inname = [in_u; in_v]; elseif (strncmpi (noise, "k", 1)) # Kalman predictor sys = ss ([a-k*c], [b-k*d, k], c, [d, zeros(p)], tsam); in_u = __labels__ (inname, "u"); in_y = __labels__ (outname, "y"); inname = [in_u; in_y]; else # no error inputs, default sys = ss (a, b, c, d, tsam); endif sys = set (sys, "inname", inname, "outname", outname); ## return x0 as vector for single-experiment data ## instead of a cell containing one vector if (numel (x0) == 1) x0 = x0{1}; endif ## assemble info struct ## Kalman gain matrix K ## state covariance matrix Q ## output covariance matrix Ry ## state-output cross-covariance matrix S ## noise variance matrix factor L info = struct ("K", k, "Q", q, "Ry", ry, "S", s, "L", l); endif endfunction function nobr = __check_s__ (s, nobr, method) if (s <= nobr) nobr = s; else error ("%s: require upper bound s <= %d, but the requested s is %d", method, nobr, s); endif endfunction control/inst/__ss_dim__.m0000644000076500000240000000417312614620313014750 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of outputs (p), inputs (m) and states (n) of state space matrices. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function [p, m, n] = __ss_dim__ (a, b, c, d, e = []) if (! is_real_matrix (a, b, c, d, e)) error ("ss: system matrices must be real-valued"); endif [arows, acols] = size (a); [brows, bcols] = size (b); [crows, ccols] = size (c); [drows, dcols] = size (d); m = bcols; # = dcols n = arows; # = acols p = crows; # = drows if (arows != acols) error ("ss: system matrix a(%dx%d) is not square", arows, acols); endif if (brows != arows) error ("ss: system matrices a(%dx%d) and b(%dx%d) are incompatible", arows, acols, brows, bcols); endif if (ccols != acols) error ("ss: system matrices a(%dx%d) and c(%dx%d) are incompatible", arows, acols, crows, ccols); endif if (bcols != dcols) error ("ss: system matrices b(%dx%d) and d(%dx%d) are incompatible", brows, bcols, drows, dcols); endif if (crows != drows) error ("ss: system matrices c(%dx%d) and d(%dx%d) are incompatible", crows, ccols, drows, dcols); endif if (! isempty (e) && ! size_equal (e, a)) error ("ss: system matrices a(%dx%d) and e(%dx%d) are incompatible", arows, acols, rows (e), columns (e)); endif endfunction control/inst/__str2idx__.m0000644000076500000240000000254412614620313015071 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Get input/output indices from in/outgroup and in/outname. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2013 ## Version: 0.1 function idx = __str2idx__ (group, name, str, id) if (isfield (group, str)) idx = group.(str)(:); else tmp = strcmp (name, str)(:); switch (nnz (tmp)) case 1 idx = find (tmp); case 0 error ("lti: %sgroup or %sname '%s' not found", id, id, str); otherwise error ("lti: %sname '%s' is ambiguous", id, str); ## FIXME: error for structure arrays endswitch endif endfunction control/inst/__tf_dim__.m0000644000076500000240000000235112614620313014730 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of outputs and inputs of transfer function numerator and ## denominator. For internal use only. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [nrows, ncols] = __tf_dim__ (num, den) [nrows, ncols] = size (num); [drows, dcols] = size (den); if (nrows != drows || ncols != dcols) error ("tf: arguments 'num' (%dx%d) and 'den' (%dx%d) must have equal dimensions", nrows, ncols, drows, dcols); endif endfunction control/inst/__time_response__.m0000644000076500000240000003245312614620313016350 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for the time response functions step, impulse and initial. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function [y, t, x] = __time_response__ (response, args, nout) idx = cellfun (@islogical, args); tmp = cellfun (@double, args(idx), "uniformoutput", false); args(idx) = tmp; sys_idx = cellfun (@isa, args, {"lti"}); # LTI models mat_idx = cellfun (@is_real_matrix, args); # matrices sty_idx = cellfun (@ischar, args); # strings (style arguments) inv_idx = ! (sys_idx | mat_idx | sty_idx); # invalid arguments if (any (inv_idx)) warning ("%s: arguments number %s are invalid and are being ignored", ... response, mat2str (find (inv_idx)(:).')); endif if (nnz (sys_idx) == 0) error ("%s: require at least one LTI model", response); endif if (nout > 0 && (nnz (sys_idx) > 1 || any (sty_idx))) evalin ("caller", "print_usage ()"); endif if (! size_equal (args{sys_idx})) error ("%s: all LTI models must have equal size", response); endif if (any (find (sty_idx) < find (sys_idx)(1))) warning ("%s: strings in front of first LTI model are being ignored", response); endif tfinal = []; dt = []; x0 = []; # default arguments switch (response) case "initial" switch (nnz (mat_idx)) case 0 error ("initial: require initial state vector 'x0'"); case 1 x0 = args{mat_idx}; case 2 [x0, tfinal] = args{mat_idx}; case 3 [x0, tfinal, dt] = args{mat_idx}; otherwise evalin ("caller", "print_usage ()"); endswitch if (! is_real_vector (x0)) error ("initial: initial state vector 'x0' must be a real-valued vector"); endif case {"step", "impulse", "ramp"} switch (nnz (mat_idx)) case 0 ## nothing to here, just prevent case 'otherwise' case 1 tfinal = args{mat_idx}; case 2 [tfinal, dt] = args{mat_idx}; otherwise evalin ("caller", "print_usage ()"); endswitch otherwise error ("time_response: invalid response type '%s'", response); endswitch if (issample (tfinal) || isempty (tfinal)) ## nothing to do here elseif (is_real_vector (tfinal)) dt = abs (tfinal(end) - tfinal(1)) / (length (tfinal) - 1); tfinal = abs (tfinal(end)); else evalin ("caller", "print_usage ()"); endif if (isempty (dt)) ## nothing to do here elseif (issample (dt)) ## nothing to do here else evalin ("caller", "print_usage ()"); endif [tfinal, dt] = cellfun (@__sim_horizon__, args(sys_idx), {tfinal}, {dt}, "uniformoutput", false); tfinal = max ([tfinal{:}]); ct_idx = cellfun (@isct, args(sys_idx)); sys_dt = args(sys_idx); tmp = cellfun (@c2d, args(sys_idx)(ct_idx), dt(ct_idx), {"zoh"}, "uniformoutput", false); sys_dt(ct_idx) = tmp; ## time vector t = cellfun (@(dt) vec (linspace (0, tfinal, tfinal/dt+1)), dt, "uniformoutput", false); ## alternative code ## t = cellfun (@(dt) vec (0 : dt : tfinal), dt, "uniformoutput", false); ## function [y, x_arr] = __initial_response__ (sys_dt, t, x0) ## function [y, x_arr] = __step_response__ (sys_dt, t) ## function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) ## function [y, x_arr] = __ramp_response__ (sys_dt, t) switch (response) case "initial" [y, x] = cellfun (@__initial_response__, sys_dt, t, {x0}, "uniformoutput", false); case "step" [y, x] = cellfun (@__step_response__, sys_dt, t, "uniformoutput", false); case "impulse" [y, x] = cellfun (@__impulse_response__, args(sys_idx), sys_dt, t, "uniformoutput", false); case "ramp" [y, x] = cellfun (@__ramp_response__, sys_dt, t, "uniformoutput", false); otherwise error ("time_response: invalid response type"); endswitch if (nout == 0) # display plot ## extract plotting styles tmp = cumsum (sys_idx); tmp(sys_idx | ! sty_idx) = 0; n_sys = nnz (sys_idx); sty = arrayfun (@(x) args(tmp == x), 1:n_sys, "uniformoutput", false); ## default plotting styles if empty colororder = get (gca, "colororder"); rc = rows (colororder); def = arrayfun (@(k) {"color", colororder(1+rem (k-1, rc), :)}, 1:n_sys, "uniformoutput", false); idx = cellfun (@isempty, sty); sty(idx) = def(idx); ## get system names for legend leg = cell (1, n_sys); idx = find (sys_idx); for k = 1 : n_sys leg{k} = evalin ("caller", sprintf ("inputname(%d)", idx(k)), "''"); endfor outname = get (args(sys_idx){end}, "outname"); outname = __labels__ (outname, "y"); [p, m] = size (args(sys_idx){1}); switch (response) case "initial" str = "Response to Initial Conditions"; cols = 1; ## yfinal = zeros (p, 1); case "step" str = "Step Response"; cols = m; ## yfinal = dcgain (sys_cell{1}); case "impulse" str = "Impulse Response"; cols = m; ## yfinal = zeros (p, m); case "ramp" str = "Ramp Response"; cols = m; otherwise error ("time_response: invalid response type"); endswitch for k = 1 : n_sys # for every system if (ct_idx(k)) # continuous-time system for i = 1 : p # for every output for j = 1 : cols # for every input (except for initial where cols=1) if (p != 1 || cols != 1) subplot (p, cols, (i-1)*cols+j); endif plot (t{k}, y{k}(:, i, j), sty{k}{:}); hold on; grid on; if (k == n_sys) axis tight ylim (__axis_margin__ (ylim)) if (j == 1) ylabel (outname{i}); if (i == 1) title (str); endif endif endif endfor endfor else # discrete-time system for i = 1 : p # for every output for j = 1 : cols # for every input (except for initial where cols=1) if (p != 1 || cols != 1) subplot (p, cols, (i-1)*cols+j); endif stairs (t{k}, y{k}(:, i, j), sty{k}{:}); hold on; grid on; if (k == n_sys) axis tight; ylim (__axis_margin__ (ylim)) if (j == 1) ylabel (outname{i}); if (i == 1) title (str); endif endif endif endfor endfor endif endfor xlabel ("Time [s]"); if (p == 1 && m == 1) legend (leg) endif hold off; endif endfunction function [y, x_arr] = __initial_response__ (sys_dt, t, x0) [F, G, C, D] = ssdata (sys_dt); # system must be proper n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p); x_arr = zeros (l_t, n); ## initial conditions x = reshape (x0, [], 1); # make sure that x is a column vector if (n != length (x0) || ! is_real_vector (x0)) error ("initial: x0 must be a real vector with %d elements", n); endif ## simulation for k = 1 : l_t y(k, :) = C * x; x_arr(k, :) = x; x = F * x; endfor endfunction function [y, x_arr] = __step_response__ (sys_dt, t) [F, G, C, D] = ssdata (sys_dt); # system must be proper n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p, m); x_arr = zeros (l_t, n, m); for j = 1 : m # for every input channel ## initial conditions x = zeros (n, 1); u = zeros (m, 1); u(j) = 1; ## simulation for k = 1 : l_t y(k, :, j) = C * x + D * u; x_arr(k, :, j) = x; x = F * x + G * u; endfor endfor endfunction function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) [~, B] = ssdata (sys); [F, G, C, D, dt] = ssdata (sys_dt); # system must be proper dt = abs (dt); # use 1 second if tsam is unspecified (-1) discrete = ! isct (sys); n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p, m); x_arr = zeros (l_t, n, m); for j = 1 : m # for every input channel ## initial conditions u = zeros (m, 1); u(j) = 1; if (discrete) x = zeros (n, 1); # zero by definition y(1, :, j) = D * u / dt; x_arr(1, :, j) = x; x = G * u / dt; else x = B * u; # B, not G! y(1, :, j) = C * x; x_arr(1, :, j) = x; x = F * x; endif ## simulation for k = 2 : l_t y (k, :, j) = C * x; x_arr(k, :, j) = x; x = F * x; endfor endfor if (discrete) y *= dt; x_arr *= dt; endif endfunction function [y, x_arr] = __ramp_response__ (sys_dt, t) [F, G, C, D] = ssdata (sys_dt); # system must be proper n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p, m); x_arr = zeros (l_t, n, m); for j = 1 : m # for every input channel ## initial conditions x = zeros (n, 1); u = zeros (m, l_t); u(j, :) = t; ## simulation for k = 1 : l_t y(k, :, j) = C * x + D * u(:, k); x_arr(k, :, j) = x; x = F * x + G * u(:, k); endfor endfor endfunction function [tfinal, dt] = __sim_horizon__ (sys, tfinal, Ts) ## code based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel TOL = 1.0e-10; # values below TOL are assumed to be zero N_MIN = 50; # min number of points N_MAX = 2000; # max number of points N_DEF = 1000; # default number of points T_DEF = 10; # default simulation time ev = pole (sys); n = length (ev); # number of states/poles continuous = isct (sys); discrete = ! continuous; if (discrete) dt = Ts = abs (get (sys, "tsam")); ## perform bilinear transformation on poles in z for k = 1 : n pol = ev(k); if (abs (pol + 1) < TOL) ev(k) = 0; else ev(k) = 2 / Ts * (pol - 1) / (pol + 1); endif endfor endif ## remove poles near zero from eigenvalue array ev nk = n; for k = 1 : n if (abs (real (ev(k))) < TOL) ev(k) = 0; nk -= 1; endif endfor if (nk == 0) if (isempty (tfinal)) tfinal = T_DEF; endif if (continuous) dt = tfinal / N_DEF; endif else ev = ev(find (ev)); ev_max = max (abs (ev)); if (continuous) dt = 0.2 * pi / ev_max; endif if (isempty (tfinal)) ev_min = min (abs (real (ev))); tfinal = 5.0 / ev_min; ## round up yy = 10^(ceil (log10 (tfinal)) - 1); tfinal = yy * ceil (tfinal / yy); endif if (continuous) N = tfinal / dt; if (N < N_MIN) dt = tfinal / N_MIN; endif if (N > N_MAX) dt = tfinal / N_MAX; endif endif endif if (continuous && ! isempty (Ts)) # catch case cont. system with dt specified dt = Ts; endif endfunction control/inst/__tito_dim__.m0000644000076500000240000000307412614620313015301 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## Extract nmeas and ncon from plant P which has been partitioned by mktito. ## Author: Lukas Reichlin ## Created: January 2014 ## Version: 0.1 function [nmeas, ncon] = __tito_dim__ (P, name) [p, m] = size (P); outgroup = P.outgroup; ingroup = P.ingroup; if (! isfield (outgroup, "V")) error ("%s: missing outgroup 'V'", name); endif if (! isfield (ingroup, "U")) error ("%s: missing ingroup 'U'", name); endif nmeas = numel (outgroup.V); ncon = numel (ingroup.U); ## check whether indices of V and U are in ascending order ## and at the end of the outputs/inputs if (! isequal (outgroup.V(:), (p-nmeas+1:p)(:))) error ("%s: outgroup 'V' invalid", name); endif if (! isequal (ingroup.U(:), (m-ncon+1:m)(:))) error ("%s: ingroup 'U' invalid", name); endif endfunction control/inst/Anderson.m0000644000076500000240000000506012614620313014443 0ustar lukasstaff%% -*- texinfo -*- %% Frequency-weighted coprime factorization controller reduction. % =============================================================================== % Coprime Factorization Controller Reduction Lukas Reichlin December 2011 % =============================================================================== % Reference: Anderson, B.D.O.: Controller Reduction: Concepts and Approaches % IEEE Transactions of Automatic Control, Vol. 34, No. 8, August 1989 % =============================================================================== % Tabula Rasa clear all, close all, clc % Plant A = [ -0.161 -6.004 -0.58215 -9.9835 -0.40727 -3.982 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 ]; B = [ 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]; C = [ 0.0 0.0 6.4432e-3 2.3196e-3 7.1252e-2 1.0002 0.10455 0.99551 ]; G = ss (A, B, C); % LQG Design H = [ 0.0 0.0 0.0 0.0 0.55 11.0 1.32 18.0 ]; q1 = 1e-6; q2 = 100; % [100, 1000, 2000] Q = q1 * H.' * H; R = 1; W = q2 * B * B.'; V = 1; F = lqr (G, Q, R) L = lqe (G, W, V) % Coprime Factorization using Balanced Truncation Approximation Kr = arrayfun (@(k) cfconred (G, F, L, k), 8:-1:2, 'uniformoutput', false); % 'method', 'bfsr-bta' T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (1) step (T{:}, 200) % Coprime Factorization using Singular Perturbation Approximation Kr = arrayfun (@(k) cfconred (G, F, L, k, 'method', 'bfsr-spa'), 8:-1:2, 'uniformoutput', false); T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (2) step (T{:}, 200) % Frequency-Weighted Coprime Factorization using BTA Kr = arrayfun (@(k) fwcfconred (G, F, L, k), 8:-1:2, 'uniformoutput', false); T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (3) step (T{:}, 300) control/inst/append.m0000644000076500000240000000221112614620313014134 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} append (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## Group @acronym{LTI} models by appending their inputs and outputs. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = append (varargin) if (nargin == 0) print_usage (); endif sys = blkdiag (varargin{:}); endfunction control/inst/arx.m0000644000076500000240000002552012614620313013467 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{'na'}, @var{na}, @var{'nb'}, @var{nb}) ## Estimate ARX model using QR factorization. ## @iftex ## @tex ## $$ A(q) \\, y(t) = B(q) \\, u(t) \\, + \\, e(t) $$ ## @end tex ## @end iftex ## @ifnottex ## ## @example ## A(q) y(t) = B(q) u(t) + e(t) ## @end example ## ## @end ifnottex ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata identification dataset containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting model @var{sys}. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time transfer function model. ## If the second output argument @var{x0} is returned, ## @var{sys} becomes a state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'na' ## Order of the polynomial A(q) and number of poles. ## ## @item 'nb' ## Order of the polynomial B(q)+1 and number of zeros+1. ## @var{nb} <= @var{na}. ## ## @item 'nk' ## Input-output delay specified as number of sampling instants. ## Scalar positive integer. This corresponds to a call to function ## @command{nkshift}, followed by padding the B polynomial with ## @var{nk} leading zeros. ## @end table ## ## ## @strong{Algorithm}@* ## Uses the formulae given in [1] on pages 318-319, ## 'Solving for the LS Estimate by QR Factorization'. ## For the initial conditions, SLICOT IB01CD is used by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @strong{References}@* ## [1] Ljung, L. (1999) ## @cite{System Identification: Theory for the User: Second Edition}. ## Prentice Hall, New Jersey, USA. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [sys, varargout] = arx (dat, varargin) ## TODO: delays if (nargin < 2) print_usage (); endif if (! isa (dat, "iddata") || ! dat.timedomain) error ("arx: first argument must be a time-domain iddata dataset"); endif ## p: outputs, m: inputs, ex: experiments [~, p, m, ex] = size (dat); # dataset dimensions if (is_real_scalar (varargin{1})) # arx (dat, n, ...) varargin = horzcat (varargin(2:end), {"na"}, varargin(1), {"nb"}, varargin(1)); endif if (isstruct (varargin{1})) # arx (dat, opt, ...), arx (dat, n, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("arx: keys and values must come in pairs"); endif ## default arguments na = []; nb = []; nk = 0; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case "na" na = __check_n__ (val, "na"); case "nb" nb = __check_n__ (val, "nb"); case "nk" nk = __check_n__ (val, "nk"); if (! issample (val, 0)) error ("arx: channel-wise 'nk' matrices not supported yet"); endif otherwise warning ("arx: invalid property name '%s' ignored", key); endswitch endfor if (any (nk(:) != 0)) dat = nkshift (dat, nk); endif ## extract data Y = dat.y; U = dat.u; tsam = dat.tsam; ## multi-experiment data requires equal sampling times if (ex > 1 && ! isequal (tsam{:})) error ("arx: require equally sampled experiments"); else tsam = tsam{1}; endif if (is_real_scalar (na, nb)) na = repmat (na, p, 1); # na(p-by-1) nb = repmat (nb, p, m); # nb(p-by-m) elseif (! (is_real_vector (na) && is_real_matrix (nb) ... && rows (na) == p && rows (nb) == p && columns (nb) == m)) error ("arx: require na(%dx1) instead of (%dx%d) and nb(%dx%d) instead of (%dx%d)", ... p, rows (na), columns (na), p, m, rows (nb), columns (nb)); endif max_nb = max (nb, [], 2); # one maximum for each row/output, max_nb(p-by-1) n = max (na, max_nb); # n(p-by-1) ## create empty cells for numerator and denominator polynomials num = cell (p, m+p); den = cell (p, m+p); ## MIMO (p-by-m) models are identified as p MISO (1-by-m) models ## For multi-experiment data, minimize the trace of the error for i = 1 : p # for every output Phi = cell (ex, 1); # one regression matrix per experiment for e = 1 : ex # for every experiment ## avoid warning: toeplitz: column wins anti-diagonal conflict ## therefore set first row element equal to y(1) PhiY = toeplitz (Y{e}(1:end-1, i), [Y{e}(1, i); zeros(na(i)-1, 1)]); ## create MISO Phi for every experiment PhiU = arrayfun (@(x) toeplitz (U{e}(1:end-1, x), [U{e}(1, x); zeros(nb(i,x)-1, 1)]), 1:m, "uniformoutput", false); Phi{e} = (horzcat (-PhiY, PhiU{:}))(n(i):end, :); endfor ## compute parameter vector Theta Theta = __theta__ (Phi, Y, i, n); ## extract polynomial matrices A and B from Theta ## A is a scalar polynomial for output i, i=1:p ## B is polynomial row vector (1-by-m) for output i A = [1; Theta(1:na(i))]; # a0 = 1, a1 = Theta(1), an = Theta(n) ThetaB = Theta(na(i)+1:end); # all polynomials from B are in one column vector B = mat2cell (ThetaB, nb(i,:)); # now separate the polynomials, one for each input B = reshape (B, 1, []); # make B a row cell (1-by-m) B = cellfun (@(B) [zeros(1+nk, 1); B], B, "uniformoutput", false); # b0 = 0 (leading zero required by filt) ## add error inputs Be = repmat ({0}, 1, p); # there are as many error inputs as system outputs (p) Be(i) = [zeros(1,nk), 1]; # inputs m+1:m+p are zero, except m+i which is one num(i, :) = [B, Be]; # numerator polynomials for output i, individual for each input den(i, :) = repmat ({A}, 1, m+p); # in a row (output i), all inputs have the same denominator polynomial endfor ## A(q) y(t) = B(q) u(t) + e(t) ## there is only one A per row ## B(z) and A(z) are a Matrix Fraction Description (MFD) ## y = A^-1(q) B(q) u(t) + A^-1(q) e(t) ## since A(q) is a diagonal polynomial matrix, its inverse is trivial: ## the corresponding transfer function has common row denominators. sys = filt (num, den, tsam); # filt creates a transfer function in z^-1 ## compute initial state vector x0 if requested ## this makes only sense for state-space models, therefore convert TF to SS if (nargout > 1) sys = prescale (ss (sys(:,1:m))); x0 = __sl_ib01cd__ (Y, U, sys.a, sys.b, sys.c, sys.d, 0.0); ## return x0 as vector for single-experiment data ## instead of a cell containing one vector if (numel (x0) == 1) x0 = x0{1}; endif varargout{1} = x0; endif endfunction function Theta = __theta__ (Phi, Y, i, n) if (numel (Phi) == 1) # single-experiment dataset ## use "square-root algorithm" A = horzcat (Phi{1}, Y{1}(n(i)+1:end, i)); # [Phi, Y] R0 = triu (qr (A, 0)); # 0 for economy-size R (without zero rows) R1 = R0(1:end-1, 1:end-1); # R1 is triangular - can we exploit this in R1\R2? R2 = R0(1:end-1, end); Theta = __ls_svd__ (R1, R2); # R1 \ R2 ## Theta = Phi \ Y(n+1:end, :); # naive formula ## Theta = __ls_svd__ (Phi{1}, Y{1}(n(i)+1:end, i)); else # multi-experiment dataset ## TODO: find more sophisticated formula than ## Theta = (Phi1' Phi1 + Phi2' Phi2 + ...) \ (Phi1' Y1 + Phi2' Y2 + ...) ## covariance matrix C = (Phi1' Phi + Phi2' Phi2 + ...) tmp = cellfun (@(Phi) Phi.' * Phi, Phi, "uniformoutput", false); ## rc = cellfun (@rcond, tmp); # also test C? QR or SVD? C = plus (tmp{:}); ## PhiTY = (Phi1' Y1 + Phi2' Y2 + ...) tmp = cellfun (@(Phi, Y) Phi.' * Y(n(i)+1:end, i), Phi, Y, "uniformoutput", false); PhiTY = plus (tmp{:}); ## pseudoinverse Theta = C \ Phi'Y Theta = __ls_svd__ (C, PhiTY); endif endfunction function x = __ls_svd__ (A, b) ## solve the problem Ax=b ## x = A\b would also work, ## but this way we have better control and warnings ## solve linear least squares problem by pseudoinverse ## the pseudoinverse is computed by singular value decomposition ## M = U S V* ---> M+ = V S+ U* ## Th = Ph \ Y = Ph+ Y ## Th = V S+ U* Y, S+ = 1 ./ diag (S) [U, S, V] = svd (A, 0); # 0 for "economy size" decomposition S = diag (S); # extract main diagonal r = sum (S > eps*S(1)); if (r < length (S)) warning ("arx: rank-deficient coefficient matrix"); warning ("sampling time too small"); warning ("persistence of excitation"); endif V = V(:, 1:r); S = S(1:r); U = U(:, 1:r); x = V * (S .\ (U' * b)); # U' is the conjugate transpose endfunction function val = __check_n__ (val, str = "n") if (! is_real_matrix (val) || fix (val) != val) error ("arx: argument '%s' must be a positive integer", str); endif endfunction control/inst/augstate.m0000644000076500000240000000353712614620313014516 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{augsys} =} augstate (@var{sys}) ## Append state vector x of system @var{sys} to output vector y. ## ## @example ## @group ## . . ## x = A x + B u x = A x + B u ## y = C x + D u => y = C x + D u ## x = I x + O u ## @end group ## @end example ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2015 ## Version: 0.1 function augsys = augstate (sys) if (nargin != 1 || ! isa (sys, "lti")) print_usage (); endif if (! isa (sys, "ss")) warning ("augstate: system not in state-space form"); sys = ss (sys); endif [a, b, c, d, e, tsam] = dssdata (sys, []); [inn, stn, outn, ing, outg] = get (sys, "inname", "stname", "outname", "ingroup", "outgroup"); [p, m] = size (d); n = rows (a); caug = vertcat (c, eye (n)); daug = vertcat (d, zeros (n, m)); outname = vertcat (outn, stn); augsys = dss (a, b, caug, daug, e, tsam); augsys = set (augsys, "inname", inn, "stname", stn, "outname", outname, ... "ingroup", ing, "outgroup", outg); endfunction control/inst/augw.m0000644000076500000240000001235112614620313013636 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{P} =} augw (@var{G}, @var{W1}, @var{W2}, @var{W3}) ## Extend plant for stacked S/KS/T problem. Subsequently, the robust control problem ## can be solved by h2syn or hinfsyn. ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of plant. ## @item W1 ## @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W2 ## @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W3 ## @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of ## complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. ## @end table ## ## All inputs must be proper/realizable. ## Scalars, vectors and matrices are possible instead of @acronym{LTI} models. ## ## @strong{Outputs} ## @table @var ## @item P ## State-space model of augmented plant. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## | W1 | -W1*G | z1 = W1 r - W1 G u ## | 0 | W2 | z2 = W2 u ## P = | 0 | W3*G | z3 = W3 G u ## |----+-------| ## | I | -G | e = r - G u ## @end group ## @end example ## @example ## @group ## +------+ z1 ## +---------------------------------------->| W1 |-----> ## | +------+ ## | +------+ z2 ## | +---------------------->| W2 |-----> ## | | +------+ ## r + e | +--------+ u | +--------+ y +------+ z3 ## ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ## ^ - +--------+ +--------+ | +------+ ## | | ## +----------------------------------------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## | |-----> z1 (p1x1) z1 = W1 e ## r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u ## | |-----> z3 (p3x1) z3 = W3 y ## u (mx1) ----->| |-----> e (px1) e = r - y ## +--------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## r ----->| |-----> z ## | P(s) | ## u +---->| |-----+ e ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## @end group ## @end example ## ## @strong{References}@* ## [1] Skogestad, S. and Postlethwaite I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley. ## ## @seealso{h2syn, hinfsyn, mixsyn} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.4 function P = augw (G, W1 = [], W2 = [], W3 = []) if (nargin == 0 || nargin > 4) print_usage (); endif G = ss (G); [p, m] = size (G); [W1, p1, m1] = __adjust_weighting__ (W1, p); [W2, p2, m2] = __adjust_weighting__ (W2, m); [W3, p3, m3] = __adjust_weighting__ (W3, p); ## Pr = [1; 0; 0; 1]; ## Pu = [-1; 0; 1; -1]*G + [0; 1; 0; 0]; Pr = ss ([eye(m1,p) ; zeros(m2,p); zeros(m3,p); eye(p,p) ]); Pu1 = ss ([-eye(m1,p) ; zeros(m2,p); eye(m3,p) ; -eye(p,p) ]); Pu2 = ss ([zeros(m1,m); eye(m2,m) ; zeros(m3,m); zeros(p,m) ]); Pu = Pu1 * G + Pu2; P = blkdiag (W1, W2, W3, eye (p, p)) * [Pr, Pu]; P = mktito (P, p, m); endfunction function [W, p, m] = __adjust_weighting__ (W, s) W = ss (W); [p, m] = size (W); if (m == 0 || m == s) # model is empty or has s inputs return; elseif (m == 1) # model is SISO or SIMO tmp = cell (s, 1); tmp(1:s) = W; W = blkdiag (tmp{:}); # stack single-input model s times [p, m] = size (W); # weighting function now of correct size else # model is MIMO or MISO error ("augw: %s must have 1 or %d inputs", inputname (1), s); endif endfunction control/inst/BMWengine.m0000644000076500000240000000672112614620313014512 0ustar lukasstaff## -*- texinfo -*- ## @deftypefn{Function File} {@var{sys} =} BMWengine () ## @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"scaled"}) ## @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"unscaled"}) ## Model of the BMW 4-cylinder engine at ETH Zurich's control laboratory. ## @example ## @group ## OPERATING POINT ## Drosselklappenstellung alpha_DK = 10.3 Grad ## Saugrohrdruck p_s = 0.48 bar ## Motordrehzahl n = 860 U/min ## Lambda-Messwert lambda = 1.000 ## Relativer Wandfilminhalt nu = 1 ## @end group ## @end example ## @example ## @group ## INPUTS ## U_1 Sollsignal Drosselklappenstellung [Grad] ## U_2 Relative Einspritzmenge [-] ## U_3 Zuendzeitpunkt [Grad KW] ## M_L Lastdrehmoment [Nm] ## @end group ## @end example ## @example ## @group ## STATES ## X_1 Drosselklappenstellung [Grad] ## X_2 Saugrohrdruck [bar] ## X_3 Motordrehzahl [U/min] ## X_4 Messwert Lamba-Sonde [-] ## X_5 Relativer Wandfilminhalt [-] ## @end group ## @end example ## @example ## @group ## OUTPUTS ## Y_1 Motordrehzahl [U/min] ## Y_2 Messwert Lambda-Sonde [-] ## @end group ## @end example ## @example ## @group ## SCALING ## U_1N, X_1N 1 Grad ## U_2N, X_4N, X_5N, Y_2N 0.05 ## U_3N 1.6 Grad KW ## X_2N 0.05 bar ## X_3N, Y_1N 200 U/min ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.1.1 ## TODO: translate German terminology function sys = BMWengine (flg = "scaled") if (nargin > 1) print_usage (); endif switch (tolower (flg)) case "unscaled" ## Linearisiertes Modell, nicht skaliert Apu = [ -40.0000 0 0 0 0 0.1683 -2.9471 -0.0016 0 0 26.6088 920.3932 -0.1756 0 259.1700 -0.5852 14.1941 0.0061 -5.7000 -5.7000 0.6600 -1.1732 -0.0052 0 -15.0000 ]; Bpu = [ 40.0000 0 0 0 0 0 0 181.4190 1.5646 0 -3.9900 0 0 4.5000 0 ]; Bdpu = [ 0 0 -15.9000 0 0 ]; Cpu = [ 0 0 1 0 0 0 0 0 1 0 ]; sys = ss (Apu, [Bpu, Bdpu], Cpu); case "scaled" ## Skaliertes Zustandsraummodell Ap = [ -40.0000 0 0 0 0 3.3659 -2.9471 -6.5157 0 0 0.1330 0.2301 -0.1756 0 0.0648 -11.7043 14.1941 24.3930 -5.7000 -5.7000 13.2003 -1.1732 -20.9844 0 -15.0000 ]; Bp = [ 40.0000 0 0 0 0 0 0 0.0454 0.0125 0 -3.9900 0 0 4.5000 0 ]; Bdp = [ 0 0 -1.5900 0 0 ]; Cp = [ 0 0 1 0 0 0 0 0 1 0 ]; sys = ss (Ap, [Bp, Bdp], Cp, [], "scaled", true); otherwise print_usage (); endswitch endfunction control/inst/bode.m0000644000076500000240000000660712614620313013613 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} bode (@var{sys}) ## @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} bode (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}, @var{w}) ## Bode diagram of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Vector of magnitude. Has length of frequency vector @var{w}. ## @item pha ## Vector of phase. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{nichols, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 1.0 function [mag_r, pha_r, w_r] = bode (varargin) if (nargin == 0) print_usage (); endif [H, w, sty, leg] = __frequency_response__ ("bode", varargin, nargout); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); mag = cellfun (@abs, H, "uniformoutput", false); pha = cellfun (@(H) unwrap (arg (H)) * 180 / pi, H, "uniformoutput", false); if (! nargout) mag_db = cellfun (@mag2db, mag, "uniformoutput", false); mag_args = horzcat (cellfun (@horzcat, w, mag_db, sty, "uniformoutput", false){:}); pha_args = horzcat (cellfun (@horzcat, w, pha, sty, "uniformoutput", false){:}); subplot (2, 1, 1) semilogx (mag_args{:}) axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") title ("Bode Diagram") ylabel ("Magnitude [dB]") subplot (2, 1, 2) semilogx (pha_args{:}) axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") xlabel ("Frequency [rad/s]") ylabel ("Phase [deg]") legend (leg) else mag_r = mag{1}; pha_r = pha{1}; w_r = w{1}; endif endfunction control/inst/bodemag.m0000644000076500000240000000576412614620313014303 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} bodemag (@var{sys}) ## @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}, @var{w}) ## Bode magnitude diagram of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Vector of magnitude. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bode, nichols, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 1.0 function [mag_r, w_r] = bodemag (varargin) if (nargin == 0) print_usage (); endif [H, w, sty, leg] = __frequency_response__ ("bodemag", varargin, nargout); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); mag = cellfun (@abs, H, "uniformoutput", false); if (! nargout) mag_db = cellfun (@mag2db, mag, "uniformoutput", false); mag_args = horzcat (cellfun (@horzcat, w, mag_db, sty, "uniformoutput", false){:}); semilogx (mag_args{:}) axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") title ("Bode Magnitude Diagram") xlabel ("Frequency [rad/s]") ylabel ("Magnitude [dB]") legend (leg) else mag_r = mag{1}; w_r = w{1}; endif endfunction control/inst/Boeing707.m0000644000076500000240000000433312614620313014335 0ustar lukasstaff## Copyright (C) 1997, 2000, 2004, 2005, 2006, 2007 Kai P. Mueller ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} Boeing707 () ## Creates a linearized state-space model of a Boeing 707-321 aircraft ## at @var{v}=80 m/s ## @iftex ## @tex ## ($M = 0.26$, $G_{a0} = -3^{\\circ}$, ${\\alpha}_0 = 4^{\\circ}$, ${\\kappa}= 50^{\\circ}$). ## @end tex ## @end iftex ## @ifnottex ## (@var{M} = 0.26, @var{Ga0} = -3 deg, @var{alpha0} = 4 deg, @var{kappa} = 50 deg). ## @end ifnottex ## ## System inputs: (1) thrust and (2) elevator angle. ## ## System outputs: (1) airspeed and (2) pitch angle. ## ## @strong{Reference}: R. Brockhaus: @cite{Flugregelung} (Flight ## Control), Springer, 1994. ## @end deftypefn ## Author: Kai P. Mueller ## Created: September 28, 1997 function outsys = Boeing707 () if (nargin != 0) print_usage (); endif a = [-0.46E-01, 0.10681415316, 0.0, -0.17121680433; -0.1675901504661613, -0.515, 1.0, 0.6420630320636088E-02; 0.1543104215347786, -0.547945, -0.906, -0.1521689385990753E-02; 0.0, 0.0, 1.0, 0.0]; b = [0.1602300107479095, 0.2111848453E-02; 0.8196877780963616E-02, -0.3025E-01; 0.9173594317692437E-01, -0.75283075; 0.0, 0.0]; c = [1.0, 0.0, 0.0, 0.0; 0.0, 0.0, 0.0, 1.0]; d = zeros (2, 2); inam = {"thrust"; "rudder"}; onam = {"speed"; "pitch"}; ## snam = {"x1"; "x2"; "x3"; "x4"}; outsys = ss (a, b, c, d, "inname", inam, "outname", onam); endfunction control/inst/bstmodred.m0000644000076500000240000003040112614620313014652 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by Balanced Stochastic Truncation (BST) method. ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## BST is a relative error method which tries to minimize ## @iftex ## @tex ## $$ || G^{-1} (G-G_r) ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## ||G (G-Gr)|| = min ## inf ## @end example ## @end ifnottex ## ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values of the phase system corresponding ## to the @var{alpha}-stable part of the original system @var{G}. ## The @var{ns} Hankel singular values are ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is the sum of NU and the number of ## Hankel singular values greater than @code{MAX(TOL1,NS*EPS)}; ## @var{nr} can be further reduced to ensure that ## @code{HSV(NR-NU) > HSV(NR+1-NU)}. ## ## @item 'method' ## Approximation method for the H-infinity norm. ## Valid values corresponding to this key are: ## @table @var ## @item 'sr-bta', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr-bta', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @item 'sr-spa', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr-spa', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'beta' ## Use @code{[G, beta*I]} as new system @var{G} to combine ## absolute and relative error methods. ## BETA > 0 specifies the absolute/relative error weighting ## parameter. A large positive value of BETA favours the ## minimization of the absolute approximation error, while a ## small value of BETA is appropriate for the minimization ## of the relative error. ## BETA = 0 means a pure relative error method and can be ## used only if rank(G.D) = rows(G.D) which means that ## the feedthrough matrice must not be rank-deficient. ## Default value is 0. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of reduced system. ## For model reduction, the recommended value of @var{tol1} lies ## in the interval [0.00001, 0.001]. @var{tol1} < 1. ## If @var{tol1} <= 0 on entry, the used default value is ## @var{tol1} = NS*EPS, where NS is the number of ## ALPHA-stable eigenvalues of A and EPS is the machine ## precision. ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the phase system (see METHOD) corresponding ## to the ALPHA-stable part of the given system. ## The recommended value is TOL2 = NS*EPS. TOL2 <= TOL1 < 1. ## This value is used by default if @var{'tol2'} is not specified ## or if TOL2 <= 0 on entry. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## BST is often suitable to perform model reduction in order to obtain ## low order design models for controller synthesis. ## ## Approximation Properties: ## @itemize @bullet ## @item ## Guaranteed stability of reduced models ## @item ## Approximates simultaneously gain and phase ## @item ## Preserves non-minimum phase zeros ## @item ## Guaranteed a priori error bound ## @iftex ## @tex ## $$ || G^{-1} (G-G_r) ||_{\\infty} \\leq 2 \\sum_{j=r+1}^{n} {1+\\sigma_j \\over 1-\\sigma_j} - 1 $$ ## @end tex ## @end iftex ## @end itemize ## ## @strong{Algorithm}@* ## Uses SLICOT AB09HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [Gr, info] = bstmodred (G, varargin) if (nargin == 0) print_usage (); endif if (! isa (G, "lti")) error ("bstmodred: first argument must be an LTI system"); endif if (nargin > 1) # bstmodred (G, ...) if (is_real_scalar (varargin{1})) # bstmodred (G, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # bstmodred (G, opt, ...), bstmodred (G, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from bstmodred (G, nr, ...) ## and bstmodred (G, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("bstmodred: keys and values must come in pairs"); endif [a, b, c, d, tsam, scaled] = ssdata (G); dt = isdt (G); ## default arguments alpha = __modred_default_alpha__ (dt); beta = 0; tol1 = 0; tol2 = 0; ordsel = 1; nr = 0; job = 1; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"order", "nr"} [nr, ordsel] = __modred_check_order__ (val, rows (a)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "beta" if (! issample (val, 0)) error ("bstmodred: argument %s must be BETA >= 0", varargin{k}); endif beta = val; case "method" # approximation method switch (tolower (val)) case {"sr-bta", "b"} # 'B': use the square-root Balance & Truncate method job = 0; case {"bfsr-bta", "f"} # 'F': use the balancing-free square-root Balance & Truncate method job = 1; case {"sr-spa", "s"} # 'S': use the square-root Singular Perturbation Approximation method job = 2; case {"bfsr-spa", "p"} # 'P': use the balancing-free square-root Singular Perturbation Approximation method job = 3; otherwise error ("bstmodred: '%s' is an invalid approximation method", val); endswitch case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); otherwise warning ("bstmodred: invalid property name '%s' ignored", key); endswitch endfor ## perform model order reduction [ar, br, cr, dr, nr, hsv, ns] = __sl_ab09hd__ (a, b, c, d, dt, scaled, job, nr, ordsel, alpha, beta, ... tol1, tol2); ## assemble reduced order model Gr = ss (ar, br, cr, dr, tsam); ## assemble info struct n = rows (a); nu = n - ns; info = struct ("n", n, "ns", ns, "hsv", hsv, "nu", nu, "nr", nr); endfunction %!shared Mo, Me, Info, HSVe %! A = [ -0.04165 0.0000 4.9200 -4.9200 0.0000 0.0000 0.0000 %! -5.2100 -12.500 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 3.3300 -3.3300 0.0000 0.0000 0.0000 0.0000 %! 0.5450 0.0000 0.0000 0.0000 -0.5450 0.0000 0.0000 %! 0.0000 0.0000 0.0000 4.9200 -0.04165 0.0000 4.9200 %! 0.0000 0.0000 0.0000 0.0000 -5.2100 -12.500 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 3.3300 -3.3300 ]; %! %! B = [ 0.0000 0.0000 %! 12.500 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 12.500 %! 0.0000 0.0000 ]; %! %! C = [ 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 ]; %! %! D = [ 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 ]; %! %! G = ss (A, B, C, D, "scaled", true); %! %! [Gr, Info] = bstmodred (G, "beta", 1.0, "tol1", 0.1, "tol2", 0.0); %! [Ao, Bo, Co, Do] = ssdata (Gr); %! %! Ae = [ 1.2729 0.0000 6.5947 0.0000 -3.4229 %! 0.0000 0.8169 0.0000 2.4821 0.0000 %! -2.9889 0.0000 -2.9028 0.0000 -0.3692 %! 0.0000 -3.3921 0.0000 -3.1126 0.0000 %! -1.4767 0.0000 -2.0339 0.0000 -0.6107 ]; %! %! Be = [ 0.1331 -0.1331 %! -0.0862 -0.0862 %! -2.6777 2.6777 %! -3.5767 -3.5767 %! -2.3033 2.3033 ]; %! %! Ce = [ -0.6907 -0.6882 0.0779 0.0958 -0.0038 %! 0.0676 0.0000 0.6532 0.0000 -0.7522 %! 0.6907 -0.6882 -0.0779 0.0958 0.0038 ]; %! %! De = [ 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 ]; %! %! HSVe = [ 0.8803 0.8506 0.8038 0.4494 0.3973 0.0214 0.0209 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/btaconred.m0000644000076500000240000002110512614620313014631 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) ## ## Controller reduction by frequency-weighted Balanced Truncation Approximation (BTA). ## Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced ## order controller @var{Kr} such that the closed-loop system is stable and closed-loop ## performance is retained. ## ## The algorithm tries to minimize the frequency-weighted error ## @iftex ## @tex ## $$ || V \\ (K - K_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||V (K-Kr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the plant. ## It has m inputs, p outputs and n states. ## @item K ## @acronym{LTI} model of the controller. ## It has p inputs, m outputs and nc states. ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @item info.ncs ## The order of the alpha-stable part of original controller @var{K}. ## @item info.hsvc ## The Hankel singular values of the alpha-stable part of @var{K}. ## The @var{ncs} Hankel singular values are ordered decreasingly. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsvc} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @end table ## ## @item 'weight' ## Specifies the type of frequency-weighting as follows: ## @table @var ## @item 'none' ## No weightings are used (V = I, W = I). ## ## @item 'left', 'output' ## Use stability enforcing left (output) weighting ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = I $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = (I-G*K) *G , W = I ## @end example ## @end ifnottex ## ## @item 'right', 'input' ## Use stability enforcing right (input) weighting ## @iftex ## @tex ## $$ V = I, \\qquad W = (I - G K)^{-1} G $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = I , W = (I-G*K) *G ## @end example ## @end ifnottex ## ## @item 'both', 'performance' ## Use stability and performance enforcing weightings ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = (I - G K)^{-1} $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 -1 ## V = (I-G*K) *G , W = (I-G*K) ## @end example ## @end ifnottex ## Default value. ## @end table ## ## @item 'feedback' ## Specifies whether @var{K} is a positive or negative feedback controller: ## @table @var ## @item '+' ## Use positive feedback controller. Default value. ## @item '-' ## Use negative feedback controller. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{K.A}. For a continuous-time ## controller, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## controller, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time controllers and ## 1 for discrete-time controllers. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced controller. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ncs*eps*info.hsvc(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## controller. TOL2 <= TOL1. ## If not specified, ncs*eps*info.hsvc(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on @var{G} and @var{K} prior to order reduction. ## Default value is false if both @code{G.scaled == true, K.scaled == true} ## and true otherwise. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = btaconred (varargin) [Kr, info] = __conred_sb16ad__ ("bta", varargin{:}); endfunction %!shared Mo, Me, Info, HSVCe %! A = [ -1. 0. 4. %! 0. 2. 0. %! 0. 0. -3. ]; %! %! B = [ 1. %! 1. %! 1. ]; %! %! C = [ 1. 1. 1. ]; %! %! D = [ 0. ]; %! %! G = ss (A, B, C, D, "scaled", true); %! %! AC = [ -26.4000, 6.4023, 4.3868; %! 32.0000, 0, 0; %! 0, 8.0000, 0 ]; %! %! BC = [ -16 %! 0 %! 0 ]; %! %! CC = [ 9.2994 1.1624 0.1090 ]; %! %! DC = [ 0 ]; %! %! K = ss (AC, BC, CC, DC, "scaled", true); %! %! [Kr, Info] = btaconred (G, K, 2, "weight", "input", "feedback", "+"); %! [Ao, Bo, Co, Do] = ssdata (Kr); %! %! Ae = [ 9.1900 0.0000 %! 0.0000 -34.5297 ]; %! %! Be = [ -11.9593 %! 86.3137 ]; %! %! Ce = [ 2.8955 -1.3566 ]; %! %! De = [ 0.0000 ]; %! %! HSVCe = [ 3.8253 0.2005 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsvc, HSVCe, 1e-4); control/inst/btamodred.m0000644000076500000240000002373312614620313014642 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by frequency weighted Balanced Truncation Approximation (BTA) method. ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## BTA is an absolute error method which tries to minimize ## @iftex ## @tex ## $$ || G - G_r ||_{\\infty} = \\min $$ ## $$ || V \\ (G - G_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||G-Gr|| = min ## inf ## ## ||V (G-Gr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values of the @var{alpha}-stable part of ## the original system @var{G}, ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'left', 'output' ## @acronym{LTI} model of the left/output frequency weighting @var{V}. ## Default value is an identity matrix. ## ## @item 'right', 'input' ## @acronym{LTI} model of the right/input frequency weighting @var{W}. ## Default value is an identity matrix. ## ## @item 'method' ## Approximation method for the L-infinity norm to be used as follows: ## @table @var ## @item 'sr', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced model. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ns*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## model. TOL2 <= TOL1. ## If not specified, ns*eps*info.hsv(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'alpha-ctrb' ## Combination method parameter for defining the ## frequency-weighted controllability Grammian. ## abs(alphac) <= 1. ## If alphac = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphac = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'alpha-obsv' ## Combination method parameter for defining the ## frequency-weighted observability Grammian. ## abs(alphao) <= 1. ## If alphao = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphao = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## This is done by state transformations. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## Approximation Properties: ## @itemize @bullet ## @item ## Guaranteed stability of reduced models ## @item ## Lower guaranteed error bound ## @item ## Guaranteed a priori error bound ## @iftex ## @tex ## $$ \\sigma_{r+1} \\leq || (G-G_r) ||_{\\infty} \\leq 2 \\sum_{j=r+1}^{n} \\sigma_j $$ ## @end tex ## @end iftex ## @end itemize ## ## ## @strong{References}@* ## [1] Enns, D. ## @cite{Model reduction with balanced realizations: An error bound ## and a frequency weighted generalization}. ## Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. ## ## [2] Lin, C.-A. and Chiu, T.-Y. ## @cite{Model reduction via frequency-weighted balanced realization}. ## Control Theory and Advanced Technology, vol. 8, ## pp. 341-351, 1992. ## ## [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. ## @cite{New results on frequency weighted balanced reduction ## technique}. ## Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. ## ## [4] Varga, A. and Anderson, B.D.O. ## @cite{Square-root balancing-free methods for the frequency-weighted ## balancing related model reduction}. ## (report in preparation) ## ## ## @strong{Algorithm}@* ## Uses SLICOT AB09ID by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [Gr, info] = btamodred (varargin) [Gr, info] = __modred_ab09id__ ("bta", varargin{:}); endfunction %!shared Mo, Me, Info, HSVe %! A = [ -26.4000, 6.4023, 4.3868; %! 32.0000, 0, 0; %! 0, 8.0000, 0 ]; %! %! B = [ 16 %! 0 %! 0 ]; %! %! C = [ 9.2994 1.1624 0.1090 ]; %! %! D = [ 0 ]; %! %! G = ss (A, B, C, D); % "scaled", false %! %! AV = [ -1.0000, 0, 4.0000, -9.2994, -1.1624, -0.1090; %! 0, 2.0000, 0, -9.2994, -1.1624, -0.1090; %! 0, 0, -3.0000, -9.2994, -1.1624, -0.1090; %! 16.0000, 16.0000, 16.0000, -26.4000, 6.4023, 4.3868; %! 0, 0, 0, 32.0000, 0, 0; %! 0, 0, 0, 0, 8.0000, 0 ]; %! %! BV = [ 1 %! 1 %! 1 %! 0 %! 0 %! 0 ]; %! %! CV = [ 1 1 1 0 0 0 ]; %! %! DV = [ 0 ]; %! %! V = ss (AV, BV, CV, DV); %! %! [Gr, Info] = btamodred (G, 2, "left", V); %! [Ao, Bo, Co, Do] = ssdata (Gr); %! %! Ae = [ 9.1900 0.0000 %! 0.0000 -34.5297 ]; %! %! Be = [ 11.9593 %! 16.9329 ]; %! %! Ce = [ 2.8955 6.9152 ]; %! %! De = [ 0.0000 ]; %! %! HSVe = [ 3.8253 0.2005 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/care.m0000644000076500000240000001501012614620313013600 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Solve continuous-time algebraic Riccati equation (ARE). ## ## @strong{Inputs} ## @table @var ## @item a ## Real matrix (n-by-n). ## @item b ## Real matrix (n-by-m). ## @item q ## Real matrix (n-by-n). ## @item r ## Real matrix (m-by-m). ## @item s ## Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item x ## Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @item g ## Corresponding gain matrix (m-by-n). ## @end table ## ## @strong{Equations} ## @example ## @group ## -1 ## A'X + XA - XB R B'X + Q = 0 ## ## -1 ## A'X + XA - (XB + S) R (B'X + S') + Q = 0 ## ## -1 ## G = R B'X ## ## -1 ## G = R (B'X + S') ## ## L = eig (A - B*G) ## @end group ## @end example ## @example ## @group ## -1 ## A'XE + E'XA - E'XB R B'XE + Q = 0 ## ## -1 ## A'XE + E'XA - (E'XB + S) R (B'XE + S') + Q = 0 ## ## -1 ## G = R B'XE ## ## -1 ## G = R (B'XE + S) ## ## L = eig (A - B*G, E) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB02OD and SG02AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{dare, lqr, dlqr, kalman} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5.1 function [x, l, g] = care (a, b, q, r, s = [], e = []) ## TODO: extract feedback matrix g from SB02OD (and SG02AD) if (nargin < 4 || nargin > 6) print_usage (); endif if (! is_real_square_matrix (a, q, r)) ## error ("care: a, q, r must be real and square"); error ("care: %s, %s, %s must be real and square", ... inputname (1), inputname (3), inputname (4)); endif if (! is_real_matrix (b) || rows (a) != rows (b)) ## error ("care: a and b must have the same number of rows"); error ("care: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif if (columns (r) != columns (b)) ## error ("care: b and r must have the same number of columns"); error ("care: %s and %s must have the same number of columns", ... inputname (2), inputname (4)); endif if (! is_real_matrix (s) && ! size_equal (s, b)) ## error ("care: s(%dx%d) must be real and identically dimensioned with b(%dx%d)", ## rows (s), columns (s), rows (b), columns (b)); error ("care: %s(%dx%d) must be real and identically dimensioned with %s(%dx%d)", ... inputname (5), rows (s), columns (s), inputname (2), rows (b), columns (b)); endif if (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (e, a))) ## error ("care: a and e must have the same number of rows"); error ("care: %s and %s must have the same number of rows", ... inputname (1), inputname (6)); endif ## check stabilizability if (! isstabilizable (a, b, e, [], 0)) ## error ("care: (a, b) not stabilizable"); error ("care: (%s, %s) not stabilizable", ... inputname (1), inputname (2)); endif ## check positive semi-definiteness if (isempty (s)) t = zeros (size (b)); else t = s; endif m = [q, t; t.', r]; if (isdefinite (m) < 0) ## error ("care: require [q, s; s.', r] >= 0"); error ("care: require [%s, %s; %s.', %s] >= 0", ... inputname (3), inputname (5), inputname (5), inputname (4)); endif ## solve the riccati equation if (isempty (e)) if (isempty (s)) [x, l] = __sl_sb02od__ (a, b, q, r, b, false, false); g = r \ (b.'*x); # gain matrix else [x, l] = __sl_sb02od__ (a, b, q, r, s, false, true); g = r \ (b.'*x + s.'); # gain matrix endif else if (isempty (s)) [x, l] = __sl_sg02ad__ (a, e, b, q, r, b, false, false); g = r \ (b.'*x*e); # gain matrix else [x, l] = __sl_sg02ad__ (a, e, b, q, r, s, false, true); g = r \ (b.'*x*e + s.'); # gain matrix endif endif endfunction %!shared x, l, g, xe, le, ge %! a = [-3 2 %! 1 1]; %! %! b = [ 0 %! 1]; %! %! c = [ 1 -1]; %! %! r = 3; %! %! [x, l, g] = care (a, b, c.'*c, r); %! %! xe = [ 0.5895 1.8216 %! 1.8216 8.8188]; %! %! le = [-3.5026 %! -1.4370]; %! %! ge = [ 0.6072 2.9396]; %! %!assert (x, xe, 1e-4); %!assert (l, le, 1e-4); %!assert (g, ge, 1e-4); %!shared x, l, g, xe, le, ge %! a = [ 0.0 1.0 %! 0.0 0.0]; %! %! b = [ 0.0 %! 1.0]; %! %! c = [ 1.0 0.0 %! 0.0 1.0 %! 0.0 0.0]; %! %! d = [ 0.0 %! 0.0 %! 1.0]; %! %! [x, l, g] = care (a, b, c.'*c, d.'*d); %! %! xe = [ 1.7321 1.0000 %! 1.0000 1.7321]; %! %! le = [-0.8660 + 0.5000i %! -0.8660 - 0.5000i]; %! %! ge = [ 1.0000 1.7321]; %! %!assert (x, xe, 1e-4); %!assert (l, le, 1e-4); %!assert (g, ge, 1e-4); %!shared x, xe %! a = [ 0.0 1.0 %! 0.0 0.0 ]; %! %! e = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! b = [ 0.0 %! 1.0 ]; %! %! c = [ 1.0 0.0 %! 0.0 1.0 %! 0.0 0.0 ]; %! %! d = [ 0.0 %! 0.0 %! 1.0 ]; %! %! x = care (a, b, c.'*c, d.'*d, [], e); %! %! xe = [ 1.7321 1.0000 %! 1.0000 1.7321 ]; %! %!assert (x, xe, 1e-4); control/inst/cfconred.m0000644000076500000240000002667512614620313014474 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) ## ## Reduction of state-feedback-observer based controller by coprime factorization (CF). ## Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, ## determine a reduced order controller @var{Kr}. ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the open-loop plant (A,B,C,D). ## It has m inputs, p outputs and n states. ## @item F ## Stabilizing state feedback matrix (m-by-n). ## @item L ## Stabilizing observer gain matrix (n-by-p). ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.hsv ## The Hankel singular values of the extended system?!?. ## The @var{n} Hankel singular values are ordered decreasingly. ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr-bta', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr-bta', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @item 'sr-spa', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr-spa', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. ## @end table ## ## @item 'cf' ## Specifies whether left or right coprime factorization is ## to be used as follows: ## @table @var ## @item 'left', 'l' ## Use left coprime factorization. Default method. ## @item 'right', 'r' ## Use right coprime factorization. ## @end table ## ## @item 'feedback' ## Specifies whether @var{F} and @var{L} are fed back positively or negatively: ## @table @var ## @item '+' ## A+BK and A+LC are both Hurwitz matrices. ## @item '-' ## A-BK and A-LC are both Hurwitz matrices. Default value. ## @end table ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced system. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is n*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the coprime factorization controller. ## TOL2 <= TOL1. ## If not specified, n*eps*info.hsv(1) is chosen. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = cfconred (G, F, L, varargin) if (nargin < 3) print_usage (); endif if (! isa (G, "lti")) error ("cfconred: first argument must be an LTI system"); endif if (! is_real_matrix (F)) error ("cfconred: second argument must be a real matrix"); endif if (! is_real_matrix (L)) error ("cfconred: third argument must be a real matrix"); endif if (nargin > 3) # cfconred (G, F, L, ...) if (is_real_scalar (varargin{1})) # cfconred (G, F, L, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # cfconred (G, F, L, opt, ...), cfconred (G, F, L, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from cfconred (G, F, L, nr, ...) ## and cfconred (G, F, L, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("cfconred: keys and values must come in pairs"); endif [a, b, c, d, tsam, scaled] = ssdata (G); [p, m] = size (G); n = rows (a); [mf, nf] = size (F); [nl, pl] = size (L); dt = isdt (G); jobd = any (d(:)); if (mf != m || nf != n) error ("cfconred: dimensions of state-feedback matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... mf, nf, p, m, n); endif if (nl != n || pl != p) error ("cfconred: dimensions of observer matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... nl, pl, p, m, n); endif ## default arguments tol1 = 0.0; tol2 = 0.0; jobcf = 0; jobmr = 2; # balancing-free BTA equil = scaled; # equil: 0 means "S", 1 means "N" ordsel = 1; ncr = 0; negfb = true; # A-BK, A-LC Hurwitz ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"order", "ncr", "nr"} [ncr, ordsel] = __modred_check_order__ (val, n); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "cf" switch (lower (val(1))) case "l" jobcf = 0; case "r" jobcf = 1; otherwise error ("cfconred: '%s' is an invalid coprime factorization", val); endswitch case "method" # approximation method switch (tolower (val)) case {"sr-bta", "b"} # 'B': use the square-root Balance & Truncate method jobmr = 0; case {"bfsr-bta", "f"} # 'F': use the balancing-free square-root Balance & Truncate method jobmr = 1; case {"sr-spa", "s"} # 'S': use the square-root Singular Perturbation Approximation method jobmr = 2; case {"bfsr-spa", "p"} # 'P': use the balancing-free square-root Singular Perturbation Approximation method jobmr = 3; otherwise error ("cfconred: '%s' is an invalid approach", val); endswitch case {"equil", "equilibrate", "equilibration", "scale", "scaling"} equil = __modred_check_equil__ (val); case "feedback" negfb = __conred_check_feedback_sign__ (val); otherwise warning ("cfconred: invalid property name '%s' ignored", key); endswitch endfor ## A - B*F --> A + B*F ; A - L*C --> A + L*C if (negfb) F = -F; L = -L; endif ## perform model order reduction [acr, bcr, ccr, dcr, ncr, hsv] = __sl_sb16bd__ (a, b, c, d, dt, equil, ncr, ordsel, jobd, jobmr, ... F, L, jobcf, tol1, tol2); ## assemble reduced order controller Kr = ss (acr, bcr, ccr, dcr, tsam); ## assemble info struct info = struct ("ncr", ncr, "hsv", hsv); endfunction %!shared Mo, Me, Info, HSVe %! A = [ 0 1.0000 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 %! 0 0 -0.0150 0.7650 0 0 0 0 %! 0 0 -0.7650 -0.0150 0 0 0 0 %! 0 0 0 0 -0.0280 1.4100 0 0 %! 0 0 0 0 -1.4100 -0.0280 0 0 %! 0 0 0 0 0 0 -0.0400 1.850 %! 0 0 0 0 0 0 -1.8500 -0.040 ]; %! %! B = [ 0.0260 %! -0.2510 %! 0.0330 %! -0.8860 %! -4.0170 %! 0.1450 %! 3.6040 %! 0.2800 ]; %! %! C = [ -.996 -.105 0.261 .009 -.001 -.043 0.002 -0.026 ]; %! %! D = [ 0.0 ]; %! %! G = ss (A, B, C, D); % "scaled", false %! %! F = [ 4.4721e-002 6.6105e-001 4.6986e-003 3.6014e-001 1.0325e-001 -3.7541e-002 -4.2685e-002 3.2873e-002 ]; %! %! L = [ 4.1089e-001 %! 8.6846e-002 %! 3.8523e-004 %! -3.6194e-003 %! -8.8037e-003 %! 8.4205e-003 %! 1.2349e-003 %! 4.2632e-003 ]; %! %! [Kr, Info] = cfconred (G, F, L, 4, "method", "bfsr-bta", "cf", "left", "feedback", "+"); %! [Ao, Bo, Co, Do] = ssdata (Kr); %! %! Ae = [ 0.5946 -0.7336 0.1914 -0.3368 %! 0.5960 -0.0184 -0.1088 0.0207 %! 1.2253 0.2043 0.1009 -1.4948 %! -0.0330 -0.0243 1.3440 0.0035 ]; %! %! Be = [ 0.0015 %! -0.0202 %! 0.0159 %! -0.0544 ]; %! %! Ce = [ 0.3534 0.0274 0.0337 -0.0320 ]; %! %! De = [ 0.0000 ]; %! %! HSVe = [ 4.9078 4.8745 3.8455 3.7811 1.2289 1.1785 0.5176 0.1148 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/covar.m0000644000076500000240000000434512614620313014011 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{p}, @var{q}] =} covar (@var{sys}, @var{w}) ## Return the steady-state covariance. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item w ## Intensity of Gaussian white noise inputs which drive @var{sys}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item p ## Output covariance. ## @item q ## State covariance. ## @end table ## ## @seealso{lyap, dlyap} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.1 function [p, q] = covar (sys, w) if (nargin != 2) print_usage (); endif if (! isa (sys, "lti")) error ("covar: first argument must be an LTI model"); endif if (! isstable (sys)) error ("covar: system must be stable"); endif [a, b, c, d] = ssdata (sys); if (isct (sys)) if (any (d(:))) error ("covar: system is not strictly proper"); endif q = lyap (a, b*w*b.'); p = c*q*c.'; else q = dlyap (a, b*w*b.'); p = c*q*c.' + d*w*d.'; endif endfunction ## continuous-time %!shared p, q, p_exp, q_exp %! sys = ss (-1, 1, 1, 0); %! [p, q] = covar (sys, 5); %! p_exp = 2.5000; %! q_exp = 2.5000; %!assert (p, p_exp, 1e-4); %!assert (q, q_exp, 1e-4); ## discrete-time %!shared p, q, p_exp, q_exp %! sys = ss ([-0.2, -0.5; 1, 0], [2; 0], [1, 0.5], [0], 0.1); %! [p, q] = covar (sys, 5); %! p_exp = 30.3167; %! q_exp = [27.1493, -3.6199; -3.6199, 27.1493]; %!assert (p, p_exp, 1e-4); %!assert (q, q_exp, 1e-4); control/inst/ctrb.m0000644000076500000240000000427112614620313013627 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## Copyright (C) 2009 Luca Favatella ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{co} =} ctrb (@var{sys}) ## @deftypefnx {Function File} {@var{co} =} ctrb (@var{a}, @var{b}) ## Return controllability matrix. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @end table ## ## @strong{Outputs} ## @table @var ## @item co ## Controllability matrix. ## @end table ## ## @strong{Equation} ## @iftex ## @tex ## $$ C_o = [ B \\ \\ AB \\ \\ A^2B \\ \\ldots \\ A^{n-1}B ] $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## 2 n-1 ## Co = [ B AB A B ... A B ] ## @end example ## @end ifnottex ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function co = ctrb (a, b) if (nargin == 1) # ctrb (sys) if (! isa (a, "lti")) error ("ctrb: argument must be an lti system"); endif [a, b] = ssdata (a); elseif (nargin == 2) # ctrb (a, b) if (! is_real_square_matrix (a) || ! is_real_matrix (b) || rows (a) != rows (b)) error ("ctrb: invalid arguments (a, b)"); endif else print_usage (); endif n = rows (a); # number of states k = 0:n-1; # exponents for a tmp = arrayfun (@(x) a^x*b, k, "uniformoutput", false); co = horzcat (tmp{:}); endfunction %!assert (ctrb ([1, 0; 0, -0.5], [8; 8]), [8, 8; 8, -4]); control/inst/ctrbf.m0000644000076500000240000000713712614620313014001 0ustar lukasstaff## Copyright (C) 2010 Benjamin Fernandez ## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}) ## @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}, @var{tol}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}, @var{TOL}) ## If Co=ctrb(A,B) has rank r <= n = SIZE(A,1), then there is a ## similarity transformation Tc such that Tc = [t1 t2] where t1 ## is the controllable subspace and t2 is orthogonal to t1 ## ## @example ## @group ## Abar = Tc \\ A * Tc , Bbar = Tc \\ B , Cbar = C * Tc ## @end group ## @end example ## ## and the transformed system has the form ## ## @example ## @group ## | Ac A12| | Bc | ## Abar = |----------|, Bbar = | ---|, Cbar = [Cc | Cnc]. ## | 0 Anc| | 0 | ## @end group ## @end example ## ## where (Ac,Bc) is controllable, and Cc(sI-Ac)^(-1)Bc = C(sI-A)^(-1)B. ## and the system is stabilizable if Anc has no eigenvalues in ## the right half plane. The last output K is a vector of length n ## containing the number of controllable states. ## @end deftypefn ## Author: Benjamin Fernandez ## Created: 2010-04-30 ## Version: 0.1 function [ac, bc, cc, z, ncont] = ctrbf (a, b = [], c, tol = []) if (nargin < 1 || nargin > 4) print_usage (); endif islti = isa (a, "lti"); if (islti) if (nargin > 2) print_usage (); endif sys = a; tol = b; [a, b, c] = ssdata (sys); else if (nargin < 3) print_usage (); endif sys = ss (a, b, c); [a, b, c] = ssdata (sys); endif if (isempty (tol)) tol = 0; # default tolerance elseif (! is_real_scalar (tol)) error ("ctrbf: tol must be a real scalar"); endif [ac, bc, cc, z, ncont] = __sl_tb01ud__ (a, b, c, tol); if (islti) ac = set (sys, "a", ac, "b", bc, "c", cc, "scaled", false); bc = z; cc = ncont; endif endfunction %!shared Ao, Bo, Co, Zo, Ae, Be, Ce, Ze, NCONT %! A = [ -1.0 0.0 0.0 %! -2.0 -2.0 -2.0 %! -1.0 0.0 -3.0 ]; %! %! B = [ 1.0 0.0 0.0 %! 0.0 2.0 1.0 ].'; %! %! C = [ 0.0 2.0 1.0 %! 1.0 0.0 0.0 ]; %! %! [Ao, Bo, Co, Zo, NCONT] = ctrbf (A, B, C); %! %! Ae = [ -3.0000 2.2361 %! 0.0000 -1.0000 ]; %! %! Be = [ 0.0000 -2.2361 %! 1.0000 0.0000 ]; %! %! Ce = [ -2.2361 0.0000 %! 0.0000 1.0000 ]; %! %! Ze = [ 0.0000 1.0000 0.0000 %! -0.8944 0.0000 -0.4472 %! -0.4472 0.0000 0.8944 ]; %! %!assert (Ao(1:NCONT, 1:NCONT), Ae, 1e-4); %!assert (Bo(1:NCONT, :), Be, 1e-4); %!assert (Co(:, 1:NCONT), Ce, 1e-4); %!assert (Zo, Ze, 1e-4); control/inst/dare.m0000644000076500000240000001373212614620313013612 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Solve discrete-time algebraic Riccati equation (ARE). ## ## @strong{Inputs} ## @table @var ## @item a ## Real matrix (n-by-n). ## @item b ## Real matrix (n-by-m). ## @item q ## Real matrix (n-by-n). ## @item r ## Real matrix (m-by-m). ## @item s ## Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item x ## Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @item g ## Corresponding gain matrix (m-by-n). ## @end table ## ## @strong{Equations} ## @example ## @group ## -1 ## A'XA - X - A'XB (B'XB + R) B'XA + Q = 0 ## ## -1 ## A'XA - X - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 ## ## -1 ## G = (B'XB + R) B'XA ## ## -1 ## G = (B'XB + R) (B'XA + S') ## ## L = eig (A - B*G) ## @end group ## @end example ## @example ## @group ## -1 ## A'XA - E'XE - A'XB (B'XB + R) B'XA + Q = 0 ## ## -1 ## A'XA - E'XE - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 ## ## -1 ## G = (B'XB + R) B'XA ## ## -1 ## G = (B'XB + R) (B'XA + S') ## ## L = eig (A - B*G, E) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB02OD and SG02AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{care, lqr, dlqr, kalman} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5.1 function [x, l, g] = dare (a, b, q, r, s = [], e = []) ## TODO: extract feedback matrix g from SB02OD (and SG02AD) if (nargin < 4 || nargin > 6) print_usage (); endif if (! is_real_square_matrix (a, q, r)) ## error ("dare: a, q, r must be real and square"); error ("dare: %s, %s, %s must be real and square", ... inputname (1), inputname (3), inputname (4)); endif if (! is_real_matrix (b) || rows (a) != rows (b)) ## error ("dare: a and b must have the same number of rows"); error ("dare: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif if (columns (r) != columns (b)) ## error ("dare: b and r must have the same number of columns"); error ("dare: %s and %s must have the same number of columns", ... inputname (2), inputname (4)); endif if (! is_real_matrix (s) && ! size_equal (s, b)) ## error ("dare: s(%dx%d) must be real and identically dimensioned with b(%dx%d)", ## rows (s), columns (s), rows (b), columns (b)); error ("dare: %s(%dx%d) must be real and identically dimensioned with %s(%dx%d)", ... inputname (5), rows (s), columns (s), inputname (2), rows (b), columns (b)); endif if (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (e, a))) ## error ("dare: a and e must have the same number of rows"); error ("dare: %s and %s must have the same number of rows", ... inputname (1), inputname (6)); endif ## check stabilizability if (! isstabilizable (a, b, e, [], 1)) ## error ("dare: (a, b) not stabilizable"); error ("dare: (%s, %s) not stabilizable", ... inputname (1), inputname (2)); endif ## check positive semi-definiteness if (isempty (s)) t = zeros (size (b)); else t = s; endif m = [q, t; t.', r]; if (isdefinite (m) < 0) ## error ("dare: require [q, s; s.', r] >= 0"); error ("dare: require [%s, %s; %s.', %s] >= 0", ... inputname (3), inputname (5), inputname (5), inputname (4)); endif ## solve the riccati equation if (isempty (e)) if (isempty (s)) [x, l] = __sl_sb02od__ (a, b, q, r, b, true, false); g = (r + b.'*x*b) \ (b.'*x*a); # gain matrix else [x, l] = __sl_sb02od__ (a, b, q, r, s, true, true); g = (r + b.'*x*b) \ (b.'*x*a + s.'); # gain matrix endif else if (isempty (s)) [x, l] = __sl_sg02ad__ (a, e, b, q, r, b, true, false); g = (r + b.'*x*b) \ (b.'*x*a); # gain matrix else [x, l] = __sl_sg02ad__ (a, e, b, q, r, s, true, true); g = (r + b.'*x*b) \ (b.'*x*a + s.'); # gain matrix endif endif endfunction %!shared x, l, g, xe, le, ge %! a = [ 0.4 1.7 %! 0.9 3.8]; %! %! b = [ 0.8 %! 2.1]; %! %! c = [ 1 -1]; %! %! r = 3; %! %! [x, l, g] = dare (a, b, c.'*c, r); %! %! xe = [ 1.5354 1.2623 %! 1.2623 10.5596]; %! %! le = [-0.0022 %! 0.2454]; %! %! ge = [ 0.4092 1.7283]; %! %!assert (x, xe, 1e-4); %!assert (sort (l), sort (le), 1e-4); %!assert (g, ge, 1e-4); ## TODO: add more tests (nonempty s and/or e) control/inst/db2mag.m0000644000076500000240000000261312614620313014027 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{mag} =} db2mag (@var{db}) ## Convert Decibels (dB) to Magnitude. ## ## @strong{Inputs} ## @table @var ## @item db ## Decibel (dB) value(s). Both real-valued scalars and matrices are accepted. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Magnitude value(s). ## @end table ## ## @seealso{mag2db} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2012 ## Version: 0.1 function mag = db2mag (db) if (nargin != 1 || ! is_real_matrix (db)) print_usage (); endif mag = 10.^(db./20); endfunction %!assert (db2mag (40), 100); %!assert (db2mag (-20), 0.1); control/inst/dlqe.m0000644000076500000240000000733212614620313013623 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## Copyright (C) 2012 Megan Zagrobelny ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) ## Kalman filter for discrete-time systems. ## ## @example ## @group ## x[k] = Ax[k] + Bu[k] + Gw[k] (State equation) ## y[k] = Cx[k] + Du[k] + v[k] (Measurement Equation) ## E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S ## @end group ## @end example ## ## @strong{Inputs} ## @table @var ## @item a ## State transition matrix of discrete-time system (n-by-n). ## @item g ## Process noise matrix of discrete-time system (n-by-g). ## If @var{g} is empty @code{[]}, an identity matrix is assumed. ## @item c ## Measurement matrix of discrete-time system (p-by-n). ## @item q ## Process noise covariance matrix (g-by-g). ## @item r ## Measurement noise covariance matrix (p-by-p). ## @item s ## Optional cross term covariance matrix (g-by-p), s = cov(w,v). ## If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item m ## Kalman filter gain matrix (n-by-p). ## @item p ## Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). ## Symmetric matrix. ## @item z ## Error covariance (n-by-n), cov(x(k|k)-x) ## @item e ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## x[k|k] = x[k|k-1] + M(y[k] - Cx[k|k-1] - Du[k]) ## ## x[k+1|k] = Ax[k|k] + Bu[k] for S=0 ## ## x[k+1|k] = Ax[k|k] + Bu[k] + G*S*(C*P*C' + R)^-1*(y[k] - C*x[k|k-1]) for non-zero S ## ## ## E = eig(A - A*M*C) for S=0 ## ## E = eig(A - A*M*C - G*S*(C*P*C' + Rv)^-1*C) for non-zero S ## ## @end group ## @end example ## @seealso{dare, care, dlqr, lqr, lqe} ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [m, p, z, e] = dlqe (a, g, c, q, r, s = []) if (nargin < 5 || nargin > 6) print_usage (); endif if (isempty (g)) [p, e] = dare (a.', c.', q, r, s); # dlqe (a, [], c, q, r, s), g=I elseif (columns (g) != rows (q) || ! issquare (q)) error ("dlqe: matrices g(%dx%d) and q(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (q), columns (q)); elseif (isempty (s)) [p, e] = dare (a.', c.', g*q*g.', r); elseif (columns (g) != rows (s)) error ("dlqe: matrices g(%dx%d) and s(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (s), columns (s)); else [p, e] = dare (a.', c.', g*q*g.', r, g*s); endif m = p*c.' / (c*p*c.' + r); z = p - m*c*p; z = (z + z.') / 2; endfunction control/inst/dlqr.m0000644000076500000240000000606512614620313013642 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Linear-quadratic regulator for discrete-time systems. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). ## @item a ## State transition matrix of discrete-time system (n-by-n). ## @item b ## Input matrix of discrete-time system (n-by-m). ## @item q ## State weighting matrix (n-by-n). ## @item r ## Input weighting matrix (m-by-m). ## @item s ## Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item g ## State feedback matrix (m-by-n). ## @item x ## Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## x[k+1] = A x[k] + B u[k], x[0] = x0 ## ## inf ## J(x0) = SUM (x' Q x + u' R u + 2 x' S u) ## k=0 ## ## L = eig (A - B*G) ## @end group ## @end example ## @seealso{dare, care, lqr} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function [g, x, l] = dlqr (a, b, q, r = [], s = [], e = []) if (nargin < 3 || nargin > 6) print_usage (); endif if (isa (a, "lti")) s = r; r = q; q = b; [a, b, c, d, e, tsam] = dssdata (a, []); elseif (nargin < 4) print_usage (); else tsam = 1; # any value > 0 could be used here endif if (issample (tsam, -1)) [x, l, g] = dare (a, b, q, r, s, e); else [x, l, g] = care (a, b, q, r, s, e); endif endfunction control/inst/dlyap.m0000644000076500000240000001155712614620313014013 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{x} =} dlyap (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{c}) ## @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{[]}, @var{e}) ## Solve discrete-time Lyapunov or Sylvester equations. ## ## @strong{Equations} ## @example ## @group ## AXA' - X + B = 0 (Lyapunov Equation) ## ## AXB' - X + C = 0 (Sylvester Equation) ## ## AXA' - EXE' + B = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03MD, SB04QD and SG03AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{dlyapchol, lyap, lyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [x, scale] = dlyap (a, b, c, e) scale = 1; switch (nargin) case 2 # Lyapunov equation if (! is_real_square_matrix (a, b)) ## error ("dlyap: a, b must be real and square"); error ("dlyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (rows (a) != rows (b)) ## error ("dlyap: a, b must have the same number of rows"); error ("dlyap: %s, %s must have the same number of rows", ... inputname (1), inputname (2)); endif [x, scale] = __sl_sb03md__ (a, -b, true); # AXA' - X = -B ## x /= scale; # 0 < scale <= 1 case 3 # Sylvester equation if (! is_real_square_matrix (a, b)) ## error ("dlyap: a, b must be real and square"); error ("dlyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (! is_real_matrix (c) || rows (c) != rows (a) || columns (c) != columns (b)) ## error ("dlyap: c must be a real (%dx%d) matrix", rows (a), columns (b)); error ("dlyap: %s must be a real (%dx%d) matrix", ... rows (a), columns (b), inputname (3)); endif x = __sl_sb04qd__ (-a, b, c); # AXB' - X = -C case 4 # generalized Lyapunov equation if (! isempty (c)) print_usage (); endif if (! is_real_square_matrix (a, b, e)) ## error ("dlyap: a, b, e must be real and square"); error ("dlyap: %s, %s, %s must be real and square", ... inputname (1), inputname (2), inputname (4)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("dlyap: a, b, e must have the same number of rows"); error ("dlyap: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (4)); endif if (! issymmetric (b)) ## error ("dlyap: b must be symmetric"); error ("dlyap: %s must be symmetric", ... inputname (2)); endif [x, scale] = __sl_sg03ad__ (a, e, -b, true); # AXA' - EXE' = -B ## x /= scale; # 0 < scale <= 1 otherwise print_usage (); endswitch if (scale < 1) warning ("dlyap: solution scaled by %g to prevent overflow", scale); endif endfunction ## Lyapunov %!shared X, X_exp %! A = [3.0 1.0 1.0 %! 1.0 3.0 0.0 %! 0.0 0.0 3.0]; %! %! B = [25.0 24.0 15.0 %! 24.0 32.0 8.0 %! 15.0 8.0 40.0]; %! %! X = dlyap (A.', -B); %! %! X_exp = [2.0000 1.0000 1.0000 %! 1.0000 3.0000 0.0000 %! 1.0000 0.0000 4.0000]; %! %!assert (X, X_exp, 1e-4); ## Sylvester %!shared X, X_exp %! A = [1.0 2.0 3.0 %! 6.0 7.0 8.0 %! 9.0 2.0 3.0]; %! %! B = [7.0 2.0 3.0 %! 2.0 1.0 2.0 %! 3.0 4.0 1.0]; %! %! C = [271.0 135.0 147.0 %! 923.0 494.0 482.0 %! 578.0 383.0 287.0]; %! %! X = dlyap (-A, B, C); %! %! X_exp = [2.0000 3.0000 6.0000 %! 4.0000 7.0000 1.0000 %! 5.0000 3.0000 2.0000]; %! %!assert (X, X_exp, 1e-4); ## Generalized Lyapunov ## TODO: add a test control/inst/dlyapchol.m0000644000076500000240000000635112614620313014655 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}, @var{e}) ## Compute Cholesky factor of discrete-time Lyapunov equations. ## ## @strong{Equations} ## @example ## @group ## A U' U A' - U' U + B B' = 0 (Lyapunov Equation) ## ## A U' U A' - E U' U E' + B B' = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03OD and SG03BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{dlyap, lyap, lyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [u, scale] = dlyapchol (a, b, e) switch (nargin) case 2 if (! is_real_square_matrix (a)) ## error ("dlyapchol: a must be real and square"); error ("dlyapchol: %s must be real and square", ... inputname (1)); endif if (! is_real_matrix (b)) ## error ("dlyapchol: b must be real") error ("dlyapchol: %s must be real", ... inputname (2)) endif if (rows (a) != rows (b)) ## error ("dlyapchol: a and b must have the same number of rows"); error ("dlyapchol: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif [u, scale] = __sl_sb03od__ (a.', b.', true); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' case 3 if (! is_real_square_matrix (a, e)) ## error ("dlyapchol: a, e must be real and square"); error ("dlyapchol: %s, %s must be real and square", ... inputname (1), inputname (3)); endif if (! is_real_matrix (b)) ## error ("dlyapchol: b must be real"); error ("dlyapchol: %s must be real", ... inputname (2)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("dlyapchol: a, b, e must have the same number of rows"); error ("dlyapchol: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (3)); endif [u, scale] = __sl_sg03bd__ (a.', e.', b.', true); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' otherwise print_usage (); endswitch if (scale < 1) warning ("dlyapchol: solution scaled by %g to prevent overflow", scale); endif endfunction ## TODO: add tests control/inst/dss.m0000644000076500000240000000775412614620313013477 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} dss (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} dss (@var{d}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}, @dots{}) ## Create or convert to descriptor state-space model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to state-space. ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Output matrix (p-by-n). ## @item d ## Feedthrough matrix (p-by-m). ## @item e ## Descriptor matrix (n-by-n). ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (dss)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Descriptor state-space model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'a', 'b', 'c', 'd', 'e' ## State-space matrices. See 'Inputs' for details. ## ## @item 'stname' ## The name of the states in @var{sys}. ## Cell vector containing strings for each state. ## Default names are @code{@{'x1', 'x2', ...@}} ## ## @item 'scaled' ## Logical. If set to true, no automatic scaling is used, ## e.g. for frequency response plots. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## E x = A x + B u ## y = C x + D u ## @end group ## @end example ## ## @seealso{ss, tf} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.2 function sys = dss (varargin) mat_idx = __lti_input_idx__ (varargin); switch (numel (mat_idx)) case {0, 1} sys = ss (varargin{:}); [a, ~, ~, ~, e] = __sys_data__ (sys); if (isempty (e)); sys = __set__ (sys, "e", eye (size (a))); endif case {5, 6} sys = ss (varargin{[1:4, 6:end]}, "e", varargin{5}); otherwise print_usage (); endswitch endfunction ## NOTE: The author prefers "dss (e, a, b, c, d)" since we write ## . ## E x = A x + B u, y = C x + D u ## ## but this would break compatibility to a widespread ## commercial implementation of the octave language. ## There's no way to tell e and d apart if n = m = p. control/inst/estim.m0000644000076500000240000001031312614620313014010 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{est} =} estim (@var{sys}, @var{l}) ## @deftypefnx {Function File} {@var{est} =} estim (@var{sys}, @var{l}, @var{sensors}, @var{known}) ## Return state estimator for a given estimator gain. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item l ## State feedback matrix. ## @item sensors ## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. ## @item known ## Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} ## are assumed stochastic (w). If argument @var{known} is omitted, no inputs u are known. ## @end table ## ## @strong{Outputs} ## @table @var ## @item est ## State-space model of estimator. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u +-------+ ^ ## +---------------------------->| |-------> y ## | +-------+ + y | est | ^ ## u ----+--->| |----->(+)------>| |-------> x ## | sys | ^ + +-------+ ## w -------->| | | ## +-------+ | v ## @end group ## @end example ## ## @seealso{kalman, lqe, place} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.3 function est = estim (sys, l, sensors = [], known = []) if (nargin < 2 || nargin > 4) print_usage (); endif if (! isa (sys, "lti")) error ("estim: first argument must be an LTI system"); endif sys = ss (sys); # needed to get stname from tf models [a, b, c, d, e, tsam] = dssdata (sys, []); [inn, stn, outn, ing, outg] = get (sys, "inname", "stname", "outname", "ingroup", "outgroup"); if (isempty (sensors)) sensors = 1 : rows (c); endif if (ischar (sensors)) sensors = {sensors}; endif if (ischar (known)) known = {known}; endif if (iscell (sensors)) tmp = cellfun (@(x) __str2idx__ (outg, outn, x, "out"), sensors(:), "uniformoutput", false); sensors = vertcat (tmp{:}); endif if (iscell (known)) tmp = cellfun (@(x) __str2idx__ (ing, inn, x, "in"), known(:), "uniformoutput", false); known = vertcat (tmp{:}); endif m = length (known); n = rows (a); p = length (sensors); if (rows (l) != n) error ("estim: system '%s' has %d states, but the state estimator gain '%s' has %d rows", ... inputname (1), n, inputname (2), rows (l)); endif if (columns (l) != p) error ("estim: estimator gain '%s' has %d columns, but argument 'known' contains %d indices", ... inputname (2), columns (l), p); endif b = b(:, known); c = c(sensors, :); d = d(sensors, known); stname = __labels__ (stn, "xhat"); outname = vertcat (__labels__ (outn(sensors(:)), "yhat"), stname); inname = vertcat (__labels__ (inn(known(:)), "u"), __labels__ (outn(sensors(:)), "y")); f = a - l*c; g = [b - l*d, l]; h = [c; eye(n)]; j = [d, zeros(p, p); zeros(n, m), zeros(n, p)]; ## k = e; est = dss (f, g, h, j, e, tsam); est = set (est, "inname", inname, "stname", stname, "outname", outname); endfunction %!shared m, m_exp %! sys = ss (-2, 1, 1, 3); %! est = estim (sys, 5); %! [a, b, c, d] = ssdata (est); %! m = [a, b; c, d]; %! m_exp = [-7, 5; 1, 0; 1, 0]; %!assert (m, m_exp, 1e-4); %!shared m, m_exp %! sys = ss (-1, 2, 3, 4); %! est = estim (sys, 5); %! [a, b, c, d] = ssdata (est); %! m = [a, b; c, d]; %! m_exp = [-16, 5; 3, 0; 1, 0]; %!assert (m, m_exp, 1e-4); control/inst/filt.m0000644000076500000240000001502112614620313013626 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} filt (@var{num}, @var{den}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} filt (@var{num}, @var{den}, @var{tsam}, @dots{}) ## Create discrete-time transfer function model from data in DSP format. ## ## @strong{Inputs} ## @table @var ## @item num ## Numerator or cell of numerators. Each numerator must be a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item den ## Denominator or cell of denominators. Each denominator must be a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## default value -1 (unspecified) is taken. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (filt)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time transfer function model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'num' ## Numerator. See 'Inputs' for details. ## ## @item 'den' ## Denominator. See 'Inputs' for details. ## ## @item 'tfvar' ## String containing the transfer function variable. ## ## @item 'inv' ## Logical. True for negative powers of the transfer function variable. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Example} ## @example ## @group ## 3 z^-1 ## H(z^-1) = ------------------- ## 1 + 4 z^-1 + 2 z^-2 ## ## octave:1> H = filt ([0, 3], [1, 4, 2]) ## ## Transfer function 'H' from input 'u1' to output ... ## ## 3 z^-1 ## y1: ------------------- ## 1 + 4 z^-1 + 2 z^-2 ## ## Sampling time: unspecified ## Discrete-time model. ## @end group ## @end example ## ## @seealso{tf} ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.2 function sys = filt (varargin) if (nargin <= 1) # filt (), filt (sys), filt (mat), filt ('s') sys = tf (varargin{:}); sys = set (sys, "inv", true); return; elseif (nargin == 2 ... && ischar (varargin{1})) # filt ('z', tsam) sys = tf (varargin{:}); return; endif num = {}; den = {}; tsam = -1; # default values [mat_idx, opt_idx, obj_flg] = __lti_input_idx__ (varargin); switch (numel (mat_idx)) case 1 num = varargin{mat_idx}; case 2 [num, den] = varargin{mat_idx}; case 3 [num, den, tsam] = varargin{mat_idx}; if (isempty (tsam) && is_real_matrix (tsam)) tsam = -1; elseif (! issample (tsam, -1)) error ("filt: invalid sampling time"); endif case 0 ## nothing to do here, just prevent case 'otherwise' otherwise print_usage (); endswitch varargin = varargin(opt_idx); if (obj_flg) varargin = horzcat ({"lti"}, varargin); endif if (isempty (den) ... && (isempty (num) || is_real_matrix (num))) sys = tf (num, "inv", true, varargin{:}); return; endif if (! iscell (num)) num = {num}; endif if (! iscell (den)) den = {den}; endif if (! size_equal (num, den) || ndims (num) != 2) error ("filt: cells 'num' and 'den' must be 2-dimensional and of equal size"); endif if (! is_real_vector (num{:}, den{:}, 1)) # last argument 1 needed if num & den are empty error ("filt: arguments 'num' and 'den' must be real-valued vectors or cells thereof"); endif ## convert from z^-1 to z ## expand each channel by z^x, where x is the largest exponent of z^-1 (z^-x) ## remove trailing zeros ## such that polynomials are as short as possible num = cellfun (@__remove_trailing_zeros__, num, "uniformoutput", false); den = cellfun (@__remove_trailing_zeros__, den, "uniformoutput", false); ## make numerator and denominator polynomials equally long ## by adding trailing zeros lnum = cellfun (@length, num, "uniformoutput", false); lden = cellfun (@length, den, "uniformoutput", false); lmax = cellfun (@max, lnum, lden, "uniformoutput", false); num = cellfun (@postpad, num, lmax, "uniformoutput", false); den = cellfun (@postpad, den, lmax, "uniformoutput", false); ## use standard tf constructor ## sys is stored in standard z form, not z^-1 ## so we can mix it with regular transfer function models ## property "inv", true displays sys in z^-1 form sys = tf (num, den, tsam, "inv", true, varargin{:}); endfunction %!shared num, den, n1, d1, n2, d2, n2e, d2e %! num = [0, 3]; %! den = [1, 4, 2]; %! sys = filt (num, den); %! [n1, d1] = filtdata (sys, "vector"); %! [n2, d2] = tfdata (sys, "vector"); %! n2e = [3, 0]; %! d2e = [1, 4, 2]; %!assert (n1, num, 1e-4); %!assert (d1, den, 1e-4); %!assert (n2, n2e, 1e-4); %!assert (d2, d2e, 1e-4); control/inst/fitfrd.m0000644000076500000240000000567512614620313014164 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}) ## @deftypefnx{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}, @var{flag}) ## Fit frequency response data with a state-space system. ## If requested, the returned system is stable and minimum-phase. ## ## @strong{Inputs} ## @table @var ## @item dat ## @acronym{LTI} model containing frequency response data of a SISO system. ## @item n ## The desired order of the system to be fitted. @code{n <= length(dat.w)}. ## @item flag ## The flag controls whether the returned system is stable and minimum-phase. ## @table @var ## @item 0 ## The system zeros and poles are not constrained. Default value. ## @item 1 ## The system zeros and poles will have negative real parts in the ## continuous-time case, or moduli less than 1 in the discrete-time case. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## State-space model of order @var{n}, fitted to frequency response data @var{dat}. ## @item n ## The order of the obtained system. The value of @var{n} ## could only be modified if inputs @code{n > 0} and @code{flag = 1}. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB10YD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [sys, n] = fitfrd (dat, n, flag = 0) if (nargin == 0 || nargin > 3) print_usage (); endif if (! isa (dat, "frd")) dat = frd (dat); endif if (! issiso (dat)) error ("fitfrd: require SISO system"); endif if (! issample (n, 0) || n != round (n)) error ("fitfrd: second argument must be an integer >= 0"); endif [H, w, tsam] = frdata (dat, "vector"); dt = isdt (dat); if (n > length (w)) error ("fitfrd: require n <= length (dat.w)"); endif [a, b, c, d, n] = __sl_sb10yd__ (real (H), imag (H), w, n, dt, logical (flag)); sys = ss (a, b, c, d, tsam); endfunction %!shared Yo, Ye %! SYS = ss (-1, 1, 1, 0); %! T = 0:0.1:50; %! Ye = step (SYS, T); %! W = logspace (-2, 2, 100); %! FR = frd (SYS, W); %! N = 1; %! SYSID = fitfrd (FR, N, 1); %! Yo = step (SYSID, T); %!assert (Yo, Ye, 1e-2); control/inst/fwcfconred.m0000644000076500000240000002354612614620313015023 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) ## ## Reduction of state-feedback-observer based controller by frequency-weighted coprime factorization (FW CF). ## Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, ## determine a reduced order controller @var{Kr} by using stability enforcing frequency weights. ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the open-loop plant (A,B,C,D). ## It has m inputs, p outputs and n states. ## @item F ## Stabilizing state feedback matrix (m-by-n). ## @item L ## Stabilizing observer gain matrix (n-by-p). ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.hsv ## The Hankel singular values of the extended system?!?. ## The @var{n} Hankel singular values are ordered decreasingly. ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @end table ## ## @item 'cf' ## Specifies whether left or right coprime factorization is ## to be used as follows: ## @table @var ## @item 'left', 'l' ## Use left coprime factorization. ## @item 'right', 'r' ## Use right coprime factorization. Default method. ## @end table ## ## @item 'feedback' ## Specifies whether @var{F} and @var{L} are fed back positively or negatively: ## @table @var ## @item '+' ## A+BK and A+LC are both Hurwitz matrices. ## @item '-' ## A-BK and A-LC are both Hurwitz matrices. Default value. ## @end table ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced system. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is n*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = fwcfconred (G, F, L, varargin) if (nargin < 3) print_usage (); endif if (! isa (G, "lti")) error ("fwcfconred: first argument must be an LTI system"); endif if (! is_real_matrix (F)) error ("fwcfconred: second argument must be a real matrix"); endif if (! is_real_matrix (L)) error ("fwcfconred: third argument must be a real matrix"); endif if (nargin > 3) # fwcfconred (G, F, L, ...) if (is_real_scalar (varargin{1})) # fwcfconred (G, F, L, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # fwcfconred (G, F, L, opt, ...), fwcfconred (G, F, L, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from fwcfconred (G, F, L, nr, ...) ## and fwcfconred (G, F, L, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("fwcfconred: keys and values must come in pairs"); endif [a, b, c, d, tsam] = ssdata (G); [p, m] = size (G); n = rows (a); [mf, nf] = size (F); [nl, pl] = size (L); dt = isdt (G); jobd = any (d(:)); if (mf != m || nf != n) error ("fwcfconred: dimensions of state-feedback matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... mf, nf, p, m, n); endif if (nl != n || pl != p) error ("fwcfconred: dimensions of observer matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... nl, pl, p, m, n); endif ## default arguments tol1 = 0.0; jobcf = 1; jobmr = 1; # balancing-free BTA ordsel = 1; ncr = 0; negfb = true; # A-BK, A-LC Hurwitz ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"order", "ncr", "nr"} [ncr, ordsel] = __modred_check_order__ (val, n); case {"tol1", "tol"} tol1 = __modred_check_tol__ (val, "tol1"); case "cf" switch (lower (val(1))) case "l" jobcf = 0; case "r" jobcf = 1; otherwise error ("cfconred: '%s' is an invalid coprime factorization", val); endswitch case "method" # approximation method switch (tolower (val)) case {"sr-bta", "b", "sr"} # 'B': use the square-root Balance & Truncate method jobmr = 0; case {"bfsr-bta", "f", "bfsr"} # 'F': use the balancing-free square-root Balance & Truncate method jobmr = 1; otherwise error ("cfconred: '%s' is an invalid approach", val); endswitch case "feedback" negfb = __conred_check_feedback_sign__ (val); otherwise warning ("fwcfconred: invalid property name '%s' ignored", key); endswitch endfor ## A - B*F --> A + B*F ; A - L*C --> A + L*C if (negfb) F = -F; L = -L; endif ## perform model order reduction [acr, bcr, ccr, ncr, hsv] = __sl_sb16cd__ (a, b, c, d, dt, ncr, ordsel, jobd, jobmr, ... F, L, jobcf, tol1); ## assemble reduced order controller Kr = ss (acr, bcr, ccr, [], tsam); ## assemble info struct info = struct ("ncr", ncr, "hsv", hsv); endfunction %!shared Mo, Me, Info, HSVe %! A = [ 0 1.0000 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 %! 0 0 -0.0150 0.7650 0 0 0 0 %! 0 0 -0.7650 -0.0150 0 0 0 0 %! 0 0 0 0 -0.0280 1.4100 0 0 %! 0 0 0 0 -1.4100 -0.0280 0 0 %! 0 0 0 0 0 0 -0.0400 1.850 %! 0 0 0 0 0 0 -1.8500 -0.040 ]; %! %! B = [ 0.0260 %! -0.2510 %! 0.0330 %! -0.8860 %! -4.0170 %! 0.1450 %! 3.6040 %! 0.2800 ]; %! %! C = [ -.996 -.105 0.261 .009 -.001 -.043 0.002 -0.026 ]; %! %! D = [ 0.0 ]; %! %! G = ss (A, B, C, D); % "scaled", false %! %! F = [ 4.472135954999638e-002 6.610515358414598e-001 4.698598960657579e-003 3.601363251422058e-001 1.032530880771415e-001 -3.754055214487997e-002 -4.268536964759344e-002 3.287284547842979e-002 ]; %! %! L = [ 4.108939884667451e-001 %! 8.684600000000012e-002 %! 3.852317308197148e-004 %! -3.619366874815911e-003 %! -8.803722876359955e-003 %! 8.420521094001852e-003 %! 1.234944428038507e-003 %! 4.263205617645322e-003 ]; %! %! [Kr, Info] = fwcfconred (G, F, L, 2, "method", "bfsr", "cf", "right", "feedback", "+"); %! [Ao, Bo, Co, Do] = ssdata (Kr); %! %! Ae = [ -0.4334 0.4884 %! -0.1950 -0.1093 ]; %! %! Be = [ -0.4231 %! -0.1785 ]; %! %! Ce = [ -0.0326 -0.2307 ]; %! %! De = [ 0.0000 ]; %! %! HSVe = [ 3.3073 0.7274 0.1124 0.0784 0.0242 0.0182 0.0101 0.0094 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/gensig.m0000644000076500000240000000537412614620313014156 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}) ## @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}, @var{tsam}) ## Generate periodic signal. Useful in combination with lsim. ## ## @strong{Inputs} ## @table @var ## @item sigtype = "sin" ## Sine wave. ## @item sigtype = "cos" ## Cosine wave. ## @item sigtype = "square" ## Square wave. ## @item sigtype = "pulse" ## Periodic pulse. ## @item tau ## Duration of one period in seconds. ## @item tfinal ## Optional duration of the signal in seconds. Default duration is 5 periods. ## @item tsam ## Optional sampling time in seconds. Default spacing is tau/64. ## @end table ## ## @strong{Outputs} ## @table @var ## @item u ## Vector of signal values. ## @item t ## Time vector of the signal. ## @end table ## ## @seealso{lsim} ## @end deftypefn ## Author: Lukas Reichlin ## Created: August 2009 ## Version: 0.4 function [u, t] = gensig (sigtype, tau, tfinal, tsam) if (nargin < 2 || nargin > 4) print_usage (); endif if (! ischar (sigtype)) error ("gensig: first argument must be a string"); endif if (! issample (tau)) error ("gensig: second argument is not a valid period"); endif if (nargin < 3) tfinal = 5 * tau; elseif (! issample (tfinal)) error ("gensig: third argument is not a valid final time"); endif if (nargin < 4) tsam = tau / 64; elseif (! issample (tsam)) error ("gensig: fourth argument is not a valid sampling time"); endif t = reshape (0 : tsam : tfinal, [], 1); switch (lower (sigtype(1:2))) case "si" u = sin (2*pi/tau * t); case "co" u = cos (2*pi/tau * t); case "sq" u = double (rem (t, tau) >= tau/2); case "pu" u = double (rem (t, tau) < (1 - 1000*eps) * tsam); otherwise error ("gensig: '%s' is an invalid signal type", sigtype); endswitch endfunction control/inst/gram.m0000644000076500000240000000754612614620313013633 0ustar lukasstaff## Copyright (C) 1996, 2000, 2003, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{W} =} gram (@var{sys}, @var{mode}) ## @deftypefnx {Function File} {@var{Wc} =} gram (@var{a}, @var{b}) ## @code{gram (@var{sys}, "c")} returns the controllability gramian of ## the (continuous- or discrete-time) system @var{sys}. ## @code{gram (@var{sys}, "o")} returns the observability gramian of the ## (continuous- or discrete-time) system @var{sys}. ## @code{gram (@var{a}, @var{b})} returns the controllability gramian ## @var{Wc} of the continuous-time system @math{dx/dt = a x + b u}; ## i.e., @var{Wc} satisfies @math{a Wc + m Wc' + b b' = 0}. ## ## @end deftypefn ## Author: A. S. Hodel ## Adapted-By: Lukas Reichlin ## Date: October 2009 ## Version: 0.2 function W = gram (argin1, argin2) if (nargin != 2) print_usage (); endif if (ischar (argin2)) # the function was called as "gram (sys, mode)" sys = argin1; if (! isa (sys, "lti")) error ("gram: first argument must be an LTI model"); endif [a, b, c] = ssdata (sys); if (strncmpi (argin2, "o", 1)) a = a.'; b = c.'; elseif (! strncmpi (argin2, "c", 1)) print_usage (); endif else # the function was called as "gram (a, b)" a = argin1; b = argin2; ## assume that a and b are matrices of continuous-time system ## values of b, c and d are irrelevant for system stability sys = ss (a, b, zeros (1, columns (a)), zeros (1, columns (b))); endif if (! isstable (sys)) error ("gram: system matrix a must be stable"); endif if (isct (sys)) W = lyap (a, b*b.'); # let lyap do the error checking about dimensions else # discrete-time system W = dlyap (a, b*b.'); # let dlyap do the error checking about dimensions endif endfunction %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; %! c = [0 0 1; 1 1 0]; ## it doesn't matter what the value of c is %! Wc = gram (ss (a, b, c), "c"); %! assert (a * Wc + Wc * a.' + b * b.', zeros (size (a))) %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; ## it doesn't matter what the value of b is %! c = [0 0 1; 1 1 0]; %! Wo = gram (ss (a, b, c), "o"); %! assert (a.' * Wo + Wo * a + c.' * c, zeros (size (a))) %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; %! Wc = gram (a, b); %! assert (a * Wc + Wc * a.' + b * b.', zeros (size (a))) %!test %! a = [-1 0 0; 1/2 1 0; 1/2 0 -1] / 2; %! b = [1 0; 0 -1; 0 1]; %! c = [0 0 1; 1 1 0]; ## it doesn't matter what the value of c is %! d = zeros (rows (c), columns (b)); ## it doesn't matter what the value of d is %! Ts = 0.1; ## Ts != 0 %! Wc = gram (ss (a, b, c, d, Ts), "c"); %! assert (a * Wc * a.' - Wc + b * b.', zeros (size (a)), 1e-12) %!test %! a = [-1 0 0; 1/2 1 0; 1/2 0 -1] / 2; %! b = [1 0; 0 -1; 0 1]; ## it doesn't matter what the value of b is %! c = [0 0 1; 1 1 0]; %! d = zeros (rows (c), columns (b)); ## it doesn't matter what the value of d is %! Ts = 0.1; ## Ts != 0 %! Wo = gram (ss (a, b, c, d, Ts), "o"); %! assert (a.' * Wo * a - Wo + c.' * c, zeros (size (a)), 1e-12) control/inst/h2syn.m0000644000076500000240000002032212614620313013733 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}, @var{nmeas}, @var{ncon}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}) ## H-2 control synthesis for @acronym{LTI} plant. ## ## @strong{Inputs} ## @table @var ## @item P ## Generalized plant. Must be a proper/realizable @acronym{LTI} model. ## If @var{P} is constructed with @command{mktito} or @command{augw}, ## arguments @var{nmeas} and @var{ncon} can be omitted. ## @item nmeas ## Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the ## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-2 norm. ## @item ncon ## Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the ## outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @end table ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-2 optimal controller. ## @item N ## State-space model of the lower LFT of @var{P} and @var{K}. ## @item info ## Structure containing additional information. ## @item info.gamma ## H-2 norm of @var{N}. ## @item info.rcond ## Vector @var{rcond} contains estimates of the reciprocal condition ## numbers of the matrices which are to be inverted and ## estimates of the reciprocal condition numbers of the ## Riccati equations which have to be solved during the ## computation of the controller @var{K}. For details, ## see the description of the corresponding SLICOT routine. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## gamma = min||N(K)|| N = lft (P, K) ## K 2 ## ## +--------+ ## w ----->| |-----> z ## | P(s) | ## u +---->| |-----+ v ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## ## +--------+ ## w ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB10HD and SB10ED by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{augw, lqr, dlqr, kalman} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.3 function [K, varargout] = h2syn (P, nmeas, ncon) ## check input arguments if (nargin != 1 && nargin != 3) print_usage (); endif if (! isa (P, "lti")) error ("h2syn: first argument must be an LTI system"); endif if (nargin == 1) [nmeas, ncon] = __tito_dim__ (P, "h2syn"); endif if (! is_real_scalar (nmeas)) error ("h2syn: second argument 'nmeas' invalid"); endif if (! is_real_scalar (ncon)) error ("h2syn: third argument 'ncon' invalid"); endif [a, b, c, d, tsam] = ssdata (P); ## check assumptions A1 - A3 m = columns (b); p = rows (c); m1 = m - ncon; p1 = p - nmeas; d11 = d(1:p1, 1:m1); if (isct (P) && any (d11(:))) warning ("h2syn: setting matrice D11 to zero"); d(1:p1, 1:m1) = 0; endif if (! isstabilizable (P(:, m1+1:m))) error ("h2syn: (A, B2) must be stabilizable"); endif if (! isdetectable (P(p1+1:p, :))) error ("h2syn: (C2, A) must be detectable"); endif ## H-2 synthesis if (isct (P)) # continuous plant [ak, bk, ck, dk, rcond] = __sl_sb10hd__ (a, b, c, d, ncon, nmeas); else # discrete plant [ak, bk, ck, dk, rcond] = __sl_sb10ed__ (a, b, c, d, ncon, nmeas); endif ## controller K = ss (ak, bk, ck, dk, tsam); if (nargout > 1) N = lft (P, K); varargout{1} = N; if (nargout > 2) gamma = norm (N, 2); varargout{2} = gamma; if (nargout > 3) varargout{3} = struct ("gamma", gamma, "rcond", rcond); endif endif endif endfunction ## continuous-time case %!shared M, M_exp %! A = [-1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0]; %! %! B = [-3.0 -4.0 -2.0 1.0 0.0 %! 2.0 0.0 1.0 -5.0 2.0 %! -5.0 -7.0 0.0 7.0 -2.0 %! 4.0 -6.0 1.0 1.0 -2.0 %! -3.0 9.0 -8.0 0.0 5.0 %! 1.0 -2.0 3.0 -6.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 %! 9.0 -3.0 4.0 0.0 3.0 7.0 %! 0.0 1.0 -2.0 1.0 -6.0 -2.0]; %! %! D = [ 0.0 0.0 0.0 -4.0 -1.0 %! 0.0 0.0 0.0 1.0 0.0 %! 0.0 0.0 0.0 0.0 1.0 %! 3.0 1.0 0.0 1.0 -3.0 %! -2.0 0.0 1.0 7.0 1.0]; %! %! P = ss (A, B, C, D); %! K = h2syn (P, 2, 2); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [ 88.0015 -145.7298 -46.2424 82.2168 -45.2996 -31.1407 %! 25.7489 -31.4642 -12.4198 9.4625 -3.5182 2.7056 %! 54.3008 -102.4013 -41.4968 50.8412 -20.1286 -26.7191 %! 108.1006 -198.0785 -45.4333 70.3962 -25.8591 -37.2741 %! -115.8900 226.1843 47.2549 -47.8435 -12.5004 34.7474 %! 59.0362 -101.8471 -20.1052 36.7834 -16.1063 -26.4309]; %! %! KB = [ 3.7345 3.4758 %! -0.3020 0.6530 %! 3.4735 4.0499 %! 4.3198 7.2755 %! -3.9424 -10.5942 %! 2.1784 2.5048]; %! %! KC = [ -2.3346 3.2556 0.7150 -0.9724 0.6962 0.4074 %! 7.6899 -8.4558 -2.9642 7.0365 -4.2844 0.1390]; %! %! KD = [ 0.0000 0.0000 %! 0.0000 0.0000]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); ## discrete-time case %!shared M, M_exp %! A = [-0.7 0.0 0.3 0.0 -0.5 -0.1 %! -0.6 0.2 -0.4 -0.3 0.0 0.0 %! -0.5 0.7 -0.1 0.0 0.0 -0.8 %! -0.7 0.0 0.0 -0.5 -1.0 0.0 %! 0.0 0.3 0.6 -0.9 0.1 -0.4 %! 0.5 -0.8 0.0 0.0 0.2 -0.9]; %! %! B = [-1.0 -2.0 -2.0 1.0 0.0 %! 1.0 0.0 1.0 -2.0 1.0 %! -3.0 -4.0 0.0 2.0 -2.0 %! 1.0 -2.0 1.0 0.0 -1.0 %! 0.0 1.0 -2.0 0.0 3.0 %! 1.0 0.0 3.0 -1.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 0.0 %! 0.0 2.0 0.0 -4.0 0.0 -2.0 %! 1.0 -3.0 0.0 0.0 3.0 1.0 %! 0.0 1.0 -2.0 1.0 0.0 -2.0]; %! %! D = [ 1.0 -1.0 -2.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 %! 2.0 -1.0 -3.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -1.0 %! 0.0 0.0 1.0 2.0 1.0]; %! %! P = ss (A, B, C, D, 1); # value of sampling time doesn't matter %! K = h2syn (P, 2, 2); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [-0.0551 -2.1891 -0.6607 -0.2532 0.6674 -1.0044 %! -1.0379 2.3804 0.5031 0.3960 -0.6605 1.2673 %! -0.0876 -2.1320 -0.4701 -1.1461 1.2927 -1.5116 %! -0.1358 -2.1237 -0.9560 -0.7144 0.6673 -0.7957 %! 0.4900 0.0895 0.2634 -0.2354 0.1623 -0.2663 %! 0.1672 -0.4163 0.2871 -0.1983 0.4944 -0.6967]; %! %! KB = [-0.5985 -0.5464 %! 0.5285 0.6087 %! -0.7600 -0.4472 %! -0.7288 -0.6090 %! 0.0532 0.0658 %! -0.0663 0.0059]; %! %! KC = [ 0.2500 -1.0200 -0.3371 -0.2733 0.2747 -0.4444 %! 0.0654 0.2095 0.0632 0.2089 -0.1895 0.1834]; %! %! KD = [-0.2181 -0.2070 %! 0.1094 0.1159]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); control/inst/hinfsyn.m0000644000076500000240000003712112614620313014353 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @dots{}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @dots{}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{opt}, @dots{}) ## H-infinity control synthesis for @acronym{LTI} plant. ## ## @strong{Inputs} ## @table @var ## @item P ## Generalized plant. Must be a proper/realizable @acronym{LTI} model. ## If @var{P} is constructed with @command{mktito} or @command{augw}, ## arguments @var{nmeas} and @var{ncon} can be omitted. ## @item nmeas ## Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the ## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-infinity norm. ## @item ncon ## Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the ## outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-infinity (sub-)optimal controller. ## @item N ## State-space model of the lower LFT of @var{P} and @var{K}. ## @item info ## Structure containing additional information. ## @item info.gamma ## L-infinity norm of @var{N}. ## @item info.rcond ## Vector @var{rcond} contains estimates of the reciprocal condition ## numbers of the matrices which are to be inverted and ## estimates of the reciprocal condition numbers of the ## Riccati equations which have to be solved during the ## computation of the controller @var{K}. For details, ## see the description of the corresponding SLICOT routine. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'method' ## String specifying the desired kind of controller: ## @table @var ## @item 'optimal', 'opt', 'o' ## Compute optimal controller using gamma iteration. ## Default selection for compatibility reasons. ## @item 'suboptimal', 'sub', 's' ## Compute (sub-)optimal controller. For stability reasons, ## suboptimal controllers are to be preferred over optimal ones. ## @end table ## @item 'gmax' ## The maximum value of the H-infinity norm of @var{N}. ## It is assumed that @var{gmax} is sufficiently large ## so that the controller is admissible. Default value is 1e15. ## @item 'gmin' ## Initial lower bound for gamma iteration. Default value is 0. ## @var{gmin} is only meaningful for optimal discrete-time controllers. ## @item 'tolgam' ## Tolerance used for controlling the accuracy of @var{gamma} ## and its distance to the estimated minimal possible ## value of @var{gamma}. Default value is 0.01. ## If @var{tolgam} = 0, then a default value equal to @code{sqrt(eps)} ## is used, where @var{eps} is the relative machine precision. ## For suboptimal controllers, @var{tolgam} is ignored. ## @item 'actol' ## Upper bound for the poles of the closed-loop system @var{N} ## used for determining if it is stable. ## @var{actol} >= 0 for stable systems. ## For suboptimal controllers, @var{actol} is ignored. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## gamma = min||N(K)|| N = lft (P, K) ## K inf ## ## +--------+ ## w ----->| |-----> z ## | P(s) | ## u +---->| |-----+ v ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## ## +--------+ ## w ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB10FD, SB10DD and SB10AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{augw, mixsyn} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.3 function [K, varargout] = hinfsyn (P, varargin) ## check input arguments if (nargin == 0) print_usage (); endif if (! isa (P, "lti")) error ("hinfsyn: first argument must be an LTI system"); endif if (nargin == 1 || (nargin > 1 && ! is_real_scalar (varargin{1}))) # hinfsyn (P, ...) [nmeas, ncon] = __tito_dim__ (P, "hinfsyn"); elseif (nargin >= 3) # hinfsyn (P, nmeas, ncon, ...) nmeas = varargin{1}; ncon = varargin{2}; varargin = varargin(3:end); else print_usage (); endif if (! is_real_scalar (nmeas)) error ("hinfsyn: second argument 'nmeas' invalid"); endif if (! is_real_scalar (ncon)) error ("hinfsyn: third argument 'ncon' invalid"); endif if (numel (varargin) > 0 && isstruct (varargin{1})) # hinfsyn (P, nmeas, ncon, opt, ...), hinfsyn (P, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("hinfsyn: keys and values must come in pairs"); endif ## default arguments gmax = 1e15; gmin = 0; tolgam = 0.01; actol = eps; # tolerance for stability margin method = "opt"; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case "gmax" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'gmax' must be a real-valued, non-negative scalar"); endif gmax = val; case "gmin" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'gmin' must be a real-valued, non-negative scalar"); endif gmin = val; case "tolgam" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'tolgam' must be a real-valued, non-negative scalar"); endif tolgam = val; case "actol" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'actol' must be a real-valued, non-negative scalar"); endif actol = val; case "method" ## NOTE: I called this "method" because of the dark side, ## maybe something like "type" would make more sense ... if (strncmpi (val, "s", 1)) method = "sub"; # sub-optimal elseif (strncmpi (val, "o", 1) || strncmpi (val, "ric", 1)) method = "opt"; # optimal else error ("hinfsyn: invalid method '%s'", val); endif otherwise warning ("hinfsyn: invalid property name '%s' ignored", key); endswitch endfor [a, b, c, d, tsam] = ssdata (P); ## check assumption A1 m = columns (b); p = rows (c); m1 = m - ncon; p1 = p - nmeas; if (! isstabilizable (P(:, m1+1:m))) error ("hinfsyn: (A, B2) must be stabilizable"); endif if (! isdetectable (P(p1+1:p, :))) error ("hinfsyn: (C2, A) must be detectable"); endif ## H-infinity synthesis switch (method) case "sub" # sub-optimal controller if (isct (P)) # continuous-time plant [ak, bk, ck, dk, rcond] = __sl_sb10fd__ (a, b, c, d, ncon, nmeas, gmax); else # discrete-time plant [ak, bk, ck, dk, rcond] = __sl_sb10dd__ (a, b, c, d, ncon, nmeas, gmax); endif case "opt" # optimal controller if (isct (P)) # continuous-time plant [ak, bk, ck, dk, ~, ~, ~, ~, ~, rcond] = __sl_sb10ad__ (a, b, c, d, ncon, nmeas, gmax, tolgam, -actol); else # discrete-time plant ## NOTE: check whether it is an alternative to compute the bilinear transformation ## of P, use __sl_sb10ad__ for a continuous-time controller and then ## discretize the controller. ## estimate gamma Pt = d2c (P, "tustin"); [at, bt, ct, dt] = ssdata (Pt); [~, ~, ~, ~, ~, ~, ~, ~, gamma] = __sl_sb10ad__ (at, bt, ct, dt, ncon, nmeas, gmax, tolgam, -actol); ## gamma iteration - bisection method using __sl_sb10dd__ gmax = 1.2*gamma; while (gmax > eps && (gmax - gmin)/gmax > tolgam) gmid = (gmax + gmin)/2; try [ak, bk, ck, dk, rcond] = __sl_sb10dd__ (a, b, c, d, ncon, nmeas, gmid); ## check for stability K = ss (ak, bk, ck, dk, tsam); N = lft (P, K); if (isstable (N, actol)) gmax = norm (N, inf); else gmin = gmid; endif catch # cannot find solution gmin = gmid; end_try_catch endwhile endif otherwise error ("hinfsyn: this should never happen"); endswitch ## controller K = ss (ak, bk, ck, dk, tsam); if (nargout > 1) N = lft (P, K); varargout{1} = N; if (nargout > 2) gamma = norm (N, inf); varargout{2} = gamma; if (nargout > 3) varargout{3} = struct ("gamma", gamma, "rcond", rcond); endif endif endif endfunction ## sub-optimal controller, continuous-time case %!shared M, M_exp %! A = [-1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0]; %! %! B = [-3.0 -4.0 -2.0 1.0 0.0 %! 2.0 0.0 1.0 -5.0 2.0 %! -5.0 -7.0 0.0 7.0 -2.0 %! 4.0 -6.0 1.0 1.0 -2.0 %! -3.0 9.0 -8.0 0.0 5.0 %! 1.0 -2.0 3.0 -6.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 %! 9.0 -3.0 4.0 0.0 3.0 7.0 %! 0.0 1.0 -2.0 1.0 -6.0 -2.0]; %! %! D = [ 1.0 -2.0 -3.0 0.0 0.0 %! 0.0 4.0 0.0 1.0 0.0 %! 5.0 -3.0 -4.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -3.0 %! 0.0 0.0 1.0 7.0 1.0]; %! %! P = ss (A, B, C, D); %! K = hinfsyn (P, 2, 2, "method", "sub", "gmax", 15); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [ -2.8043 14.7367 4.6658 8.1596 0.0848 2.5290 %! 4.6609 3.2756 -3.5754 -2.8941 0.2393 8.2920 %! -15.3127 23.5592 -7.1229 2.7599 5.9775 -2.0285 %! -22.0691 16.4758 12.5523 -16.3602 4.4300 -3.3168 %! 30.6789 -3.9026 -1.3868 26.2357 -8.8267 10.4860 %! -5.7429 0.0577 10.8216 -11.2275 1.5074 -10.7244]; %! %! KB = [ -0.1581 -0.0793 %! -0.9237 -0.5718 %! 0.7984 0.6627 %! 0.1145 0.1496 %! -0.6743 -0.2376 %! 0.0196 -0.7598]; %! %! KC = [ -0.2480 -0.1713 -0.0880 0.1534 0.5016 -0.0730 %! 2.8810 -0.3658 1.3007 0.3945 1.2244 2.5690]; %! %! KD = [ 0.0554 0.1334 %! -0.3195 0.0333]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); ## sub-optimal controller, discrete-time case %!shared M, M_exp %! A = [-0.7 0.0 0.3 0.0 -0.5 -0.1 %! -0.6 0.2 -0.4 -0.3 0.0 0.0 %! -0.5 0.7 -0.1 0.0 0.0 -0.8 %! -0.7 0.0 0.0 -0.5 -1.0 0.0 %! 0.0 0.3 0.6 -0.9 0.1 -0.4 %! 0.5 -0.8 0.0 0.0 0.2 -0.9]; %! %! B = [-1.0 -2.0 -2.0 1.0 0.0 %! 1.0 0.0 1.0 -2.0 1.0 %! -3.0 -4.0 0.0 2.0 -2.0 %! 1.0 -2.0 1.0 0.0 -1.0 %! 0.0 1.0 -2.0 0.0 3.0 %! 1.0 0.0 3.0 -1.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 0.0 %! 0.0 2.0 0.0 -4.0 0.0 -2.0 %! 1.0 -3.0 0.0 0.0 3.0 1.0 %! 0.0 1.0 -2.0 1.0 0.0 -2.0]; %! %! D = [ 1.0 -1.0 -2.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 %! 2.0 -1.0 -3.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -1.0 %! 0.0 0.0 1.0 2.0 1.0]; %! %! P = ss (A, B, C, D, 1); # value of sampling time doesn't matter %! K = hinfsyn (P, 2, 2, "method", "sub", "gmax", 111.294); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [-18.0030 52.0376 26.0831 -0.4271 -40.9022 18.0857 %! 18.8203 -57.6244 -29.0938 0.5870 45.3309 -19.8644 %! -26.5994 77.9693 39.0368 -1.4020 -60.1129 26.6910 %! -21.4163 62.1719 30.7507 -0.9201 -48.6221 21.8351 %! -0.8911 4.2787 2.3286 -0.2424 -3.0376 1.2169 %! -5.3286 16.1955 8.4824 -0.2489 -12.2348 5.1590]; %! %! KB = [ 16.9788 14.1648 %! -18.9215 -15.6726 %! 25.2046 21.2848 %! 20.1122 16.8322 %! 1.4104 1.2040 %! 5.3181 4.5149]; %! %! KC = [ -9.1941 27.5165 13.7364 -0.3639 -21.5983 9.6025 %! 3.6490 -10.6194 -5.2772 0.2432 8.1108 -3.6293]; %! %! KD = [ 9.0317 7.5348 %! -3.4006 -2.8219]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); ## optimal controller, discrete-time case??? -- test for bisection method %!shared M, M_exp, GAM_exp, GAM %! A = [-0.7 0.0 0.3 0.0 -0.5 -0.1 %! -0.6 0.2 -0.4 -0.3 0.0 0.0 %! -0.5 0.7 -0.1 0.0 0.0 -0.8 %! -0.7 0.0 0.0 -0.5 -1.0 0.0 %! 0.0 0.3 0.6 -0.9 0.1 -0.4 %! 0.5 -0.8 0.0 0.0 0.2 -0.9]; %! %! B = [-1.0 -2.0 -2.0 1.0 0.0 %! 1.0 0.0 1.0 -2.0 1.0 %! -3.0 -4.0 0.0 2.0 -2.0 %! 1.0 -2.0 1.0 0.0 -1.0 %! 0.0 1.0 -2.0 0.0 3.0 %! 1.0 0.0 3.0 -1.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 0.0 %! 0.0 2.0 0.0 -4.0 0.0 -2.0 %! 1.0 -3.0 0.0 0.0 3.0 1.0 %! 0.0 1.0 -2.0 1.0 0.0 -2.0]; %! %! D = [ 1.0 -1.0 -2.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 %! 2.0 -1.0 -3.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -1.0 %! 0.0 0.0 1.0 2.0 1.0]; %! %! P = ss (A, B, C, D, 1); %! [K, ~, GAM] = hinfsyn (P, 2, 2, "gmax", 1000, "tolgam", 1e-4); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [-18.0030 52.0376 26.0831 -0.4271 -40.9022 18.0857 %! 18.8203 -57.6244 -29.0938 0.5870 45.3309 -19.8644 %! -26.5994 77.9693 39.0368 -1.4020 -60.1129 26.6910 %! -21.4163 62.1719 30.7507 -0.9201 -48.6221 21.8351 %! -0.8911 4.2787 2.3286 -0.2424 -3.0376 1.2169 %! -5.3286 16.1955 8.4824 -0.2489 -12.2348 5.1590]; %! %! KB = [ 16.9788 14.1648 %! -18.9215 -15.6726 %! 25.2046 21.2848 %! 20.1122 16.8322 %! 1.4104 1.2040 %! 5.3181 4.5149]; %! %! KC = [ -9.1941 27.5165 13.7364 -0.3639 -21.5983 9.6025 %! 3.6490 -10.6194 -5.2772 0.2432 8.1108 -3.6293]; %! %! KD = [ 9.0317 7.5348 %! -3.4006 -2.8219]; %! %! M_exp = [KA, KB; KC, KD]; %! GAM_exp = 111.294; %! %!assert (M, M_exp, 1e-1); %!assert (GAM, GAM_exp, 1e-3); control/inst/hnamodred.m0000644000076500000240000003401312614620313014633 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by frequency weighted optimal Hankel-norm (HNA) method. ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## HNA is an absolute error method which tries to minimize ## @iftex ## @tex ## $$ || G - G_r ||_H = \\min $$ ## $$ || V \\ (G - G_r) \\ W ||_H = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||G-Gr|| = min ## H ## ## ||V (G-Gr) W|| = min ## H ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{"order"}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values corresponding to the projection @code{op(V)*G1*op(W)}, ## where G1 denotes the @var{alpha}-stable part of the original system @var{G}. ## The @var{ns} Hankel singular values are ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is the sum of @var{info.nu} and the number of ## Hankel singular values greater than @code{max(tol1, ns*eps*info.hsv(1)}; ## ## @item 'method' ## Specifies the computational approach to be used. ## Valid values corresponding to this key are: ## @table @var ## @item 'descriptor' ## Use the inverse free descriptor system approach. ## @item 'standard' ## Use the inversion based standard approach. ## @item 'auto' ## Switch automatically to the inverse free ## descriptor approach in case of badly conditioned ## feedthrough matrices in V or W. Default method. ## @end table ## ## ## @item 'left', 'v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must be antistable. ## @iftex ## @math{|| V \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || V (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right', 'w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must be antistable. ## @iftex ## @math{|| \\dots (G-G_r) \\ W ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) W || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'left-inv', 'inv-v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must have only antistable zeros. ## @iftex ## @math{|| inv(V) \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || inv(V) (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right-inv', 'inv-w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must have only antistable zeros. ## @iftex ## @math{|| \\dots (G-G_r) \\ inv(W) ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) inv(W) || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'left-conj', 'conj-v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must be stable. ## @iftex ## @math{|| conj(V) \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || V (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right-conj', 'conj-w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must be stable. ## @iftex ## @math{|| \\dots (G-G_r) \\ conj(W) ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) W || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'left-conj-inv', 'conj-inv-v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must be minimum-phase. ## @iftex ## @math{|| conj(inv(V)) \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || V (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right-conj-inv', 'conj-inv-w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must be minimum-phase. ## @iftex ## @math{|| \\dots (G-G_r) \\ conj(inv(W)) ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) W || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced model. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## @var{tol1} < 1. ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## model. @var{tol2} <= @var{tol1} < 1. ## If not specified, ns*eps*info.hsv(1) is chosen. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## Approximation Properties: ## @itemize @bullet ## @item ## Guaranteed stability of reduced models ## @item ## Lower guaranteed error bound ## @item ## Guaranteed a priori error bound ## @iftex ## @tex ## $$ \\sigma_{r+1} \\leq || (G-G_r) ||_{\\infty} \\leq 2 \\sum_{j=r+1}^{n} \\sigma_j $$ ## @end tex ## @end iftex ## @end itemize ## ## @strong{Algorithm}@* ## Uses SLICOT AB09JD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [Gr, info] = hnamodred (G, varargin) if (nargin == 0) print_usage (); endif if (! isa (G, "lti")) error ("hnamodred: first argument must be an LTI system"); endif if (nargin > 1) # hnamodred (G, ...) if (is_real_scalar (varargin{1})) # hnamodred (G, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # hnamodred (G, opt, ...), hnamodred (G, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from hnamodred (G, nr, ...) ## and hnamodred (G, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("hnamodred: keys and values must come in pairs"); endif [a, b, c, d, tsam, scaled] = ssdata (G); [p, m] = size (G); dt = isdt (G); ## default arguments alpha = __modred_default_alpha__ (dt); av = bv = cv = dv = []; jobv = 0; aw = bw = cw = dw = []; jobw = 0; jobinv = 2; tol1 = 0; tol2 = 0; ordsel = 1; nr = 0; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"left", "v", "wo"} [av, bv, cv, dv, jobv] = __modred_check_weight__ (val, dt, p, p); ## TODO: correct error messages for non-square weights case {"right", "w", "wi"} [aw, bw, cw, dw, jobw] = __modred_check_weight__ (val, dt, m, m); case {"left-inv", "inv-v"} [av, bv, cv, dv] = __modred_check_weight__ (val, dt, p, p); jobv = 2; case {"right-inv", "inv-w"} [aw, bw, cw, dw] = __modred_check_weight__ (val, dt, m, m); jobv = 2 case {"left-conj", "conj-v"} [av, bv, cv, dv] = __modred_check_weight__ (val, dt, p, p); jobv = 3; case {"right-conj", "conj-w"} [aw, bw, cw, dw] = __modred_check_weight__ (val, dt, m, m); jobv = 3 case {"left-conj-inv", "conj-inv-v"} [av, bv, cv, dv] = __modred_check_weight__ (val, dt, p, p); jobv = 4; case {"right-conj-inv", "conj-inv-w"} [aw, bw, cw, dw] = __modred_check_weight__ (val, dt, m, m); jobv = 4 case {"order", "nr"} [nr, ordsel] = __modred_check_order__ (val, rows (a)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "method" switch (tolower (val(1))) case {"d", "n"} # "descriptor" jobinv = 0; case {"s", "i"} # "standard" jobinv = 1; case "a" # {"auto", "automatic"} jobinv = 2; otherwise error ("hnamodred: invalid computational approach"); endswitch case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); otherwise warning ("hnamodred: invalid property name '%s' ignored", key); endswitch endfor ## perform model order reduction [ar, br, cr, dr, nr, hsv, ns] = __sl_ab09jd__ (a, b, c, d, dt, scaled, nr, ordsel, alpha, ... jobv, av, bv, cv, dv, ... jobw, aw, bw, cw, dw, ... jobinv, tol1, tol2); ## assemble reduced order model Gr = ss (ar, br, cr, dr, tsam); ## assemble info struct n = rows (a); nu = n - ns; info = struct ("n", n, "ns", ns, "hsv", hsv, "nu", nu, "nr", nr); endfunction %!shared Mo, Me, Info, HSVe %! A = [ -3.8637 -7.4641 -9.1416 -7.4641 -3.8637 -1.0000 %! 1.0000, 0 0 0 0 0 %! 0 1.0000 0 0 0 0 %! 0 0 1.0000 0 0 0 %! 0 0 0 1.0000 0 0 %! 0 0 0 0 1.0000 0 ]; %! %! B = [ 1 %! 0 %! 0 %! 0 %! 0 %! 0 ]; %! %! C = [ 0 0 0 0 0 1 ]; %! %! D = [ 0 ]; %! %! G = ss (A, B, C, D); # "scaled", false %! %! AV = [ 0.2000 -1.0000 %! 1.0000 0 ]; %! %! BV = [ 1 %! 0 ]; %! %! CV = [ -1.8000 0 ]; %! %! DV = [ 1 ]; %! %! V = ss (AV, BV, CV, DV); %! %! [Gr, Info] = hnamodred (G, "left", V, "tol1", 1e-1, "tol2", 1e-14); %! [Ao, Bo, Co, Do] = ssdata (Gr); %! %! Ae = [ -0.2391 0.3072 1.1630 1.1967 %! -2.9709 -0.2391 2.6270 3.1027 %! 0.0000 0.0000 -0.5137 -1.2842 %! 0.0000 0.0000 0.1519 -0.5137 ]; %! %! Be = [ -1.0497 %! -3.7052 %! 0.8223 %! 0.7435 ]; %! %! Ce = [ -0.4466 0.0143 -0.4780 -0.2013 ]; %! %! De = [ 0.0219 ]; %! %! HSVe = [ 2.6790 2.1589 0.8424 0.1929 0.0219 0.0011 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/hsvd.m0000644000076500000240000000655512614620313013650 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{hsv} =} hsvd (@var{sys}) ## @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"offset"}, @var{offset}) ## @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"alpha"}, @var{alpha}) ## Hankel singular values of the stable part of an @acronym{LTI} model. If no output arguments are ## given, the Hankel singular values are displayed in a plot. ## ## @strong{Algorithm}@* ## Uses SLICOT AB13AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.4 function hsv_r = hsvd (sys, prop = "offset", val = 1e-8) if (nargin != 1 && nargin != 3) print_usage (); endif if (! isa (sys, "lti")) error ("hsvd: first argument must be an LTI system"); endif if (! is_real_scalar (val)) error ("hsvd: third argument must be a real scalar"); endif [a, b, c, ~, ~, scaled] = ssdata (sys); discrete = ! isct (sys); switch (tolower (prop(1))) case "o" # offset if (discrete) alpha = 1 - val; else alpha = - val; endif case "a" # alpha alpha = val; otherwise error ("hsvd: second argument invalid"); endswitch [hsv, ns] = __sl_ab13ad__ (a, b, c, discrete, alpha, scaled); if (nargout) hsv_r = hsv; else bar ((1:ns) + (rows (a) - ns), hsv); title (["Hankel Singular Values of Stable Part of ", inputname(1)]); xlabel ("State"); ylabel ("State Energy"); grid ("on"); endif endfunction %!shared hsv, hsv_exp %! a = [ -0.04165 0.0000 4.9200 -4.9200 0.0000 0.0000 0.0000 %! -5.2100 -12.500 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 3.3300 -3.3300 0.0000 0.0000 0.0000 0.0000 %! 0.5450 0.0000 0.0000 0.0000 -0.5450 0.0000 0.0000 %! 0.0000 0.0000 0.0000 4.9200 -0.04165 0.0000 4.9200 %! 0.0000 0.0000 0.0000 0.0000 -5.2100 -12.500 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 3.3300 -3.3300]; %! %! b = [ 0.0000 0.0000 %! 12.5000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 12.500 %! 0.0000 0.0000]; %! %! c = [ 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000]; %! %! sys = ss (a, b, c, [], "scaled", true); %! hsv = hsvd (sys, "alpha", 0.0); %! %! hsv_exp = [2.5139; 2.0846; 1.9178; 0.7666; 0.5473; 0.0253; 0.0246]; %! %!assert (hsv, hsv_exp, 1e-4); control/inst/impulse.m0000644000076500000240000000614112614620313014351 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} impulse (@var{sys}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{t}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}, @var{dt}) ## Impulse response of @acronym{LTI} system. ## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item t ## Time vector. Should be evenly spaced. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{initial, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 1.0 function [y_r, t_r, x_r] = impulse (varargin) if (nargin == 0) print_usage (); endif [y, t, x] = __time_response__ ("impulse", varargin, nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction control/inst/initial.m0000644000076500000240000001177112614620313014331 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} initial (@var{sys}, @var{x0}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{x0}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{x0}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{t}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}, @var{dt}) ## Initial condition response of state-space model. ## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## State-space model. ## @item x0 ## Vector of initial conditions for each state. ## @item t ## Optional time vector. Should be evenly spaced. If not specified, it is calculated ## by the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @strong{Example} ## @example ## @group ## . ## Continuous Time: x = A x , y = C x , x(0) = x0 ## ## Discrete Time: x[k+1] = A x[k] , y[k] = C x[k] , x[0] = x0 ## @end group ## @end example ## ## @seealso{impulse, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 1.0 function [y_r, t_r, x_r] = initial (varargin) if (nargin < 2) print_usage (); endif [y, t, x] = __time_response__ ("initial", varargin, nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction %!shared initial_c, initial_c_exp, initial_d, initial_d_exp %! %! A = [ -2.8 2.0 -1.8 %! -2.4 -2.0 0.8 %! 1.1 1.7 -1.0 ]; %! %! B = [ -0.8 0.5 0 %! 0 0.7 2.3 %! -0.3 -0.1 0.5 ]; %! %! C = [ -0.1 0 -0.3 %! 0.9 0.5 1.2 %! 0.1 -0.1 1.9 ]; %! %! D = [ -0.5 0 0 %! 0.1 0 0.3 %! -0.8 0 0 ]; %! %! x_0 = [1, 2, 3]; %! %! sysc = ss (A, B, C, D); %! %! [yc, tc, xc] = initial (sysc, x_0, 0.2, 0.1); %! initial_c = [yc, tc, xc]; %! %! sysd = c2d (sysc, 2); %! %! [yd, td, xd] = initial (sysd, x_0, 4); %! initial_d = [yd, td, xd]; %! %! ## expected values computed by the "dark side" %! %! yc_exp = [ -1.0000 5.5000 5.6000 %! -0.9872 5.0898 5.7671 %! -0.9536 4.6931 5.7598 ]; %! %! tc_exp = [ 0.0000 %! 0.1000 %! 0.2000 ]; %! %! xc_exp = [ 1.0000 2.0000 3.0000 %! 0.5937 1.6879 3.0929 %! 0.2390 1.5187 3.0988 ]; %! %! initial_c_exp = [yc_exp, tc_exp, xc_exp]; %! %! yd_exp = [ -1.0000 5.5000 5.6000 %! -0.6550 3.1673 4.2228 %! -0.5421 2.6186 3.4968 ]; %! %! td_exp = [ 0 %! 2 %! 4 ]; %! %! xd_exp = [ 1.0000 2.0000 3.0000 %! -0.4247 1.5194 2.3249 %! -0.3538 1.2540 1.9250 ]; %! %! initial_d_exp = [yd_exp, td_exp, xd_exp]; %! %!assert (initial_c, initial_c_exp, 1e-4) %!assert (initial_d, initial_d_exp, 1e-4) control/inst/isctrb.m0000644000076500000240000000722612614620313014166 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}, @var{tol}) ## Logical check for system controllability. ## For numerical reasons, @code{isctrb (sys)} ## should be used instead of @code{rank (ctrb (sys))}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Descriptor state-space models are possible. ## If @var{sys} is not a state-space model, it is converted to ## a minimal state-space realization, so beware of pole-zero ## cancellations which may lead to wrong results! ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item e ## Descriptor matrix (n-by-n). ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional roundoff parameter. Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not controllable. ## @item bool = 1 ## System is controllable. ## @item ncon ## Number of controllable states. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{isobsv} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function [bool, ncont] = isctrb (a, b = [], e = [], tol = []) if (nargin < 1 || nargin > 4) print_usage (); elseif (isa (a, "lti")) # isctrb (sys), isctrb (sys, tol) if (nargin > 2) print_usage (); endif if (! isa (a, "ss")) warning ("isctrb: converting to minimal state-space realization"); endif tol = b; [a, b, c, d, e] = dssdata (a, []); elseif (nargin < 2) # isctrb (a, b), isctrb (a, b, tol) print_usage (); elseif (! is_real_square_matrix (a) || ! is_real_matrix (b) || rows (a) != rows (b)) error ("isctrb: a(%dx%d), b(%dx%d) not conformal", rows (a), columns (a), rows (b), columns (b)); elseif (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (e, a))) error ("isctrb: a(%dx%d), e(%dx%d) not conformal", rows (a), columns (a), rows (e), columns (e)); endif if (isempty (tol)) tol = 0; # default tolerance elseif (! is_real_scalar (tol)) error ("isctrb: tol must be a real scalar"); endif if (isempty (e)) [~, ~, ~, ncont] = __sl_ab01od__ (a, b, tol); else [~, ~, ~, ~, ~, ~, ncont] = __sl_tg01hd__ (a, e, b, zeros (1, columns (a)), tol); endif bool = (ncont == rows (a)); endfunction control/inst/isdetectable.m0000644000076500000240000000660412614620313015327 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isdetectable (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}, @var{dflg}) ## Logical test for system detectability. ## All unstable modes must be observable or all unobservable states must be stable. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item a ## State transition matrix. ## @item c ## Measurement matrix. ## @item e ## Descriptor matrix. ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional tolerance for stability. Default value is 0. ## @item dflg = 0 ## Matrices (@var{a}, @var{c}) are part of a continuous-time system. Default Value. ## @item dflg = 1 ## Matrices (@var{a}, @var{c}) are part of a discrete-time system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not detectable. ## @item bool = 1 ## System is detectable. ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## See @command{isstabilizable} for description of computational method. ## @seealso{isstabilizable, isstable, isctrb, isobsv} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function bool = isdetectable (a, c = [], e = [], tol = [], dflg = 0) if (nargin == 0) print_usage (); elseif (isa (a, "lti")) # isdetectable (sys), isdetectable (sys, tol) if (nargin > 2) print_usage (); endif bool = isstabilizable (a.', c); # transpose is overloaded elseif (nargin < 2 || nargin > 5) print_usage (); else # isdetectable (a, c, ...) bool = isstabilizable (a.', c.', e.', tol, dflg); # arguments checked inside endif endfunction control/inst/isobsv.m0000644000076500000240000000535412614620313014205 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}, @var{tol}) ## Logical check for system observability. ## For numerical reasons, @code{isobsv (sys)} ## should be used instead of @code{rank (obsv (sys))}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Descriptor state-space models are possible. ## @item a ## State matrix (n-by-n). ## @item c ## Measurement matrix (p-by-n). ## @item e ## Descriptor matrix (n-by-n). ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional roundoff parameter. Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not observable. ## @item bool = 1 ## System is observable. ## @item nobs ## Number of observable states. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{isctrb} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function [bool, nobs] = isobsv (a, c = [], e = [], tol = []) if (nargin == 0) print_usage (); elseif (isa (a, "lti")) # isobsv (sys), isobsv (sys, tol) if (nargin > 2) print_usage (); endif [bool, nobs] = isctrb (a.', c); # transpose is overloaded elseif (nargin < 2 || nargin > 4) print_usage (); else # isobsv (a, c), isobsv (a, c, e), ... [bool, nobs] = isctrb (a.', c.', e.', tol); endif endfunction control/inst/issample.m0000644000076500000240000000661712614620313014520 0ustar lukasstaff## Copyright (C) 1996, 2000, 2002, 2003, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## 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 . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} issample (@var{ts}) ## @deftypefnx {Function File} {@var{bool} =} issample (@var{ts}, @var{flg}) ## Return true if @var{ts} is a valid sampling time. ## ## @strong{Inputs} ## @table @var ## @item ts ## Alleged sampling time to be tested. ## @item flg = 1 ## Accept real scalars @var{ts} > 0. Default Value. ## @item flg = 0 ## Accept real scalars @var{ts} >= 0. ## @item flg = -1 ## Accept real scalars @var{ts} > 0 and @var{ts} == -1. ## @item flg = -10 ## Accept real scalars @var{ts} >= 0 and @var{ts} == -1. ## @item flg = -2 ## Accept real scalars @var{ts} >= 0, @var{ts} == -1 and @var{ts} == -2. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool ## True if conditions are met and false otherwise. ## @end table ## ## @end deftypefn ## Author: A. S. Hodel ## Created: July 1995 ## Adapted-By: Lukas Reichlin ## Date: September 2009 ## Version: 0.3 function bool = issample (tsam, flg = 1) if (nargin < 1 || nargin > 2) print_usage (); endif switch (flg) case 1 # discrete bool = is_real_scalar (tsam) && (tsam > 0); case 0 # continuous or discrete bool = is_real_scalar (tsam) && (tsam >= 0); case -1 # discrete, tsam unspecified bool = is_real_scalar (tsam) && (tsam > 0 || tsam == -1); case -10 # continuous or discrete, tsam unspecified bool = is_real_scalar (tsam) && (tsam >= 0 || tsam == -1); case -2 # accept static gains bool = is_real_scalar (tsam) && (tsam >= 0 || tsam == -1 || tsam == -2); otherwise print_usage (); endswitch endfunction ## flg == 1 %!assert (issample (1)) %!assert (issample (pi)) %!assert (issample (0), false) %!assert (issample (-1), false) %!assert (issample (-1, 1), false) %!assert (issample ("a"), false) %!assert (issample (eye (2)), false) %!assert (issample (2+2i), false) ## flg == 0 %!assert (issample (1, 0)) %!assert (issample (0, 0)) %!assert (issample (-1, 0), false) %!assert (issample (pi, 0)) %!assert (issample ("b", 0), false) %!assert (issample (rand (3,2), 0), false) %!assert (issample (2+2i, 0), false) %!assert (issample (0+2i, 0), false) ## flg == -1 %!assert (issample (-1, -1)) %!assert (issample (0, -1), false) %!assert (issample (1, -1)) %!assert (issample (pi, -1)) %!assert (issample (-pi, -1), false) %!assert (issample ("b", -1), false) %!assert (issample (rand (3,2), -1), false) %!assert (issample (-2+2i, -1), false) ## errors %!error (issample (-1, "ab")) %!error (issample ()) %!error (issample (-1, -1, -1)) %!error (issample (1, pi)) %!error (issample (5, rand (2,3))) %!error (issample (0, 1+2i)) control/inst/isstabilizable.m0000644000076500000240000001225512614620313015677 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isstabilizable (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}, @var{dflg}) ## Logical check for system stabilizability. ## All unstable modes must be controllable or all uncontrollable states must be stable. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. If @var{sys} is not a state-space system, it is converted to ## a minimal state-space realization, so beware of pole-zero cancellations ## which may lead to wrong results! ## @item a ## State transition matrix. ## @item b ## Input matrix. ## @item e ## Descriptor matrix. ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional tolerance for stability. Default value is 0. ## @item dflg = 0 ## Matrices (@var{a}, @var{b}) are part of a continuous-time system. Default Value. ## @item dflg = 1 ## Matrices (@var{a}, @var{b}) are part of a discrete-time system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not stabilizable. ## @item bool = 1 ## System is stabilizable. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @example ## @group ## * Calculate staircase form (SLICOT AB01OD) ## * Extract unobservable part of state transition matrix ## * Calculate eigenvalues of unobservable part ## * Check whether ## real (ev) < -tol*(1 + abs (ev)) continuous-time ## abs (ev) < 1 - tol discrete-time ## @end group ## @end example ## @seealso{isdetectable, isstable, isctrb, isobsv} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function bool = isstabilizable (a, b = [], e = [], tol = [], dflg = 0) if (nargin < 1 || nargin > 5) print_usage (); elseif (isa (a, "lti")) # isstabilizable (sys), isstabilizable (sys, tol) if (nargin > 2) print_usage (); endif if (! isa (a, "ss")) warning ("isstabilizable: converting to minimal state-space realization"); endif tol = b; dflg = ! isct (a); [a, b, c, d, e] = dssdata (a, []); elseif (nargin == 1) # isstabilizable (a, b, ...) print_usage (); elseif (! is_real_square_matrix (a) || rows (a) != rows (b)) error ("isstabilizable: a must be square and conformal to b"); elseif (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (a, e))) error ("isstabilizable: e must be square and conformal to a"); endif if (isempty (tol)) tol = 0; # default tolerance elseif (! is_real_scalar (tol)) error ("isstabilizable: tol must be a real scalar"); endif if (isempty (e)) ## controllability staircase form [ac, ~, ~, ncont] = __sl_ab01od__ (a, b, tol); ## extract uncontrollable part of staircase form uncont_idx = ncont+1 : rows (a); auncont = ac(uncont_idx, uncont_idx); ## calculate poles of uncontrollable part pol = eig (auncont); else ## controllability staircase form - output matrix c has no influence [ac, ec, ~, ~, ~, ~, ncont] = __sl_tg01hd__ (a, e, b, zeros (1, columns (a)), tol); ## extract uncontrollable part of staircase form uncont_idx = ncont+1 : rows (a); auncont = ac(uncont_idx, uncont_idx); euncont = ec(uncont_idx, uncont_idx); ## calculate poles of uncontrollable part pol = eig (auncont, euncont); ## remove infinite poles tolinf = norm ([auncont, euncont], 2); idx = find (abs (pol) < tolinf/eps); pol = pol(idx); endif ## check whether uncontrollable poles are stable bool = __is_stable__ (pol, ! dflg, tol); endfunction control/inst/kalman.m0000644000076500000240000000740412614620313014141 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{[]}, @var{sensors}, @var{known}) ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}, @var{sensors}, @var{known}) ## Design Kalman estimator for @acronym{LTI} systems. ## ## @strong{Inputs} ## @table @var ## @item sys ## Nominal plant model. ## @item q ## Covariance of white process noise. ## @item r ## Covariance of white measurement noise. ## @item s ## Optional cross term covariance. Default value is 0. ## @item sensors ## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. ## @item known ## Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} ## are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. ## @end table ## ## @strong{Outputs} ## @table @var ## @item est ## State-space model of the Kalman estimator. ## @item g ## Estimator gain. ## @item x ## Solution of the Riccati equation. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u +-------+ ^ ## +---------------------------->| |-------> y ## | +-------+ + y | est | ^ ## u ----+--->| |----->(+)------>| |-------> x ## | sys | ^ + +-------+ ## w -------->| | | ## +-------+ | v ## ## Q = cov (w, w') R = cov (v, v') S = cov (w, v') ## @end group ## @end example ## ## @seealso{care, dare, estim, lqr} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.3 function [est, k, x] = kalman (sys, q, r, s = [], sensors = [], deterministic = []) ## TODO: type "current" for discrete-time systems if (nargin < 3 || nargin > 6 || ! isa (sys, "lti")) print_usage (); endif [a, b, c, d, e] = dssdata (sys, []); if (isempty (sensors)) sensors = 1 : rows (c); endif stochastic = setdiff (1 : columns (b), deterministic); c = c(sensors, :); g = b(:, stochastic); h = d(sensors, stochastic); if (isempty (s)) rbar = r + h*q*h.'; sbar = g * q*h.'; else rbar = r + h*q*h.'+ h*s + s.'*h.'; sbar = g * (q*h.' + s); endif if (isct (sys)) [x, l, k] = care (a.', c.', g*q*g.', rbar, sbar, e.'); else [x, l, k] = dare (a.', c.', g*q*g.', rbar, sbar, e.'); endif k = k.'; est = estim (sys, k, sensors, deterministic); endfunction %!shared m, m_exp, g, g_exp, x, x_exp %! sys = ss (-2, 1, 1, 3); %! [est, g, x] = kalman (sys, 1, 1, 1); %! [a, b, c, d] = ssdata (est); %! m = [a, b; c, d]; %! m_exp = [-2.25, 0.25; 1, 0; 1, 0]; %! g_exp = 0.25; %! x_exp = 0; %!assert (m, m_exp, 1e-2); %!assert (g, g_exp, 1e-2); %!assert (x, x_exp, 1e-2); control/inst/lqe.m0000644000076500000240000001000312614620313013444 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## Copyright (C) 2012 Megan Zagrobelny ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) ## Kalman filter for continuous-time systems. ## ## @example ## @group ## . ## x = Ax + Bu + Gw (State equation) ## y = Cx + Du + v (Measurement Equation) ## E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S ## @end group ## @end example ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). ## @item a ## State matrix of continuous-time system (n-by-n). ## @item g ## Process noise matrix of continuous-time system (n-by-g). ## If @var{g} is empty @code{[]}, an identity matrix is assumed. ## @item c ## Measurement matrix of continuous-time system (p-by-n). ## @item q ## Process noise covariance matrix (g-by-g). ## @item r ## Measurement noise covariance matrix (p-by-p). ## @item s ## Optional cross term covariance matrix (g-by-p), s = cov(w,v). ## If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item l ## Kalman filter gain matrix (n-by-p). ## @item p ## Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). ## Symmetric matrix. If @var{sys} is a discrete-time model, the solution of the ## corresponding discrete-time Riccati equation is returned. ## @item e ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## x = Ax + Bu + L(y - Cx -Du) ## ## E = eig(A - L*C) ## ## @end group ## @end example ## @seealso{dare, care, dlqr, lqr, dlqe} ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [l, p, e] = lqe (a, g, c, q = [], r = [], s = []) if (nargin < 3 || nargin > 6) print_usage (); endif if (isa (a, "lti")) [l, p, e] = lqr (a.', g, c, q); # lqe (sys, q, r, s), g=I, works like lqr (sys.', q, r, s).' elseif (isempty (g)) [l, p, e] = lqr (a.', c.', q, r, s); # lqe (a, [], c, q, r, s), g=I, works like lqr (a.', c.', q, r, s).' elseif (columns (g) != rows (q) || ! issquare (q)) error ("lqe: matrices g(%dx%d) and q(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (q), columns (q)); elseif (isempty (s)) [l, p, e] = lqr (a.', c.', g*q*g.', r); elseif (columns (g) != rows (s)) error ("lqe: matrices g(%dx%d) and s(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (s), columns (s)); else [l, p, e] = lqr (a.', c.', g*q*g.', r, g*s); endif l = l.'; ## NOTE: for discrete-time sys, the solution L' from DARE ## is different to L from DLQE (a, s) endfunction control/inst/lqr.m0000644000076500000240000000575112614620313013477 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Linear-quadratic regulator. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). ## @item a ## State matrix of continuous-time system (n-by-n). ## @item b ## Input matrix of continuous-time system (n-by-m). ## @item q ## State weighting matrix (n-by-n). ## @item r ## Input weighting matrix (m-by-m). ## @item s ## Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item g ## State feedback matrix (m-by-n). ## @item x ## Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## x = A x + B u, x(0) = x0 ## ## inf ## J(x0) = INT (x' Q x + u' R u + 2 x' S u) dt ## 0 ## ## L = eig (A - B*G) ## @end group ## @end example ## @seealso{care, dare, dlqr} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function [g, x, l] = lqr (a, b, q, r = [], s = [], e = []) if (nargin < 3 || nargin > 6) print_usage (); endif if (isa (a, "lti")) s = r; r = q; q = b; [a, b, c, d, e, tsam] = dssdata (a, []); elseif (nargin < 4) print_usage (); else tsam = 0; endif if (issample (tsam, -1)) [x, l, g] = dare (a, b, q, r, s, e); else [x, l, g] = care (a, b, q, r, s, e); endif endfunction control/inst/lsim.m0000644000076500000240000002462612614620313013647 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} lsim (@var{sys}, @var{u}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{u}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{u}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}, @var{x0}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}, @var{x0}) ## Simulate @acronym{LTI} model response to arbitrary inputs. If no output arguments are given, ## the system response is plotted on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. System must be proper, i.e. it must not have more zeros than poles. ## @item u ## Vector or array of input signal. Needs @code{length(t)} rows and as many columns ## as there are inputs. If @var{sys} is a single-input system, row vectors @var{u} ## of length @code{length(t)} are accepted as well. ## @item t ## Time vector. Should be evenly spaced. If @var{sys} is a continuous-time system ## and @var{t} is a real scalar, @var{sys} is discretized with sampling time ## @code{tsam = t/(rows(u)-1)}. If @var{sys} is a discrete-time system and @var{t} ## is not specified, vector @var{t} is assumed to be @code{0 : tsam : tsam*(rows(u)-1)}. ## @item x0 ## Vector of initial conditions for each state. If not specified, a zero vector is assumed. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. It is always evenly spaced. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{impulse, initial, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function [y_r, t_r, x_r] = lsim (varargin) ## TODO: individual initial state vectors 'x0' for each system ## there would be conflicts with other arguments, ## maybe a cell {x0_1, x0_2, ..., x0_N} would be a solution? if (nargin < 2) print_usage (); endif idx = cellfun (@islogical, varargin); tmp = cellfun (@double, varargin(idx), "uniformoutput", false); varargin(idx) = tmp; sys_idx = cellfun (@isa, varargin, {"lti"}); # LTI models mat_idx = cellfun (@is_real_matrix, varargin); # matrices sty_idx = cellfun (@ischar, varargin); # string (style arguments) inv_idx = ! (sys_idx | mat_idx | sty_idx); # invalid arguments if (any (inv_idx)) warning ("lsim: arguments number %s are invalid and are being ignored", ... mat2str (find (inv_idx)(:).')); endif if (nnz (sys_idx) == 0) error ("lsim: require at least one LTI model"); endif if (nargout > 0 && (nnz (sys_idx) > 1 || any (sty_idx))) print_usage (); endif if (! size_equal (varargin{sys_idx})) error ("lsim: all LTI models must have equal size"); endif if (any (find (sty_idx) < find (sys_idx)(1))) warning ("lsim: strings in front of first LTI model are being ignored"); endif t = []; x0 = []; # default arguments switch (nnz (mat_idx)) case 0 error ("lsim: require input signal 'u'"); case 1 u = varargin{mat_idx}; case 2 [u, t] = varargin{mat_idx}; case 3 [u, t, x0] = varargin{mat_idx}; otherwise print_usage (); endswitch if (is_real_vector (u)) # allow row vectors for single-input systems u = vec (u); elseif (isempty (u)) # ! is_real_matrix (u) already tested error ("lsim: input signal 'u' must be a real-valued matrix"); endif if (! is_real_vector (t) && ! isempty (t)) error ("lsim: time vector 't' must be real-valued or empty"); endif if (! isequal (t, unique (t))) error ("lsim: time vector 't' must be sorted"); endif if (! is_real_vector (x0) && ! isempty (x0)) error ("lsim: initial state vector 'x0' must be empty or a real-valued vector"); endif ## function [y, t, x_arr] = __linear_simulation__ (sys, u, t, x0) [y, t, x] = cellfun (@__linear_simulation__, varargin(sys_idx), {u}, {t}, {x0}, "uniformoutput", false); if (nargout == 0) # plot information ## extract plotting styles tmp = cumsum (sys_idx); tmp(sys_idx | ! sty_idx) = 0; n_sys = nnz (sys_idx); sty = arrayfun (@(x) varargin(tmp == x), 1:n_sys, "uniformoutput", false); ## default plotting styles if empty colororder = get (gca, "colororder"); rc = rows (colororder); def = arrayfun (@(k) {"color", colororder(1+rem (k-1, rc), :)}, 1:n_sys, "uniformoutput", false); idx = cellfun (@isempty, sty); sty(idx) = def(idx); ## get system names for legend ## leg = cellfun (@inputname, find (sys_idx), "uniformoutput", false); leg = cell (1, n_sys); idx = find (sys_idx); for k = 1 : n_sys try leg{k} = inputname (idx(k)); catch leg{k} = ""; # catch case lsim (lticell{:}, ...) end_try_catch endfor [p, m] = size (varargin(sys_idx){1}); ct_idx = cellfun (@isct, varargin(sys_idx)); str = "Linear Simulation Results"; outname = get (varargin(sys_idx){end}, "outname"); outname = __labels__ (outname, "y"); for k = 1 : n_sys # for every system if (ct_idx(k)) # continuous-time system for i = 1 : p # for every output if (p != 1) subplot (p, 1, i); endif plot (t{k}, y{k}(:, i), sty{k}{:}); hold on; grid on; if (k == n_sys) axis tight ylim (__axis_margin__ (ylim)) ylabel (outname{i}); if (i == 1) title (str); endif endif endfor else # discrete-time system for i = 1 : p # for every output if (p != 1) subplot (p, 1, i); endif stairs (t{k}, y{k}(:, i), sty{k}{:}); hold on; grid on; if (k == n_sys) axis tight; ylim (__axis_margin__ (ylim)) ylabel (outname{i}); if (i == 1) title (str); endif endif endfor endif endfor xlabel ("Time [s]"); if (p == 1 && m == 1) legend (leg) endif hold off; else # return values y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction function [y, t, x_arr] = __linear_simulation__ (sys, u, t, x0) method = "zoh"; [urows, ucols] = size (u); len_t = length (t); if (isct (sys)) # continuous-time system if (isempty (t)) # lsim (sys, u, [], ...) error ("lsim: time vector 't' must not be empty"); elseif (len_t == 1) # lsim (sys, u, tfinal, ...) dt = t / (urows - 1); t = vec (linspace (0, t, urows)); elseif (len_t != urows) error ("lsim: length of time vector (%d) doesn't match input signal (%dx%d)", ... len_t, urows, ucols); else # lsim (sys, u, t, ...) dt = abs (t(end) - t(1)) / (urows - 1); # assume that t is regularly spaced t = vec (linspace (t(1), t(end), urows)); endif sys = c2d (sys, dt, method); # convert to discrete-time model else # discrete-time system dt = abs (get (sys, "tsam")); # use 1 second as default if tsam is unspecified (-1) if (isempty (t)) # lsim (sys, u) t = vec (linspace (0, dt*(urows-1), urows)); elseif (len_t == 1) # lsim (sys, u, tfinal) ## TODO: maybe raise warning if abs (tfinal - dt*(urows-1)) > dt t = vec (linspace (0, dt*(urows-1), urows)); elseif (len_t != urows) error ("lsim: length of time vector (%d) doesn't match input signal (%dx%d)", ... len_t, urows, ucols); else # lsim (sys, u, t, ...) t = vec (linspace (t(1), t(end), len_t)); endif endif [A, B, C, D] = ssdata (sys); [p, m] = size (D); # number of outputs and inputs n = rows (A); # number of states if (ucols != m) error ("lsim: input vector 'u' must have %d columns", m); endif ## preallocate memory y = zeros (urows, p); x_arr = zeros (urows, n); ## initial conditions if (isempty (x0)) x0 = zeros (n, 1); elseif (n != length (x0) || ! is_real_vector (x0)) error ("lsim: 'x0' must be a vector with %d elements", n); endif x = vec (x0); # make sure that x is a column vector ## simulation for k = 1 : urows y(k, :) = C * x + D * u(k, :).'; x_arr(k, :) = x; x = A * x + B * u(k, :).'; endfor endfunction ## TODO: add test cases control/inst/ltimodels.m0000644000076500000240000003240612614620313014672 0ustar lukasstaff## Copyright (C) 2009 Luca Favatella ## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} test ltimodels ## @deftypefnx {Function File} ltimodels ## @deftypefnx {Function File} ltimodels (@var{systype}) ## Test suite and help for @acronym{LTI} models. ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function ltimodels (systype = "general") %if (nargin > 1) print_usage (); %endif ## TODO: write documentation if (! ischar (systype)) error ("ltimodels: argument must be a string"); endif systype = lower (systype); switch (systype) case "ss" str = {"State Space (SS) Models"... "-----------------------"... ""}; case "tf" str = {"Transfer Function (TF) Models"... "-----------------------------"... ""}; otherwise # general str = {"Linear Time Invariant (LTI) Models"... "----------------------------------"... ""}; endswitch disp (""); disp (char (str)); endfunction ## ============================================================================== ## LTI Tests ## ============================================================================== ## isct, isdt %!shared ltisys %! ltisys = tf (12); %!assert (ltisys.ts, -2); %!assert (isct (ltisys)); %!assert (isdt (ltisys)); %!shared ltisys %! ltisys = ss (17); %!assert (ltisys.ts, -2); %!assert (isct (ltisys)); %!assert (isdt (ltisys)); %!shared ltisys %! ltisys = tf (1, [1 1]); %!assert (ltisys.ts, 0); %!assert (isct (ltisys)); %!assert (! isdt (ltisys)); %!shared ltisys, ts %! ts = 0.1; %! ltisys = ss (-1, 1, 1, 0, ts); %!assert (ltisys.ts, ts); %!assert (! isct (ltisys)); %!assert (isdt (ltisys)); ## ============================================================================== ## TF Tests ## ============================================================================== ## ============================================================================== ## SS Tests ## ============================================================================== ## staircase (SLICOT AB01OD) %!shared Ac, Bc, Ace, Bce %! A = [ 17.0 24.0 1.0 8.0 15.0 %! 23.0 5.0 7.0 14.0 16.0 %! 4.0 6.0 13.0 20.0 22.0 %! 10.0 12.0 19.0 21.0 3.0 %! 11.0 18.0 25.0 2.0 9.0 ]; %! %! B = [ -1.0 -4.0 %! 4.0 9.0 %! -9.0 -16.0 %! 16.0 25.0 %! -25.0 -36.0 ]; %! %! tol = 0; %! %! A = A.'; # There's a little mistake in the example %! # program of routine AB01OD in SLICOT 5.0 %! %! [Ac, Bc, U, ncont] = __sl_ab01od__ (A, B, tol); %! %! Ace = [ 12.8848 3.2345 11.8211 3.3758 -0.8982 %! 4.4741 -12.5544 5.3509 5.9403 1.4360 %! 14.4576 7.6855 23.1452 26.3872 -29.9557 %! 0.0000 1.4805 27.4668 22.6564 -0.0072 %! 0.0000 0.0000 -30.4822 0.6745 18.8680 ]; %! %! Bce = [ 31.1199 47.6865 %! 3.2480 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 ]; %! %!assert (Ac, Ace, 1e-4); %!assert (Bc, Bce, 1e-4); ## controllability staircase form of descriptor state-space models (SLICOT TG01HD) %!shared ac, ec, bc, cc, q, z, ncont, ac_e, ec_e, bc_e, cc_e, q_e, z_e, ncont_e %! %! a = [ 2 0 2 0 -1 3 1 %! 0 1 0 0 1 0 0 %! 0 0 0 1 0 0 1 %! 0 0 2 0 -1 3 1 %! 0 0 0 1 0 0 1 %! 0 1 0 0 1 0 0 %! 0 0 0 1 0 0 1 ]; %! %! e = [ 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 1 %! 0 0 0 0 0 0 1 %! 0 0 0 1 0 0 0 %! 0 0 1 0 -1 0 0 %! 1 3 0 2 0 0 0 ]; %! %! b = [ 2 1 0 %! 0 0 0 %! 0 0 0 %! 0 0 0 %! 0 0 0 %! 0 0 0 %! 1 2 3 ]; %! %! c = [ 1 0 0 1 0 0 1 %! 0 -1 1 0 -1 1 0 ]; %! %! tol = 0; %! %! [ac, ec, bc, cc, q, z, ncont] = __sl_tg01hd__ (a, e, b, c, tol); %! %! ncont_e = 3; %! %! ac_e = [ 0.0000 0.0000 0.0000 0.0000 -1.2627 0.4334 0.4666 %! 0.0000 2.0000 0.0000 -3.7417 -0.8520 0.2924 -0.4342 %! 0.0000 0.0000 1.7862 0.3780 -0.2651 -0.7723 0.0000 %! 0.0000 0.0000 0.0000 3.7417 0.8520 -0.2924 0.4342 %! 0.0000 0.0000 0.0000 0.0000 -1.5540 0.5334 0.5742 %! 0.0000 0.0000 0.0000 0.0000 -0.6533 0.2242 0.2414 %! 0.0000 0.0000 0.0000 0.0000 -0.5892 0.2022 0.2177 ]; %! %! ec_e = [ -1.8325 1.0000 2.3752 0.0000 -0.8214 0.2819 1.8016 %! 0.4887 0.0000 0.3770 -0.5345 0.1874 0.5461 0.0000 %! -0.1728 0.0000 -0.1333 -1.1339 0.1325 0.3861 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.8520 -0.2924 0.4342 %! 0.0000 0.0000 0.0000 0.0000 -1.0260 -0.1496 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 1.1937 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; %! %! bc_e = [ 1.0000 2.0000 3.0000 %! 2.0000 1.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 ]; %! %! cc_e = [ 0.0000 1.0000 0.0000 0.0000 -1.2627 0.4334 0.4666 %! 0.3665 0.0000 -0.9803 -1.6036 0.1874 0.5461 0.0000 ]; %! %! q_e = [ 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.7071 0.0000 0.2740 -0.6519 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.8304 0.3491 -0.4342 %! 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.4003 0.1683 0.9008 %! 0.0000 0.0000 0.7071 0.0000 -0.2740 0.6519 0.0000 %! 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 ]; %! %! z_e = [ 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! -0.6108 0.0000 0.7917 0.0000 0.0000 0.0000 0.0000 %! 0.4887 0.0000 0.3770 -0.5345 0.1874 0.5461 0.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.4107 0.1410 0.9008 %! 0.6108 0.0000 0.4713 0.2673 -0.1874 -0.5461 0.0000 %! -0.1222 0.0000 -0.0943 -0.8018 -0.1874 -0.5461 0.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.8520 0.2924 -0.4342 ]; %! %!assert (ac, ac_e, 1e-4); %!assert (ec, ec_e, 1e-4); %!assert (bc, bc_e, 1e-4); %!assert (cc, cc_e, 1e-4); %!assert (q, q_e, 1e-4); %!assert (z, z_e, 1e-4); %!assert (ncont, ncont_e); ## observability staircase form of descriptor state-space models (SLICOT TG01ID) %!shared ao, eo, bo, co, q, z, nobsv, ao_e, eo_e, bo_e, co_e, q_e, z_e, nobsv_e %! %! a = [ 2 0 0 0 0 0 0 %! 0 1 0 0 0 1 0 %! 2 0 0 2 0 0 0 %! 0 0 1 0 1 0 1 %! -1 1 0 -1 0 1 0 %! 3 0 0 3 0 0 0 %! 1 0 1 1 1 0 1 ]; %! %! e = [ 0 0 0 0 0 0 1 %! 0 0 0 0 0 0 3 %! 1 0 0 0 0 1 0 %! 0 0 0 0 1 0 2 %! 0 0 0 0 0 -1 0 %! 0 1 0 0 0 0 0 %! 0 0 1 1 0 0 0 ]; %! %! b = [ 1 0 %! 0 -1 %! 0 1 %! 1 0 %! 0 -1 %! 0 1 %! 1 0 ]; %! %! c = [ 2 0 0 0 0 0 1 %! 1 0 0 0 0 0 2 %! 0 0 0 0 0 0 3 ]; %! %! tol = 0; %! %! [ao, eo, bo, co, q, z, nobsv] = __sl_tg01id__ (a, e, b, c, tol); %! %! nobsv_e = 3; %! %! ao_e = [ 0.2177 0.2414 0.5742 0.4342 0.0000 -0.4342 0.4666 %! 0.2022 0.2242 0.5334 -0.2924 -0.7723 0.2924 0.4334 %! -0.5892 -0.6533 -1.5540 0.8520 -0.2651 -0.8520 -1.2627 %! 0.0000 0.0000 0.0000 3.7417 0.3780 -3.7417 0.0000 %! 0.0000 0.0000 0.0000 0.0000 1.7862 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 2.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 ]; %! %! eo_e = [ 1.0000 0.0000 0.0000 0.4342 0.0000 0.0000 1.8016 %! 0.0000 1.1937 -0.1496 -0.2924 0.3861 0.5461 0.2819 %! 0.0000 0.0000 -1.0260 0.8520 0.1325 0.1874 -0.8214 %! 0.0000 0.0000 0.0000 0.0000 -1.1339 -0.5345 0.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.1333 0.3770 2.3752 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.1728 0.4887 -1.8325 ]; %! %! bo_e = [ 0.4666 0.0000 %! 0.4334 0.5461 %! -1.2627 0.1874 %! 0.0000 -1.6036 %! 0.0000 -0.9803 %! 1.0000 0.0000 %! 0.0000 0.3665 ]; %! %! co_e = [ 0.0000 0.0000 0.0000 0.0000 0.0000 2.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 2.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 3.0000 ]; %! %! q_e = [ 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.7917 0.0000 -0.6108 %! 0.0000 0.5461 0.1874 -0.5345 0.3770 0.0000 0.4887 %! 0.9008 0.1410 -0.4107 0.0000 0.0000 0.0000 0.0000 %! 0.0000 -0.5461 -0.1874 0.2673 0.4713 0.0000 0.6108 %! 0.0000 -0.5461 -0.1874 -0.8018 -0.0943 0.0000 -0.1222 %! -0.4342 0.2924 -0.8520 0.0000 0.0000 0.0000 0.0000 ]; %! %! z_e = [ 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 %! 0.0000 -0.6519 0.2740 0.0000 0.7071 0.0000 0.0000 %! -0.4342 0.3491 0.8304 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.9008 0.1683 0.4003 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.6519 -0.2740 0.0000 0.7071 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; %! %!assert (ao, ao_e, 1e-4); %!assert (eo, eo_e, 1e-4); %!assert (bo, bo_e, 1e-4); %!assert (co, co_e, 1e-4); %!assert (q, q_e, 1e-4); %!assert (z, z_e, 1e-4); %!assert (nobsv, nobsv_e); ## ss2tf conversion by Slicot TB04BD ## Test provided by Slicot %!shared NUM, DEN, NUMe, DENe %! A = [ -1.0 0.0 0.0 %! 0.0 -2.0 0.0 %! 0.0 0.0 -3.0 ]; %! %! B = [ 0.0 1.0 -1.0 %! 1.0 1.0 0.0 ].'; %! %! C = [ 0.0 1.0 1.0 %! 1.0 1.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! [NUM, DEN] = tfdata (ss (A, B, C, D)); %! %! NUMe = {[1, 5, 7], [1]; [1], [1, 5, 5]}; %! %! DENe = {[1, 5, 6], [1, 2]; [1, 5, 6], [1, 3, 2]}; %! %!assert (NUM, NUMe, 1e-4); %!assert (DEN, DENe, 1e-4); ## ss2tf conversion by Slicot TB04BD ## Trivial test %!shared NUM, DEN, NUMe, DENe %! A = [ 0 ]; %! %! B = [ 1 ]; %! %! C = [ 1 ]; %! %! D = [ 0 ]; %! %! [NUM, DEN] = tfdata (ss (A, B, C, D)); %! %! NUMe = {[1]}; %! %! DENe = {[1, 0]}; %! %!assert (NUM, NUMe, 1e-4); %!assert (DEN, DENe, 1e-4); ## transfer function to state-space conversion ## test from SLICOT TD04AD %!shared Mo, Me %! INDEX = [ 3 3 ]; %! %! DCOEFF = [ 1.0 6.0 11.0 6.0 %! 1.0 6.0 11.0 6.0 ]; %! %! UCOEFF = zeros (2, 2, 4); %! %! u11 = [ 1.0 6.0 12.0 7.0 ]; %! u12 = [ 0.0 1.0 4.0 3.0 ]; %! u21 = [ 0.0 0.0 1.0 1.0 ]; %! u22 = [ 1.0 8.0 20.0 15.0 ]; %! %! UCOEFF(1,1,:) = u11; %! UCOEFF(1,2,:) = u12; %! UCOEFF(2,1,:) = u21; %! UCOEFF(2,2,:) = u22; %! %! [Ao, Bo, Co, Do] = __sl_td04ad__ (UCOEFF, DCOEFF, INDEX, 0); %! %! Ae = [ 0.5000 -0.8028 0.9387 %! 4.4047 -2.3380 2.5076 %! -5.5541 1.6872 -4.1620 ]; %! %! Be = [ -0.2000 -1.2500 %! 0.0000 -0.6097 %! 0.0000 2.2217 ]; %! %! Ce = [ 0.0000 -0.8679 0.2119 %! 0.0000 0.0000 0.9002 ]; %! %! De = [ 1.0000 0.0000 %! 0.0000 1.0000 ]; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); control/inst/lyap.m0000644000076500000240000001202112614620313013632 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{x} =} lyap (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{c}) ## @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{[]}, @var{e}) ## Solve continuous-time Lyapunov or Sylvester equations. ## ## @strong{Equations} ## @example ## @group ## AX + XA' + B = 0 (Lyapunov Equation) ## ## AX + XB + C = 0 (Sylvester Equation) ## ## AXE' + EXA' + B = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03MD, SB04MD and SG03AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{lyapchol, dlyap, dlyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [x, scale] = lyap (a, b, c, e) scale = 1; switch (nargin) case 2 # Lyapunov equation if (! is_real_square_matrix (a, b)) ## error ("lyap: a, b must be real and square"); error ("lyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (rows (a) != rows (b)) ## error ("lyap: a, b must have the same number of rows"); error ("lyap: %s, %s must have the same number of rows", ... inputname (1), inputname (2)); endif [x, scale] = __sl_sb03md__ (a, -b, false); # AX + XA' = -B ## x /= scale; # 0 < scale <= 1 case 3 # Sylvester equation if (! is_real_square_matrix (a, b)) ## error ("lyap: a, b must be real and square"); error ("lyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (! is_real_matrix (c) || rows (c) != rows (a) || columns (c) != columns (b)) ## error ("lyap: c must be a real (%dx%d) matrix", rows (a), columns (b)); error ("lyap: %s must be a real (%dx%d) matrix", ... rows (a), columns (b), inputname (3)); endif x = __sl_sb04md__ (a, b, -c); # AX + XB = -C case 4 # generalized Lyapunov equation if (! isempty (c)) print_usage (); endif if (! is_real_square_matrix (a, b, e)) ## error ("lyap: a, b, e must be real and square"); error ("lyap: %s, %s, %s must be real and square", ... inputname (1), inputname (2), inputname (4)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("lyap: a, b, e must have the same number of rows"); error ("lyap: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (4)); endif if (! issymmetric (b)) ## error ("lyap: b must be symmetric"); error ("lyap: %s must be symmetric", ... inputname (2)); endif [x, scale] = __sl_sg03ad__ (a, e, -b, false); # AXE' + EXA' = -B ## x /= scale; # 0 < scale <= 1 otherwise print_usage (); endswitch if (scale < 1) warning ("lyap: solution scaled by %g to prevent overflow", scale); endif endfunction ## Lyapunov %!shared X, X_exp %! A = [1, 2; -3, -4]; %! Q = [3, 1; 1, 1]; %! X = lyap (A, Q); %! X_exp = [ 6.1667, -3.8333; %! -3.8333, 3.0000]; %!assert (X, X_exp, 1e-4); ## Sylvester %!shared X, X_exp %! A = [2.0 1.0 3.0 %! 0.0 2.0 1.0 %! 6.0 1.0 2.0]; %! %! B = [2.0 1.0 %! 1.0 6.0]; %! %! C = [2.0 1.0 %! 1.0 4.0 %! 0.0 5.0]; %! %! X = lyap (A, B, -C); %! %! X_exp = [-2.7685 0.5498 %! -1.0531 0.6865 %! 4.5257 -0.4389]; %! %!assert (X, X_exp, 1e-4); ## Generalized Lyapunov %!shared X, X_exp %! A = [ 3.0 1.0 1.0 %! 1.0 3.0 0.0 %! 1.0 0.0 2.0]; %! %! E = [ 1.0 3.0 0.0 %! 3.0 2.0 1.0 %! 1.0 0.0 1.0]; %! %! B = [-64.0 -73.0 -28.0 %! -73.0 -70.0 -25.0 %! -28.0 -25.0 -18.0]; %! %! X = lyap (A.', -B, [], E.'); %! %! X_exp = [-2.0000 -1.0000 0.0000 %! -1.0000 -3.0000 -1.0000 %! 0.0000 -1.0000 -3.0000]; %! %!assert (X, X_exp, 1e-4); control/inst/lyapchol.m0000644000076500000240000001072112614620313014505 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}, @var{e}) ## Compute Cholesky factor of continuous-time Lyapunov equations. ## ## @strong{Equations} ## @example ## @group ## A U' U + U' U A' + B B' = 0 (Lyapunov Equation) ## ## A U' U E' + E U' U A' + B B' = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03OD and SG03BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{lyap, dlyap, dlyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [u, scale] = lyapchol (a, b, e) switch (nargin) case 2 if (! is_real_square_matrix (a)) ## error ("lyapchol: a must be real and square"); error ("lyapchol: %s must be real and square", ... inputname (1)); endif if (! is_real_matrix (b)) ## error ("lyapchol: b must be real") error ("lyapchol: %s must be real", ... inputname (2)) endif if (rows (a) != rows (b)) ## error ("lyapchol: a and b must have the same number of rows"); error ("lyapchol: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif [u, scale] = __sl_sb03od__ (a.', b.', false); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' case 3 if (! is_real_square_matrix (a, e)) ## error ("lyapchol: a, e must be real and square"); error ("lyapchol: %s, %s must be real and square", ... inputname (1), inputname (3)); endif if (! is_real_matrix (b)) ## error ("lyapchol: b must be real"); error ("lyapchol: %s must be real", ... inputname (2)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("lyapchol: a, b, e must have the same number of rows"); error ("lyapchol: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (3)); endif [u, scale] = __sl_sg03bd__ (a.', e.', b.', false); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' otherwise print_usage (); endswitch if (scale < 1) warning ("lyapchol: solution scaled by %g to prevent overflow", scale); endif endfunction %!shared U, U_exp, X, X_exp %! %! A = [ -1.0 37.0 -12.0 -12.0 %! -1.0 -10.0 0.0 4.0 %! 2.0 -4.0 7.0 -6.0 %! 2.0 2.0 7.0 -9.0 ].'; %! %! B = [ 1.0 2.5 1.0 3.5 %! 0.0 1.0 0.0 1.0 %! -1.0 -2.5 -1.0 -1.5 %! 1.0 2.5 4.0 -5.5 %! -1.0 -2.5 -4.0 3.5 ].'; %! %! U = lyapchol (A, B); %! %! X = U.' * U; # use lyap at home! %! %! U_exp = [ 1.0000 0.0000 0.0000 0.0000 %! 3.0000 1.0000 0.0000 0.0000 %! 2.0000 -1.0000 1.0000 0.0000 %! -1.0000 1.0000 -2.0000 1.0000 ].'; %! %! X_exp = [ 1.0000 3.0000 2.0000 -1.0000 %! 3.0000 10.0000 5.0000 -2.0000 %! 2.0000 5.0000 6.0000 -5.0000 %! -1.0000 -2.0000 -5.0000 7.0000 ]; %! %!assert (U, U_exp, 1e-4); %!assert (X, X_exp, 1e-4); %!shared U, U_exp, X, X_exp %! %! A = [ -1.0 3.0 -4.0 %! 0.0 5.0 -2.0 %! -4.0 4.0 1.0 ].'; %! %! E = [ 2.0 1.0 3.0 %! 2.0 0.0 1.0 %! 4.0 5.0 1.0 ].'; %! %! B = [ 2.0 -1.0 7.0 ].'; %! %! U = lyapchol (A, B, E); %! %! U_exp = [ 1.6003 -0.4418 -0.1523 %! 0.0000 0.6795 -0.2499 %! 0.0000 0.0000 0.2041 ]; %! %!assert (U, U_exp, 1e-4); control/inst/Madievski.m0000644000076500000240000001252112614620313014606 0ustar lukasstaff%% -*- texinfo -*- %% Demonstration of frequency-weighted controller reduction. %% The system considered in this example has been studied by Madievski and %% Anderson [1] and comprises four spinning disks. The disks are connected by a %% flexible rod, a motor applies torque to the third disk, and the angular %% displacement of the first disk is the variable of interest. The state-space %% model of eighth order is non-minimumphase and unstable. %% The continuous-time LQG controller used in [1] is open-loop stable and of %% eighth order like the plant. This eighth-order controller shall be reduced by %% frequency-weighted singular perturbation approximation (SPA). %% The major aim of this reduction is the preservation of the closed-loop %% transfer function. This means that the error in approximation of the %% controller @var{K} by the reduced-order controller @var{Kr} is minimized by %% @iftex %% @tex %% $$ \\underset{K_r}{\\min} \\ || W \\ (K - K_r) \\ V ||_{\\infty} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% min ||W (K-Kr) V|| %% Kr inf %% @end example %% @end ifnottex %% where weights @var{W} and @var{V} are dictated by the requirement to preserve %% (as far as possible) the closed-loop transfer function. In minimizing the %% error, they cause the approximation process for @var{K} to be more accurate at %% certain frequencies. Suggested by [1] is the use of the following stability %% and performance enforcing weights: %% @iftex %% @tex %% $$ W = (I - G K)^{-1} G, \\qquad V = (I - G K)^{-1} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% -1 -1 %% W = (I - G K) G, V = (I - G K) %% @end example %% @end ifnottex %% This example script reduces the eighth-order controller to orders four and two %% by the function call %% @code{Kr = spaconred (G, K, nr, 'feedback', '-')} %% where argument @var{nr} denotes the desired order (4 or 2). The key-value %% pair @code{'feedback', '-'} allows the reduction of negative feedback %% controllers while the default setting expects positive feedback controllers. %% The frequency responses of the original and reduced-order controllers are %% depicted in figure 1, the step responses of the closed loop in figure 2. %% There is no visible difference between the step responses of the closed-loop %% systems with original (blue) and fourth order (green) controllers. %% The second order controller (red) causes ripples in the step response, but %% otherwise the behavior of the system is unaltered. This leads to the %% conclusion that function @command{spaconred} is well suited to reduce the %% order of controllers considerably, while stability and performance are %% retained. %% @*@strong{Reference}@* %% [1] Madievski, A.G. and Anderson, B.D.O. %% @cite{Sampled-Data Controller Reduction Procedure}, %% IEEE Transactions of Automatic Control, %% Vol. 40, No. 11, November 1995 % =============================================================================== % Frequency Weighted Controller Reduction Lukas Reichlin December 2011 % =============================================================================== % Tabula Rasa clear all, close all, clc % Plant Ap1 = [ 0.0 1.0 0.0 0.0 ]; Ap2 = [ -0.015 0.765 -0.765 -0.015 ]; Ap3 = [ -0.028 1.410 -1.410 -0.028 ]; Ap4 = [ -0.04 1.85 -1.85 -0.04 ]; Ap = blkdiag (Ap1, Ap2, Ap3, Ap4); Bp = [ 0.026 -0.251 0.033 -0.886 -4.017 0.145 3.604 0.280 ]; Cp = [ -0.996 -0.105 0.261 0.009 -0.001 -0.043 0.002 -0.026 ]; Dp = [ 0.0 ]; P = ss (Ap, Bp, Cp, Dp); % Controller Ac = [ -0.4077 0.9741 0.1073 0.0131 0.0023 -0.0186 -0.0003 -0.0098 -0.0977 -0.1750 0.0215 -0.0896 -0.0260 0.0057 0.0109 -0.0105 0.0011 0.0218 -0.0148 0.7769 0.0034 -0.0013 -0.0014 0.0011 -0.0361 -0.5853 -0.7701 -0.3341 -0.0915 0.0334 0.0378 -0.0290 -0.1716 -2.6546 -0.0210 -1.4467 -0.4428 1.5611 0.1715 -0.1318 -0.0020 0.0950 0.0029 0.0523 -1.3950 -0.0338 -0.0062 0.0045 0.1607 2.3824 0.0170 1.2979 0.3721 -0.1353 -0.1938 1.9685 -0.0006 0.1837 0.0048 0.1010 0.0289 -0.0111 -1.8619 -0.0311 ]; Bc = [ -0.4105 -0.0868 -0.0004 0.0036 0.0081 -0.0085 -0.0004 -0.0132 ]; Cc = [ -0.0447 -0.6611 -0.0047 -0.3601 -0.1033 0.0375 0.0427 -0.0329 ]; Dc = [ 0.0 ]; K = ss (Ac, Bc, Cc, Dc); % Controller Reduction Kr4 = spaconred (P, K, 4, 'feedback', '-') Kr2 = spaconred (P, K, 2, 'feedback', '-') % Open Loop L = P * K; Lr4 = P * Kr4; Lr2 = P * Kr2; % Closed Loop T = feedback (L); Tr4 = feedback (Lr4); Tr2 = feedback (Lr2); % Frequency Range w = {1e-2, 1e1}; % Bode Plot of Controller figure (1) bode (K, Kr4, Kr2, w) legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'Location', 'SouthWest') % Step Response of Closed Loop figure (2) step (T, Tr4, Tr2, 100) legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'Location', 'SouthEast') control/inst/mag2db.m0000644000076500000240000000264512614620313014034 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{db} =} mag2db (@var{mag}) ## Convert Magnitude to Decibels (dB). ## ## @strong{Inputs} ## @table @var ## @item mag ## Magnitude value(s). Both real-valued scalars and matrices are accepted. ## @end table ## ## @strong{Outputs} ## @table @var ## @item db ## Decibel (dB) value(s). ## @end table ## ## @seealso{db2mag} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2012 ## Version: 0.1 function db = mag2db (mag) if (nargin != 1 || ! is_real_matrix (mag)) print_usage (); endif db = 20 .* log10 (mag); db(mag < 0) = NaN; endfunction %!assert (mag2db (100), 40); %!assert (mag2db (0.1), -20); control/inst/margin.m0000644000076500000240000003071112614620313014150 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}) ## @deftypefnx{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}, @var{tol}) ## Gain and phase margin of a system. ## If no output arguments are given, both gain and phase margin are plotted on a bode diagram. ## Otherwise, the margins and their corresponding frequencies are computed and returned. ## A more robust criterion to assess the stability of a feedback system is the sensitivity Ms ## computed by function @command{sensitivity}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Must be a single-input and single-output (SISO) system. ## @item tol ## Imaginary parts below @var{tol} are assumed to be zero. ## If not specified, default value @code{sqrt (eps)} is taken. ## @end table ## ## @strong{Outputs} ## @table @var ## @item gamma ## Gain margin (as gain, not dBs). ## @item phi ## Phase margin (in degrees). ## @item w_gamma ## Frequency for the gain margin (in rad/s). ## @item w_phi ## Frequency for the phase margin (in rad/s). ## @end table ## ## @strong{Algorithm}@* ## Uses function @command{roots} to calculate the frequencies ## @var{w_gamma}, @var{w_phi} from special polynomials created ## from the transfer function of @var{sys} as listed below ## in section @guillemetleft{}Equations@guillemetright{}. ## ## @strong{Equations} ## @example ## @group ## CONTINUOUS-TIME SYSTEMS ## Gain Margin ## _ _ ## L(jw) = L(jw) BTW: L(jw) = L(-jw) = conj (L(jw)) ## ## num(jw) num(-jw) ## ------- = -------- ## den(jw) den(-jw) ## ## num(jw) den(-jw) = num(-jw) den(jw) ## ## imag (num(jw) den(-jw)) = 0 ## imag (num(-jw) den(jw)) = 0 ## @end group ## @end example ## @example ## @group ## Phase Margin ## |num(jw)| ## |L(jw)| = |-------| = 1 ## |den(jw)| ## _ 2 2 ## z z = Re z + Im z ## ## num(jw) num(-jw) ## ------- * -------- = 1 ## den(jw) den(-jw) ## ## num(jw) num(-jw) - den(jw) den(-jw) = 0 ## ## real (num(jw) num(-jw) - den(jw) den(-jw)) = 0 ## @end group ## @end example ## @example ## @group ## DISCRETE-TIME SYSTEMS ## Gain Margin ## jwT log z ## L(z) = L(1/z) BTW: z = e --> w = ----- ## j T ## num(z) num(1/z) ## ------ = -------- ## den(z) den(1/z) ## ## num(z) den(1/z) - num(1/z) den(z) = 0 ## @end group ## @end example ## @example ## @group ## Phase Margin ## |num(z)| ## |L(z)| = |------| = 1 ## |den(z)| ## @end group ## @end example ## @example ## @group ## L(z) L(1/z) = 1 ## ## num(z) num(1/z) ## ------ * -------- = 1 ## den(z) den(1/z) ## ## num(z) num(1/z) - den(z) den(1/z) = 0 ## @end group ## @end example ## @example ## @group ## PS: How to get L(1/z) ## 4 3 2 ## p(z) = a z + b z + c z + d z + e ## ## -4 -3 -2 -1 ## p(1/z) = a z + b z + c z + d z + e ## ## -4 2 3 4 ## = z ( a + b z + c z + d z + e z ) ## ## 4 3 2 4 ## = ( e z + d z + c z + b z + a ) / ( z ) ## @end group ## @end example ## ## @seealso{sensitivity, roots} ## @end deftypefn ## Author: Lukas Reichlin ## Created: July 2009 ## Version: 0.9.2 function [gamma_r, phi_r, w_gamma_r, w_phi_r] = margin (sys, tol = sqrt (eps)) ## TODO: multiplot feature: margin (sys1, "b", sys2, "r", ...) ## check whether arguments are OK if (nargin < 1 || nargin > 2) print_usage (); endif if (! isa (sys, "lti")) error ("margin: argument sys must be an LTI system"); endif if (! issiso (sys)) error ("margin: argument sys must be a SISO system"); endif ## get transfer function [num, den, tsam] = tfdata (sys, "vector"); continuous = isct (sys); tsam = abs (tsam); # use 1 second as default if tsam == -1 if (continuous) # CONTINUOUS-TIME SYSTEM ## create polynomials s -> jw l_num = length (num); l_den = length (den); num_jw = num .* i.^(l_num-1 : -1 : 0); den_jw = den .* i.^(l_den-1 : -1 : 0); ## GAIN MARGIN ## create gm polynomial gm_poly = imag (conv (num_jw, conj (den_jw))); ## find frequencies w w = roots (gm_poly); ## filter results [gamma, w_gamma] = gm_filter (w, num, den, tsam, tol, continuous); ## PHASE MARGIN ## create pm polynomials poly_1 = conv (num_jw, conj (num_jw)); poly_2 = conv (den_jw, conj (den_jw)); ## make polynomials equally long for subtraction [poly_1, poly_2] = poly_equalizer (poly_1, poly_2); ## subtract polynomials pm_poly = real (poly_1 - poly_2); ## find frequencies w w = roots (pm_poly); ## filter results [phi, w_phi] = pm_filter (w, num, den, tsam, tol, continuous); else # DISCRETE-TIME SYSTEM ## create polynomials z -> 1/z l_num = length (num); l_den = length (den); num_rev = fliplr (num); den_rev = fliplr (den); num_div = zeros (1, l_num); den_div = zeros (1, l_den); num_div(1) = 1; den_div(1) = 1; num_inv = conv (num_rev, den_div); den_inv = conv (den_rev, num_div); ## GAIN MARGIN ## create gm polynomial poly_1 = conv (num, den_inv); poly_2 = conv (num_inv, den); ## make polynomials equally long for subtraction [poly_1, poly_2] = poly_equalizer (poly_1, poly_2); ## subtract polynomials gm_poly = poly_1 - poly_2; ## find frequencies z z = roots (gm_poly); ## filter results idx = find (abs (abs (z) - 1) < tol); # find z with magnitude 1 if (length (idx) > 0) # if z with magnitude 1 exist z_gm = z(idx); w = log (z_gm) / (i*tsam); # get frequencies w from z [gamma, w_gamma] = gm_filter (w, num, den, tsam, tol, continuous); else # there are no z with magnitude 1 gamma = Inf; w_gamma = NaN; endif ## PHASE MARGIN ## create pm polynomials poly_1 = conv (num, num_inv); poly_2 = conv (den, den_inv); ## make polynomials equally long for subtraction [poly_1, poly_2] = poly_equalizer (poly_1, poly_2); ## subtract polynomials pm_poly = poly_1 - poly_2; ## find frequencies z z = roots (pm_poly); ## filter results idx = find (abs (abs (z) - 1) < tol); # find z with magnitude 1 if (length (idx) > 0) # if z with magnitude 1 exist z_gm = z(idx); w = log (z_gm) / (i*tsam); # get frequencies w from z [phi, w_phi] = pm_filter (w, num, den, tsam, tol, continuous); else # there are no z with magnitude 1 phi = 180; w_phi = NaN; endif endif if (nargout == 0) # show bode diagram [H, w] = __frequency_response__ ("margin", {sys}); H = H{1}; w = w{1}; H = reshape (H, [], 1); mag_db = 20 * log10 (abs (H)); pha = unwrap (arg (H)) * 180 / pi; gamma_db = 20 * log10 (gamma); wv = [min(w), max(w)]; ax_vec_mag = __axis_limits__ ([w(:), mag_db(:)]); ax_vec_mag(1:2) = wv; ax_vec_pha = __axis_limits__ ([w(:), pha(:)]); ax_vec_pha(1:2) = wv; wgm = [w_gamma, w_gamma]; mgmh = [-gamma_db, ax_vec_mag(3)]; mgm = [0, -gamma_db]; pgm = [ax_vec_pha(4), -180]; wpm = [w_phi, w_phi]; mpm = [0, ax_vec_mag(3)]; ppmh = [ax_vec_pha(4), phi - 180]; ppm = [phi - 180, -180]; title_str = sprintf ("GM = %g dB (at %g rad/s), PM = %g deg (at %g rad/s)", gamma_db, w_gamma, phi, w_phi); if (continuous) xl_str = "Frequency [rad/s]"; else xl_str = sprintf ("Frequency [rad/s] w_N = %g", pi/tsam); endif subplot (2, 1, 1) semilogx (w, mag_db, "b", wv, [0, 0], "-.k", wgm, mgmh, "-.k", wgm, mgm, "r", wpm, mpm, "-.k") axis (ax_vec_mag) grid ("on") title (title_str) ylabel ("Magnitude [dB]") subplot (2, 1, 2) semilogx (w, pha, "b", wv, [-180, -180], "-.k", wgm, pgm, "-.k", wpm, ppmh, "-.k", wpm, ppm, "r") axis (ax_vec_pha) grid ("on") xlabel (xl_str) ylabel ("Phase [deg]") else # return values gamma_r = gamma; phi_r = phi; w_gamma_r = w_gamma; w_phi_r = w_phi; endif endfunction function [poly_eq_1, poly_eq_2] = poly_equalizer (poly_1, poly_2) l_p1 = length (poly_1); l_p2 = length (poly_2); l_max = max (l_p1, l_p2); lead_zer_1 = zeros (1, l_max - l_p1); lead_zer_2 = zeros (1, l_max - l_p2); poly_eq_1 = horzcat (lead_zer_1, poly_1); poly_eq_2 = horzcat (lead_zer_2, poly_2); endfunction function [gamma, w_gamma] = gm_filter (w, num, den, tsam, tol, continuous) idx = find ((abs (imag (w)) < tol) & (real (w) > 0)); # find frequencies in R+ if (length (idx) > 0) # if frequencies in R+ exist w_gm = real (w(idx)); if (continuous) s = i * w_gm; else s = exp (i * w_gm * tsam); endif f_resp = polyval (num, s) ./ polyval (den, s); gm = (abs (f_resp)).^-1; ## find crossings between 0 and -1 idx = find ((real (f_resp) < 0) & (real (f_resp) >= -1)); if (length (idx) > 0) # if crossings between 0 and -1 exist gm = gm(idx); w_gm = w_gm(idx); [gamma, idx] = min (gm); w_gamma = w_gm(idx); else # there are no crossings between 0 and -1 idx = find (real (f_resp) < -1); # find crossings between -1 and -Inf if (length (idx) > 0) # if crossings between -1 and -Inf exist gm = gm(idx); w_gm = w_gm(idx); [gamma, idx] = max (gm); w_gamma = w_gm(idx); else gamma = Inf; w_gamma = NaN; endif endif else # there are no frequencies in R+ gamma = Inf; w_gamma = NaN; endif endfunction function [phi, w_phi] = pm_filter (w, num, den, tsam, tol, continuous) idx = find ((abs (imag (w)) < tol) & (real (w) > 0)); # find frequencies in R+ if (length (idx) > 0) # if frequencies in R+ exist w_pm = real (w(idx)); if (continuous) s = i * w_pm; else s = exp (i * w_pm * tsam); endif f_resp = polyval (num, s) ./ polyval (den, s); pm = 180 + arg (f_resp) ./ pi .* 180; [phi, idx] = min (pm); w_phi = w_pm(idx); else # there are no frequencies in R+ phi = 180; w_phi = NaN; endif endfunction %!shared margin_c, margin_c_exp, margin_d, margin_d_exp %! sysc = tf ([24], [1, 6, 11, 6]); %! [gamma_c, phi_c, w_gamma_c, w_phi_c] = margin (sysc); %! sysd = c2d (sysc, 0.3); %! [gamma_d, phi_d, w_gamma_d, w_phi_d] = margin (sysd); %! %! margin_c = [gamma_c, phi_c, w_gamma_c, w_phi_c]; %! margin_d = [gamma_d, phi_d, w_gamma_d, w_phi_d]; %! %! ## results from this implementation and the "dark side" diverge %! ## from the third digit after the decimal point on %! %! gamma_c_exp = 2.50; %! phi_c_exp = 35.43; %! w_gamma_c_exp = 3.32; %! w_phi_c_exp = 2.06; %! %! gamma_d_exp = 1.41; %! phi_d_exp = 18.60; %! w_gamma_d_exp = 2.48; %! w_phi_d_exp = 2.04; %! %! margin_c_exp = [gamma_c_exp, phi_c_exp, w_gamma_c_exp, w_phi_c_exp]; %! margin_d_exp = [gamma_d_exp, phi_d_exp, w_gamma_d_exp, w_phi_d_exp]; %! %!assert (margin_c, margin_c_exp, 1e-2); %!assert (margin_d, margin_d_exp, 1e-2); control/inst/MDSSystem.m0000644000076500000240000001310412614620313014520 0ustar lukasstaff%% -*- texinfo -*- %% Robust control of a mass-damper-spring system. %% Type @code{which MDSSystem} to locate, %% @code{edit MDSSystem} to open and simply %% @code{MDSSystem} to run the example file. % =============================================================================== % Robust Control of a Mass-Damper-Spring System Lukas Reichlin August 2011 % =============================================================================== % Reference: Gu, D.W., Petkov, P.Hr. and Konstantinov, M.M. % Robust Control Design with Matlab, Springer 2005 % =============================================================================== % Tabula Rasa clear all, close all, clc % =============================================================================== % System Model % =============================================================================== % +---------------+ % | d_m 0 0 | % +-----| 0 d_c 0 |<----+ % u_m | | 0 0 d_k | | y_m % u_c | +---------------+ | y_c % u_k | | y_k % | +---------------+ | % +---->| |-----+ % | G_nom | % u ----->| |-----> y % +---------------+ % Nominal Values m_nom = 3; % mass c_nom = 1; % damping coefficient k_nom = 2; % spring stiffness % Perturbations p_m = 0.4; % 40% uncertainty in the mass p_c = 0.2; % 20% uncertainty in the damping coefficient p_k = 0.3; % 30% uncertainty in the spring stiffness % State-Space Representation A = [ 0, 1 -k_nom/m_nom, -c_nom/m_nom ]; B1 = [ 0, 0, 0 -p_m, -p_c/m_nom, -p_k/m_nom ]; B2 = [ 0 1/m_nom ]; C1 = [ -k_nom/m_nom, -c_nom/m_nom 0, c_nom k_nom, 0 ]; C2 = [ 1, 0 ]; D11 = [ -p_m, -p_c/m_nom, -p_k/m_nom 0, 0, 0 0, 0, 0 ]; D12 = [ 1/m_nom 0 0 ]; D21 = [ 0, 0, 0 ]; D22 = [ 0 ]; inname = {'u_m', 'u_c', 'u_k', 'u'}; % input names outname = {'y_m', 'y_c', 'y_k', 'y'}; % output names G_nom = ss (A, [B1, B2], [C1; C2], [D11, D12; D21, D22], ... 'inputname', inname, 'outputname', outname); G = G_nom('y', 'u'); % extract output y and input u % =============================================================================== % Frequency Analysis of Uncertain System % =============================================================================== % Uncertainties: -1 <= delta_m, delta_c, delta_k <= 1 [delta_m, delta_c, delta_k] = ndgrid ([-1, 0, 1], [-1, 0, 1], [-1, 0, 1]); % Bode Plots of Perturbed Plants w = logspace (-1, 1, 100); % frequency vector Delta = arrayfun (@(m, c, k) diag ([m, c, k]), delta_m(:), delta_c(:), delta_k(:), 'uniformoutput', false); G_per = cellfun (@lft, Delta, {G_nom}, 'uniformoutput', false); figure (1) bode (G_per{:}, w) legend off % =============================================================================== % Mixed Sensitivity H-infinity Controller Design (S over KS Method) % =============================================================================== % +-------+ % +--------------------->| W_p |----------> e_p % | +-------+ % | +-------+ % | +---->| W_u |----------> e_u % | | +-------+ % | | +---------+ % | | ->| |-> % r + e | +-------+ u | | G_nom | % ----->(+)---+-->| K |----+--->| |----+----> y % ^ - +-------+ +---------+ | % | | % +-----------------------------------------+ % Weighting Functions s = tf ('s'); % transfer function variable W_p = 0.95 * (s^2 + 1.8*s + 10) / (s^2 + 8.0*s + 0.01); % performance weighting W_u = 10^-2; % control weighting % Synthesis K_mix = mixsyn (G, W_p, W_u); % mixed-sensitivity H-infinity synthesis % Interconnections L_mix = G * K_mix; % open loop T_mix = feedback (L_mix); % closed loop % =============================================================================== % H-infinity Loop-Shaping Design (Normalized Coprime Factor Perturbations) % =============================================================================== % Settings W1 = 8 * (2*s + 1) / (0.9*s); % precompensator W2 = 1; % postcompensator factor = 1.1; % suboptimal controller % Synthesis K_ncf = ncfsyn (G, W1, W2, factor); % positive feedback controller % Interconnections K_ncf = -K_ncf; % negative feedback controller L_ncf = G * K_ncf; % open loop T_ncf = feedback (L_ncf); % closed loop % =============================================================================== % Plot Results % =============================================================================== % Bode Plot figure (2) bode (K_mix, K_ncf) % Step Response figure (3) step (T_mix, T_ncf, 10) % step response for 10 seconds % =============================================================================== control/inst/mixsyn.m0000644000076500000240000002421212614620313014221 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} mixsyn (@var{G}, @var{W1}, @var{W2}, @var{W3}, @dots{}) ## Solve stacked S/KS/T H-infinity problem. ## Mixed-sensitivity is the name given to transfer function shaping problems in which ## the sensitivity function ## @iftex ## @tex ## $ S = (I + G K)^{-1} $ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## S = (I + G K) ## @end example ## @end ifnottex ## is shaped along with one or more other closed-loop transfer functions such as @var{K S} ## or the complementary sensitivity function ## @iftex ## @tex ## $ T = I - S = (I + G K)^{-1} G K $ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## T = I - S = (I + G K) ## @end example ## @end ifnottex ## in a typical one degree-of-freedom configuration, where @var{G} denotes the plant and ## @var{K} the (sub-)optimal controller to be found. The shaping of multivariable ## transfer functions is based on the idea that a satisfactory definition of gain ## (range of gain) for a matrix transfer function is given by the singular values ## @iftex ## @tex ## $\\sigma$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## of the transfer function. Hence the classical loop-shaping ideas of feedback design ## can be generalized to multivariable systems. In addition to the requirement that ## @var{K} stabilizes @var{G}, the closed-loop objectives are as follows [1]: ## @enumerate ## @item For @emph{disturbance rejection} make ## @iftex ## @tex ## $\\overline{\\sigma}(S)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{noise attenuation} make ## @iftex ## @tex ## $\\overline{\\sigma}(T)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{reference tracking} make ## @iftex ## @tex ## $\\overline{\\sigma}(T) \\approx \\underline{\\sigma}(T) \\approx 1$. ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## @item For @emph{input usage (control energy) reduction} make ## @iftex ## @tex ## $\\overline{\\sigma}(K S)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{robust stability} in the presence of an additive perturbation ## @iftex ## @tex ## $G_p = G + \\Delta$, ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## make ## @iftex ## @tex ## $\\overline{\\sigma}(K S)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{robust stability} in the presence of a multiplicative output perturbation ## @iftex ## @tex ## $G_p = (I + \\Delta) G$, ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## make ## @iftex ## @tex ## $\\overline{\\sigma}(T)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @end enumerate ## In order to find a robust controller for the so-called stacked ## @iftex ## @tex ## $S/KS/T \\ H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## S/KS/T H-infinity ## @end ifnottex ## problem, the user function @command{mixsyn} minimizes the following criterion ## @iftex ## @tex ## $$ \\underset{K}{\\min} || N(K) ||_{\\infty}, \\quad N = | W_1 S; \\ W_2 K S; \\ W_3 T |$$ ## @end tex ## @end iftex ## @ifnottex ## @example ## | W1 S | ## min || N(K) || N = | W2 K S | ## K oo | W3 T | ## @end example ## @end ifnottex ## @code{[K, N] = mixsyn (G, W1, W2, W3)}. ## The user-defined weighting functions @var{W1}, @var{W2} and @var{W3} bound the largest ## singular values of the closed-loop transfer functions @var{S} (for performance), ## @var{K S} (to penalize large inputs) and @var{T} (for robustness and to avoid ## sensitivity to noise), respectively [1]. ## A few points are to be considered when choosing the weights. ## The weigths @var{Wi} must all be proper and stable. Therefore if one wishes, ## for example, to minimize @var{S} at low frequencies by a weighting @var{W1} including ## integral action, ## @iftex ## @tex ## ${1 \\over s}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## 1 ## - ## s ## @end example ## @end ifnottex ## needs to be approximated by ## @iftex ## @tex ## ${1 \\over s + \\epsilon}$, where $\\epsilon \\ll 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## 1 ## ----- where e << 1. ## s + e ## @end example ## @end ifnottex ## Similarly one might be interested in weighting @var{K S} with a non-proper weight ## @var{W2} to ensure that @var{K} is small outside the system bandwidth. ## The trick here is to replace a non-proper term such as ## @iftex ## @tex ## $ 1 + \\tau_1 s $ by $ {1 + \\tau_1 s \\over 1 + \\tau_2 s} $, where ## @end tex ## @end iftex ## @ifnottex ## @example ## 1 + T1 s ## 1 + T1 s by --------, where T2 << T1. ## 1 + T2 s ## @end example ## @end ifnottex ## @iftex ## @tex ## $\\tau_2 \\ll \\tau_1$ ## @end tex ## @end iftex ## [1, 2]. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of plant. ## @item W1 ## @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W2 ## @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W3 ## @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of ## complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. ## @item @dots{} ## Optional arguments of @command{hinfsyn}. Type @command{help hinfsyn} for more information. ## @end table ## ## All inputs must be proper/realizable. ## Scalars, vectors and matrices are possible instead of @acronym{LTI} models. ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-infinity (sub-)optimal controller. ## @item N ## State-space model of the lower LFT of @var{P} and @var{K}. ## @item info ## Structure containing additional information. ## @item info.gamma ## L-infinity norm of @var{N}. ## @item info.rcond ## Vector @var{rcond} contains estimates of the reciprocal condition ## numbers of the matrices which are to be inverted and ## estimates of the reciprocal condition numbers of the ## Riccati equations which have to be solved during the ## computation of the controller @var{K}. For details, ## see the description of the corresponding SLICOT routine. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## | W1 S | ## gamma = min||N(K)|| N = | W2 K S | = lft (P, K) ## K inf | W3 T | ## @end group ## @end example ## @example ## @group ## +------+ z1 ## +---------------------------------------->| W1 |-----> ## | +------+ ## | +------+ z2 ## | +---------------------->| W2 |-----> ## | | +------+ ## r + e | +--------+ u | +--------+ y +------+ z3 ## ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ## ^ - +--------+ +--------+ | +------+ ## | | ## +----------------------------------------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## | |-----> z1 (p1x1) z1 = W1 e ## r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u ## | |-----> z3 (p3x1) z3 = W3 y ## u (mx1) ----->| |-----> e (px1) e = r - y ## +--------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## r ----->| |-----> z ## | P(s) | ## u +---->| |-----+ e ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## r ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## @example ## @group ## Extended Plant: P = augw (G, W1, W2, W3) ## Controller: K = mixsyn (G, W1, W2, W3) ## Entire System: N = lft (P, K) ## Open Loop: L = G * K ## Closed Loop: T = feedback (L) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Relies on functions @command{augw} and @command{hinfsyn}, ## which use SLICOT SB10FD, SB10DD and SB10AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @strong{References}@* ## [1] Skogestad, S. and Postlethwaite I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley, Chichester, England.@* ## [2] Meinsma, G. (1995) ## @cite{Unstable and nonproper weights in H-infinity control} ## Automatica, Vol. 31, No. 11, pp. 1655-1658 ## ## @seealso{hinfsyn, augw} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.2 function [K, N, gamma, info] = mixsyn (G, W1 = [], W2 = [], W3 = [], varargin) if (nargin == 0) print_usage (); endif [p, m] = size (G); P = augw (G, W1, W2, W3); [K, N, gamma, info] = hinfsyn (P, p, m, varargin{:}); endfunction control/inst/mktito.m0000644000076500000240000000704312614620313014204 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{P} =} mktito (@var{P}, @var{nmeas}, @var{ncon}) ## Partition @acronym{LTI} plant @var{P} for robust controller synthesis. ## If a plant is partitioned this way, one can omit the inputs @var{nmeas} ## and @var{ncon} when calling the functions @command{hinfsyn} and @command{h2syn}. ## ## @strong{Inputs} ## @table @var ## @item P ## Generalized plant. ## @item nmeas ## Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the ## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-2/H-infinity norm. ## @item ncon ## Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the ## outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @end table ## ## @strong{Outputs} ## @table @var ## @item P ## Partitioned plant. The input/output groups and names are overwritten with designations ## according to [1]. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## min||N(K)|| N = lft (P, K) ## K norm ## ## +--------+ ## w ----->| |-----> z ## | P(s) | ## u +---->| |-----+ v ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## ## +--------+ ## w ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## ## @strong{Reference}@* ## [1] Skogestad, S. and Postlethwaite, I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley, Chichester, England. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2013 ## Version: 0.1 function P = mktito (P, nmeas, ncon) if (nargin != 3) print_usage (); endif if (! isa (P, "lti")) error ("mktito: first argument must be an LTI model"); endif [p, m] = size (P); if (! is_index (nmeas, p)) error ("mktito: second argument 'nmeas' invalid"); endif if (! is_index (ncon, m)) error ("mktito: third argument 'ncon' invalid"); endif outgroup = struct ("Z", 1:p-nmeas, "V", p-nmeas+1:p); outname = vertcat (strseq ("z", 1:p-nmeas), strseq ("v", 1:nmeas)); ingroup = struct ("W", 1:m-ncon, "U", m-ncon+1:m); inname = vertcat (strseq ("w", 1:m-ncon), strseq ("u", 1:ncon)); P = set (P, "outgroup", outgroup, "ingroup", ingroup, ... "outname", outname, "inname", inname); endfunction function bool = is_index (idx, s) ## (idx < s) and not (idx <= s) because we need at least one Z or W bool = is_real_scalar (idx) && fix (idx) == idx && idx > 0 && idx < s; endfunction control/inst/moen4.m0000644000076500000240000044615112614620313013726 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @var{opt}, @dots{}) ## Estimate state-space model using combined subspace method: ## @acronym{MOESP} algorithm for finding the matrices A and C, ## and @acronym{N4SID} algorithm for finding the matrices B and D. ## If no output arguments are given, the singular values are ## plotted on the screen in order to estimate the system order. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting state-space system @var{sys}. ## If not specified, @var{n} is chosen automatically according ## to the singular values and tolerances. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @item info ## Struct containing additional information. ## @table @var ## @item info.K ## Kalman gain matrix. ## @item info.Q ## State covariance matrix. ## @item info.Ry ## Output covariance matrix. ## @item info.S ## State-output cross-covariance matrix. ## @item info.L ## Noise variance matrix factor. LL'=Ry. ## @end table ## @end table ## ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'n' ## The desired order of the resulting state-space system @var{sys}. ## @var{s} > @var{n} > 0. ## ## @item 's' ## The number of block rows @var{s} in the input and output ## block Hankel matrices to be processed. @var{s} > 0. ## In the MOESP theory, @var{s} should be larger than @var{n}, ## the estimated dimension of state vector. ## ## @item 'alg', 'algorithm' ## Specifies the algorithm for computing the triangular ## factor R, as follows: ## @table @var ## @item 'C' ## Cholesky algorithm applied to the correlation ## matrix of the input-output data. Default method. ## @item 'F' ## Fast QR algorithm. ## @item 'Q' ## QR algorithm applied to the concatenated block ## Hankel matrices. ## @end table ## ## @item 'tol' ## Absolute tolerance used for determining an estimate of ## the system order. If @var{tol} >= 0, the estimate is ## indicated by the index of the last singular value greater ## than or equal to @var{tol}. (Singular values less than @var{tol} ## are considered as zero.) When @var{tol} = 0, an internally ## computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, ## where SV(1) is the maximal singular value, and @var{eps} is ## the relative machine precision. ## When @var{tol} < 0, the estimate is indicated by the ## index of the singular value that has the largest ## logarithmic gap to its successor. Default value is 0. ## ## @item 'rcond' ## The tolerance to be used for estimating the rank of ## matrices. If the user sets @var{rcond} > 0, the given value ## of @var{rcond} is used as a lower bound for the reciprocal ## condition number; an m-by-n matrix whose estimated ## condition number is less than 1/@var{rcond} is considered to ## be of full rank. If the user sets @var{rcond} <= 0, then an ## implicitly computed, default tolerance, defined by ## @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the ## relative machine precision. Default value is 0. ## ## @item 'confirm' ## Specifies whether or not the user's confirmation of the ## system order estimate is desired, as follows: ## @table @var ## @item true ## User's confirmation. ## @item false ## No confirmation. Default value. ## @end table ## ## @item 'noiseinput' ## The desired type of noise input channels. ## @table @var ## @item 'n' ## No error inputs. Default value. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k $$ ## $$ y_k = C x_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @item 'e' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and noise channels e ## with covariance matrix @var{Ry}. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K e_k $$ ## $$ y_k = C x_k + D u_k + e_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K e[k] ## y[k] = C x[k] + D u[k] + e[k] ## @end example ## @end ifnottex ## ## @item 'v' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and white noise channels v ## with identity covariance matrix. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K L v_k $$ ## $$ y_k = C x_k + D u_k + L v_k $$ ## $$ e = L v, \\ L L^T = R_y $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K L v[k] ## y[k] = C x[k] + D u[k] + L v[k] ## e = L v, L L' = Ry ## @end example ## @end ifnottex ## ## @item 'k' ## Return @var{sys} as a Kalman predictor for simulation. ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = A \\widehat{x}_k + B u_k + K (y_k - \\widehat{y}_k) $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ^ ## x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ## ^ ^ ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = (A-KC) \\widehat{x}_k + (B-KD) u_k + K y_k $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k + 0 y_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ## x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ## ^ ^ ## y[k] = C x[k] + D u[k] + 0 y[k] ## @end example ## @end ifnottex ## @end table ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = moen4 (varargin) if (nargin == 0) print_usage (); endif if (nargout == 0) __slicot_identification__ ("moen4", nargout, varargin{:}); else [sys, x0, info] = __slicot_identification__ ("moen4", nargout, varargin{:}); endif endfunction %!shared SYS, X0, INFO, Ae, Be, Ce, De, Ke, Qe, Rye, Se, X0e %! %! Y = [ 4.7661 5.5451 5.8503 5.3766 4.8833 5.4865 3.5378 5.3155 6.0530 4.3729 %! 4.7637 5.1886 5.9236 5.6818 4.8858 5.1495 3.5549 5.5329 6.0799 4.7417 %! 4.8394 4.8833 5.9212 5.8235 4.8931 4.8442 3.4938 5.4450 6.1287 5.0884 %! 5.0030 4.6000 5.9773 5.9529 4.7148 4.5414 3.4474 5.3961 6.0799 5.1861 %! 5.0176 4.2704 5.7405 6.0628 4.4511 4.2679 3.4401 5.2740 6.1678 5.0372 %! 5.0567 4.0384 5.3888 6.0897 4.2337 4.0604 3.4083 5.0274 6.1947 4.7856 %! 5.1544 3.8381 5.0005 6.0750 4.0433 3.9602 3.4108 4.7441 6.2362 4.5634 %! 5.3619 3.7112 4.8491 6.0262 3.8650 3.7893 3.4523 4.6684 6.0530 4.5341 %! 5.4254 3.5915 4.9444 5.9944 3.7576 3.6428 3.6818 4.6513 5.6525 4.7050 %! 5.5695 3.5353 5.1739 6.0775 3.6696 3.5256 4.0604 4.5146 5.2740 4.7417 %! 5.6818 3.4865 5.3693 5.8577 3.5939 3.4987 4.4413 4.2679 4.8589 4.6489 %! 5.7429 3.4767 5.4474 5.7014 3.5475 3.4547 4.8540 4.2606 4.5341 4.4315 %! 5.8039 3.4254 5.6037 5.7307 3.5060 3.4083 5.1544 4.2630 4.4560 4.2386 %! 5.9187 3.3815 5.7307 5.7844 3.4547 3.3790 5.4254 4.1898 4.6196 4.0652 %! 5.8210 3.3693 5.8503 5.8235 3.3986 3.3766 5.5964 4.2777 4.8662 3.9431 %! 5.4474 3.3644 5.9798 5.8943 3.3619 3.3619 5.5866 4.6000 5.1177 3.8113 %! 5.0616 3.3473 5.9920 5.7624 3.3400 3.3595 5.3546 4.9322 5.1666 3.6916 %! 4.6293 3.3815 6.0848 5.4157 3.3742 3.3693 5.0274 5.2838 5.0567 3.6525 %! 4.2679 3.4206 5.9407 4.9615 3.5207 3.3986 4.8638 5.5280 5.0030 3.8259 %! 4.0115 3.4132 5.8039 4.5952 3.7136 3.5793 4.7612 5.7405 5.0982 4.2240 %! 3.8503 3.4523 5.7917 4.3314 3.7576 3.9480 4.5707 5.8748 5.3253 4.4242 %! 3.7112 3.6355 5.6037 4.2972 3.7795 4.4120 4.3681 5.9554 5.5671 4.4291 %! 3.5695 4.0384 5.2643 4.5829 3.6965 4.5854 4.3974 5.9920 5.4670 4.3192 %! 3.5182 4.3754 4.9468 4.8613 3.7771 4.5146 4.5732 5.8455 5.2521 4.1385 %! 3.6525 4.7270 4.6196 5.1739 3.8870 4.3436 4.8418 5.5280 4.9468 3.9651 %! 3.8186 5.0567 4.5146 5.1666 3.9041 4.1556 5.2032 5.0616 4.8809 3.8870 %! 3.8626 5.2985 4.4340 4.9199 3.8503 3.9847 5.4523 4.7344 4.9810 3.8015 %! 4.0115 5.5329 4.2850 4.6074 3.9651 4.0433 5.6525 4.5341 5.2252 3.7014 %! 4.3534 5.4670 4.1214 4.3705 4.2826 4.3070 5.8552 4.5341 5.4596 3.6403 %! 4.7050 5.1959 3.9456 4.1825 4.5219 4.4218 5.9065 4.6977 5.7234 3.7673 %! 5.0836 4.8858 3.9847 4.0384 4.7148 4.3534 5.9529 4.7441 5.7917 4.1507 %! 5.3449 4.7637 4.2191 4.1458 4.9712 4.2240 5.8284 4.6196 5.9065 4.6489 %! 5.2740 4.8760 4.5463 4.4315 5.2203 4.0530 5.7917 4.6440 5.9920 4.9908 %! 5.1275 5.0420 4.8735 4.5561 5.5329 3.9407 5.7991 4.8320 5.8357 5.0884 %! 4.7612 5.2838 5.1544 4.4804 5.6525 3.8381 5.8137 5.1324 5.5280 5.0225 %! 4.4511 5.4914 5.3888 4.3754 5.7820 3.7307 5.8772 5.4108 5.1422 4.7832 %! 4.2215 5.5964 5.6135 4.3705 5.9554 3.6525 5.9554 5.6257 4.7759 4.6855 %! 4.0457 5.6721 5.8357 4.5585 6.0359 3.6110 5.7820 5.6037 4.4902 4.6660 %! 3.8748 5.7722 5.8845 4.8589 6.1190 3.5646 5.5182 5.3155 4.2362 4.7075 %! 3.7307 5.8308 5.9554 4.8955 6.1336 3.4963 5.1275 4.9615 4.0237 4.9126 %! 3.6623 5.9334 5.7624 4.7417 6.1532 3.4621 4.7637 4.6196 3.8870 5.1959 %! 3.5768 5.8992 5.4596 4.7441 6.1922 3.4547 4.4926 4.3583 3.7527 5.4157 %! 3.5427 5.9358 5.0616 4.8760 6.1434 3.4254 4.2337 4.1556 3.6818 5.6232 %! 3.4792 5.8943 4.7075 5.1055 6.1678 3.3790 4.0115 4.0335 3.8064 5.7405 %! 3.4547 5.9187 4.4584 5.2398 5.9920 3.4328 3.8552 3.8870 4.1458 5.8992 %! 3.3595 5.9944 4.2679 5.5182 5.6525 3.6232 3.6916 3.7722 4.6000 5.9285 %! 3.2985 5.9578 4.0530 5.6525 5.4596 3.9749 3.6355 3.6403 5.0030 6.0506 %! 3.2252 6.0311 3.9431 5.7234 5.4376 4.3803 3.8186 3.5329 5.3033 6.1532 %! 3.2008 6.0628 3.8259 5.8552 5.3400 4.7148 4.1556 3.4352 5.5524 5.9651 %! 3.2252 6.0408 3.9676 5.9627 5.0982 5.0738 4.5903 3.4279 5.6159 5.5866 %! 3.2276 6.0970 4.2801 5.9847 4.7856 5.3693 4.9883 3.4230 5.5231 5.3815 %! 3.2740 6.1239 4.4804 5.9847 4.4926 5.6037 5.0762 3.3986 5.6110 5.3717 %! 3.4572 6.1629 4.4926 6.0555 4.2362 5.7453 4.9077 3.6037 5.7136 5.4865 %! 3.8674 6.0408 4.3900 6.0628 4.0677 5.6525 4.6489 4.0237 5.8455 5.5671 %! 4.3217 5.8455 4.1971 6.0555 3.9334 5.4010 4.3778 4.4511 5.8992 5.8210 %! 4.4926 5.7722 4.1116 6.0701 3.8235 5.0152 4.2166 4.7930 5.9944 5.9138 %! 4.4315 5.7991 3.9822 5.7844 3.7307 4.7099 4.2875 4.9029 6.0921 5.9944 %! 4.2435 5.9236 3.8674 5.4401 3.6110 4.4169 4.5903 4.7808 6.0921 6.0115 %! 4.0506 5.9285 3.7673 5.0567 3.5646 4.2362 4.8467 4.5903 6.1434 5.9993 %! 3.8577 6.0018 3.8723 4.9419 3.5500 4.2362 5.1397 4.3363 6.1532 6.0188 %! 3.7307 6.0018 4.2362 5.0103 3.5573 4.2484 5.3888 4.1458 6.2337 5.8210 %! 3.7917 6.0604 4.6635 5.1348 3.5134 4.2215 5.6892 4.2166 6.1873 5.7282 %! 3.9212 5.8821 4.9712 5.3131 3.5158 4.2972 5.8845 4.4340 6.0140 5.7405 %! 3.9554 5.5109 5.0665 5.4792 3.6941 4.5903 6.0433 4.7148 5.8357 5.7649 %! 3.8479 5.3229 4.9029 5.6232 4.0726 4.8931 6.1703 5.0982 5.7746 5.8821 %! 3.7258 5.3717 4.6757 5.5622 4.4804 5.1348 6.2118 5.3595 5.6867 5.9260 %! 3.6110 5.4547 4.3925 5.3302 4.7050 5.4279 6.2508 5.5695 5.5378 5.7502 %! 3.7160 5.4376 4.0994 5.0103 4.6123 5.3790 6.2093 5.7722 5.3278 5.4157 %! 4.0921 5.1593 4.1141 4.6660 4.3851 5.3644 6.0140 5.9212 5.0543 4.9956 %! 4.4804 4.9029 4.3265 4.4145 4.2020 5.4523 5.7014 6.0555 4.7002 4.8613 %! 4.8149 4.5878 4.6440 4.2020 4.0262 5.5671 5.4694 5.9627 4.3949 4.9029 %! 5.0543 4.5024 4.9712 4.0482 3.9041 5.6721 5.4792 5.6428 4.1800 5.1031 %! 5.3033 4.5952 5.1593 4.0799 3.7746 5.7698 5.5573 5.4352 4.0433 5.3644 %! 5.4865 4.8247 5.3888 4.1898 3.6916 5.8308 5.7282 5.3888 3.8772 5.5964 %! 5.6721 5.0640 5.5768 4.1312 3.8455 5.9236 5.8821 5.5378 3.7527 5.7527 %! 5.7795 5.2716 5.6525 4.0042 4.2020 5.9651 5.9847 5.6818 3.7282 5.8455 %! 5.7991 5.4670 5.8039 3.9163 4.5854 6.0579 5.9016 5.7014 3.8699 5.9285 %! 5.6648 5.6159 5.9138 3.9602 4.9029 6.0506 5.5817 5.6159 4.2069 6.0066 %! 5.2911 5.5280 5.8870 4.1996 5.2569 6.0726 5.3717 5.6672 4.3558 5.8406 %! 4.8809 5.2545 5.7991 4.6245 5.5109 6.1116 5.4181 5.7405 4.4267 5.5182 %! 4.5585 4.8833 5.7307 4.8833 5.6403 6.0701 5.5109 5.8039 4.4535 5.1739 %! 4.1849 4.5170 5.7624 5.1373 5.8430 5.8967 5.6672 5.8821 4.5219 4.7392 %! 3.8894 4.1971 5.8137 5.3790 5.9749 5.7551 5.7917 5.9505 4.3925 4.4584 %! 3.7087 4.0018 5.8210 5.6232 5.9358 5.7185 5.6989 6.0726 4.1556 4.4267 %! 3.6232 3.8064 5.9285 5.7624 5.8210 5.8210 5.4840 6.1483 3.9651 4.6025 %! 3.5695 3.9041 6.0140 5.8333 5.5280 6.0018 5.1544 6.1165 3.8772 4.8223 %! 3.7185 3.9236 5.7649 5.6867 5.1715 6.0018 4.9810 6.1776 3.9700 5.1837 %! 4.0335 3.8699 5.4132 5.3668 4.8101 5.9016 5.0616 6.2020 4.2582 5.4303 %! 4.4120 3.8064 5.0982 5.2252 4.4535 5.5573 5.1959 6.2069 4.4218 5.6525 %! 4.6293 3.7209 4.6782 5.2398 4.3803 5.1739 5.3595 5.9920 4.3363 5.8210 %! 4.5585 3.8186 4.3729 5.3546 4.5659 4.8003 5.6159 5.5646 4.2997 5.7063 %! 4.3949 4.1409 4.3925 5.5085 4.8052 4.4315 5.7624 5.1788 4.3925 5.3693 %! 4.1800 4.5292 4.5903 5.5964 5.1251 4.1947 5.8577 4.9981 4.6757 5.0274 %! 4.1971 4.8052 4.9199 5.7527 5.3546 4.0066 5.9480 5.0518 4.7612 4.7050 %! 4.4315 5.0860 5.0176 5.8748 5.5891 3.8503 5.8357 5.2325 4.6587 4.4145 %! 4.7148 5.3400 4.8589 5.9065 5.7649 3.7478 5.7063 5.4840 4.4902 4.1458 %! 4.9615 5.5329 4.6757 5.8943 5.9236 3.6428 5.4987 5.6867 4.3070 3.9651 %! 5.3009 5.5768 4.6196 5.7429 5.9407 3.5915 5.1886 5.8992 4.1263 4.0335 %! 5.5671 5.6672 4.8345 5.4474 5.8577 3.5695 5.1177 5.8699 3.9724 4.3729 %! 5.6818 5.7917 5.0909 5.0250 5.6941 3.5280 5.1910 5.9773 4.0775 4.6831 ](:); %! %! %! %! U = [ 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 %! 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 %! 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 ](:); %! %! %! DAT = iddata (Y, U); %! %! [SYS, X0, INFO] = moen4 (DAT, "s", 15, "rcond", 0.0, "tol", -1.0, "confirm", false); %! %! Ae = [ 0.8924 0.3887 0.1285 0.1716 %! -0.0837 0.6186 -0.6273 -0.4582 %! 0.0052 0.1307 0.6685 -0.6755 %! 0.0055 0.0734 -0.2148 0.4788 ]; %! %! Ce = [ -0.4442 0.6663 0.3961 0.4102 ]; %! %! Be = [ -0.2142 %! -0.1968 %! 0.0525 %! 0.0361 ]; %! %! De = [ -0.0041 ]; %! %! Ke = [ -1.9513 %! -0.1867 %! 0.6348 %! -0.3486 ]; %! %! Qe = [ 0.0052 0.0005 -0.0017 0.0009 %! 0.0005 0.0000 -0.0002 0.0001 %! -0.0017 -0.0002 0.0006 -0.0003 %! 0.0009 0.0001 -0.0003 0.0002 ]; %! %! Rye = [ 0.0012 ]; %! %! Se = [ -0.0025 %! -0.0002 %! 0.0008 %! -0.0005 ]; %! %! X0e = [ -11.496422 %! -0.718576 %! -0.014211 %! 0.500073 ]; # X0e is not from SLICOT %! %! ## The SLICOT test for IB01CD uses COMUSE=C, not COMUSE=U. %! ## This means that they don't use the matrices B and D %! ## computed by IB01BD. They use only A and C from IB01BD, %! ## while B and D are from SLICOT routine IB01CD. %! ## Therefore they get slightly different matrices B and D %! ## and finally a different initial state vector X0. %! %!assert (SYS.A, Ae, 1e-4); %!assert (SYS.B, Be, 1e-4); %!assert (SYS.C, Ce, 1e-4); %!assert (SYS.D, De, 1e-4); %!assert (INFO.K, Ke, 1e-4); %!assert (INFO.Q, Qe, 1e-4); %!assert (INFO.Ry, Rye, 1e-4); %!assert (INFO.S, Se, 1e-4); %!assert (X0, X0e, 1e-4); ## [96-003] Data of a 120 MW power plant (Pont-sur-Sambre, France) %!shared SYS, Ae, Be, Ce, De %! U = [ -811 -592 421 -680 -681 %! -812 -619 477 -685 -651 %! -817 -565 538 -678 -677 %! -695 -725 536 -674 -702 %! -697 -571 531 -676 -685 %! -697 -618 533 -681 -721 %! -702 -579 549 -677 -699 %! -703 -487 575 -677 -694 %! -705 -449 561 -679 -678 %! -705 -431 563 -680 -692 %! -707 -502 561 -679 -686 %! -707 -583 530 -676 -751 %! -710 -458 540 -677 -700 %! -713 -469 543 -679 -731 %! -715 -506 549 -684 -635 %! -713 -590 532 -681 -715 %! -714 -582 528 -676 -696 %! -713 -575 538 -679 -690 %! -716 -382 557 -682 -701 %! -716 -476 558 -679 -690 %! -718 -425 565 -678 -686 %! -719 -409 562 -679 -615 %! -719 -508 523 -677 -737 %! -721 -569 523 -679 -722 %! -723 -434 542 -681 -735 %! -723 -395 544 -676 -704 %! -723 -428 542 -677 -729 %! -722 -402 537 -677 -706 %! -725 -380 534 -681 -696 %! -726 -324 549 -676 -701 %! -726 -211 578 -675 -614 %! -727 -113 569 -677 -738 %! -727 -208 554 -676 -737 %! -727 -320 523 -684 -697 %! -727 944 605 -680 -587 %! -729 396 654 -681 -708 %! -729 754 637 -682 -685 %! -727 419 522 -677 -715 %! -729 378 494 -668 -703 %! -728 363 493 -669 -682 %! -729 390 496 -665 -713 %! -729 106 483 -664 -711 %! -729 32 495 -661 -718 %! -729 517 585 -661 -641 %! -729 455 625 -659 -703 %! -730 521 649 -687 -669 %! -730 540 627 -689 -705 %! -731 514 605 -694 -682 %! -585 525 558 -685 -611 %! -586 534 520 -680 -668 %! -586 539 531 -681 -679 %! -585 519 507 -682 -663 %! -588 513 505 -667 -668 %! -587 509 539 -680 -616 %! -587 512 535 -668 -628 %! -588 514 557 -667 -648 %! -588 553 563 -676 -613 %! -589 519 559 -684 -638 %! -589 521 563 -682 -652 %! -588 518 547 -678 -597 %! -589 552 549 -688 -630 %! -589 520 535 -685 -623 %! -589 547 542 -678 -619 %! -589 549 531 -684 -524 %! -588 544 522 -1540 -580 %! -588 564 555 -1538 -584 %! -588 684 545 -1541 -564 %! -590 558 546 -1541 -609 %! -589 552 537 -1550 -601 %! -591 532 526 -1548 -580 %! -590 544 524 -1542 -565 %! -591 559 535 -1538 -604 %! -592 555 542 -1548 -629 %! -591 577 532 -1549 -587 %! -593 581 530 -1543 -585 %! -592 562 540 -1548 -583 %! -591 568 546 -1536 -587 %! -593 550 557 -1533 -569 %! -592 550 537 -1518 -527 %! -593 568 551 -1533 -582 %! -590 528 540 -1529 -492 %! -590 542 532 -1525 -585 %! -590 556 535 -1522 -606 %! -591 637 535 -1516 -571 %! -591 608 539 -1512 -582 %! -591 545 527 -1510 -577 %! -591 603 534 -1507 -548 %! -592 567 521 -1507 -539 %! -594 560 530 -1503 -583 %! -422 549 534 -1487 -542 %! 5 619 550 -1488 -609 %! 5 572 541 -1487 -545 %! 185 564 529 -1488 -528 %! 185 571 531 -1497 -512 %! 187 590 545 -1489 -472 %! 186 658 544 -1485 -501 %! 185 639 553 -1486 -512 %! 187 604 532 -1486 -490 %! 186 584 535 -1486 -505 %! 187 572 541 -1488 -479 %! 186 570 531 -1486 -477 %! 187 579 539 -1488 -482 %! 187 694 537 -1487 -512 %! 187 727 546 -1494 -474 %! 186 838 545 -1493 -470 %! 186 703 527 -1492 -510 %! 185 634 502 -1490 -486 %! 185 659 502 -1490 -446 %! 185 569 483 -1488 -472 %! 184 552 494 -1487 -468 %! 183 541 492 -1487 -411 %! 184 544 519 -1486 -471 %! 184 577 538 -1487 -420 %! 183 536 546 -1490 -455 %! 183 586 567 -1487 -421 %! 183 554 566 -1485 -449 %! 183 564 558 -1486 -455 %! 182 558 546 -1486 -426 %! 183 659 543 -1486 -398 %! 182 545 531 -1487 -425 %! 182 542 513 -1487 -297 %! 181 549 502 -1486 -407 %! 180 558 963 -1487 -391 %! 182 546 1105 -1487 -388 %! 179 540 1166 -1487 -387 %! 181 519 1221 -1487 -390 %! 179 510 1254 -1486 -382 %! 176 528 1289 -1487 -379 %! 178 510 1310 -1486 -389 %! 178 504 1313 -1484 -357 %! 178 507 1328 -1484 -383 %! 178 519 1333 -1489 -426 %! 183 509 1317 -1483 -377 %! 177 585 1331 -1483 -352 %! 176 765 1334 -1484 -375 %! 196 689 1328 -1484 -381 %! 178 570 1306 -1486 -398 %! 176 997 1338 -1483 -360 %! 176 839 1318 -1487 -366 %! 176 879 1324 -90 -394 %! 175 763 1302 -92 -436 %! 175 739 1307 -92 -430 %! 176 791 1336 -86 -446 %! 175 774 1301 -91 -405 %! 174 782 1304 -91 -414 %! 189 722 1335 -92 -360 %! 173 871 1341 -91 -417 %! 173 825 1337 -86 -383 %! 193 836 1332 -86 -449 %! 174 832 1325 -87 -432 %! 175 834 1326 -88 -383 %! 176 899 1332 -86 -341 %! 195 827 1296 -84 -371 %! 174 897 1311 -86 -366 %! 195 848 1320 -86 -416 %! 192 777 1286 -83 126 %! 171 788 1309 -84 153 %! 171 810 1307 -84 173 %! 174 758 1297 -85 182 %! 188 910 1329 -1036 236 %! 189 944 1344 -1669 245 %! 196 859 1330 -1668 249 %! 190 797 1320 -1669 231 %! 191 784 1341 -1665 248 %! 184 737 1335 -1656 240 %! 182 733 1342 -1655 245 %! 182 696 1350 -1653 253 %! 185 614 1341 -1658 236 %! 188 708 1370 -1654 238 %! 191 729 1366 -1655 237 %! 183 714 1380 -1651 262 %! 186 695 1378 -1651 257 %! 189 758 1387 -1649 276 %! 164 572 1364 -1649 257 %! 163 587 1343 -1650 246 %! 161 683 1353 -1658 261 %! 160 572 1359 -1654 261 %! 160 607 1355 -1651 267 %! 158 580 1349 -1655 273 %! 161 631 1362 -1652 272 %! 160 706 1382 -1657 298 %! 161 601 1356 -1654 277 %! 159 570 1354 -1653 274 %! 158 547 1347 -1657 261 %! 158 582 1332 -1657 257 %! 157 570 1340 -1657 267 %! 154 556 1343 -1657 268 %! 157 537 1345 -1657 -425 %! 158 555 1331 -1653 -581 %! 158 551 1315 -1654 -643 %! 159 590 1322 -1656 -687 %! 160 566 1315 -1657 -737 %! 160 553 1315 -1653 -767 %! 161 644 1327 -1396 -731 %! 159 640 1335 -577 -639 %! 161 726 1334 -577 -730 %! 175 729 1310 -573 -711 %! 175 854 1330 -576 -690 %! 161 729 1313 -573 -636 %! 176 706 1314 -583 -745 ]; %! %! %! Y = [ 117 129 -47 %! 113 141 -42 %! 83 150 -37 %! 144 174 -3 %! 156 196 19 %! 174 192 6 %! 171 193 3 %! 169 224 14 %! 155 211 14 %! 137 175 4 %! 130 165 13 %! 145 172 21 %! 128 173 30 %! 119 194 30 %! 127 188 11 %! 147 176 5 %! 162 183 19 %! 173 178 14 %! 131 161 4 %! 112 139 -11 %! 91 133 -10 %! 75 127 -7 %! 80 115 -10 %! 87 132 6 %! 51 151 6 %! 28 167 3 %! 22 167 -3 %! 9 171 4 %! 7 158 6 %! -11 155 5 %! -87 149 -8 %! -153 146 -12 %! -184 116 -20 %! -167 118 8 %! -563 78 -4 %! -694 -3 -155 %! -1000 -39 -168 %! -1101 -28 -135 %! -1080 55 6 %! -1075 162 89 %! -1035 254 117 %! -894 329 148 %! -747 409 218 %! -774 416 231 %! -781 361 189 %! -825 288 171 %! -897 220 166 %! -960 175 169 %! -994 157 196 %! -1009 202 237 %! -1003 267 258 %! -981 326 267 %! -947 361 276 %! -921 369 280 %! -894 369 292 %! -876 359 302 %! -869 356 318 %! -857 334 316 %! -857 336 320 %! -868 331 323 %! -873 316 324 %! -870 301 326 %! -867 294 323 %! -878 293 322 %! -877 300 309 %! -891 317 233 %! -919 308 160 %! -919 296 111 %! -898 304 94 %! -884 336 101 %! -876 344 92 %! -877 347 77 %! -859 354 79 %! -852 368 84 %! -852 362 79 %! -846 337 67 %! -846 322 71 %! -836 325 82 %! -831 330 81 %! -848 332 84 %! -834 334 89 %! -830 314 87 %! -838 322 93 %! -859 313 73 %! -864 317 59 %! -852 318 48 %! -850 313 59 %! -858 327 65 %! -849 332 82 %! -822 332 77 %! -721 377 121 %! -517 492 193 %! -306 596 226 %! -117 683 244 %! 22 716 212 %! 87 684 157 %! 151 642 129 %! 198 599 105 %! 233 549 93 %! 244 512 83 %! 255 487 70 %! 247 453 49 %! 225 437 32 %! 175 410 4 %! 105 386 -12 %! 86 379 -35 %! 101 382 -16 %! 111 412 3 %! 158 451 31 %! 217 486 37 %! 259 504 29 %! 301 503 24 %! 317 495 7 %! 354 472 -3 %! 361 441 -8 %! 368 413 -32 %! 362 381 -34 %! 354 370 -42 %! 310 360 -36 %! 318 369 -36 %! 313 372 -36 %! 298 377 -28 %! 311 341 -34 %! 339 292 -33 %! 362 223 -52 %! 380 161 -73 %! 397 113 -90 %! 402 64 -117 %! 398 30 -136 %! 396 12 -148 %! 390 -22 -189 %! 377 -47 -211 %! 366 -54 -227 %! 331 -52 -240 %! 227 -74 -289 %! 168 -117 -355 %! 149 -104 -357 %! 10 -101 -344 %! -77 -115 -374 %! -116 -88 -330 %! -106 -53 -223 %! -82 -4 -98 %! -99 5 -40 %! -89 22 3 %! -79 34 26 %! -74 34 42 %! -101 28 61 %! -102 28 73 %! -124 22 74 %! -125 19 90 %! -132 9 100 %! -167 8 102 %! -161 7 90 %! -185 19 105 %! -207 29 110 %! -295 24 159 %! -361 17 293 %! -411 12 436 %! -401 48 540 %! -441 86 601 %! -475 118 553 %! -448 146 472 %! -401 172 428 %! -366 197 400 %! -304 231 391 %! -252 253 387 %! -183 261 399 %! -123 255 405 %! -107 247 397 %! -76 228 392 %! -71 205 389 %! -66 192 381 %! -92 171 371 %! -40 178 356 %! -15 185 353 %! -27 170 359 %! 15 173 351 %! 23 175 356 %! 44 178 338 %! 47 171 323 %! 4 153 294 %! 23 141 295 %! 39 141 306 %! 52 139 313 %! 53 142 313 %! 69 142 312 %! 74 136 306 %! 196 164 277 %! 347 208 133 %! 461 230 -58 %! 526 204 -251 %! 581 161 -385 %! 588 119 -458 %! 549 63 -528 %! 497 5 -550 %! 420 -20 -498 %! 327 -49 -464 %! 198 -78 -438 %! 154 -80 -409 %! 130 -60 -377 ]; %! %! DAT = iddata (Y, U, 1228.8); %! %! [SYS, X0] = moen4 (DAT, "s", 10, "n", 8, "rcond", 0.0, "tol", -1.0); %! %! Ae = [ 0.9811 0.0574 0.3270 0.0003 0.0358 0.0403 -0.1366 0.0276 %! 0.1043 0.7634 -0.1308 0.2252 0.0203 -0.0117 -0.2328 -0.2516 %! -0.0612 0.1437 0.8378 -0.2400 0.0367 -0.3205 -0.0367 -0.0978 %! -0.0213 0.0149 0.0706 0.8902 0.2415 -0.1329 0.3080 -0.0143 %! -0.0076 0.0680 0.0557 -0.0469 0.7084 0.2852 0.2565 0.1508 %! -0.0016 0.0603 0.0071 -0.0448 -0.0870 0.8608 0.1495 -0.1148 %! 0.0046 0.0120 0.0040 -0.0272 0.0117 -0.0654 0.8348 -0.4557 %! -0.0058 0.0133 -0.0112 -0.0171 -0.0353 -0.0892 0.3328 0.7650 ]; %! %! Ce = [ -0.1635 0.6294 0.1157 -0.2129 0.0812 -0.0238 0.0745 0.2027 %! 0.1775 0.1736 -0.2839 -0.0750 -0.4986 -0.1254 0.3740 0.1598 %! 0.2012 -0.0045 -0.4447 -0.3289 0.4767 -0.3377 0.0200 -0.0978 ]; %! %! Be = [ -0.0436 0.1911 -0.1345 0.0409 0.2828 %! 0.5541 -0.4223 0.0001 -0.0151 -0.1778 %! -0.3644 0.2868 0.0754 -0.0457 -0.1691 %! -0.0372 0.1270 -0.0772 -0.0714 -0.0255 %! -0.1251 -0.0021 0.1094 0.0576 0.2121 %! -0.1372 0.1139 0.0030 0.0141 0.0493 %! -0.0187 0.0712 -0.0042 0.0075 -0.0221 %! -0.0834 0.0509 0.0322 -0.0089 0.0009 ]; %! %! De = [ 0.1581 -0.3111 -0.0350 0.0179 -0.1403 %! -0.0037 -0.0461 -0.1177 0.0092 -0.0242 %! 0.0476 -0.0237 -0.0159 0.0174 0.0464 ]; %! %!assert (abs (SYS.A), abs (Ae), 1e-4); %!assert (abs (SYS.B), abs (Be), 1e-4); %!assert (abs (SYS.C), abs (Ce), 1e-4); %!assert (abs (SYS.D), abs (De), 1e-4); ## [96-007] Data of a CD-player arm %!shared SYS, Ae, Be, Ce, De %! UY = [ 0.0531 -0.0313 0.0495 0.0342 %! 0.0526 -0.0328 0.0525 0.0342 %! 0.0504 -0.0482 0.0485 0.0567 %! 0.0423 -0.1048 0.0285 0.1542 %! 0.0269 -0.1515 0.0555 0.1192 %! 0.0072 -0.1404 0.0635 0.2067 %! -0.0091 -0.0936 0.1885 -0.0558 %! -0.0272 -0.0770 0.1145 0.2292 %! -0.0602 -0.0720 0.0985 0.2767 %! -0.0962 -0.1012 0.2485 -0.0733 %! -0.1266 -0.2732 0.2705 0.3017 %! -0.1548 -0.4999 0.3675 0.2567 %! -0.1831 -0.6836 0.3665 0.3492 %! -0.2225 -0.8477 0.3145 0.7492 %! -0.2638 -0.9533 0.4615 0.4067 %! -0.2865 -0.9926 0.5025 0.4917 %! -0.2877 -0.9519 0.5355 0.5942 %! -0.2652 -0.8100 0.5835 0.2917 %! -0.2229 -0.6546 0.4355 0.4417 %! -0.1690 -0.4802 0.3175 0.2667 %! -0.1022 -0.3147 0.2265 0.1067 %! -0.0262 -0.2181 0.1655 0.1717 %! 0.0508 -0.1214 0.1295 0.0167 %! 0.1181 0.0027 -0.0375 0.0642 %! 0.1639 0.1290 -0.2015 0.0767 %! 0.1915 0.2491 -0.2445 -0.0933 %! 0.2141 0.3501 -0.2085 -0.1833 %! 0.2383 0.4384 -0.2055 -0.2083 %! 0.2591 0.5325 -0.2915 -0.1533 %! 0.2720 0.6505 -0.3725 -0.2108 %! 0.2855 0.7959 -0.3975 -0.4083 %! 0.3036 0.9837 -0.4585 -0.4258 %! 0.3180 1.2078 -0.5175 -0.4108 %! 0.3278 1.4001 -0.4415 -0.6958 %! 0.3333 1.5244 -0.4445 -0.7183 %! 0.3201 1.6123 -0.6065 -0.4658 %! 0.2920 1.6983 -0.5645 -0.8133 %! 0.2720 1.7388 -0.3875 -1.0058 %! 0.2556 1.6854 -0.3775 -0.6208 %! 0.2279 1.5986 -0.4115 -0.6783 %! 0.1954 1.4945 -0.4215 -0.7808 %! 0.1667 1.3238 -0.3475 -0.6483 %! 0.1384 1.0917 -0.2985 -0.5033 %! 0.1039 0.8539 -0.2995 -0.3083 %! 0.0697 0.6475 -0.1155 -0.4483 %! 0.0391 0.4233 -0.0315 -0.2033 %! 0.0027 0.2235 -0.0775 0.0317 %! -0.0330 0.0966 0.0155 -0.2458 %! -0.0606 -0.0817 0.1125 0.0542 %! -0.0827 -0.3000 0.2685 0.1242 %! -0.0939 -0.4675 0.2865 0.0642 %! -0.0950 -0.5866 0.1685 0.3717 %! -0.0840 -0.6702 0.2735 0.1017 %! -0.0611 -0.7676 0.2505 0.2867 %! -0.0432 -0.7891 0.1245 0.5342 %! -0.0289 -0.6736 0.1945 0.0842 %! -0.0126 -0.5516 0.1885 0.2392 %! 0.0003 -0.4055 0.1795 0.1967 %! 0.0159 -0.2097 0.1605 -0.1208 %! 0.0348 -0.0408 0.0925 0.0217 %! 0.0506 0.1208 0.1395 -0.1408 %! 0.0627 0.3078 0.0795 -0.2183 %! 0.0723 0.4773 0.0175 -0.3158 %! 0.0792 0.5095 0.0215 -0.3533 %! 0.0752 0.4314 0.0085 -0.1533 %! 0.0590 0.4053 0.0425 -0.2683 %! 0.0378 0.4174 0.0245 -0.2658 %! 0.0103 0.4410 0.0295 -0.1783 %! -0.0258 0.4940 0.0905 -0.2633 %! -0.0652 0.4837 0.1385 -0.2758 %! -0.1035 0.3611 0.1805 -0.2258 %! -0.1429 0.1376 0.2035 -0.0383 %! -0.1847 -0.2251 0.3095 0.0167 %! -0.2340 -0.7017 0.3245 0.3692 %! -0.3036 -1.1050 0.3355 0.7517 %! -0.3827 -1.3696 0.5995 0.4917 %! -0.4557 -1.6423 0.7655 0.7017 %! -0.5309 -1.9082 0.7975 1.1367 %! -0.6018 -2.0464 0.9805 0.8317 %! -0.6458 -2.0844 1.1445 0.7692 %! -0.6613 -2.0949 1.2125 0.9217 %! -0.6589 -2.0794 1.1595 0.9317 %! -0.6399 -1.9906 1.1525 0.7942 %! -0.6009 -1.8632 1.1895 0.6867 %! -0.5490 -1.7523 1.0765 0.7617 %! -0.4912 -1.6356 0.9615 0.6342 %! -0.4272 -1.5132 0.8845 0.5817 %! -0.3567 -1.3945 0.8295 0.5517 %! -0.2766 -1.3215 0.7085 0.4392 %! -0.1868 -1.3317 0.5175 0.4792 %! -0.0971 -1.3609 0.3765 0.5317 %! -0.0192 -1.3473 0.2125 0.6367 %! 0.0466 -1.2796 0.0715 0.5192 %! 0.1089 -1.2096 -0.0385 0.4117 %! 0.1644 -1.1582 -0.1425 0.5742 %! 0.2056 -1.0522 -0.2015 0.4542 %! 0.2331 -0.9216 -0.3305 0.3817 %! 0.2478 -0.8330 -0.4485 0.4142 %! 0.2518 -0.7613 -0.4545 0.3017 %! 0.2470 -0.7081 -0.4315 0.2892 %! 0.2276 -0.6960 -0.4605 0.3442 %! 0.1865 -0.7076 -0.5155 0.3692 %! 0.1253 -0.7396 -0.4485 0.3242 %! 0.0472 -0.8146 -0.3375 0.4292 %! -0.0473 -0.8961 -0.2235 0.4967 %! -0.1521 -0.9436 -0.0515 0.4692 %! -0.2577 -0.9516 0.1265 0.5667 %! -0.3484 -0.8765 0.3575 0.3617 %! -0.4103 -0.7632 0.4915 0.2542 %! -0.4523 -0.6816 0.4825 0.4667 %! -0.4835 -0.5694 0.5725 0.2892 %! -0.4953 -0.4093 0.6665 0.1417 %! -0.4786 -0.2418 0.7055 0.0917 %! -0.4345 -0.0829 0.6615 0.0192 %! -0.3719 0.0565 0.5455 0.0617 %! -0.2949 0.2073 0.4655 -0.0808 %! -0.2016 0.3566 0.3255 -0.1433 %! -0.0946 0.3950 0.1765 -0.1383 %! 0.0180 0.2803 0.0325 -0.1083 %! 0.1239 0.1148 -0.1245 0.0392 %! 0.2137 -0.0357 -0.2785 0.0642 %! 0.2851 -0.1776 -0.4545 0.1267 %! 0.3386 -0.2838 -0.5135 0.1392 %! 0.3724 -0.3703 -0.5395 0.1992 %! 0.3804 -0.4262 -0.5995 0.2692 %! 0.3606 -0.3882 -0.6205 0.1717 %! 0.3143 -0.2657 -0.6005 0.1667 %! 0.2456 -0.0453 -0.4925 0.0092 %! 0.1633 0.2726 -0.3835 -0.1683 %! 0.0757 0.6140 -0.2705 -0.3183 %! -0.0088 0.8954 -0.1175 -0.5333 %! -0.0827 1.0590 -0.0395 -0.5358 %! -0.1377 1.1857 0.0545 -0.7408 %! -0.1707 1.3715 0.0725 -0.7933 %! -0.1911 1.5865 0.0695 -0.7758 %! -0.2027 1.7486 0.1445 -0.9933 %! -0.2042 1.8322 0.1265 -0.8733 %! -0.1901 1.9362 0.2065 -1.0933 %! -0.1550 2.0756 0.2185 -1.2008 %! -0.1150 2.2175 0.0835 -0.9258 %! -0.0782 2.4161 0.1225 -1.3158 %! -0.0382 2.5968 0.0995 -1.3508 %! 0.0009 2.6974 0.0685 -1.2508 %! 0.0392 2.7343 0.0955 -1.4683 %! 0.0755 2.6634 0.0165 -1.2133 %! 0.1076 2.5477 0.0225 -1.2458 %! 0.1431 2.4412 -0.0305 -1.2558 %! 0.1844 2.3062 -0.1165 -1.0908 %! 0.2260 2.1947 -0.1755 -1.1083 %! 0.2587 2.1622 -0.2835 -0.9508 %! 0.2798 2.1829 -0.3055 -1.0508 %! 0.2967 2.2071 -0.3375 -1.1083 %! 0.3114 2.2195 -0.3515 -1.0408 %! 0.3235 2.2042 -0.3295 -1.1133 %! 0.3315 2.0932 -0.3775 -0.9583 %! 0.3365 1.8795 -0.3815 -0.9233 %! 0.3446 1.6517 -0.4025 -0.8583 %! 0.3561 1.4464 -0.4285 -0.7183 %! 0.3619 1.2298 -0.4995 -0.5708 %! 0.3524 1.0610 -0.6035 -0.3683 %! 0.3355 0.9913 -0.5375 -0.5383 %! 0.3266 0.9109 -0.4835 -0.5358 %! 0.3218 0.7731 -0.5415 -0.2683 %! 0.3110 0.6149 -0.5715 -0.2408 %! 0.2969 0.4368 -0.5525 -0.1883 %! 0.2860 0.2525 -0.4825 -0.1483 %! 0.2740 0.0546 -0.5115 0.0767 %! 0.2521 -0.1300 -0.5075 0.2217 %! 0.2261 -0.2571 -0.3805 0.1317 %! 0.2065 -0.3238 -0.3155 0.1867 %! 0.1931 -0.2987 -0.3305 0.1942 %! 0.1808 -0.2329 -0.3565 0.2092 %! 0.1728 -0.2060 -0.2655 0.1117 %! 0.1778 -0.1696 -0.1935 0.0042 %! 0.1933 -0.0814 -0.2805 0.1292 %! 0.2136 0.0401 -0.3195 0.0017 %! 0.2433 0.1480 -0.3015 -0.1308 %! 0.2830 0.1864 -0.3395 -0.1183 %! 0.3231 0.1801 -0.5095 -0.0508 %! 0.3548 0.1985 -0.6255 -0.0283 %! 0.3828 0.2212 -0.5505 -0.2358 %! 0.4071 0.2130 -0.6185 -0.0833 %! 0.4161 0.2078 -0.7505 -0.0233 %! 0.4070 0.1729 -0.7735 -0.1208 %! 0.3820 0.0580 -0.7255 0.0892 %! 0.3472 -0.1245 -0.6195 0.0492 %! 0.3091 -0.3883 -0.6545 0.2617 %! 0.2664 -0.6903 -0.6355 0.5492 %! 0.2262 -1.0013 -0.4655 0.4792 %! 0.1930 -1.3467 -0.4925 0.8692 %! 0.1636 -1.6417 -0.5175 0.9717 %! 0.1427 -1.8525 -0.4415 0.9067 %! 0.1266 -2.0179 -0.4015 1.2292 %! 0.1118 -2.1203 -0.3485 1.0842 %! 0.1018 -2.1909 -0.3845 1.0817 %! 0.0912 -2.2222 -0.3635 1.2492 %! 0.0774 -2.1564 -0.2115 0.9892 %! 0.0614 -2.0300 -0.1995 1.0467 %! 0.0438 -1.8759 -0.1595 0.9517 %! 0.0385 -1.7096 0.0155 0.5367 %! 0.0457 -1.5773 0.0455 0.6742 %! 0.0461 -1.4479 -0.0415 0.7242 %! 0.0371 -1.2867 -0.0325 0.3842 %! 0.0259 -1.1849 0.0445 0.4142 %! 0.0133 -1.1751 0.1485 0.4092 %! -0.0023 -1.1735 0.1255 0.3992 %! -0.0234 -1.1757 0.0705 0.5492 %! -0.0427 -1.2288 0.1825 0.3642 %! -0.0546 -1.3379 0.1545 0.5367 %! -0.0693 -1.4457 0.0385 0.8092 %! -0.0862 -1.4768 0.0965 0.6067 %! -0.0960 -1.4632 0.1635 0.6542 %! -0.1013 -1.4416 0.1445 0.7117 %! -0.1098 -1.3817 0.0555 0.6417 %! -0.1307 -1.2943 0.0305 0.7067 %! -0.1687 -1.1853 0.1585 0.6017 %! -0.2203 -1.0350 0.2505 0.5317 %! -0.2805 -0.8197 0.3175 0.4542 %! -0.3427 -0.5362 0.4545 0.3067 %! -0.3950 -0.2783 0.6245 0.1217 %! -0.4257 -0.1265 0.6745 -0.0083 %! -0.4347 -0.0352 0.6115 0.0642 %! -0.4273 0.0849 0.6455 -0.0608 %! -0.4080 0.2669 0.6375 -0.0983 %! -0.3808 0.4593 0.5595 -0.1183 %! -0.3378 0.6035 0.5465 -0.4158 %! -0.2776 0.6956 0.4895 -0.3233 %! -0.2139 0.7767 0.4145 -0.2483 %! -0.1485 0.8759 0.3105 -0.5033 %! -0.0798 0.9496 0.1465 -0.4033 %! -0.0138 0.9867 0.1065 -0.4133 %! 0.0481 1.0353 0.0825 -0.5458 %! 0.1014 1.0584 -0.0285 -0.3958 %! 0.1417 1.0195 -0.1245 -0.3508 %! 0.1810 0.9643 -0.1175 -0.5058 %! 0.2304 0.8987 -0.1325 -0.4633 %! 0.2784 0.8223 -0.3155 -0.1833 %! 0.3158 0.7741 -0.4165 -0.3058 %! 0.3477 0.7241 -0.4475 -0.3608 %! 0.3700 0.6195 -0.5515 -0.0458 %! 0.3809 0.5139 -0.5905 -0.1633 %! 0.3896 0.4472 -0.5885 -0.1983 %! 0.3935 0.3697 -0.5985 0.0417 %! 0.3879 0.3296 -0.6335 -0.0308 %! 0.3781 0.3844 -0.6795 -0.1183 %! 0.3661 0.4741 -0.6555 -0.0908 %! 0.3493 0.6039 -0.5805 -0.2358 %! 0.3240 0.7004 -0.5635 -0.2533 %! 0.2858 0.6189 -0.5785 -0.0933 %! 0.2432 0.4427 -0.4435 -0.2383 %! 0.2074 0.2354 -0.3355 -0.1458 %! 0.1672 0.0128 -0.4075 0.2967 %! 0.1183 -0.1060 -0.3275 0.0767 %! 0.0720 -0.1569 -0.2185 0.0792 %! 0.0281 -0.1837 -0.1755 0.2942 %! -0.0110 -0.1465 -0.0965 0.0092 %! -0.0430 -0.1124 -0.1035 0.1892 %! -0.0694 -0.0907 0.0345 0.1267 %! -0.0822 -0.0402 0.1395 -0.0883 %! -0.0840 0.0366 0.0545 0.1267 %! -0.0813 0.1044 0.1125 -0.0758 %! -0.0744 0.0936 0.1615 -0.0783 %! -0.0736 0.0579 0.1215 0.1442 %! -0.0809 0.0546 0.1445 -0.0458 %! -0.0869 0.0402 0.1665 -0.0033 %! -0.0882 0.0025 0.2585 0.0167 %! -0.0891 -0.0893 0.2335 0.0617 %! -0.0989 -0.2016 0.1095 0.2567 %! -0.1157 -0.2898 0.1755 0.1517 %! -0.1279 -0.4203 0.2505 0.2192 %! -0.1321 -0.5523 0.2425 0.2892 %! -0.1353 -0.6380 0.1515 0.3892 %! -0.1451 -0.7266 0.0955 0.5492 %! -0.1517 -0.8032 0.1775 0.3517 %! -0.1402 -0.8444 0.1445 0.4217 %! -0.1103 -0.8473 0.0825 0.4467 %! -0.0677 -0.8711 0.0725 0.3342 %! -0.0286 -0.9469 -0.0805 0.6842 %! 0.0023 -0.9579 -0.1245 0.4242 %! 0.0381 -0.9479 -0.1135 0.2117 %! 0.0664 -0.9993 -0.2065 0.7217 %! 0.0742 -1.0048 -0.1365 0.4642 %! 0.0735 -1.0174 -0.0945 0.2817 %! 0.0619 -1.1243 -0.1855 0.6692 %! 0.0339 -1.2704 -0.1235 0.5067 %! -0.0041 -1.4761 -0.0475 0.6292 %! -0.0512 -1.6788 0.0215 0.8992 %! -0.0973 -1.7716 0.1645 0.6467 %! -0.1341 -1.8061 0.1835 0.7942 %! -0.1695 -1.7935 0.1665 0.9717 %! -0.1988 -1.7171 0.2675 0.6517 %! -0.2107 -1.6368 0.3285 0.6417 %! -0.2119 -1.5489 0.3375 0.7267 %! -0.2123 -1.4181 0.3615 0.5617 %! -0.2172 -1.2714 0.3455 0.5342 %! -0.2319 -1.0671 0.3335 0.4817 %! -0.2558 -0.7123 0.3665 0.2467 %! -0.2838 -0.2669 0.4385 0.0517 %! -0.3123 0.1531 0.5195 -0.1483 %! -0.3390 0.5226 0.5215 -0.3008 %! -0.3576 0.8555 0.4985 -0.4808 %! -0.3583 1.1684 0.5345 -0.7233 %! -0.3436 1.4304 0.5085 -0.6883 %! -0.3233 1.6427 0.4625 -0.7483 %! -0.2932 1.8196 0.4685 -1.0258 %! -0.2534 1.8815 0.3835 -0.8933 %! -0.2164 1.8872 0.2795 -0.7883 %! -0.1816 1.9679 0.2695 -0.9983 %! -0.1423 2.0907 0.2485 -1.0408 %! -0.1081 2.2150 0.1715 -0.9933 %! -0.0923 2.2823 0.0785 -0.9883 %! -0.0926 2.2505 0.0865 -1.0533 %! -0.0974 2.2151 0.1815 -1.1133 %! -0.1033 2.1746 0.2105 -1.0133 %! -0.1130 2.0369 0.1895 -0.9683 %! -0.1261 1.8613 0.1905 -0.8858 %! -0.1377 1.7249 0.2185 -0.8358 %! -0.1403 1.5793 0.2285 -0.8208 %! -0.1310 1.4183 0.2345 -0.7683 %! -0.1180 1.2871 0.2165 -0.6133 %! -0.1102 1.1936 0.1955 -0.5383 %! -0.1015 1.1864 0.2075 -0.7283 %! -0.0886 1.2592 0.1275 -0.5833 %! -0.0749 1.3410 0.1485 -0.5658 %! -0.0470 1.4143 0.2895 -0.9458 %! -0.0031 1.4604 0.1465 -0.6733 %! 0.0402 1.5447 -0.0435 -0.6083 %! 0.0876 1.6959 -0.0645 -1.0383 %! 0.1412 1.7869 -0.1525 -0.8083 %! 0.1883 1.8245 -0.2255 -0.8208 %! 0.2252 1.8679 -0.3275 -0.9933 %! 0.2467 1.9045 -0.4395 -0.8208 %! 0.2469 1.9533 -0.4565 -0.9058 %! 0.2301 1.9731 -0.5135 -0.9308 %! 0.2034 1.9264 -0.4865 -0.9233 %! 0.1679 1.8261 -0.4125 -0.8458 %! 0.1191 1.7087 -0.3975 -0.7083 %! 0.0578 1.6395 -0.3765 -0.7758 %! -0.0120 1.5785 -0.3385 -0.6708 %! -0.0860 1.4653 -0.1925 -0.6008 %! -0.1515 1.3092 0.0135 -0.6958 %! -0.2008 1.0958 0.0985 -0.5583 %! -0.2418 0.8423 0.0795 -0.3258 %! -0.2793 0.5898 0.1115 -0.2908 %! -0.3053 0.3063 0.2445 -0.3208 %! -0.3232 -0.0402 0.2745 0.0467 %! -0.3460 -0.3642 0.2835 0.3317 %! -0.3602 -0.6486 0.4845 0.0767 %! -0.3510 -1.0138 0.5625 0.3067 %! -0.3365 -1.3782 0.4035 0.8092 %! -0.3285 -1.6311 0.3775 0.7192 %! -0.3177 -1.8760 0.4785 0.7742 %! -0.3025 -2.0846 0.5275 1.0067 %! -0.2861 -2.1696 0.4745 1.0042 %! -0.2632 -2.1988 0.4385 0.9742 %! -0.2280 -2.2098 0.4705 0.9567 %! -0.1835 -2.2121 0.3835 1.0492 %! -0.1343 -2.2346 0.2365 1.0167 %! -0.0799 -2.2940 0.2005 0.9267 %! -0.0296 -2.4018 0.1485 1.1567 %! 0.0054 -2.5377 0.0265 1.2892 %! 0.0379 -2.6953 -0.0205 1.1017 %! 0.0850 -2.8762 -0.0155 1.1667 %! 0.1365 -3.0209 -0.1045 1.4792 %! 0.1758 -3.0638 -0.2865 1.4992 %! 0.2069 -3.0199 -0.3975 1.3217 %! 0.2399 -2.9711 -0.3785 1.2517 %! 0.2687 -2.9543 -0.4125 1.3817 %! 0.2813 -2.9447 -0.4615 1.3142 %! 0.2737 -2.9591 -0.4575 1.2217 %! 0.2385 -3.0112 -0.4585 1.4592 %! 0.1778 -3.0317 -0.3535 1.3667 %! 0.1115 -2.9655 -0.1805 1.1367 %! 0.0469 -2.8414 -0.0535 1.2642 %! -0.0254 -2.7009 0.0305 1.2717 %! -0.1049 -2.5296 0.0665 1.1567 %! -0.1749 -2.2903 0.2005 0.8842 %! -0.2261 -2.0294 0.3485 0.7692 %! -0.2709 -1.8409 0.3965 0.9217 %! -0.3160 -1.7059 0.4925 0.6592 %! -0.3553 -1.5587 0.5645 0.5542 %! -0.3887 -1.4311 0.6065 0.6467 %! -0.4132 -1.3691 0.6915 0.4717 %! -0.4202 -1.3607 0.7465 0.4992 %! -0.4079 -1.3743 0.8165 0.5242 %! -0.3790 -1.3781 0.7885 0.4892 %! -0.3393 -1.3442 0.6355 0.5792 %! -0.2925 -1.2459 0.5555 0.4817 %! -0.2378 -1.1148 0.5695 0.3467 %! -0.1856 -0.9931 0.4825 0.4667 %! -0.1486 -0.8185 0.3805 0.3767 %! -0.1216 -0.5874 0.3885 0.0717 %! -0.1015 -0.3821 0.3235 0.1667 %! -0.0898 -0.1778 0.2855 0.0667 %! -0.0712 0.0346 0.3355 -0.2858 %! -0.0379 0.2085 0.3175 -0.2483 %! -0.0027 0.3772 0.2065 -0.2333 %! 0.0236 0.5655 0.0175 -0.3458 %! 0.0438 0.7329 -0.0445 -0.4733 %! 0.0635 0.8253 0.0225 -0.5433 %! 0.0801 0.8649 0.0045 -0.4633 %! 0.0903 0.9308 -0.0115 -0.6133 %! 0.0901 1.0208 -0.0875 -0.5258 %! 0.0744 1.1279 -0.1185 -0.4933 %! 0.0558 1.2299 -0.0115 -0.8233 %! 0.0408 1.2587 -0.0005 -0.6233 %! 0.0191 1.2574 0.0385 -0.5433 %! -0.0063 1.2484 0.0785 -0.7158 %! -0.0255 1.1921 0.0205 -0.5933 %! -0.0336 1.1108 0.0425 -0.6808 %! -0.0357 0.9984 0.0135 -0.4883 %! -0.0415 0.8908 0.0155 -0.3583 %! -0.0416 0.8448 0.0965 -0.6158 %! -0.0291 0.8026 0.0265 -0.4233 %! -0.0135 0.7560 -0.0525 -0.2958 %! 0.0064 0.7406 -0.0195 -0.4958 %! 0.0347 0.7367 -0.0165 -0.4208 %! 0.0633 0.7939 -0.0945 -0.3233 %! 0.0912 0.9579 -0.1195 -0.5658 %! 0.1225 1.1168 -0.1215 -0.6283 %! 0.1480 1.1866 -0.2055 -0.4508 %! 0.1662 1.2186 -0.1875 -0.7083 %! 0.1851 1.2276 -0.2065 -0.7058 %! 0.1996 1.2388 -0.2605 -0.4633 %! 0.2131 1.3063 -0.2195 -0.7858 %! 0.2323 1.3793 -0.3485 -0.6333 %! 0.2558 1.4242 -0.3975 -0.6083 %! 0.2937 1.4094 -0.3555 -0.9133 %! 0.3392 1.2810 -0.5475 -0.4583 %! 0.3757 1.1218 -0.6745 -0.4483 %! 0.4103 0.9746 -0.7225 -0.6508 %! 0.4441 0.8090 -0.8085 -0.2808 %! 0.4710 0.6612 -0.8195 -0.3258 %! 0.4931 0.5291 -0.8975 -0.3208 %! 0.5052 0.4500 -0.9735 -0.1608 %! 0.4969 0.4825 -1.0065 -0.2058 %! 0.4640 0.5571 -1.0395 -0.1783 %! 0.4134 0.6007 -0.9225 -0.3358 %! 0.3525 0.5695 -0.7705 -0.2733 %! 0.2808 0.4708 -0.6625 -0.1683 %! 0.2038 0.3850 -0.5825 -0.2383 %! 0.1330 0.3329 -0.4905 -0.1808 %! 0.0800 0.2964 -0.3315 -0.2783 %! 0.0499 0.2154 -0.2585 -0.2158 %! 0.0356 0.0501 -0.2945 0.0017 %! 0.0345 -0.1225 -0.2425 -0.1633 %! 0.0424 -0.2963 -0.2555 0.0417 %! 0.0454 -0.4329 -0.3185 0.2467 %! 0.0459 -0.4041 -0.2455 -0.0408 %! 0.0501 -0.2796 -0.1785 0.0867 %! 0.0562 -0.1394 -0.1245 0.0392 %! 0.0708 0.0026 -0.1095 -0.2233 %! 0.0921 0.1000 -0.2235 0.0242 %! 0.1173 0.2755 -0.1985 -0.2208 %! 0.1574 0.5562 -0.1505 -0.5558 %! 0.2034 0.7663 -0.3005 -0.3233 %! 0.2345 0.8696 -0.3995 -0.4508 %! 0.2466 0.8681 -0.4305 -0.5183 %! 0.2426 0.8135 -0.4365 -0.4033 %! 0.2294 0.8375 -0.3955 -0.5383 %! 0.2117 0.9195 -0.3865 -0.4633 %! 0.1889 1.0417 -0.3415 -0.5258 %! 0.1615 1.2338 -0.3415 -0.6758 %! 0.1260 1.4168 -0.4065 -0.6508 %! 0.0810 1.5369 -0.3505 -0.7708 %! 0.0342 1.5810 -0.1615 -0.8558 %! -0.0091 1.5314 -0.0225 -0.8083 %! -0.0503 1.4241 -0.0285 -0.7283 %! -0.0876 1.2739 0.0045 -0.7208 %! -0.1141 1.0825 0.0965 -0.7008 %! -0.1308 0.9130 0.1345 -0.5608 %! -0.1446 0.7945 0.1385 -0.5108 %! -0.1608 0.7183 0.1425 -0.4833 %! -0.1846 0.7185 0.1855 -0.4508 %! -0.2169 0.7908 0.2355 -0.5133 %! -0.2502 0.8577 0.2985 -0.5833 %! -0.2747 0.8571 0.4505 -0.6633 %! -0.2911 0.7965 0.5145 -0.5358 %! -0.3055 0.7070 0.5125 -0.5008 %! -0.3153 0.5460 0.5205 -0.5583 %! -0.3242 0.2987 0.4875 -0.2383 %! -0.3392 0.0706 0.5795 -0.1583 %! -0.3528 -0.0710 0.6875 -0.2433 %! -0.3649 -0.1759 0.6485 0.0217 %! -0.3827 -0.3188 0.6335 0.1142 %! -0.3987 -0.5033 0.7005 0.0142 %! -0.4061 -0.6932 0.7185 0.2192 %! -0.4107 -0.8736 0.7015 0.4317 %! -0.4089 -1.0089 0.7395 0.3192 %! -0.3942 -1.1045 0.7075 0.4167 %! -0.3738 -1.2074 0.5835 0.6192 %! -0.3490 -1.3199 0.5075 0.5067 %! -0.3125 -1.4543 0.4785 0.5492 %! -0.2685 -1.5904 0.4425 0.6667 %! -0.2324 -1.6779 0.2805 0.7667 %! -0.2177 -1.7222 0.1215 0.8817 %! -0.2177 -1.7124 0.2035 0.6517 %! -0.2191 -1.6440 0.2945 0.6017 %! -0.2262 -1.5442 0.2725 0.7342 %! -0.2446 -1.4283 0.2725 0.5967 %! -0.2675 -1.3620 0.3145 0.5392 %! -0.2852 -1.3847 0.3815 0.5242 %! -0.2915 -1.4221 0.3885 0.5442 %! -0.2859 -1.4241 0.3955 0.6142 %! -0.2662 -1.4117 0.4345 0.5817 %! -0.2261 -1.4121 0.3795 0.5092 %! -0.1681 -1.4674 0.1875 0.5967 %! -0.1067 -1.5856 0.0025 0.7967 %! -0.0484 -1.7123 0.0105 0.7017 %! 0.0055 -1.8149 -0.0275 0.7892 %! 0.0441 -1.8852 -0.1755 1.0267 %! 0.0662 -1.9856 -0.1775 0.8417 %! 0.0769 -2.2193 -0.1235 1.0092 %! 0.0690 -2.4788 -0.1095 1.2917 %! 0.0433 -2.5547 -0.1075 1.1892 %! 0.0121 -2.4502 -0.0515 1.1292 %! -0.0163 -2.3174 0.0695 1.0167 %! -0.0431 -2.2535 0.0355 1.0567 %! -0.0690 -2.2237 -0.0085 1.0267 %! -0.0830 -2.1826 0.0905 0.8217 %! -0.0802 -2.1610 0.1245 0.9717 %! -0.0644 -2.1314 0.0895 0.8942 %! -0.0389 -2.0083 -0.0235 0.7767 %! -0.0144 -1.7807 -0.0925 0.8117 %! 0.0039 -1.5045 -0.0555 0.5167 %! 0.0181 -1.2185 -0.0975 0.3967 %! 0.0257 -0.9135 -0.1055 0.2917 %! 0.0253 -0.5901 -0.0405 0.0192 %! 0.0119 -0.2804 -0.0405 -0.0208 %! -0.0223 0.0284 -0.0525 -0.1183 %! -0.0722 0.3668 0.0375 -0.3658 %! -0.1248 0.6931 0.2185 -0.5433 %! -0.1762 0.9826 0.3255 -0.5983 %! -0.2279 1.2387 0.3505 -0.7408 %! -0.2801 1.4081 0.3595 -0.7783 %! -0.3313 1.4824 0.4385 -0.7633 %! -0.3714 1.4586 0.5705 -0.8483 %! -0.3940 1.3294 0.5915 -0.6908 %! -0.4058 1.2356 0.5915 -0.5733 %! -0.4124 1.2560 0.5965 -0.6108 %! -0.4123 1.3012 0.5405 -0.5908 %! -0.3988 1.2608 0.5535 -0.6983 %! -0.3752 1.0714 0.5255 -0.4733 %! -0.3563 0.8491 0.5215 -0.2658 %! -0.3428 0.6776 0.5805 -0.4083 %! -0.3337 0.4690 0.4925 -0.1158 %! -0.3337 0.2571 0.5005 0.0117 %! -0.3316 0.0998 0.6345 -0.1208 %! -0.3140 -0.0275 0.7025 -0.0458 %! -0.2848 -0.1338 0.6455 0.0317 %! -0.2575 -0.2528 0.4625 0.1967 %! -0.2342 -0.3685 0.4365 0.0917 %! -0.2083 -0.4770 0.4665 0.0767 %! -0.1875 -0.6038 0.3695 0.3942 %! -0.1767 -0.6891 0.3645 0.2767 %! -0.1647 -0.7274 0.4225 0.1342 %! -0.1496 -0.7568 0.3685 0.2642 %! -0.1427 -0.8146 0.2315 0.3767 %! -0.1438 -0.9273 0.2285 0.3517 %! -0.1384 -1.0284 0.4105 0.2117 %! -0.1249 -1.1491 0.4185 0.4717 %! -0.1147 -1.3249 0.2665 0.6917 %! -0.0989 -1.4528 0.2795 0.4867 %! -0.0619 -1.5434 0.3525 0.5667 %! -0.0081 -1.6087 0.2615 0.7242 %! 0.0507 -1.6067 0.0855 0.6692 %! 0.1051 -1.5640 -0.0405 0.7317 %! 0.1482 -1.4225 -0.0795 0.6492 %! 0.1804 -1.1516 -0.1505 0.4267 %! 0.2027 -0.8082 -0.2635 0.3492 %! 0.2135 -0.4165 -0.2375 0.1192 %! 0.2148 -0.0383 -0.1745 -0.1108 %! 0.2076 0.3144 -0.3045 -0.1433 %! 0.2004 0.6244 -0.3415 -0.4108 %! 0.2110 0.7909 -0.2105 -0.6583 %! 0.2361 0.8213 -0.2295 -0.3833 %! 0.2602 0.7620 -0.3495 -0.3533 %! 0.2841 0.6144 -0.4395 -0.4783 %! 0.3056 0.4209 -0.4835 -0.1683 %! 0.3176 0.2084 -0.4535 -0.0783 %! 0.3250 -0.0407 -0.4695 -0.0783 %! 0.3287 -0.3328 -0.5005 0.1792 %! 0.3187 -0.6266 -0.5085 0.4117 %! 0.2961 -0.8894 -0.5195 0.4617 %! 0.2740 -1.0959 -0.4995 0.4492 %! 0.2542 -1.1684 -0.4795 0.6467 %! 0.2321 -1.0800 -0.3895 0.5542 %! 0.2110 -0.8808 -0.3495 0.3067 %! 0.1900 -0.6415 -0.3965 0.3167 %! 0.1682 -0.4753 -0.3005 0.0467 %! 0.1458 -0.4414 -0.2055 0.0917 %! 0.1163 -0.4386 -0.1425 0.2617 %! 0.0891 -0.3733 0.0045 -0.0933 %! 0.0760 -0.3217 0.0415 -0.0408 %! 0.0669 -0.3010 -0.0135 0.1467 %! 0.0560 -0.2167 -0.0305 -0.0708 %! 0.0476 -0.1060 -0.0405 -0.0458 %! 0.0458 -0.0230 0.0035 -0.1208 %! 0.0540 0.0155 -0.0085 -0.1733 %! 0.0668 -0.0147 -0.1005 0.0117 %! 0.0792 -0.0398 -0.1425 -0.0508 %! 0.0933 -0.0347 -0.1735 -0.0508 %! 0.1089 -0.0374 -0.2045 -0.0283 %! 0.1195 -0.0380 -0.2625 0.0292 %! 0.1195 -0.0179 -0.2725 0.0267 %! 0.1110 0.0673 -0.2335 -0.1483 %! 0.0916 0.2159 -0.2865 -0.0383 %! 0.0596 0.3960 -0.2405 -0.1733 %! 0.0267 0.6076 -0.1025 -0.4333 %! -0.0017 0.8519 -0.0395 -0.3883 %! -0.0248 1.1211 0.0015 -0.6533 %! -0.0414 1.3389 -0.0415 -0.6833 %! -0.0505 1.4805 -0.0145 -0.7208 %! -0.0418 1.5473 0.0785 -1.0008 %! -0.0182 1.5086 -0.0465 -0.7158 %! 0.0047 1.4786 -0.1455 -0.6858 %! 0.0286 1.4618 -0.1135 -0.8933 %! 0.0544 1.3645 -0.1525 -0.6733 %! 0.0735 1.2553 -0.1945 -0.6583 %! 0.0804 1.1186 -0.2285 -0.5433 %! 0.0768 0.9336 -0.1345 -0.4483 %! 0.0700 0.7648 -0.0355 -0.4333 %! 0.0642 0.5964 -0.0615 -0.2583 %! 0.0608 0.4208 -0.0495 -0.2258 %! 0.0602 0.2307 -0.0155 -0.0408 %! 0.0659 0.0514 0.0435 -0.0433 %! 0.0820 -0.0945 0.0105 -0.0583 %! 0.0956 -0.2256 -0.1235 0.2667 %! 0.0948 -0.2807 -0.1055 0.1717 %! 0.0868 -0.2945 -0.0515 0.0367 %! 0.0754 -0.3494 -0.0825 0.1942 %! 0.0574 -0.4033 -0.0815 0.1867 %! 0.0357 -0.4587 -0.0115 0.1717 %! 0.0156 -0.5346 0.0505 0.1867 %! -0.0023 -0.6237 0.0135 0.3017 %! -0.0165 -0.7228 0.0525 0.2717 %! -0.0230 -0.7928 0.1605 0.2417 %! -0.0284 -0.8219 0.1615 0.4642 %! -0.0327 -0.8036 0.1625 0.2917 %! -0.0210 -0.7466 0.1915 0.1567 %! 0.0111 -0.7242 0.2005 0.3042 %! 0.0592 -0.7573 0.1465 0.2667 %! 0.1231 -0.7844 -0.0095 0.2467 %! 0.1999 -0.7794 -0.1375 0.2692 %! 0.2804 -0.7513 -0.2825 0.3117 %! 0.3560 -0.6774 -0.4315 0.2467 %! 0.4198 -0.5854 -0.5625 0.2242 %! 0.4650 -0.5277 -0.6685 0.3242 %! 0.4975 -0.4888 -0.6675 0.1642 %! 0.5329 -0.4856 -0.6705 0.0967 %! 0.5714 -0.5286 -0.7535 0.2292 %! 0.5974 -0.5528 -0.8835 0.3717 %! 0.6036 -0.5237 -0.9285 0.3542 %! 0.6018 -0.4513 -0.8545 0.1417 %! 0.5995 -0.3414 -0.8395 0.2067 %! 0.5916 -0.2010 -0.8205 0.1942 %! 0.5754 -0.0626 -0.8065 0.0892 %! 0.5542 0.0470 -0.8155 0.0967 %! 0.5375 0.0963 -0.7775 -0.0808 %! 0.5306 0.0637 -0.8045 0.0367 %! 0.5296 0.0065 -0.7795 0.0492 %! 0.5319 -0.0821 -0.7785 -0.0208 %! 0.5239 -0.2330 -0.9285 0.2767 %! 0.4911 -0.3534 -0.9875 0.2492 %! 0.4368 -0.4041 -0.9135 0.2767 %! 0.3774 -0.4396 -0.6965 0.2317 %! 0.3299 -0.5189 -0.5085 0.1617 %! 0.2946 -0.5876 -0.5285 0.4617 %! 0.2732 -0.5118 -0.4495 0.1917 %! 0.2735 -0.3676 -0.4335 0.1092 %! 0.2897 -0.2488 -0.4875 0.2317 %! 0.3188 -0.1107 -0.4445 -0.0758 %! 0.3580 0.0310 -0.4655 0.0367 %! 0.3999 0.2099 -0.4825 -0.0933 %! 0.4416 0.4537 -0.6305 -0.2708 %! 0.4758 0.6744 -0.8075 -0.1533 %! 0.5033 0.8167 -0.7235 -0.5058 %! 0.5249 0.8812 -0.7385 -0.3783 %! 0.5302 0.9226 -0.8115 -0.2858 %! 0.5213 0.9572 -0.8195 -0.5783 %! 0.4967 0.9528 -0.8725 -0.2483 %! 0.4535 0.9563 -0.7685 -0.3808 %! 0.4022 0.9923 -0.6685 -0.5258 %! 0.3435 1.0462 -0.6205 -0.2433 %! 0.2816 1.1181 -0.4365 -0.5508 %! 0.2276 1.1811 -0.3685 -0.5858 %! 0.1752 1.2622 -0.3765 -0.4508 %! 0.1188 1.4145 -0.3025 -0.6808 %! 0.0624 1.5738 -0.1975 -0.7083 %! 0.0118 1.6516 -0.0645 -0.8358 %! -0.0333 1.6513 -0.0625 -0.8383 %! -0.0826 1.5769 -0.1065 -0.6158 %! -0.1318 1.4702 0.0125 -0.7833 %! -0.1670 1.4121 0.1115 -0.7908 %! -0.1917 1.3594 0.0985 -0.5433 %! -0.2125 1.2994 0.1295 -0.6108 %! -0.2249 1.2767 0.2415 -0.6833 %! -0.2319 1.2354 0.2795 -0.5283 %! -0.2430 1.1914 0.2665 -0.4958 %! -0.2598 1.1599 0.3615 -0.5608 %! -0.2818 1.0552 0.4915 -0.4008 %! -0.3076 0.8983 0.5765 -0.2833 %! -0.3210 0.7477 0.6535 -0.4083 %! -0.3101 0.6146 0.6765 -0.3383 %! -0.2900 0.5163 0.5625 0.0067 %! -0.2723 0.4557 0.4575 -0.0683 %! -0.2465 0.3869 0.4035 -0.2233 %! -0.2099 0.2499 0.3495 0.0092 %! -0.1739 0.1037 0.3055 0.0267 %! -0.1512 0.0119 0.1695 0.1517 %! -0.1484 -0.0519 0.0805 0.2842 %! -0.1510 -0.0699 0.2045 -0.0533 %! -0.1495 -0.0575 0.2485 0.0517 %! -0.1572 -0.0494 0.2205 0.2867 %! -0.1715 -0.0612 0.3355 -0.0658 %! -0.1810 -0.1391 0.3715 0.0442 %! -0.1916 -0.2317 0.3255 0.2367 %! -0.2045 -0.3066 0.3375 0.0842 %! -0.2152 -0.4015 0.3625 0.2167 %! -0.2228 -0.5104 0.4315 0.2292 %! -0.2264 -0.6669 0.3695 0.2817 %! -0.2322 -0.8304 0.2035 0.5217 %! -0.2424 -0.9202 0.2115 0.4992 %! -0.2438 -0.9549 0.3045 0.3742 %! -0.2288 -0.9232 0.2735 0.3792 %! -0.2076 -0.8649 0.1505 0.5142 %! -0.1881 -0.8226 0.1345 0.4142 %! -0.1670 -0.7409 0.1615 0.2617 %! -0.1451 -0.6425 0.1015 0.3617 %! -0.1230 -0.5638 0.1275 0.1917 %! -0.0984 -0.5363 0.2195 0.1492 %! -0.0803 -0.5953 0.1945 0.3917 %! -0.0729 -0.6555 0.1085 0.3267 %! -0.0632 -0.6865 0.1145 0.1717 %! -0.0489 -0.7249 0.1485 0.3442 %! -0.0439 -0.7028 0.0995 0.4717 %! -0.0451 -0.6042 0.0625 0.2117 %! -0.0406 -0.5269 0.0245 0.1367 %! -0.0383 -0.4894 -0.0435 0.3392 %! -0.0485 -0.4438 -0.0455 0.2067 %! -0.0679 -0.4331 -0.0395 0.2042 %! -0.0895 -0.4768 0.0445 0.2217 %! -0.1077 -0.4958 0.1265 0.0817 %! -0.1329 -0.4951 0.0275 0.3717 %! -0.1737 -0.5221 0.0445 0.3217 %! -0.2132 -0.5739 0.2165 0.0742 %! -0.2403 -0.6589 0.2895 0.3267 %! -0.2575 -0.7592 0.3165 0.3442 %! -0.2639 -0.8295 0.2885 0.3417 %! -0.2594 -0.8865 0.2775 0.3992 %! -0.2440 -0.9962 0.2605 0.3367 %! -0.2267 -1.1301 0.0985 0.6167 %! -0.2183 -1.1910 0.0655 0.6417 %! -0.2123 -1.1804 0.1735 0.4192 %! -0.2063 -1.1308 0.1145 0.5367 %! -0.2103 -1.0522 -0.0135 0.6292 %! -0.2177 -0.9723 0.0595 0.3867 %! -0.2085 -0.8974 0.2295 0.2317 %! -0.1816 -0.8520 0.1905 0.4017 %! -0.1471 -0.8541 0.0715 0.3917 %! -0.1048 -0.8622 0.0615 0.2592 %! -0.0576 -0.8463 0.0615 0.3767 %! -0.0136 -0.8192 -0.0185 0.3392 %! 0.0235 -0.7788 -0.1415 0.3292 %! 0.0551 -0.7021 -0.1095 0.2867 %! 0.0856 -0.6467 -0.0675 0.1667 %! 0.1120 -0.6449 -0.2705 0.3217 %! 0.1297 -0.6291 -0.4115 0.2392 %! 0.1433 -0.6098 -0.3755 0.1167 %! 0.1493 -0.5649 -0.4015 0.2967 %! 0.1413 -0.4200 -0.4795 0.1742 %! 0.1251 -0.2349 -0.5045 -0.0333 %! 0.1035 -0.0723 -0.4195 -0.0283 %! 0.0714 0.0871 -0.3485 -0.0533 %! 0.0300 0.2866 -0.3345 -0.1883 %! -0.0115 0.5233 -0.2235 -0.3508 %! -0.0474 0.7916 -0.0725 -0.4258 %! -0.0765 1.1562 -0.0105 -0.6133 %! -0.0981 1.5229 -0.0365 -0.7958 %! -0.1162 1.7436 -0.0585 -0.7983 %! -0.1316 1.8822 0.0025 -0.9008 %! -0.1349 1.9916 0.0605 -1.0358 %! -0.1202 2.0391 0.0065 -1.0233 %! -0.0932 2.0123 -0.0625 -0.9483 %! -0.0609 1.9210 -0.0805 -0.9583 %! -0.0293 1.8059 -0.1785 -0.8458 %! -0.0052 1.7253 -0.2625 -0.7733 %! 0.0091 1.7317 -0.2195 -0.8883 %! 0.0063 1.7910 -0.1925 -0.7333 %! -0.0175 1.8525 -0.1535 -0.7433 %! -0.0460 1.9114 -0.0405 -1.0208 %! -0.0656 1.9435 0.0365 -0.9383 %! -0.0793 1.9967 0.1075 -0.9433 %! -0.0890 2.0655 0.1275 -1.0708 %! -0.0971 2.0547 0.0985 -0.9808 %! -0.1056 1.9936 0.1425 -1.0508 %! -0.1133 1.9289 0.1445 -1.0233 %! -0.1202 1.8841 0.1445 -1.0283 %! -0.1278 1.8653 0.1605 -1.1133 %! -0.1456 1.8273 0.0905 -0.9433 %! -0.1796 1.7730 0.0805 -0.9833 %! -0.2191 1.6584 0.1575 -1.0358 %! -0.2544 1.4743 0.2565 -0.9083 %! -0.2854 1.3089 0.3565 -0.9083 %! -0.3208 1.1494 0.3295 -0.6758 %! -0.3642 0.9927 0.3655 -0.6683 %! -0.4052 0.8263 0.5005 -0.7658 %! -0.4443 0.5780 0.5355 -0.4133 %! -0.4891 0.3103 0.6355 -0.3558 %! -0.5373 0.1107 0.7275 -0.2808 %! -0.5849 0.0334 0.7645 -0.1008 %! -0.6212 0.1017 0.8415 -0.3308 %! -0.6375 0.2141 0.8055 -0.2608 %! -0.6349 0.3187 0.8195 -0.2683 %! -0.6100 0.4173 0.8785 -0.5558 %! -0.5747 0.4404 0.6735 -0.2058 %! -0.5453 0.3679 0.5525 -0.1733 %! -0.5116 0.2496 0.6265 -0.4183 %! -0.4674 0.1314 0.6485 -0.1408 %! -0.4214 0.0316 0.6365 -0.1358 %! -0.3811 -0.0349 0.5035 -0.0783 %! -0.3498 -0.0504 0.4445 0.0092 %! -0.3165 -0.0772 0.5055 -0.2258 %! -0.2736 -0.1911 0.4325 -0.0983 %! -0.2333 -0.3845 0.3495 0.0917 %! -0.2116 -0.6080 0.2855 0.1917 %! -0.2140 -0.7873 0.2095 0.3642 %! -0.2278 -0.9055 0.1795 0.2642 %! -0.2368 -1.0029 0.1665 0.3317 %! -0.2350 -1.0601 0.2255 0.3617 %! -0.2232 -1.0793 0.2145 0.2592 %! -0.2166 -1.0744 -0.0305 0.4942 %! -0.2288 -0.9663 -0.1795 0.4292 %! -0.2482 -0.7630 -0.0595 0.1117 %! -0.2598 -0.5967 0.1215 0.0967 %! -0.2618 -0.4925 0.2025 0.0492 %! -0.2590 -0.4010 0.1605 0.0367 %! -0.2550 -0.3328 0.1185 0.0867 %! -0.2431 -0.2946 0.1605 -0.0808 %! -0.2166 -0.2787 0.1645 -0.0383 %! -0.1817 -0.3122 0.1755 0.1067 %! -0.1408 -0.4076 0.2485 -0.0058 %! -0.0955 -0.5121 0.1335 0.1192 %! -0.0580 -0.5406 -0.0965 0.2292 %! -0.0371 -0.4996 -0.1945 0.1292 %! -0.0357 -0.4631 -0.1495 0.2142 %! -0.0497 -0.4436 -0.0065 0.0717 %! -0.0737 -0.4519 -0.0165 0.0992 %! -0.1119 -0.4687 -0.0865 0.2892 %! -0.1561 -0.4543 0.0375 -0.0208 %! -0.1950 -0.4876 0.1145 0.0817 %! -0.2343 -0.5827 0.1375 0.2967 %! -0.2695 -0.6924 0.2895 0.0017 %! -0.2983 -0.8815 0.3295 0.3067 %! -0.3325 -1.1117 0.3055 0.5492 %! -0.3656 -1.2956 0.3705 0.2967 %! -0.3906 -1.4858 0.4285 0.5417 %! -0.4198 -1.6773 0.4905 0.8242 %! -0.4544 -1.8112 0.5555 0.6917 %! -0.4817 -1.9092 0.5635 0.7317 %! -0.4984 -1.9624 0.5865 0.8517 %! -0.5052 -1.9578 0.6725 0.7392 %! -0.5043 -1.9750 0.6675 0.8467 %! -0.5005 -2.0244 0.6645 0.8942 %! -0.4895 -2.0492 0.7325 0.7292 %! -0.4713 -2.0865 0.6905 0.9517 %! -0.4485 -2.1329 0.7045 0.9417 %! -0.4108 -2.1318 0.7525 0.7467 %! -0.3562 -2.1064 0.6665 0.9792 %! -0.2897 -2.0510 0.5845 0.8717 %! -0.2097 -1.9414 0.4475 0.7142 %! -0.1240 -1.8255 0.2975 0.8092 %! -0.0458 -1.7261 0.1825 0.7217 %! 0.0176 -1.5932 0.0225 0.7017 %! 0.0662 -1.4228 -0.0535 0.5917 %! 0.1049 -1.3030 -0.0845 0.4792 %! 0.1335 -1.2418 -0.1745 0.5192 %! 0.1483 -1.1914 -0.2385 0.4542 %! 0.1466 -1.1992 -0.2885 0.5092 %! 0.1282 -1.2520 -0.2755 0.5542 %! 0.0992 -1.2430 -0.2205 0.5267 %! 0.0699 -1.1510 -0.1345 0.4517 %! 0.0478 -1.0541 -0.0455 0.3867 %! 0.0322 -0.9852 -0.0195 0.4267 %! 0.0207 -0.8964 0.0005 0.2817 %! 0.0094 -0.8166 -0.0155 0.3042 %! -0.0108 -0.7687 0.0055 0.3492 %! -0.0421 -0.6628 0.0855 0.1892 %! -0.0816 -0.5166 0.1335 0.2067 %! -0.1240 -0.4531 0.1985 0.1517 %! -0.1587 -0.4955 0.2175 0.1317 %! -0.1765 -0.5726 0.2375 0.2242 %! -0.1697 -0.6386 0.2575 0.1567 %! -0.1396 -0.6945 0.1815 0.2542 %! -0.0986 -0.7609 0.0965 0.3417 %! -0.0577 -0.8911 0.0185 0.4417 %! -0.0179 -1.0590 0.0145 0.4917 %! 0.0260 -1.1811 0.0785 0.4217 %! 0.0683 -1.2444 0.0305 0.6217 %! 0.0949 -1.1920 -0.0365 0.6392 %! 0.1073 -1.0508 -0.0215 0.4067 %! 0.1155 -0.9975 -0.0025 0.4092 %! 0.1214 -1.0199 0.0115 0.4092 %! 0.1192 -0.9884 0.0035 0.4167 %! 0.1011 -0.8955 -0.0175 0.4642 %! 0.0706 -0.7734 -0.0055 0.3317 %! 0.0435 -0.6574 0.0385 0.1417 %! 0.0254 -0.5681 0.0495 0.1792 %! 0.0072 -0.4466 0.0325 0.2567 %! -0.0080 -0.2535 0.0875 -0.0533 %! -0.0115 -0.0873 0.0575 -0.1208 %! -0.0112 -0.0130 -0.0395 0.0817 %! -0.0089 0.0369 0.0145 -0.1758 %! 0.0030 0.0533 0.0625 -0.1708 %! 0.0194 -0.0025 0.0185 0.0467 %! 0.0374 -0.0338 -0.0445 -0.0783 %! 0.0607 0.0134 -0.0985 -0.0633 %! 0.0869 0.0666 -0.1175 -0.0358 %! 0.1116 0.1083 -0.1945 -0.0683 %! 0.1329 0.1776 -0.2645 -0.0883 %! 0.1515 0.2269 -0.2495 -0.1808 %! 0.1643 0.2195 -0.3015 -0.0533 %! 0.1677 0.2351 -0.3745 -0.0333 %! 0.1713 0.2860 -0.3445 -0.2508 %! 0.1813 0.2769 -0.3195 -0.1283 %! 0.1898 0.1852 -0.3195 -0.0083 %! 0.1937 0.0800 -0.3415 -0.0683 %! 0.1960 0.0125 -0.3745 0.0767 %! 0.2058 -0.0679 -0.2675 -0.0358 %! 0.2313 -0.2067 -0.2205 -0.0433 %! 0.2604 -0.2975 -0.3315 0.2442 %! 0.2806 -0.2723 -0.3645 0.0692 %! 0.2919 -0.2029 -0.3955 0.0117 %! 0.2899 -0.0986 -0.4325 0.0517 %! 0.2731 0.0407 -0.3855 -0.1783 %! 0.2420 0.1252 -0.3585 -0.1008 %! 0.1990 0.1201 -0.2645 -0.1433 %! 0.1551 0.0612 -0.2165 -0.2383 %! 0.1148 -0.0002 -0.2735 -0.0133 %! 0.0804 -0.0214 -0.2015 -0.1033 %! 0.0626 -0.0484 -0.0865 -0.2383 %! 0.0590 -0.1404 -0.1335 0.0367 %! 0.0604 -0.2218 -0.2005 0.0567 %! 0.0731 -0.2085 -0.1645 -0.1383 %! 0.0997 -0.1695 -0.1575 -0.0058 %! 0.1295 -0.1504 -0.2145 0.0242 %! 0.1556 -0.1147 -0.2605 -0.0783 %! 0.1749 -0.1237 -0.2505 0.0192 %! 0.1857 -0.2165 -0.2005 -0.0008 %! 0.1859 -0.2956 -0.2755 0.1167 %! 0.1726 -0.2906 -0.3025 0.1892 %! 0.1556 -0.2457 -0.1625 -0.0583 %! 0.1417 -0.2264 -0.1545 0.0942 %! 0.1269 -0.2038 -0.1905 0.0842 %! 0.1129 -0.1753 -0.1785 -0.0658 %! 0.0992 -0.1663 -0.1525 0.1442 %! 0.0875 -0.1169 -0.0275 -0.1183 %! 0.0790 -0.0582 -0.0545 -0.0283 %! 0.0663 -0.0174 -0.0605 0.0767 %! 0.0562 0.0665 0.0935 -0.3133 %! 0.0531 0.1512 0.0685 -0.1408 %! 0.0461 0.2151 0.0115 -0.1208 %! 0.0374 0.2488 0.0475 -0.3083 %! 0.0370 0.2115 0.1245 -0.2358 %! 0.0492 0.1377 0.1595 -0.3158 %! 0.0650 0.0180 -0.0255 -0.0283 %! 0.0750 -0.1500 -0.0805 0.0317 %! 0.0891 -0.3396 0.0055 -0.0733 %! 0.1133 -0.5416 -0.0395 0.1742 %! 0.1401 -0.7139 -0.1485 0.2417 %! 0.1603 -0.9009 -0.2485 0.4742 %! 0.1780 -1.1065 -0.1815 0.4742 %! 0.2099 -1.2319 -0.1665 0.3667 %! 0.2553 -1.2788 -0.3375 0.6817 %! 0.3076 -1.2666 -0.3695 0.5117 %! 0.3685 -1.2250 -0.3785 0.4217 %! 0.4305 -1.1970 -0.5295 0.5917 %! 0.4856 -1.1524 -0.7095 0.4792 %! 0.5373 -1.1079 -0.7375 0.4042 %! 0.5897 -1.0977 -0.6755 0.3842 %! 0.6362 -1.0851 -0.8095 0.4792 %! 0.6699 -1.0496 -0.9775 0.4067 %! 0.6894 -0.9976 -1.0365 0.3367 %! 0.6901 -0.9060 -1.0275 0.4142 %! 0.6719 -0.7677 -0.9995 0.2142 %! 0.6371 -0.6139 -1.0315 0.2267 %! 0.5849 -0.4463 -0.9335 0.1717 %! 0.5219 -0.2783 -0.7995 0.0167 %! 0.4573 -0.1421 -0.7785 0.0567 %! 0.4020 -0.0451 -0.6615 -0.1833 %! 0.3559 0.0389 -0.5805 -0.0758 %! 0.3050 0.2057 -0.5415 0.0042 %! 0.2521 0.4271 -0.4775 -0.3708 %! 0.2065 0.5643 -0.4755 -0.3033 %! 0.1686 0.6331 -0.3475 -0.3783 %! 0.1358 0.6722 -0.2895 -0.3708 %! 0.1037 0.6797 -0.3195 -0.2408 %! 0.0778 0.6585 -0.2575 -0.4533 %! 0.0624 0.5950 -0.2515 -0.2558 %! 0.0517 0.5407 -0.2285 -0.1908 %! 0.0473 0.5332 -0.1815 -0.3383 %! 0.0465 0.6105 -0.1795 -0.2558 %! 0.0382 0.7590 -0.1585 -0.3383 %! 0.0154 0.8366 -0.1745 -0.3208 %! -0.0179 0.8604 -0.0875 -0.3733 %! -0.0470 0.8872 0.1005 -0.5033 %! -0.0626 0.8752 0.1875 -0.3783 %! -0.0602 0.8813 0.2065 -0.5008 %! -0.0402 0.8863 0.1245 -0.4583 %! -0.0124 0.8391 0.0235 -0.3433 %! 0.0192 0.7919 -0.0165 -0.4783 %! 0.0554 0.7361 -0.0555 -0.3733 %! 0.0929 0.6751 -0.0475 -0.3683 %! 0.1304 0.6184 -0.0965 -0.3933 %! 0.1639 0.5700 -0.2405 -0.2308 %! 0.1967 0.6093 -0.2875 -0.4483 %! 0.2338 0.7093 -0.3125 -0.4933 %! 0.2645 0.8005 -0.3845 -0.3158 %! 0.2869 0.8915 -0.3885 -0.5983 %! 0.3091 0.9385 -0.4365 -0.6158 %! 0.3251 0.9464 -0.5195 -0.4483 %! 0.3311 0.9586 -0.5255 -0.6083 %! 0.3313 0.9269 -0.5245 -0.5558 %! 0.3224 0.8837 -0.5195 -0.4508 %! 0.3000 0.9051 -0.5285 -0.4733 %! 0.2679 0.9557 -0.5235 -0.4883 %! 0.2360 1.0002 -0.4485 -0.6033 %! 0.2076 0.9830 -0.4105 -0.5083 %! 0.1760 0.8692 -0.4285 -0.3633 %! 0.1395 0.7508 -0.4055 -0.3758 %! 0.1052 0.6499 -0.3275 -0.3558 %! 0.0774 0.5699 -0.2655 -0.3033 %! 0.0517 0.6138 -0.2495 -0.3008 %! 0.0213 0.7287 -0.1975 -0.3383 %! -0.0184 0.7977 -0.1255 -0.3633 %! -0.0668 0.8589 -0.0445 -0.4283 %! -0.1192 0.9156 0.0605 -0.5133 %! -0.1747 0.9026 0.1815 -0.4483 %! -0.2323 0.8126 0.3325 -0.4383 %! -0.2839 0.6700 0.4405 -0.4483 %! -0.3233 0.5204 0.4685 -0.3258 %! -0.3485 0.4290 0.5085 -0.3033 %! -0.3550 0.4219 0.5735 -0.3533 %! -0.3426 0.4701 0.5585 -0.3108 %! -0.3172 0.5523 0.4785 -0.3108 %! -0.2791 0.6432 0.4565 -0.4733 %! -0.2315 0.6805 0.4115 -0.4533 %! -0.1894 0.6917 0.2995 -0.3708 %! -0.1591 0.7669 0.2685 -0.5033 %! -0.1352 0.8755 0.2685 -0.5383 %! -0.1136 0.9348 0.2695 -0.5183 %! -0.0901 0.9419 0.2325 -0.6033 %! -0.0643 0.9225 0.1315 -0.5033 %! -0.0407 0.8522 0.0945 -0.4833 %! -0.0225 0.7295 0.0265 -0.4108 %! -0.0137 0.6081 -0.0405 -0.3008 %! -0.0151 0.4741 -0.0395 -0.2883 %! -0.0274 0.3231 -0.0395 -0.1408 %! -0.0520 0.2134 -0.0215 -0.0958 %! -0.0864 0.1254 -0.0295 -0.0233 %! -0.1263 0.0256 0.0055 0.0442 %! -0.1653 -0.0778 0.0825 0.0617 %! -0.1988 -0.1712 0.1285 0.1667 %! -0.2238 -0.2647 0.1945 0.1292 %! -0.2412 -0.3741 0.1865 0.2617 %! -0.2549 -0.4006 0.1935 0.3267 %! -0.2573 -0.3240 0.2765 0.0892 %! -0.2433 -0.2505 0.2645 0.1417 %! -0.2231 -0.1534 0.2415 0.1142 %! -0.2069 -0.0410 0.2085 0.0342 %! -0.2000 0.0238 0.1645 0.0642 %! -0.2001 0.0544 0.1985 -0.0808 %! -0.2037 -0.0099 0.2065 0.0317 %! -0.2104 -0.1788 0.2635 0.1042 %! -0.2160 -0.3564 0.2935 0.1217 %! -0.2186 -0.5024 0.2335 0.2917 %! -0.2186 -0.5871 0.1745 0.3217 %! -0.2108 -0.5916 0.1735 0.2567 %! -0.1901 -0.5845 0.2265 0.1692 %! -0.1679 -0.6241 0.1165 0.4067 %! -0.1573 -0.6377 0.0325 0.3817 %! -0.1530 -0.6189 0.0765 0.1342 %! -0.1569 -0.6339 0.0265 0.4667 %! -0.1734 -0.6051 0.0855 0.3067 %! -0.1951 -0.5319 0.1385 0.1567 %! -0.2237 -0.4474 0.1275 0.3742 %! -0.2571 -0.3082 0.2075 0.0317 %! -0.2879 -0.2211 0.1775 0.0992 %! -0.3188 -0.1793 0.1985 0.1917 %! -0.3429 -0.0881 0.3475 -0.1158 %! -0.3541 -0.0297 0.3825 -0.0333 %! -0.3618 0.0134 0.3265 0.0117 %! -0.3716 0.0785 0.2805 -0.0033 %! -0.3719 0.0910 0.3965 -0.1883 %! -0.3546 0.0535 0.4395 -0.1708 %! -0.3345 0.0320 0.3055 0.1492 %! -0.3160 0.0821 0.3255 -0.1533 %! -0.2892 0.1773 0.3235 -0.2208 %! -0.2587 0.2922 0.2255 -0.0133 %! -0.2214 0.4446 0.2095 -0.3608 %! -0.1671 0.5549 0.2005 -0.4208 %! -0.1050 0.5845 0.1275 -0.2683 %! -0.0486 0.5966 -0.0525 -0.3083 %! 0.0032 0.5948 -0.1795 -0.4133 %! 0.0516 0.5806 -0.2155 -0.3683 %! 0.0863 0.5808 -0.2465 -0.2633 %! 0.1019 0.5570 -0.2995 -0.3258 %! 0.1007 0.4895 -0.3555 -0.2833 %! 0.0823 0.4475 -0.3445 -0.2083 %! 0.0486 0.4517 -0.3085 -0.1983 %! 0.0106 0.4461 -0.2495 -0.2433 %! -0.0204 0.3968 -0.1525 -0.2433 %! -0.0427 0.3374 -0.1145 -0.1308 %! -0.0570 0.3425 -0.1035 -0.2283 %! -0.0662 0.4094 -0.1785 -0.1583 %! -0.0749 0.4980 -0.1755 -0.1458 %! -0.0767 0.5981 -0.0495 -0.3908 %! -0.0689 0.6888 -0.0465 -0.2683 %! -0.0577 0.7881 -0.0605 -0.3833 %! -0.0469 0.8619 -0.1055 -0.4733 %! -0.0422 0.8321 -0.1485 -0.3083 %! -0.0387 0.7466 -0.0695 -0.5408 %! -0.0309 0.6634 -0.0885 -0.3933 %! -0.0268 0.5794 -0.0795 -0.2908 %! -0.0307 0.5002 -0.0445 -0.4458 %! -0.0508 0.4760 -0.1505 -0.1608 %! -0.0894 0.5679 -0.0875 -0.3133 %! -0.1283 0.7078 0.1175 -0.6508 %! -0.1663 0.7919 0.1845 -0.3833 %! -0.2133 0.8265 0.2345 -0.4483 %! -0.2599 0.8374 0.3125 -0.6758 %! -0.2969 0.8162 0.3435 -0.4808 %! -0.3210 0.7420 0.4165 -0.5058 %! -0.3215 0.5730 0.4795 -0.5808 %! -0.3013 0.2979 0.4085 -0.1883 %! -0.2680 0.0143 0.3635 -0.1408 %! -0.2172 -0.1931 0.2695 -0.1933 %! -0.1568 -0.3482 0.0795 0.1542 %! -0.0990 -0.5055 0.0565 0.0917 %! -0.0475 -0.7178 -0.0035 0.2642 %! -0.0025 -0.9341 -0.0295 0.3692 %! 0.0428 -1.0834 -0.0325 0.2067 %! 0.0814 -1.2097 -0.2115 0.6567 %! 0.1090 -1.3175 -0.1885 0.4517 %! 0.1336 -1.4127 -0.1795 0.3767 %! 0.1445 -1.5065 -0.3165 0.8592 %! 0.1424 -1.5894 -0.2155 0.4442 %! 0.1379 -1.7094 -0.2005 0.5842 %! 0.1194 -1.7628 -0.2475 0.9192 %! 0.0871 -1.6474 -0.1865 0.5092 %! 0.0541 -1.4894 -0.1495 0.4967 %! 0.0205 -1.3807 -0.0495 0.4817 %! -0.0189 -1.3325 -0.0365 0.4492 %! -0.0630 -1.3452 -0.0175 0.4417 %! -0.1055 -1.4067 0.0835 0.4317 %! -0.1473 -1.4711 0.1405 0.6042 %! -0.1886 -1.4663 0.2055 0.4892 %! -0.2252 -1.4405 0.2435 0.5292 %! -0.2545 -1.4530 0.3345 0.5367 %! -0.2726 -1.4790 0.3915 0.4667 %! -0.2804 -1.5291 0.3805 0.6292 %! -0.2800 -1.6064 0.4145 0.5967 %! -0.2711 -1.6577 0.4125 0.6642 %! -0.2543 -1.6503 0.4445 0.6142 %! -0.2332 -1.6413 0.3945 0.6267 %! -0.2186 -1.6598 0.2995 0.8167 %! -0.2105 -1.6905 0.3655 0.6167 %! -0.2016 -1.7773 0.3605 0.6767 %! -0.1990 -1.8767 0.3035 0.8442 %! -0.2109 -1.9359 0.2905 0.8542 %! -0.2309 -1.9978 0.3625 0.8267 %! -0.2464 -2.0725 0.4795 0.7117 %! -0.2598 -2.1566 0.3915 1.0417 %! -0.2729 -2.2060 0.4415 0.9092 %! -0.2729 -2.2146 0.5805 0.6867 %! -0.2651 -2.1907 0.4845 1.0592 %! -0.2563 -2.0544 0.4705 0.7217 %! -0.2420 -1.8793 0.4675 0.5817 %! -0.2313 -1.7438 0.4625 0.7617 %! -0.2284 -1.5795 0.5095 0.4092 %! -0.2306 -1.4005 0.4165 0.4717 %! -0.2380 -1.2226 0.4445 0.3817 %! -0.2426 -1.0615 0.5195 0.1817 %! -0.2387 -0.9443 0.4795 0.2317 %! -0.2262 -0.8374 0.4195 0.1167 %! -0.2090 -0.7585 0.3505 0.1867 %! -0.1902 -0.6965 0.3525 0.1167 %! -0.1702 -0.6160 0.2955 0.0917 %! -0.1530 -0.5535 0.2285 0.1892 %! -0.1379 -0.5331 0.2845 0.0267 %! -0.1232 -0.5745 0.2955 0.1692 %! -0.1141 -0.6693 0.2535 0.3117 %! -0.1051 -0.7692 0.2395 0.2017 %! -0.0888 -0.8714 0.2465 0.3167 %! -0.0706 -0.9784 0.2345 0.4467 %! -0.0576 -1.0470 0.1525 0.4467 %! -0.0533 -1.0386 0.0805 0.4942 %! -0.0564 -0.9563 0.0985 0.4417 %! -0.0595 -0.8278 0.1525 0.2792 %! -0.0590 -0.6936 0.1335 0.2642 %! -0.0571 -0.6112 0.1255 0.2042 %! -0.0560 -0.6221 0.1465 0.1867 %! -0.0570 -0.6806 0.1365 0.2192 %! -0.0627 -0.7056 0.1195 0.1917 %! -0.0791 -0.6703 0.1115 0.3067 %! -0.1047 -0.5488 0.2345 0.1217 %! -0.1276 -0.3868 0.3215 -0.0508 %! -0.1452 -0.2989 0.2885 0.0592 %! -0.1579 -0.3142 0.3435 -0.1133 %! -0.1698 -0.3930 0.3155 0.1142 %! -0.1872 -0.4033 0.3395 0.1592 %! -0.1990 -0.3194 0.4595 -0.2333 %! -0.2078 -0.2826 0.3695 0.1642 %! -0.2264 -0.2406 0.3875 0.1117 %! -0.2433 -0.1958 0.4715 -0.2008 %! -0.2512 -0.2855 0.4245 0.1467 %! -0.2515 -0.4154 0.4715 0.0942 %! -0.2396 -0.5006 0.4585 0.1692 %! -0.2129 -0.5207 0.4565 0.2067 %! -0.1705 -0.4377 0.3985 0.0617 %! -0.1208 -0.3532 0.2195 0.2492 %! -0.0686 -0.3256 0.2095 0.0667 %! -0.0112 -0.3184 0.1815 0.0317 %! 0.0433 -0.3352 0.0535 0.2317 %! 0.0918 -0.4017 -0.0255 0.0992 %! 0.1426 -0.5515 -0.0725 0.1567 %! 0.1971 -0.7994 -0.1095 0.3167 %! 0.2489 -1.0643 -0.2455 0.4467 %! 0.2920 -1.1858 -0.3815 0.4692 %! 0.3209 -1.1632 -0.4625 0.5017 %! 0.3329 -1.1275 -0.5055 0.5192 %! 0.3346 -1.1285 -0.4975 0.3542 %! 0.3295 -1.1701 -0.5175 0.5017 %! 0.3165 -1.1697 -0.4415 0.4092 %! 0.2959 -1.0758 -0.4215 0.3492 %! 0.2624 -0.9392 -0.4725 0.4917 %! 0.2233 -0.7484 -0.3445 0.0942 %! 0.1902 -0.5707 -0.2465 0.1017 %! 0.1574 -0.4626 -0.2065 0.2217 %! 0.1245 -0.3397 -0.1795 -0.0258 %! 0.0987 -0.1692 -0.2115 0.0592 %! 0.0892 0.0685 -0.1245 -0.2233 %! 0.1028 0.3453 -0.1275 -0.3658 %! 0.1273 0.5826 -0.2405 -0.2433 %! 0.1497 0.7764 -0.2575 -0.4733 %! 0.1646 0.9231 -0.3065 -0.4433 %! 0.1718 1.0326 -0.3265 -0.4683 %! 0.1809 1.1361 -0.2795 -0.6558 %! 0.1953 1.2657 -0.2505 -0.6283 %! 0.2050 1.4464 -0.2775 -0.6108 %! 0.2068 1.6188 -0.3545 -0.7183 %! 0.2126 1.7093 -0.3495 -0.9183 %! 0.2281 1.7044 -0.3355 -0.8058 %! 0.2457 1.6703 -0.3325 -0.7608 %! 0.2611 1.6585 -0.3575 -0.9008 %! 0.2661 1.6143 -0.4705 -0.6558 %! 0.2578 1.5015 -0.4585 -0.7583 %! 0.2451 1.2956 -0.4175 -0.8033 %! 0.2207 1.0253 -0.4485 -0.3858 %! 0.1768 0.8074 -0.3655 -0.4483 %! 0.1220 0.6616 -0.2795 -0.4508 %! 0.0620 0.5891 -0.2285 -0.3108 %! 0.0002 0.5812 -0.1485 -0.4083 %! -0.0594 0.5578 -0.0655 -0.3083 %! -0.1114 0.5396 0.0895 -0.3433 %! -0.1434 0.5741 0.2125 -0.4708 %! -0.1458 0.6506 0.2315 -0.4908 %! -0.1214 0.7486 0.1975 -0.5258 %! -0.0806 0.8194 0.1325 -0.4908 %! -0.0301 0.8304 0.0945 -0.5433 %! 0.0299 0.7454 0.0665 -0.5858 %! 0.0900 0.5891 -0.0315 -0.3883 %! 0.1351 0.4885 -0.1265 -0.2783 %! 0.1632 0.4505 -0.1695 -0.3683 %! 0.1762 0.3982 -0.2285 -0.2433 %! 0.1710 0.3510 -0.2465 -0.1358 %! 0.1548 0.3268 -0.1755 -0.2458 %! 0.1398 0.2582 -0.1175 -0.2033 %! 0.1272 0.1084 -0.1365 -0.0433 %! 0.1135 -0.0557 -0.1765 0.0192 %! 0.1006 -0.2035 -0.1505 0.0517 %! 0.0938 -0.3889 -0.0855 0.1217 %! 0.0944 -0.6404 -0.0965 0.2717 %! 0.1026 -0.9610 -0.1245 0.3942 %! 0.1201 -1.2709 -0.1525 0.5192 %! 0.1463 -1.4491 -0.2075 0.6042 %! 0.1781 -1.5392 -0.2885 0.5967 %! 0.2058 -1.5973 -0.4185 0.7367 %! 0.2213 -1.5830 -0.4225 0.7092 %! 0.2301 -1.5379 -0.3435 0.5192 %! 0.2335 -1.5207 -0.3875 0.6617 %! 0.2284 -1.5386 -0.3855 0.6292 %! 0.2245 -1.5724 -0.3055 0.4667 %! 0.2271 -1.5665 -0.2665 0.5442 %! 0.2266 -1.5256 -0.3165 0.5842 %! 0.2127 -1.4837 -0.3835 0.5992 %! 0.1882 -1.4411 -0.2855 0.4917 %! 0.1628 -1.3895 -0.1655 0.4392 %! 0.1359 -1.2722 -0.1825 0.5567 %! 0.1069 -1.0629 -0.1565 0.3892 %! 0.0833 -0.7969 -0.0815 0.2242 %! 0.0679 -0.5100 -0.0695 0.1892 %! 0.0615 -0.2389 -0.1075 -0.0033 %! 0.0664 0.0303 -0.1485 -0.0908 %! 0.0822 0.3079 -0.1295 -0.1783 %! 0.1140 0.5658 -0.1465 -0.4283 %! 0.1627 0.7941 -0.3005 -0.5208 %! 0.2134 0.9634 -0.4675 -0.4783 %! 0.2515 1.0687 -0.5295 -0.5583 %! 0.2738 1.1300 -0.5445 -0.6233 %! 0.2803 1.1322 -0.5615 -0.6283 %! 0.2668 1.0979 -0.5675 -0.5358 %! 0.2311 1.0801 -0.4795 -0.5458 %! 0.1799 1.0888 -0.3715 -0.6558 %! 0.1121 1.1266 -0.4035 -0.4358 %! 0.0311 1.2269 -0.3055 -0.5658 %! -0.0402 1.3304 -0.0415 -0.9458 %! -0.0970 1.3157 0.0015 -0.6333 %! -0.1536 1.2545 -0.0375 -0.5383 %! -0.2054 1.2245 0.0305 -0.7933 %! -0.2445 1.1415 0.1235 -0.5958 %! -0.2725 1.0068 0.2105 -0.5658 %! -0.2878 0.8388 0.2305 -0.5408 %! -0.2910 0.6395 0.2735 -0.3933 %! -0.2874 0.5035 0.3115 -0.3133 %! -0.2779 0.4273 0.2875 -0.2908 %! -0.2564 0.3242 0.2965 -0.3508 %! -0.2262 0.1788 0.3125 -0.1683 %! -0.1995 0.0612 0.3315 -0.0883 %! -0.1818 0.0445 0.2725 -0.1558 %! -0.1738 0.0600 0.1725 -0.0008 %! -0.1659 0.0355 0.2655 -0.2008 %! -0.1461 -0.0219 0.3315 -0.2508 %! -0.1285 -0.0978 0.1775 0.1717 %! -0.1227 -0.0947 0.1175 -0.0583 %! -0.1180 0.0203 0.1475 -0.2958 %! -0.1209 0.1808 0.0885 -0.0583 %! -0.1447 0.3916 0.0655 -0.2633 %! -0.1867 0.6153 0.1075 -0.3983 %! -0.2364 0.7858 0.2675 -0.4633 %! -0.2797 0.8695 0.3975 -0.6508 %! -0.3113 0.8415 0.3245 -0.4733 %! -0.3328 0.7698 0.3295 -0.4683 %! -0.3393 0.6590 0.4225 -0.5358 %! -0.3336 0.4096 0.3615 -0.2583 %! -0.3268 0.0623 0.2565 -0.0833 %! -0.3236 -0.2521 0.2545 0.0217 %! -0.3274 -0.4415 0.3015 0.1842 %! -0.3401 -0.4715 0.3165 0.1442 %! -0.3613 -0.3861 0.2875 0.1192 %! -0.3928 -0.2126 0.3465 0.1017 %! -0.4270 0.0263 0.5095 -0.1383 %! -0.4483 0.2006 0.5895 -0.2933 %! -0.4524 0.2266 0.5585 -0.1858 %! -0.4430 0.1870 0.5985 -0.2108 %! -0.4182 0.1108 0.6425 -0.2158 %! -0.3771 -0.0376 0.5545 -0.0483 %! -0.3187 -0.1650 0.4475 -0.0533 %! -0.2411 -0.2002 0.3935 -0.0583 %! -0.1509 -0.2036 0.2985 0.0642 %! -0.0553 -0.2188 0.1135 0.0367 %! 0.0448 -0.2304 -0.0875 -0.0033 %! 0.1459 -0.2073 -0.1945 0.0142 %! 0.2399 -0.1473 -0.2935 -0.0083 %! 0.3167 -0.0702 -0.4665 -0.0133 %! 0.3672 -0.0015 -0.6225 -0.0183 %! 0.3880 0.0378 -0.6905 -0.0008 %! 0.3879 0.0570 -0.6595 -0.1233 %! 0.3785 0.0166 -0.6325 -0.1958 %! 0.3514 -0.0870 -0.7245 0.1167 %! 0.2945 -0.1448 -0.7365 0.1692 %! 0.2217 -0.1525 -0.6035 -0.0558 %! 0.1512 -0.1462 -0.5155 0.0192 %! 0.0848 -0.0799 -0.4575 0.1092 %! 0.0256 0.0141 -0.3195 -0.0783 %! -0.0216 0.0462 -0.2265 -0.0958 %! -0.0663 0.0041 -0.2675 0.1267 %! -0.1129 -0.0417 -0.2395 0.0467 %! -0.1489 -0.0732 -0.0465 -0.1133 %! -0.1735 -0.1401 0.0665 0.1492 %! -0.1959 -0.2071 0.0965 0.1167 %! -0.2177 -0.2551 0.0575 0.0867 %! -0.2382 -0.3215 0.0755 0.3017 %! -0.2444 -0.3974 0.2365 0.0692 %! -0.2240 -0.5052 0.2665 0.1617 %! -0.1884 -0.5983 0.1795 0.4567 %! -0.1441 -0.5736 0.1695 0.2567 %! -0.0834 -0.5133 0.1105 0.2092 %! -0.0064 -0.5083 -0.0085 0.2642 %! 0.0780 -0.4662 -0.1285 0.2517 %! 0.1629 -0.3218 -0.1705 0.1792 %! 0.2469 -0.1316 -0.2225 -0.0458 %! 0.3188 0.0698 -0.4895 0.0292 %! 0.3657 0.2711 -0.6915 -0.0558 %! 0.3947 0.3881 -0.6545 -0.3083 %! 0.4166 0.3752 -0.6155 -0.2233 %! 0.4322 0.3157 -0.6895 -0.1933 %! 0.4374 0.2851 -0.8475 -0.1083 %! 0.4346 0.2856 -0.8755 -0.1283 %! 0.4354 0.2982 -0.8335 -0.3133 %! 0.4374 0.3127 -0.9455 -0.0808 %! 0.4289 0.3315 -0.9695 -0.0958 %! 0.4117 0.3484 -0.8695 -0.2483 %! 0.3875 0.3695 -0.8635 -0.1233 %! 0.3534 0.4046 -0.8965 -0.2008 %! 0.3109 0.4103 -0.8595 -0.2033 %! 0.2621 0.3735 -0.6865 -0.1533 %! 0.2091 0.3471 -0.5615 -0.1958 %! 0.1487 0.3500 -0.6085 -0.0883 %! 0.0755 0.4095 -0.5965 -0.0558 %! -0.0007 0.5566 -0.3735 -0.2433 %! -0.0624 0.7375 -0.1545 -0.3708 %! -0.1055 0.9106 -0.1155 -0.3558 %! -0.1340 1.0728 -0.0775 -0.4608 %! -0.1476 1.2037 -0.0005 -0.5433 %! -0.1445 1.3093 0.0225 -0.5708 %! -0.1205 1.4124 0.0125 -0.6983 %! -0.0755 1.5512 -0.0005 -0.7383 %! -0.0197 1.7541 -0.0045 -0.7633 %! 0.0390 1.9343 -0.0825 -0.9433 %! 0.0935 1.9883 -0.2615 -0.9758 %! 0.1276 1.9447 -0.3705 -0.8358 %! 0.1302 1.8773 -0.3225 -0.8033 %! 0.1103 1.7874 -0.2095 -0.9333 %! 0.0776 1.6447 -0.2025 -0.8183 %! 0.0259 1.5027 -0.2675 -0.5433 %! -0.0390 1.4181 -0.1615 -0.7108 %! -0.0957 1.2941 -0.0355 -0.7858 %! -0.1442 1.0659 -0.0665 -0.4158 %! -0.1955 0.8406 -0.0395 -0.3733 %! -0.2470 0.6814 0.0665 -0.4008 %! -0.2951 0.5478 0.1495 -0.2533 %! -0.3391 0.4030 0.1875 -0.2308 %! -0.3757 0.2509 0.2445 -0.1508 %! -0.3997 0.0973 0.4195 -0.1908 %! -0.4133 -0.1007 0.4435 0.0092 %! -0.4258 -0.3112 0.3315 0.2217 %! -0.4290 -0.4816 0.4055 0.0417 %! -0.4116 -0.6439 0.5125 0.1667 %! -0.3855 -0.7518 0.4715 0.3892 %! -0.3658 -0.8248 0.3845 0.3667 %! -0.3557 -0.9450 0.3525 0.4867 %! -0.3478 -1.0281 0.4715 0.4367 %! -0.3283 -1.0926 0.5655 0.3717 %! -0.2970 -1.2113 0.4865 0.5767 %! -0.2629 -1.3095 0.4455 0.5692 %! -0.2277 -1.4162 0.4285 0.5542 %! -0.1940 -1.5722 0.2955 0.7242 %! -0.1658 -1.7209 0.1985 0.7442 %! -0.1448 -1.8574 0.2275 0.7892 %! -0.1375 -1.9598 0.2405 0.9342 %! -0.1496 -1.9831 0.1605 0.9617 %! -0.1754 -1.9571 0.0975 0.8592 %! -0.2079 -1.9523 0.1425 0.9042 %! -0.2432 -1.9481 0.2485 0.9167 %! -0.2732 -1.8977 0.2955 0.8142 %! -0.2909 -1.8860 0.2895 0.8067 %! -0.2993 -1.9321 0.2625 0.8917 %! -0.3030 -1.9254 0.2225 0.9267 %! -0.2944 -1.8378 0.2495 0.7292 %! -0.2680 -1.7114 0.2665 0.6842 %! -0.2381 -1.6035 0.2105 0.8692 %! -0.2142 -1.5457 0.1815 0.7167 %! -0.1883 -1.5002 0.1355 0.6142 %! -0.1554 -1.4121 0.0995 0.6692 %! -0.1165 -1.2429 0.1295 0.4617 %! -0.0822 -1.0065 0.0435 0.5217 %! -0.0685 -0.7615 -0.0505 0.5117 %! -0.0718 -0.5596 -0.0245 0.1767 %! -0.0823 -0.4178 -0.0155 0.2067 %! -0.0983 -0.3206 0.0595 0.2192 %! -0.1120 -0.2728 0.1795 0.0367 %! -0.1158 -0.3035 0.2005 0.0992 %! -0.1137 -0.4179 0.1345 0.2017 %! -0.1111 -0.5628 0.0385 0.2992 %! -0.1055 -0.6991 0.0785 0.2917 %! -0.0926 -0.8462 0.1725 0.3192 %! -0.0805 -0.9604 0.1215 0.4942 %! -0.0829 -0.9911 0.0025 0.5617 %! -0.0989 -0.9748 0.0055 0.4517 %! -0.1198 -0.9313 0.0895 0.3517 %! -0.1470 -0.8188 0.0865 0.4717 %! -0.1825 -0.5767 0.1175 0.3517 %! -0.2078 -0.2504 0.2775 -0.1133 %! -0.2118 0.0583 0.2575 -0.1083 %! -0.2050 0.3599 0.1075 -0.1258 %! -0.1866 0.6426 0.1025 -0.5283 %! -0.1520 0.8930 0.1295 -0.5483 %! -0.1091 1.1596 0.1155 -0.6283 %! -0.0649 1.3843 -0.0185 -0.8033 %! -0.0246 1.5324 -0.1305 -0.8133 %! 0.0046 1.6659 -0.1205 -0.8933 %! 0.0178 1.7974 -0.1815 -0.8083 %! 0.0241 1.8634 -0.1665 -0.9808 %! 0.0406 1.7408 -0.1085 -1.0333 %! 0.0601 1.4745 -0.2045 -0.5733 %! 0.0706 1.2181 -0.2795 -0.5683 %! 0.0761 0.9181 -0.3655 -0.4383 %! 0.0813 0.5557 -0.3455 -0.1333 %! 0.0948 0.1924 -0.1705 -0.2608 %! 0.1104 -0.2105 -0.2785 0.2767 %! 0.1106 -0.5572 -0.3925 0.5542 %! 0.1075 -0.7736 -0.2685 0.2067 %! 0.1162 -0.9587 -0.2095 0.4942 %! 0.1310 -1.0968 -0.1835 0.5617 %! 0.1419 -1.1625 -0.2115 0.5117 %! 0.1387 -1.1825 -0.2185 0.6392 %! 0.1236 -1.1781 -0.1115 0.3592 %! 0.1019 -1.2740 -0.1395 0.5267 %! 0.0726 -1.4467 -0.0835 0.6167 %! 0.0408 -1.5448 0.1065 0.4117 %! 0.0016 -1.5764 0.0855 0.7292 %! -0.0515 -1.5247 0.0165 0.6792 %! -0.0978 -1.3839 0.1515 0.2642 %! -0.1198 -1.2895 0.3075 0.3542 %! -0.1232 -1.2714 0.3285 0.4542 %! -0.1137 -1.2652 0.2525 0.3392 %! -0.0937 -1.2585 0.1695 0.4317 %! -0.0676 -1.2220 0.1545 0.4642 %! -0.0336 -1.1269 0.1285 0.2617 %! 0.0051 -0.9943 0.0255 0.3567 %! 0.0358 -0.8408 -0.0185 0.3917 %! 0.0583 -0.6968 -0.0065 0.1442 %! 0.0780 -0.6212 -0.1115 0.1767 %! 0.0897 -0.6090 -0.2035 0.2367 %! 0.0864 -0.6100 -0.1845 0.2517 %! 0.0693 -0.5884 -0.0925 0.3142 %! 0.0521 -0.5452 0.0195 0.0817 %! 0.0422 -0.5450 -0.0485 0.2167 %! 0.0304 -0.5974 -0.0775 0.3592 %! 0.0179 -0.6380 0.0365 0.1317 %! 0.0090 -0.6589 0.0385 0.3142 %! 0.0029 -0.6802 0.0675 0.3042 %! 0.0083 -0.7241 0.1465 0.1517 %! 0.0292 -0.8090 0.1455 0.3517 %! 0.0665 -0.9103 0.1315 0.2267 %! 0.1175 -0.9751 -0.0355 0.3342 %! 0.1700 -0.9540 -0.1515 0.4492 %! 0.2239 -0.8772 -0.1285 0.1217 %! 0.2782 -0.7929 -0.2845 0.2592 %! 0.3202 -0.6856 -0.4145 0.2367 %! 0.3485 -0.5863 -0.4115 -0.0058 %! 0.3620 -0.5588 -0.4445 0.1667 %! 0.3588 -0.6270 -0.4405 0.1317 %! 0.3445 -0.7807 -0.4595 0.1717 %! 0.3223 -0.9466 -0.4315 0.3642 %! 0.2962 -1.0383 -0.3285 0.3042 %! 0.2693 -1.0274 -0.3485 0.3917 %! 0.2392 -0.9591 -0.3755 0.3742 %! 0.2038 -0.9085 -0.3265 0.3042 %! 0.1593 -0.8824 -0.2615 0.4042 %! 0.1061 -0.8394 -0.1675 0.3567 %! 0.0545 -0.7459 -0.0505 0.2442 %! 0.0122 -0.6037 0.0655 0.1592 %! -0.0254 -0.4611 0.0855 0.2192 %! -0.0626 -0.3247 0.0695 0.1617 %! -0.0875 -0.1777 0.1505 -0.1158 %! -0.0905 -0.0481 0.2245 -0.0983 %! -0.0766 0.0802 0.2345 -0.1633 %! -0.0549 0.2306 0.1405 -0.2558 %! -0.0366 0.3284 0.0435 -0.1458 %! -0.0207 0.3329 0.1075 -0.3483 %! 0.0026 0.3131 0.1475 -0.3983 %! 0.0262 0.3154 0.1045 -0.1858 %! 0.0400 0.3280 0.0795 -0.2658 %! 0.0476 0.3332 0.0685 -0.3658 %! 0.0513 0.3067 0.0155 -0.3033 %! 0.0436 0.2422 -0.0525 -0.2133 %! 0.0191 0.1745 -0.0125 -0.1783 %! -0.0154 0.1173 0.1125 -0.2333 %! -0.0520 0.0566 0.1405 -0.1883 %! -0.0912 -0.0241 0.1125 -0.1083 %! -0.1337 -0.1957 0.1615 -0.0583 %! -0.1775 -0.4680 0.2625 0.0967 %! -0.2182 -0.7258 0.3555 0.1792 %! -0.2523 -0.9660 0.3795 0.3267 %! -0.2796 -1.2414 0.4355 0.4692 %! -0.3002 -1.4781 0.5115 0.5442 %! -0.3161 -1.6356 0.4915 0.7167 %! -0.3243 -1.7215 0.5205 0.6517 %! -0.3173 -1.7280 0.6125 0.5417 %! -0.3033 -1.6605 0.5655 0.7367 %! -0.2915 -1.5221 0.5125 0.5692 %! -0.2740 -1.4133 0.5035 0.3317 %! -0.2508 -1.3893 0.4615 0.5317 %! -0.2274 -1.3097 0.5105 0.3317 %! -0.2072 -1.1267 0.4385 0.2692 %! -0.2012 -0.8891 0.3175 0.3692 %! -0.2073 -0.6029 0.3925 -0.0383 %! -0.2127 -0.3371 0.4275 -0.1183 %! -0.2136 -0.1458 0.4635 -0.1808 %! -0.2108 -0.0281 0.4615 -0.3008 %! -0.2106 0.0331 0.3555 -0.0583 %! -0.2045 0.0892 0.4145 -0.3483 %! -0.1740 0.1431 0.4105 -0.4808 %! -0.1301 0.2082 0.2505 -0.1883 %! -0.0931 0.3034 0.1765 -0.3183 %! -0.0690 0.3629 0.0665 -0.2933 %! -0.0537 0.4034 0.0305 -0.3458 %! -0.0359 0.4826 0.0655 -0.5758 %! -0.0191 0.5747 0.0015 -0.3583 %! -0.0119 0.6836 0.0125 -0.4958 %! -0.0100 0.8082 -0.0155 -0.6258 %! -0.0110 0.9267 -0.0725 -0.5783 %! -0.0131 1.0266 -0.0315 -0.7833 %! -0.0191 1.0669 -0.0235 -0.6333 %! -0.0329 1.0852 0.0475 -0.6808 %! -0.0476 1.1486 0.1005 -0.8408 %! -0.0613 1.2331 0.0555 -0.6658 %! -0.0695 1.2863 0.1305 -0.8658 %! -0.0629 1.2536 0.1935 -0.9183 %! -0.0502 1.1622 0.1295 -0.6433 %! -0.0420 1.0762 0.1075 -0.7283 %! -0.0378 0.9463 0.0865 -0.6458 %! -0.0383 0.7694 0.0815 -0.4908 %! -0.0424 0.6196 0.1055 -0.5508 %! -0.0527 0.4838 0.0825 -0.3458 %! -0.0750 0.3620 0.1135 -0.2508 %! -0.1029 0.3257 0.1775 -0.3258 %! -0.1237 0.3916 0.2245 -0.4083 %! -0.1362 0.4953 0.2215 -0.4708 %! -0.1525 0.5921 0.2075 -0.3783 %! -0.1774 0.6786 0.2845 -0.5608 %! -0.2054 0.7145 0.3265 -0.5958 %! -0.2364 0.6962 0.3055 -0.4108 %! -0.2619 0.6799 0.4275 -0.6658 %! -0.2722 0.6582 0.4825 -0.6183 %! -0.2772 0.6341 0.3975 -0.3433 %! -0.2753 0.6139 0.3925 -0.6433 %! -0.2569 0.5279 0.3515 -0.5758 %! -0.2352 0.3880 0.2905 -0.2933 %! -0.2256 0.2776 0.2425 -0.2983 %! -0.2253 0.2197 0.2435 -0.2883 %! -0.2240 0.1661 0.3435 -0.3258 %! -0.2194 0.0552 0.3135 -0.1083 %! -0.2107 -0.0586 0.2945 -0.0883 %! -0.1862 -0.1745 0.3505 -0.1983 %! -0.1449 -0.3729 0.2845 0.1492 %! -0.0923 -0.5517 0.2365 0.0692 %! -0.0331 -0.6555 0.0805 0.1867 %! 0.0188 -0.7057 -0.0615 0.4342 %! 0.0632 -0.6388 -0.0115 0.0117 %! 0.1011 -0.5252 -0.1195 0.1917 %! 0.1224 -0.4038 -0.1795 0.1617 %! 0.1294 -0.2700 -0.1185 -0.2408 %! 0.1151 -0.2191 -0.2065 0.1567 %! 0.0729 -0.1642 -0.1515 -0.0483 %! 0.0192 -0.0712 -0.0105 -0.3533 %! -0.0439 -0.0512 0.0485 0.0167 %! -0.1182 -0.0612 0.2055 -0.1708 %! -0.1887 -0.0999 0.2975 -0.2733 %! -0.2494 -0.1813 0.3405 -0.0633 %! -0.2982 -0.2755 0.4775 -0.1683 %! -0.3334 -0.4156 0.5205 -0.0333 %! -0.3602 -0.5483 0.5275 0.1142 %! -0.3767 -0.6765 0.6015 0.0492 %! -0.3788 -0.8510 0.6165 0.1667 %! -0.3733 -0.9980 0.5815 0.3117 %! -0.3666 -1.1136 0.5495 0.3617 %! -0.3586 -1.2004 0.5285 0.3817 %! -0.3497 -1.1950 0.5185 0.4042 %! -0.3411 -1.1416 0.4925 0.3942 %! -0.3308 -1.1319 0.4865 0.3667 %! -0.3151 -1.1897 0.5185 0.4042 %! -0.2909 -1.2479 0.5295 0.4217 %! -0.2559 -1.2221 0.4895 0.3667 %! -0.2137 -1.1087 0.4145 0.3742 %! -0.1715 -0.9637 0.3655 0.3142 %! -0.1311 -0.8325 0.3315 0.2117 %! -0.0919 -0.6882 0.2665 0.1967 %! -0.0507 -0.5098 0.2545 0.0167 %! -0.0053 -0.3457 0.2025 -0.0408 %! 0.0384 -0.2101 0.0915 -0.0308 %! 0.0784 -0.1111 0.0025 -0.1683 %! 0.1181 -0.0751 -0.0865 -0.1308 %! 0.1605 -0.0730 -0.1175 -0.2033 %! 0.2059 -0.1001 -0.2135 -0.2008 %! 0.2462 -0.2077 -0.3615 -0.0183 %! 0.2772 -0.4270 -0.4225 -0.0558 %! 0.3007 -0.7541 -0.4925 0.1717 %! 0.3146 -1.1303 -0.5105 0.3567 %! 0.3186 -1.4819 -0.5215 0.4617 %! 0.3091 -1.7927 -0.5565 0.7917 %! 0.2890 -2.0763 -0.4785 0.7642 %! 0.2692 -2.3198 -0.4585 0.8617 %! 0.2490 -2.4531 -0.4775 1.1192 %! 0.2292 -2.4601 -0.4055 0.9467 %! 0.2131 -2.4495 -0.3885 0.9992 %! 0.1952 -2.4696 -0.3775 1.0642 %! 0.1710 -2.4586 -0.3765 1.0317 %! 0.1456 -2.4272 -0.2785 0.9392 %! 0.1230 -2.4762 -0.1635 0.9317 %! 0.0921 -2.5929 -0.1965 1.2292 %! 0.0478 -2.6509 -0.1055 1.0467 %! -0.0025 -2.6497 0.0055 1.0742 %! -0.0578 -2.6410 0.0905 1.2692 %! -0.1096 -2.5957 0.2545 0.9617 %! -0.1513 -2.5087 0.2895 1.1817 %! -0.1795 -2.3898 0.4275 1.0492 %! -0.1794 -2.2767 0.5375 0.6942 %! -0.1570 -2.1483 0.3505 1.0492 %! -0.1248 -1.8914 0.3095 0.7342 %! -0.0796 -1.5767 0.2835 0.4517 %! -0.0317 -1.3301 0.1355 0.6567 %! 0.0092 -1.1046 0.0485 0.3492 %! 0.0457 -0.8055 -0.0545 0.2217 %! 0.0755 -0.4035 -0.0825 0.1117 %! 0.0943 0.0059 -0.1495 -0.0883 %! 0.1011 0.3715 -0.2115 -0.2533 %! 0.0943 0.7130 -0.1945 -0.4308 %! 0.0694 1.0155 -0.1785 -0.3908 %! 0.0356 1.3196 -0.0615 -0.7733 %! 0.0046 1.5734 -0.0275 -0.8458 %! -0.0314 1.7202 -0.0395 -0.6133 %! -0.0681 1.8521 0.1035 -1.0408 %! -0.0942 1.9659 0.1055 -0.9358 %! -0.1141 2.0471 0.0675 -0.8083 %! -0.1209 2.0915 0.1535 -1.1308 %! -0.1063 2.0434 0.1825 -1.0608 %! -0.0888 1.9430 0.0735 -0.8483 %! -0.0915 1.8424 -0.1075 -0.6683 %! -0.1083 1.8053 -0.0255 -0.9108 %! -0.1202 1.8339 0.1335 -0.9908 %! -0.1316 1.8332 0.1095 -0.6858 %! -0.1505 1.8459 0.1255 -0.9133 %! -0.1761 1.8897 0.1255 -0.8433 %! -0.2072 1.8891 0.1965 -0.7508 %! -0.2260 1.8554 0.3535 -1.1083 %! -0.2255 1.8173 0.3455 -0.8533 %! -0.2197 1.7742 0.3785 -0.7258 %! -0.2068 1.6928 0.4225 -0.9683 %! -0.1823 1.5929 0.2655 -0.7583 %! -0.1528 1.5525 0.1635 -0.6833 %! -0.1153 1.5768 0.1865 -0.8233 %! -0.0639 1.6492 0.1845 -0.8233 %! -0.0036 1.7389 0.0385 -0.7983 %! 0.0568 1.8252 -0.1795 -0.8408 %! 0.1135 1.9303 -0.3065 -0.9008 %! 0.1663 2.0578 -0.3395 -0.9508 %! 0.2171 2.2149 -0.3865 -1.1108 %! 0.2609 2.3688 -0.5255 -1.0583 %! 0.2903 2.4811 -0.5965 -1.0783 %! 0.3116 2.5456 -0.5985 -1.2933 %! 0.3302 2.5368 -0.6915 -1.2033 %! 0.3386 2.4999 -0.7635 -1.1133 %! 0.3349 2.4705 -0.7265 -1.1508 %! 0.3272 2.3935 -0.6665 -1.1583 %! 0.3200 2.2373 -0.7235 -1.0883 %! 0.3069 2.0341 -0.8575 -0.8508 %! 0.2852 1.8725 -0.7935 -0.9233 %! 0.2581 1.7540 -0.7195 -0.8208 %! 0.2203 1.6180 -0.7705 -0.5283 %! 0.1816 1.4957 -0.6725 -0.8258 %! 0.1549 1.3512 -0.5665 -0.7058 %! 0.1282 1.1388 -0.5585 -0.2658 %! 0.1008 0.9536 -0.4685 -0.5208 %! 0.0874 0.8015 -0.3885 -0.4808 %! 0.0840 0.6058 -0.3185 -0.1583 %! 0.0854 0.4115 -0.2425 -0.2633 %! 0.0948 0.2596 -0.2405 -0.1983 %! 0.1089 0.1118 -0.2375 -0.0158 %! 0.1282 -0.0454 -0.1845 -0.0983 %! 0.1559 -0.2334 -0.2045 -0.0283 %! 0.1806 -0.4327 -0.3215 0.2567 %! 0.1940 -0.5798 -0.3475 0.2092 %! 0.2039 -0.6991 -0.3195 0.1717 %! 0.2138 -0.7922 -0.3635 0.3517 %! 0.2221 -0.8503 -0.4145 0.3267 %! 0.2299 -0.9164 -0.4665 0.3792 %! 0.2400 -0.9682 -0.4465 0.3692 %! 0.2545 -1.0512 -0.4625 0.3767 %! 0.2670 -1.2018 -0.5555 0.6217 %! 0.2737 -1.3174 -0.5085 0.5317 %! 0.2764 -1.4090 -0.4815 0.6092 %! 0.2693 -1.5248 -0.5265 0.8217 %! 0.2531 -1.6471 -0.4865 0.6892 %! 0.2321 -1.8015 -0.4525 0.8867 %! 0.2056 -1.9496 -0.3925 1.0067 %! 0.1804 -2.0230 -0.3695 0.8967 %! 0.1599 -1.9852 -0.4155 1.0367 %! 0.1436 -1.8214 -0.3455 0.8392 %! 0.1329 -1.6423 -0.3275 0.7317 %! 0.1199 -1.5459 -0.3995 0.8667 %! 0.1026 -1.4838 -0.3475 0.6542 %! 0.0885 -1.4278 -0.2525 0.5967 %! 0.0761 -1.3787 -0.2145 0.6842 %! 0.0645 -1.2595 -0.1895 0.5417 %! 0.0588 -1.0485 -0.1635 0.3892 %! 0.0552 -0.8090 -0.1595 0.4317 %! 0.0479 -0.5480 -0.1485 0.2867 %! 0.0420 -0.3196 -0.1045 0.0467 %! 0.0378 -0.2052 -0.0815 0.0967 %! 0.0258 -0.1789 -0.0605 0.0942 %! 0.0006 -0.2476 -0.0715 0.1042 %! -0.0359 -0.4128 -0.0735 0.2417 %! -0.0730 -0.6137 0.0265 0.2317 %! -0.0993 -0.8314 0.0895 0.3617 %! -0.1153 -0.9895 0.0605 0.5417 %! -0.1249 -1.0287 -0.0115 0.6092 %! -0.1250 -1.0177 -0.0275 0.5817 %! -0.1093 -0.9871 0.0055 0.4892 %! -0.0832 -0.9130 -0.0565 0.6292 %! -0.0526 -0.8006 -0.0585 0.5317 %! -0.0077 -0.7273 0.0065 0.2742 %! 0.0553 -0.7710 -0.0665 0.4267 %! 0.1270 -0.9222 -0.1935 0.4617 %! 0.1985 -1.1668 -0.3345 0.6017 %! 0.2688 -1.4234 -0.3835 0.6767 %! 0.3422 -1.5956 -0.4405 0.5992 %! 0.4068 -1.7452 -0.6875 0.9367 %! 0.4443 -1.9072 -0.8405 0.9867 %! 0.4553 -2.0635 -0.8345 0.9092 %! 0.4476 -2.2464 -0.8135 1.0567 %! 0.4252 -2.4329 -0.7825 1.0967 %! 0.3876 -2.5541 -0.7555 1.2767 %! 0.3383 -2.5291 -0.6055 1.1367 %! 0.2853 -2.3477 -0.5295 1.0567 %! 0.2304 -2.0738 -0.5415 1.0692 %! 0.1821 -1.7182 -0.3605 0.5542 %! 0.1429 -1.3468 -0.2425 0.5842 %! 0.1032 -1.0234 -0.2025 0.4742 %! 0.0679 -0.7153 -0.1825 0.0467 %! 0.0414 -0.4370 -0.1845 0.1467 %! 0.0237 -0.2054 -0.0365 -0.1708 %! 0.0103 -0.0543 -0.0845 -0.1233 %! -0.0138 -0.0096 -0.1945 0.1042 %! -0.0442 0.0084 -0.0665 -0.3308 %! -0.0775 0.0274 -0.0545 -0.0058 %! -0.1239 0.0529 -0.0365 0.0892 %! -0.1740 0.1041 0.0725 -0.2208 %! -0.2155 0.1382 0.1855 0.0092 %! -0.2412 0.1550 0.3675 -0.2133 %! -0.2493 0.1734 0.3055 -0.1183 %! -0.2515 0.2194 0.2315 0.0167 %! -0.2507 0.3222 0.3455 -0.2983 %! -0.2498 0.4421 0.3345 -0.1158 %! -0.2534 0.5567 0.3655 -0.2708 %! -0.2559 0.6360 0.3995 -0.3958 %! -0.2582 0.6567 0.4175 -0.2383 %! -0.2604 0.6446 0.4565 -0.4358 %! -0.2618 0.5815 0.3395 -0.2633 %! -0.2665 0.5052 0.3425 -0.2233 %! -0.2708 0.5100 0.4235 -0.3608 %! -0.2728 0.6079 0.3875 -0.2883 %! -0.2742 0.7203 0.3615 -0.4683 %! -0.2795 0.7793 0.3085 -0.3733 %! -0.2924 0.8673 0.3805 -0.4158 %! -0.3020 0.9995 0.5025 -0.6983 %! -0.3037 1.0591 0.4755 -0.5208 %! -0.3040 1.0871 0.5245 -0.5933 %! -0.3049 1.1507 0.5525 -0.6233 %! -0.3058 1.2644 0.5195 -0.6358 %! -0.3004 1.4334 0.4955 -0.8358 %! -0.2875 1.5499 0.4055 -0.6808 %! -0.2652 1.5844 0.4605 -0.8508 %! -0.2284 1.5971 0.3825 -0.8783 %! -0.1892 1.6190 0.1465 -0.5958 %! -0.1537 1.6781 0.1075 -0.9083 %! -0.1213 1.6967 0.0525 -0.7883 %! -0.1047 1.6351 0.0045 -0.5783 %! -0.1042 1.5375 0.0525 -0.8158 %! -0.1170 1.3787 0.0375 -0.5208 %! -0.1449 1.2041 0.1245 -0.4508 %! -0.1783 1.0765 0.1865 -0.4958 %! -0.2074 0.9696 0.2285 -0.3758 %! -0.2269 0.8117 0.3565 -0.4383 %! -0.2434 0.5263 0.3285 -0.0883 %! -0.2634 0.1883 0.3275 0.0292 %! -0.2766 -0.1724 0.4035 -0.0358 %! -0.2855 -0.6067 0.3515 0.5092 %! -0.2971 -0.9636 0.3975 0.5592 %! -0.3002 -1.1742 0.4425 0.4867 %! -0.2883 -1.3005 0.3975 0.6967 %! -0.2630 -1.3348 0.3585 0.5892 %! -0.2244 -1.3593 0.2655 0.6317 %! -0.1732 -1.4072 0.2425 0.5767 %! -0.1119 -1.4491 0.2175 0.5367 %! -0.0519 -1.5377 0.1075 0.7042 %! -0.0045 -1.6482 0.0515 0.6342 %! 0.0222 -1.7353 -0.0215 0.8067 %! 0.0255 -1.7833 -0.0095 0.8492 %! 0.0200 -1.7957 0.0855 0.6017 %! 0.0138 -1.8427 0.0605 0.8717 %! 0.0079 -1.9256 0.0775 0.8342 %! 0.0100 -2.0111 0.0645 0.7467 %! 0.0160 -2.0729 -0.0805 1.0792 %! 0.0231 -2.0740 -0.0975 0.8967 %! 0.0388 -2.0445 -0.1065 0.8617 %! 0.0597 -1.9906 -0.1435 1.0067 %! 0.0807 -1.9170 -0.1825 0.8017 %! 0.0969 -1.8479 -0.3205 0.9292 %! 0.1029 -1.7495 -0.3275 0.8542 %! 0.1043 -1.6604 -0.2355 0.6392 %! 0.1001 -1.6211 -0.2395 0.8142 %! 0.0841 -1.5806 -0.2095 0.7817 %! 0.0630 -1.5319 -0.1415 0.6667 %! 0.0489 -1.5022 -0.0715 0.6367 %! 0.0469 -1.4700 -0.0835 0.6692 %! 0.0566 -1.3234 -0.1335 0.6092 %! 0.0811 -1.0251 -0.0935 0.2617 %! 0.1115 -0.7103 -0.2095 0.3017 %! 0.1288 -0.4227 -0.3555 0.2692 %! 0.1352 -0.1704 -0.2835 -0.2308 %! 0.1320 -0.0594 -0.2505 -0.0183 %! 0.1065 -0.0067 -0.2275 0.0967 %! 0.0680 0.1685 -0.1365 -0.3083 %! 0.0335 0.4148 -0.0715 -0.3258 %! 0.0049 0.5997 -0.0175 -0.3758 %! -0.0195 0.7006 -0.0445 -0.4033 %! -0.0351 0.7637 -0.0225 -0.4233 %! -0.0299 0.8425 0.0905 -0.6383 %! -0.0055 0.9276 0.0615 -0.5283 %! 0.0178 1.0462 -0.0975 -0.3783 %! 0.0368 1.2729 -0.1145 -0.6858 %! 0.0674 1.4969 -0.0265 -0.9283 %! 0.1083 1.6066 -0.1025 -0.7658 %! 0.1448 1.7228 -0.2695 -0.7558 %! 0.1778 1.9169 -0.3095 -1.0808 %! 0.2111 2.1262 -0.3605 -1.0633 %! 0.2372 2.3387 -0.4795 -1.0733 %! 0.2550 2.5757 -0.5415 -1.3358 %! 0.2666 2.7617 -0.4935 -1.4108 %! 0.2636 2.7910 -0.4535 -1.3158 %! 0.2380 2.7246 -0.5335 -1.2708 %! 0.1975 2.6043 -0.4965 -1.3383 %! 0.1524 2.3566 -0.3465 -1.1458 %! 0.1037 2.0830 -0.2385 -0.9383 %! 0.0570 1.8917 -0.1875 -1.0133 %! 0.0150 1.7363 -0.2315 -0.7908 %! -0.0242 1.6378 -0.1455 -0.8158 %! -0.0589 1.5875 -0.0665 -0.9083 %! -0.0979 1.5152 -0.1345 -0.6183 %! -0.1459 1.4203 -0.0325 -0.7233 %! -0.1901 1.3044 0.1315 -0.7433 %! -0.2209 1.1849 0.2195 -0.6183 %! -0.2339 1.0649 0.2275 -0.6983 %! -0.2355 0.9365 0.1425 -0.4533 %! -0.2337 0.8784 0.1855 -0.4658 %! -0.2214 0.8990 0.2485 -0.6558 %! -0.1964 0.9349 0.1745 -0.5258 %! -0.1659 0.9811 0.1785 -0.6333 %! -0.1372 0.9916 0.1725 -0.5783 %! -0.1158 0.9395 0.1425 -0.5083 %! -0.0970 0.8657 0.1345 -0.6183 %! -0.0792 0.8086 0.0965 -0.4358 %! -0.0657 0.8370 0.1385 -0.4958 %! -0.0552 0.9112 0.1155 -0.5783 %! -0.0518 0.9266 -0.0175 -0.4133 %! -0.0560 0.9192 -0.0425 -0.5208 %! -0.0578 0.8932 0.0005 -0.5783 %! -0.0564 0.8007 -0.0235 -0.4083 %! -0.0591 0.6940 -0.0925 -0.3358 %! -0.0655 0.6191 -0.1015 -0.3833 %! -0.0735 0.5441 -0.0995 -0.2783 %! -0.0841 0.4197 -0.1085 -0.1608 %! -0.0892 0.2639 -0.0675 -0.2483 %! -0.0801 0.1240 -0.0085 -0.2133 %! -0.0661 -0.0027 -0.0185 -0.0408 %! -0.0647 -0.0929 -0.1255 0.0367 %! -0.0828 -0.1350 -0.1705 0.0342 %! -0.1111 -0.1750 -0.0195 -0.0983 %! -0.1424 -0.2431 0.1145 -0.0458 %! -0.1823 -0.3343 0.1235 0.1642 %! -0.2282 -0.4034 0.1845 0.0017 %! -0.2684 -0.4463 0.2355 0.0017 %! -0.3042 -0.4858 0.2235 0.1692 %! -0.3374 -0.5038 0.2585 0.0742 %! -0.3619 -0.5260 0.3695 0.0692 %! -0.3751 -0.5692 0.4925 0.0867 %! -0.3804 -0.6271 0.4655 0.1342 %! -0.3838 -0.6946 0.3635 0.2492 %! -0.3849 -0.7012 0.4405 0.1317 %! -0.3802 -0.6456 0.5245 0.1767 %! -0.3685 -0.5710 0.5145 0.1717 %! -0.3432 -0.4960 0.4965 -0.0458 %! -0.3091 -0.5027 0.3875 0.1642 %! -0.2816 -0.5650 0.2855 0.2767 %! -0.2575 -0.6307 0.2745 0.0492 %! -0.2333 -0.7767 0.2115 0.3092 %! -0.2177 -0.9320 0.2115 0.4467 %! -0.2103 -0.9808 0.2295 0.3017 %! -0.2077 -0.9820 0.1235 0.4517 %! -0.2091 -0.9672 0.0925 0.4017 %! -0.2067 -0.9320 0.1505 0.2667 %! -0.1964 -0.9354 0.1875 0.3117 %! -0.1862 -1.0067 0.1385 0.4092 %! -0.1835 -1.1249 0.0845 0.4417 %! -0.1878 -1.2659 0.1145 0.4717 %! -0.1971 -1.4192 0.1755 0.5892 %! -0.2082 -1.5634 0.2345 0.5917 %! -0.2205 -1.6030 0.2205 0.7092 %! -0.2334 -1.4712 0.2515 0.5992 %! -0.2378 -1.2802 0.2915 0.3067 %! -0.2371 -1.1340 0.1805 0.4742 %! -0.2418 -1.0239 0.1895 0.3717 %! -0.2467 -0.9961 0.2855 0.1917 %! -0.2506 -1.0394 0.2625 0.4892 %! -0.2481 -1.0708 0.3205 0.2867 %! -0.2255 -1.1285 0.3115 0.2942 %! -0.1851 -1.2190 0.2515 0.5392 %! -0.1284 -1.2780 0.2205 0.3617 %! -0.0568 -1.3066 0.0485 0.4992 %! 0.0190 -1.3093 -0.0745 0.5842 %! 0.0980 -1.3169 -0.0975 0.3817 %! 0.1790 -1.3629 -0.1905 0.4917 %! 0.2470 -1.3928 -0.3335 0.5942 %! 0.2906 -1.3799 -0.4495 0.5667 %! 0.3119 -1.3872 -0.4345 0.4267 %! 0.3070 -1.4366 -0.4805 0.6267 %! 0.2694 -1.4497 -0.5195 0.7092 %! 0.2157 -1.4180 -0.3445 0.3267 %! 0.1572 -1.4131 -0.2795 0.5917 %! 0.0900 -1.4020 -0.2475 0.6467 %! 0.0252 -1.3726 -0.1455 0.2942 %! -0.0329 -1.3701 -0.1075 0.5992 %! -0.0863 -1.3388 0.0435 0.4792 %! -0.1235 -1.2708 0.1565 0.2142 %! -0.1478 -1.2320 0.1245 0.4817 %! -0.1728 -1.2034 0.1555 0.4392 %! -0.1952 -1.1628 0.2365 0.2667 %! -0.2103 -1.1065 0.2765 0.3317 %! -0.2217 -0.9840 0.3265 0.2767 %! -0.2321 -0.8129 0.3975 0.1317 %! -0.2489 -0.6673 0.3905 0.1867 %! -0.2823 -0.5045 0.3435 0.2217 %! -0.3208 -0.2971 0.4725 -0.1183 %! -0.3473 -0.1283 0.6145 -0.1808 %! -0.3655 0.0017 0.6595 -0.0633 %! -0.3824 0.1148 0.6585 -0.2158 %! -0.3984 0.1791 0.6025 -0.1708 %! -0.4094 0.2068 0.6665 -0.2083 %! -0.4057 0.1834 0.7515 -0.2908 %! -0.3881 0.1013 0.7285 -0.1283 %! -0.3652 0.0076 0.6865 -0.0358 %! -0.3341 -0.0852 0.6455 -0.0683 %! -0.2841 -0.1695 0.5685 -0.0783 %! -0.2157 -0.2379 0.4245 0.0317 %! -0.1411 -0.3204 0.2975 0.1167 %! -0.0709 -0.4622 0.1965 0.1842 %! -0.0090 -0.6683 0.0635 0.2967 %! 0.0471 -0.8651 -0.0275 0.2617 %! 0.0923 -0.9752 -0.1435 0.4992 %! 0.1202 -0.9762 -0.1835 0.5592 %! 0.1442 -0.9324 -0.0975 0.1967 %! 0.1675 -0.9128 -0.2015 0.4142 %! 0.1732 -0.8419 -0.3305 0.5317 %! 0.1625 -0.6695 -0.2815 0.1442 %! 0.1441 -0.4938 -0.2375 0.1892 ]; %! %! DAT = iddata (UY(:, 3:4), UY(:, 1:2)); %! %! [SYS, X0] = moen4 (DAT, "s", 15, "n", 8, "rcond", 0.0, "tol", -1.0); %! %! Ae = [ 0.9893 0.0081 -0.0844 0.0299 0.1262 0.0815 -0.0379 0.1779 %! 0.0076 0.9694 0.1352 0.1793 0.0965 -0.1041 -0.0373 -0.0045 %! 0.0018 -0.0115 0.9413 -0.3450 0.1674 0.0302 -0.1098 -0.0087 %! 0.0036 -0.0197 0.1766 0.6550 -0.1178 0.6168 0.0028 0.0085 %! -0.0010 -0.0032 -0.0507 0.0624 0.9293 -0.0034 0.0229 -0.4511 %! 0.0032 -0.0012 -0.0397 0.1255 0.1578 0.1833 0.7586 0.3125 %! 0.0029 -0.0048 0.0422 0.2343 0.0321 -0.6549 -0.0374 0.2232 %! -0.0036 0.0028 0.0080 -0.2437 0.1074 0.1599 -0.1012 0.2106 ]; %! %! Ce = [ -0.2226 0.2072 -0.3129 -0.3937 0.1722 0.3232 -0.2113 0.2928 %! -0.1680 -0.2205 0.0698 0.4049 0.3210 -0.1143 -0.2451 0.4844 ]; %! %! Be = [ 0.0857 0.0026 %! -0.6433 -0.0314 %! 0.2445 0.0044 %! 1.8942 0.0488 %! 0.0549 0.0151 %! -2.2093 -0.0622 %! -2.5072 -0.0925 %! 0.8189 0.0280 ]; %! %! De = [ -0.4997 0.0451 %! -1.0011 -0.5567 ]; %! %!assert (SYS.A, Ae, 1e-4); %!assert (SYS.B, Be, 1e-4); %!assert (SYS.C, Ce, 1e-4); %!assert (SYS.D, De, 1e-4); control/inst/moesp.m0000644000076500000240000001652712614620313014027 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @var{opt}, @dots{}) ## Estimate state-space model using @acronym{MOESP} algorithm. ## @acronym{MOESP}: Multivariable Output Error State sPace. ## If no output arguments are given, the singular values are ## plotted on the screen in order to estimate the system order. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting state-space system @var{sys}. ## If not specified, @var{n} is chosen automatically according ## to the singular values and tolerances. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @item info ## Struct containing additional information. ## @table @var ## @item info.K ## Kalman gain matrix. ## @item info.Q ## State covariance matrix. ## @item info.Ry ## Output covariance matrix. ## @item info.S ## State-output cross-covariance matrix. ## @item info.L ## Noise variance matrix factor. LL'=Ry. ## @end table ## @end table ## ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'n' ## The desired order of the resulting state-space system @var{sys}. ## @var{s} > @var{n} > 0. ## ## @item 's' ## The number of block rows @var{s} in the input and output ## block Hankel matrices to be processed. @var{s} > 0. ## In the MOESP theory, @var{s} should be larger than @var{n}, ## the estimated dimension of state vector. ## ## @item 'alg', 'algorithm' ## Specifies the algorithm for computing the triangular ## factor R, as follows: ## @table @var ## @item 'C' ## Cholesky algorithm applied to the correlation ## matrix of the input-output data. Default method. ## @item 'F' ## Fast QR algorithm. ## @item 'Q' ## QR algorithm applied to the concatenated block ## Hankel matrices. ## @end table ## ## @item 'tol' ## Absolute tolerance used for determining an estimate of ## the system order. If @var{tol} >= 0, the estimate is ## indicated by the index of the last singular value greater ## than or equal to @var{tol}. (Singular values less than @var{tol} ## are considered as zero.) When @var{tol} = 0, an internally ## computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, ## where SV(1) is the maximal singular value, and @var{eps} is ## the relative machine precision. ## When @var{tol} < 0, the estimate is indicated by the ## index of the singular value that has the largest ## logarithmic gap to its successor. Default value is 0. ## ## @item 'rcond' ## The tolerance to be used for estimating the rank of ## matrices. If the user sets @var{rcond} > 0, the given value ## of @var{rcond} is used as a lower bound for the reciprocal ## condition number; an m-by-n matrix whose estimated ## condition number is less than 1/@var{rcond} is considered to ## be of full rank. If the user sets @var{rcond} <= 0, then an ## implicitly computed, default tolerance, defined by ## @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the ## relative machine precision. Default value is 0. ## ## @item 'confirm' ## Specifies whether or not the user's confirmation of the ## system order estimate is desired, as follows: ## @table @var ## @item true ## User's confirmation. ## @item false ## No confirmation. Default value. ## @end table ## ## @item 'noiseinput' ## The desired type of noise input channels. ## @table @var ## @item 'n' ## No error inputs. Default value. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k $$ ## $$ y_k = C x_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @item 'e' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and noise channels e ## with covariance matrix @var{Ry}. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K e_k $$ ## $$ y_k = C x_k + D u_k + e_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K e[k] ## y[k] = C x[k] + D u[k] + e[k] ## @end example ## @end ifnottex ## ## @item 'v' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and white noise channels v ## with identity covariance matrix. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K L v_k $$ ## $$ y_k = C x_k + D u_k + L v_k $$ ## $$ e = L v, \\ L L^T = R_y $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K L v[k] ## y[k] = C x[k] + D u[k] + L v[k] ## e = L v, L L' = Ry ## @end example ## @end ifnottex ## ## @item 'k' ## Return @var{sys} as a Kalman predictor for simulation. ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = A \\widehat{x}_k + B u_k + K (y_k - \\widehat{y}_k) $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ^ ## x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ## ^ ^ ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = (A-KC) \\widehat{x}_k + (B-KD) u_k + K y_k $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k + 0 y_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ## x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ## ^ ^ ## y[k] = C x[k] + D u[k] + 0 y[k] ## @end example ## @end ifnottex ## @end table ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = moesp (varargin) if (nargin == 0) print_usage (); endif if (nargout == 0) __slicot_identification__ ("moesp", nargout, varargin{:}); else [sys, x0, info] = __slicot_identification__ ("moesp", nargout, varargin{:}); endif endfunction control/inst/n4sid.m0000644000076500000240000001656312614620313013725 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @var{opt}, @dots{}) ## Estimate state-space model using @acronym{N4SID} algorithm. ## @acronym{N4SID}: Numerical algorithm for Subspace State Space System IDentification. ## If no output arguments are given, the singular values are ## plotted on the screen in order to estimate the system order. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting state-space system @var{sys}. ## If not specified, @var{n} is chosen automatically according ## to the singular values and tolerances. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @item info ## Struct containing additional information. ## @table @var ## @item info.K ## Kalman gain matrix. ## @item info.Q ## State covariance matrix. ## @item info.Ry ## Output covariance matrix. ## @item info.S ## State-output cross-covariance matrix. ## @item info.L ## Noise variance matrix factor. LL'=Ry. ## @end table ## @end table ## ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'n' ## The desired order of the resulting state-space system @var{sys}. ## @var{s} > @var{n} > 0. ## ## @item 's' ## The number of block rows @var{s} in the input and output ## block Hankel matrices to be processed. @var{s} > 0. ## In the MOESP theory, @var{s} should be larger than @var{n}, ## the estimated dimension of state vector. ## ## @item 'alg', 'algorithm' ## Specifies the algorithm for computing the triangular ## factor R, as follows: ## @table @var ## @item 'C' ## Cholesky algorithm applied to the correlation ## matrix of the input-output data. Default method. ## @item 'F' ## Fast QR algorithm. ## @item 'Q' ## QR algorithm applied to the concatenated block ## Hankel matrices. ## @end table ## ## @item 'tol' ## Absolute tolerance used for determining an estimate of ## the system order. If @var{tol} >= 0, the estimate is ## indicated by the index of the last singular value greater ## than or equal to @var{tol}. (Singular values less than @var{tol} ## are considered as zero.) When @var{tol} = 0, an internally ## computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, ## where SV(1) is the maximal singular value, and @var{eps} is ## the relative machine precision. ## When @var{tol} < 0, the estimate is indicated by the ## index of the singular value that has the largest ## logarithmic gap to its successor. Default value is 0. ## ## @item 'rcond' ## The tolerance to be used for estimating the rank of ## matrices. If the user sets @var{rcond} > 0, the given value ## of @var{rcond} is used as a lower bound for the reciprocal ## condition number; an m-by-n matrix whose estimated ## condition number is less than 1/@var{rcond} is considered to ## be of full rank. If the user sets @var{rcond} <= 0, then an ## implicitly computed, default tolerance, defined by ## @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the ## relative machine precision. Default value is 0. ## ## @item 'confirm' ## Specifies whether or not the user's confirmation of the ## system order estimate is desired, as follows: ## @table @var ## @item true ## User's confirmation. ## @item false ## No confirmation. Default value. ## @end table ## ## @item 'noiseinput' ## The desired type of noise input channels. ## @table @var ## @item 'n' ## No error inputs. Default value. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k $$ ## $$ y_k = C x_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @item 'e' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and noise channels e ## with covariance matrix @var{Ry}. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K e_k $$ ## $$ y_k = C x_k + D u_k + e_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K e[k] ## y[k] = C x[k] + D u[k] + e[k] ## @end example ## @end ifnottex ## ## @item 'v' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and white noise channels v ## with identity covariance matrix. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K L v_k $$ ## $$ y_k = C x_k + D u_k + L v_k $$ ## $$ e = L v, \\ L L^T = R_y $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K L v[k] ## y[k] = C x[k] + D u[k] + L v[k] ## e = L v, L L' = Ry ## @end example ## @end ifnottex ## ## @item 'k' ## Return @var{sys} as a Kalman predictor for simulation. ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = A \\widehat{x}_k + B u_k + K (y_k - \\widehat{y}_k) $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ^ ## x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ## ^ ^ ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = (A-KC) \\widehat{x}_k + (B-KD) u_k + K y_k $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k + 0 y_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ## x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ## ^ ^ ## y[k] = C x[k] + D u[k] + 0 y[k] ## @end example ## @end ifnottex ## @end table ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = n4sid (varargin) if (nargin == 0) print_usage (); endif if (nargout == 0) __slicot_identification__ ("n4sid", nargout, varargin{:}); else [sys, x0, info] = __slicot_identification__ ("n4sid", nargout, varargin{:}); endif endfunction control/inst/ncfsyn.m0000644000076500000240000004761412614620313014205 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} ncfsyn (@var{G}, @var{W1}, @var{W2}, @var{factor}) ## Loop shaping H-infinity synthesis. Compute positive feedback controller using ## the McFarlane/Glover loop shaping design procedure [1]. ## Using a precompensator @var{W1} and/or a postcompensator @var{W2}, the singular values ## of the nominal plant @var{G} are shaped to give a desired open-loop shape. ## The nominal plant @var{G} and shaping functions @var{W1}, @var{W2} are combined to ## form the shaped plant, @var{Gs} where @code{Gs = W2 G W1}. ## We assume that @var{W1} and @var{W2} are such that @var{Gs} contains no hidden modes. ## It is relatively easy to approximate the closed-loop requirements by the following ## open-loop objectives [2]: ## @enumerate ## @item For @emph{disturbance rejection} make ## @iftex ## @tex ## $\\underline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## large; valid for frequencies at which ## @iftex ## @tex ## $\\underline{\\sigma}(G_S) \\gg 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @item For @emph{noise attenuation} make ## @iftex ## @tex ## $\\overline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## small; valid for frequencies at which ## @iftex ## @tex ## $\\overline{\\sigma}(G_S) \\ll 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @item For @emph{reference tracking} make ## @iftex ## @tex ## $\\underline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## large; valid for frequencies at which ## @iftex ## @tex ## $\\underline{\\sigma}(G_S) \\gg 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @item For @emph{robust stability} to a multiplicative output perturbation ## @iftex ## @tex ## $G_p = (I + \\Delta) G$, make ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @iftex ## @tex ## $\\overline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## small; valid for frequencies at which ## @iftex ## @tex ## $\\overline{\\sigma}(G_S) \\ll 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## . ## @end example ## @end ifnottex ## @end enumerate ## Then a stabilizing controller @var{Ks} is synthesized for shaped plant @var{Gs}. ## The final positive feedback controller @var{K} is then constructed by combining ## the ## @iftex ## @tex ## $H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## H-infinity ## @end example ## @end ifnottex ## controller @var{Ks} with the shaping functions @var{W1} and @var{W2} ## such that @code{K = W1 Ks W2}. ## In [1] is stated further that the given robust stabilization objective can be ## interpreted as a ## @iftex ## @tex ## $H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## H-infinity ## @end example ## @end ifnottex ## problem formulation of minimizing the ## @iftex ## @tex ## $H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## H-infinity ## @end example ## @end ifnottex ## norm of the frequency weighted gain from disturbances on the plant input and output ## to the controller input and output as follows: ## @iftex ## @tex ## $$ \\underset{K}{\\min} \\, || N(K) ||_{\\infty}, $$ ## $$ N = | W_{1}^{-1}; W_2 G | \\ (I - K G)^{-1} \\ | W_1, \\ G W_{2}^{-1} | $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 -1 -1 ## min || N(K) || , N = | W1 | (I - K G) | W1 G W2 | ## K oo | W2 G | ## @end example ## @end ifnottex ## @iftex ## @tex ## ## @end tex ## @end iftex ## ## @code{[K, N] = ncfsyn (G, W1, W2, f)} ## The function @command{ncfsyn} - the somewhat cryptic name stands ## for @emph{normalized coprime factorization synthesis} - allows the specification of ## an additional argument, factor @var{f}. Default value @code{f = 1} implies that an ## optimal controller is required, whereas @code{f > 1} implies that a suboptimal ## controller is required, achieving a performance that is @var{f} times less than optimal. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of plant. ## @item W1 ## @acronym{LTI} model of precompensator. Model must be SISO or of appropriate size. ## An identity matrix is taken if @var{W1} is not specified or if an empty model ## @code{[]} is passed. ## @item W2 ## @acronym{LTI} model of postcompensator. Model must be SISO or of appropriate size. ## An identity matrix is taken if @var{W2} is not specified or if an empty model ## @code{[]} is passed. ## @item factor ## @code{factor = 1} implies that an optimal controller is required. ## @code{factor > 1} implies that a suboptimal controller is required, ## achieving a performance that is @var{factor} times less than optimal. ## Default value is 1. ## @end table ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-infinity loop-shaping controller. ## Note that @var{K} is a @emph{positive} feedback controller. ## @item N ## State-space model of the closed loop depicted below. ## @item info ## Structure containing additional information. ## @item info.gamma ## L-infinity norm of @var{N}. @code{gamma = norm (N, inf)}. ## @item info.emax ## Nugap robustness. @code{emax = inv (gamma)}. ## @item info.Gs ## Shaped plant. @code{Gs = W2 * G * W1}. ## @item info.Ks ## Controller for shaped plant. @code{Ks = ncfsyn (Gs)}. ## @item info.rcond ## Estimates of the reciprocal condition numbers of the Riccati equations ## and a few other things. For details, see the description of the ## corresponding SLICOT routine. ## @end table ## ## @strong{Block Diagram of N} ## @example ## @group ## ## ^ z1 ^ z2 ## | | ## w1 + | +--------+ | +--------+ ## ----->(+)---+-->| Ks |----+--->(+)---->| Gs |----+ ## ^ + +--------+ ^ +--------+ | ## | w2 | | ## | | ## +-------------------------------------------------+ ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB10ID, SB10KD and SB10ZD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @strong{References}@* ## [1] D. McFarlane and K. Glover, ## @cite{A Loop Shaping Design Procedure Using H-infinity Synthesis}, ## IEEE Transactions on Automatic Control, Vol. 37, No. 6, June 1992.@* ## [2] S. Skogestad and I. Postlethwaite, ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley, Chichester, England, 2005.@* ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: July 2011 ## Version: 0.3 function [K, varargout] = ncfsyn (G, W1 = [], W2 = [], factor = 1.0) if (nargin == 0 || nargin > 4) print_usage (); endif if (! isa (G, "lti")) error ("ncfsyn: first argument must be an LTI system"); endif if (! is_real_scalar (factor) || factor < 1.0) error ("ncfsyn: fourth argument invalid"); endif [p, m] = size (G); W1 = __adjust_weighting__ (W1, m); W2 = __adjust_weighting__ (W2, p); Gs = W2 * G * W1; # shaped plant [a, b, c, d, tsam] = ssdata (Gs); ## synthesis if (isct (Gs)) # continuous-time [ak, bk, ck, dk, rcond] = __sl_sb10id__ (a, b, c, d, factor); elseif (any (d(:))) # discrete-time, d != 0 [ak, bk, ck, dk, rcond] = __sl_sb10zd__ (a, b, c, d, factor, 0.0); else # discrete-time, d == 0 [ak, bk, ck, dk, rcond] = __sl_sb10kd__ (a, b, c, factor); endif ## controller Ks = ss (ak, bk, ck, dk, tsam); K = W1 * Ks * W2; if (nargout > 1) ## FIXME: is this really the same thing as the dark side does? N = blkdiag (eye (p), Ks, Gs); M = [zeros(p,p), zeros(p,m), eye(p); eye(p), zeros(p,m), zeros(p,p); zeros(m,p), eye(m), zeros(m,p)]; in_idx = [1:p, 2*p+(1:m)]; out_idx = 1:p+m; N = mconnect (N, M, in_idx, out_idx); varargout{1} = N; if (nargout > 2) gamma = norm (N, inf); varargout{2} = gamma; if (nargout > 3) varargout{3} = struct ("gamma", gamma, "emax", inv (gamma), "Gs", Gs, "Ks", Ks, "rcond", rcond); endif endif endif endfunction function W = __adjust_weighting__ (W, s) if (isempty (W)) W = ss (eye (s)); else W = ss (W); ## if (! isstable (W)) ## error ("ncfsyn: %s must be stable", inputname (1)); ## endif ## if (! isminimumphase (W)) ## error ("ncfsyn: %s must be minimum-phase", inputname (1)); ## endif [p, m] = size (W); if (m == s && p == s) # model is of correct size return; elseif (m == 1 && p == 1) # model is SISO tmp = cell (s, 1); tmp(1:s) = W; W = blkdiag (tmp{:}); # stack SISO model s times else # model is invalid error ("ncfsyn: %s must have 1 or %d inputs and outputs", inputname (1), s); endif endif endfunction ## continuous-time case, direct access to sb10id %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ -1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0 ]; %! %! B = [ -3.0 -4.0 %! 2.0 0.0 %! -5.0 -7.0 %! 4.0 -6.0 %! -3.0 9.0 %! 1.0 -2.0 ]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 ]; %! %! D = [ 1.0 -2.0 %! 0.0 4.0 %! 5.0 -3.0 ]; %! %! FACTOR = 1.0; %! %! [AK, BK, CK, DK, RCOND] = __sl_sb10id__ (A, B, C, D, FACTOR); %! %! AKe = [ -39.0671 9.9293 22.2322 -27.4113 43.8655 %! -6.6117 3.0006 11.0878 -11.4130 15.4269 %! 33.6805 -6.6934 -23.9953 14.1438 -33.4358 %! -32.3191 9.7316 25.4033 -24.0473 42.0517 %! -44.1655 18.7767 34.8873 -42.4369 50.8437 ]; %! %! BKe = [ -10.2905 -16.5382 -10.9782 %! -4.3598 -8.7525 -5.1447 %! 6.5962 1.8975 6.2316 %! -9.8770 -14.7041 -11.8778 %! -9.6726 -22.7309 -18.2692 ]; %! %! CKe = [ -0.6647 -0.0599 -1.0376 0.5619 1.7297 %! -8.4202 3.9573 7.3094 -7.6283 10.6768 ]; %! %! DKe = [ 0.8466 0.4979 -0.6993 %! -1.2226 -4.8689 -4.5056 ]; %! %! RCONDe = [ 0.13861D-01 0.90541D-02 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); %!assert (RCOND, RCONDe, 1e-4); ## continuous-time case %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ -1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0 ]; %! %! B = [ -3.0 -4.0 %! 2.0 0.0 %! -5.0 -7.0 %! 4.0 -6.0 %! -3.0 9.0 %! 1.0 -2.0 ]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 ]; %! %! D = [ 1.0 -2.0 %! 0.0 4.0 %! 5.0 -3.0 ]; %! %! FACTOR = 1.0; %! %! G = ss (A, B, C, D); %! K = ncfsyn (G, [], [], FACTOR); %! [AK, BK, CK, DK] = ssdata (K); %! %! AKe = [ -39.0671 9.9293 22.2322 -27.4113 43.8655 %! -6.6117 3.0006 11.0878 -11.4130 15.4269 %! 33.6805 -6.6934 -23.9953 14.1438 -33.4358 %! -32.3191 9.7316 25.4033 -24.0473 42.0517 %! -44.1655 18.7767 34.8873 -42.4369 50.8437 ]; %! %! BKe = [ -10.2905 -16.5382 -10.9782 %! -4.3598 -8.7525 -5.1447 %! 6.5962 1.8975 6.2316 %! -9.8770 -14.7041 -11.8778 %! -9.6726 -22.7309 -18.2692 ]; %! %! CKe = [ -0.6647 -0.0599 -1.0376 0.5619 1.7297 %! -8.4202 3.9573 7.3094 -7.6283 10.6768 ]; %! %! DKe = [ 0.8466 0.4979 -0.6993 %! -1.2226 -4.8689 -4.5056 ]; %! %! RCONDe = [ 0.13861D-01 0.90541D-02 ]; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); ## discrete-time case D==0, direct access to sb10kd %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 0.3 0.0 -0.3 -0.1 %! -0.3 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -0.1 0.0 0.0 -0.3 %! 0.1 0.0 0.0 -0.1 -0.1 0.0 %! 0.0 0.3 0.6 0.2 0.1 -0.4 %! 0.2 -0.4 0.0 0.0 0.2 -0.2 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 ]; %! %! FACTOR = 1.1; %! %! [AK, BK, CK, DK, RCOND] = __sl_sb10kd__ (A, B, C, FACTOR); %! %! AKe = [ 0.0337 0.0222 0.0858 0.1264 -0.1872 0.1547 %! 0.4457 0.0668 -0.2255 -0.3204 -0.4548 -0.0691 %! -0.2419 -0.2506 -0.0982 -0.1321 -0.0130 -0.0838 %! -0.4402 0.3654 -0.0335 -0.2444 0.6366 -0.6469 %! -0.3623 0.3854 0.4162 0.4502 0.0065 0.1261 %! -0.0121 -0.4377 0.0604 0.2265 -0.3389 0.4542 ]; %! %! BKe = [ 0.0931 -0.0269 %! -0.0872 0.1599 %! 0.0956 -0.1469 %! -0.1728 0.0129 %! 0.2022 -0.1154 %! 0.2419 -0.1737 ]; %! %! CKe = [ -0.3677 0.2188 0.0403 -0.0854 0.3564 -0.3535 %! 0.1624 -0.0708 0.0058 0.0606 -0.2163 0.1802 ]; %! %! DKe = [ -0.0857 -0.0246 %! 0.0460 0.0074 ]; %! %! RCONDe = [ 0.11269D-01 0.17596D-01 0.18225D+00 0.75968D-03 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); %!assert (RCOND, RCONDe, 1e-4); ## discrete-time case D==0 %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 0.3 0.0 -0.3 -0.1 %! -0.3 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -0.1 0.0 0.0 -0.3 %! 0.1 0.0 0.0 -0.1 -0.1 0.0 %! 0.0 0.3 0.6 0.2 0.1 -0.4 %! 0.2 -0.4 0.0 0.0 0.2 -0.2 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 ]; %! %! FACTOR = 1.1; %! %! G = ss (A, B, C, [], 1); # value of sampling time doesn't matter %! K = ncfsyn (G, [], [], FACTOR); %! [AK, BK, CK, DK] = ssdata (K); %! %! AKe = [ 0.0337 0.0222 0.0858 0.1264 -0.1872 0.1547 %! 0.4457 0.0668 -0.2255 -0.3204 -0.4548 -0.0691 %! -0.2419 -0.2506 -0.0982 -0.1321 -0.0130 -0.0838 %! -0.4402 0.3654 -0.0335 -0.2444 0.6366 -0.6469 %! -0.3623 0.3854 0.4162 0.4502 0.0065 0.1261 %! -0.0121 -0.4377 0.0604 0.2265 -0.3389 0.4542 ]; %! %! BKe = [ 0.0931 -0.0269 %! -0.0872 0.1599 %! 0.0956 -0.1469 %! -0.1728 0.0129 %! 0.2022 -0.1154 %! 0.2419 -0.1737 ]; %! %! CKe = [ -0.3677 0.2188 0.0403 -0.0854 0.3564 -0.3535 %! 0.1624 -0.0708 0.0058 0.0606 -0.2163 0.1802 ]; %! %! DKe = [ -0.0857 -0.0246 %! 0.0460 0.0074 ]; %! %! RCONDe = [ 0.11269D-01 0.17596D-01 0.18225D+00 0.75968D-03 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); ## discrete-time case D!=0, direct access to sb10zd %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 3.0 0.0 -0.3 -0.1 %! -3.0 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -1.0 0.0 0.0 -3.0 %! 1.0 0.0 0.0 -1.0 -1.0 0.0 %! 0.0 0.3 0.6 2.0 0.1 -0.4 %! 0.2 -4.0 0.0 0.0 0.2 -2.0 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 %! 2.0 4.0 -3.0 0.0 5.0 1.0 ]; %! %! D = [ 10.0 -6.0 %! -7.0 8.0 %! 2.0 -4.0 ]; %! %! FACTOR = 1.1; %! %! [AK, BK, CK, DK, RCOND] = __sl_sb10zd__ (A, B, C, D, FACTOR, 0.0); %! %! AKe = [ 1.0128 0.5101 -0.1546 1.1300 3.3759 0.4911 %! -2.1257 -1.4517 -0.4486 0.3493 -1.5506 -1.4296 %! -1.0930 -0.6026 -0.1344 0.2253 -1.5625 -0.6762 %! 0.3207 0.1698 0.2376 -1.1781 -0.8705 0.2896 %! 0.5017 0.9006 0.0668 2.3613 0.2049 0.3703 %! 1.0787 0.6703 0.2783 -0.7213 0.4918 0.7435 ]; %! %! BKe = [ 0.4132 0.3112 -0.8077 %! 0.2140 0.4253 0.1811 %! -0.0710 0.0807 0.3558 %! -0.0121 -0.2019 0.0249 %! 0.1047 0.1399 -0.0457 %! -0.2542 -0.3472 0.0523 ]; %! %! CKe = [ -0.0372 -0.0456 -0.0040 0.0962 -0.2059 -0.0571 %! 0.1999 0.2994 0.1335 -0.0251 -0.3108 0.2048 ]; %! %! DKe = [ 0.0629 -0.0022 0.0363 %! -0.0228 0.0195 0.0600 ]; %! %! RCONDe = [ 0.27949D-03 0.66679D-03 0.45677D-01 0.23433D-07 0.68495D-01 0.76854D-01 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); %!assert (RCOND, RCONDe, 1e-4); ## discrete-time case D!=0 %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 3.0 0.0 -0.3 -0.1 %! -3.0 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -1.0 0.0 0.0 -3.0 %! 1.0 0.0 0.0 -1.0 -1.0 0.0 %! 0.0 0.3 0.6 2.0 0.1 -0.4 %! 0.2 -4.0 0.0 0.0 0.2 -2.0 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 %! 2.0 4.0 -3.0 0.0 5.0 1.0 ]; %! %! D = [ 10.0 -6.0 %! -7.0 8.0 %! 2.0 -4.0 ]; %! %! FACTOR = 1.1; %! %! G = ss (A, B, C, D, 1); # value of sampling time doesn't matter %! K = ncfsyn (G, [], [], FACTOR); %! [AK, BK, CK, DK] = ssdata (K); %! %! AKe = [ 1.0128 0.5101 -0.1546 1.1300 3.3759 0.4911 %! -2.1257 -1.4517 -0.4486 0.3493 -1.5506 -1.4296 %! -1.0930 -0.6026 -0.1344 0.2253 -1.5625 -0.6762 %! 0.3207 0.1698 0.2376 -1.1781 -0.8705 0.2896 %! 0.5017 0.9006 0.0668 2.3613 0.2049 0.3703 %! 1.0787 0.6703 0.2783 -0.7213 0.4918 0.7435 ]; %! %! BKe = [ 0.4132 0.3112 -0.8077 %! 0.2140 0.4253 0.1811 %! -0.0710 0.0807 0.3558 %! -0.0121 -0.2019 0.0249 %! 0.1047 0.1399 -0.0457 %! -0.2542 -0.3472 0.0523 ]; %! %! CKe = [ -0.0372 -0.0456 -0.0040 0.0962 -0.2059 -0.0571 %! 0.1999 0.2994 0.1335 -0.0251 -0.3108 0.2048 ]; %! %! DKe = [ 0.0629 -0.0022 0.0363 %! -0.0228 0.0195 0.0600 ]; %! %! RCONDe = [ 0.27949D-03 0.66679D-03 0.45677D-01 0.23433D-07 0.68495D-01 0.76854D-01 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); control/inst/nichols.m0000644000076500000240000000627312614620313014340 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} nichols (@var{sys}) ## @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} nichols (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}, @var{w}) ## Nichols chart of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Vector of magnitude. Has length of frequency vector @var{w}. ## @item pha ## Vector of phase. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bode, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 1.0 function [mag_r, pha_r, w_r] = nichols (varargin) if (nargin == 0) print_usage (); endif [H, w, sty, leg] = __frequency_response__ ("nichols", varargin, nargout); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); mag = cellfun (@abs, H, "uniformoutput", false); pha = cellfun (@(H) unwrap (arg (H)) * 180 / pi, H, "uniformoutput", false); if (! nargout) mag_db = cellfun (@mag2db, mag, "uniformoutput", false); plot_args = horzcat (cellfun (@horzcat, pha, mag_db, sty, "uniformoutput", false){:}); plot (plot_args{:}) axis ("tight") xlim (__axis_margin__ (xlim)) ylim (__axis_margin__ (ylim)) grid ("on") title ("Nichols Chart") xlabel ("Phase [deg]") ylabel ("Magnitude [dB]") legend (leg) else mag_r = mag{1}; pha_r = pha{1}; w_r = w{1}; endif endfunction control/inst/nyquist.m0000644000076500000240000000731112614620313014407 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} nyquist (@var{sys}) ## @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}) ## @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}, @var{w}) ## Nyquist diagram of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item re ## Vector of real parts. Has length of frequency vector @var{w}. ## @item im ## Vector of imaginary parts. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bode, nichols, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 1.0 function [re_r, im_r, w_r] = nyquist (varargin) if (nargin == 0) print_usage (); endif [H, w, sty, leg] = __frequency_response__ ("nyquist", varargin, nargout); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); re = cellfun (@real, H, "uniformoutput", false); im = cellfun (@imag, H, "uniformoutput", false); if (! nargout) len = numel (H); colororder = get (gca, "colororder"); rc = rows (colororder); def_pos = arrayfun (@(k) {"-", "color", colororder(1+rem (k-1, rc), :)}, 1:len, "uniformoutput", false); def_neg = arrayfun (@(k) {"-.", "color", colororder(1+rem (k-1, rc), :)}, 1:len, "uniformoutput", false); idx = cellfun (@isempty, sty); sty_pos = sty_neg = sty; sty_pos(idx) = def_pos(idx); sty_neg(idx) = def_neg(idx); imn = cellfun (@uminus, im, "uniformoutput", false); pos_args = horzcat (cellfun (@horzcat, re, im, sty_pos, "uniformoutput", false){:}); neg_args = horzcat (cellfun (@horzcat, re, imn, sty_neg, "uniformoutput", false){:}); h = plot (pos_args{:}, neg_args{:}); axis ("tight") xlim (__axis_margin__ (xlim)) ylim (__axis_margin__ (ylim)) grid ("on") title ("Nyquist Diagram") xlabel ("Real Axis") ylabel ("Imaginary Axis") legend (h(1:len), leg) else re_r = re{1}; im_r = im{1}; w_r = w{1}; endif endfunction control/inst/obsv.m0000644000076500000240000000416712614620313013652 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## Copyright (C) 2009 Luca Favatella ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{ob} =} obsv (@var{sys}) ## @deftypefnx {Function File} {@var{ob} =} obsv (@var{a}, @var{c}) ## Return observability matrix. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item a ## State matrix (n-by-n). ## @item c ## Measurement matrix (p-by-n). ## @end table ## ## @strong{Outputs} ## @table @var ## @item ob ## Observability matrix. ## @end table ## ## @strong{Equation} ## @iftex ## @tex ## $$ O_b = \\left[ \\matrix{ C \\cr ## CA \\cr ## CA^2 \\cr ## \\vdots \\cr ## CA^{n-1} } \\right ] $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## @group ## | C | ## | CA | ## Ob = | CA^2 | ## | ... | ## | CA^(n-1) | ## @end group ## @end example ## @end ifnottex ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function ob = obsv (a, c) if (nargin == 1) # obsv (sys) ob = ctrb (a.').'; # transpose is overloaded for lti models elseif (nargin == 2) # obsv (a, c) ob = ctrb (a.', c.').'; # size checked inside else print_usage (); endif endfunction %!assert (obsv ([1, 0; 0, -0.5], [8, 8]), [8, 8; 8, -4]); control/inst/obsvf.m0000644000076500000240000000516312614620313014015 0ustar lukasstaff## Copyright (C) 2010 Benjamin Fernandez ## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}) ## @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}, @var{tol}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}, @var{TOL}) ## If Ob=obsv(A,C) has rank r <= n = SIZE(A,1), then there is a ## similarity transformation Tc such that To = [t1;t2] where t1 is c ## and t2 is orthogonal to t1 ## ## @example ## @group ## Abar = To \\ A * To , Bbar = To \\ B , Cbar = C * To ## @end group ## @end example ## ## and the transformed system has the form ## ## @example ## @group ## | Ao 0 | | Bo | ## Abar = |----------|, Bbar = | --- |, Cbar = [Co | 0 ]. ## | A21 Ano| | Bno | ## @end group ## @end example ## ## where (Ao,Bo) is observable, and Co(sI-Ao)^(-1)Bo = C(sI-A)^(-1)B. And ## system is detectable if Ano has no eigenvalues in the right ## half plane. The last output K is a vector of length n containing the ## number of observable states. ## @end deftypefn ## Author: Benjamin Fernandez ## Created: 2010-05-02 ## Version: 0.1 function [ac, bc, cc, z, ncont] = obsvf (a, b = [], c, tol = []) if (nargin < 1 || nargin > 4) print_usage (); endif if (isa (a, "lti")) if (nargin > 2) print_usage (); endif [ac, bc, cc] = ctrbf (a.', b); # [sysbar, z, ncont] = ctrbf (sys.', tol); ac = ac.'; z = ncont = []; else if (nargin < 3) print_usage (); endif [ac, tmp, cc, z, ncont] = ctrbf (a.', c.', b.', tol); ac = ac.'; bc = cc.'; cc = tmp.'; endif endfunction control/inst/options.m0000644000076500000240000000445512614620313014374 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{opt} =} options (@var{'key1'}, @var{value1}, @var{'key2'}, @var{value2}, @dots{}) ## Create options struct @var{opt} from a number of key and value pairs. ## For use with order reduction and system identification functions. ## Option structs are a way to avoid typing the same key and value pairs ## over and over again. ## ## @strong{Inputs} ## @table @var ## @item key, property ## The name of the property. ## @item value ## The value of the property. ## @end table ## ## @strong{Outputs} ## @table @var ## @item opt ## Struct with fields for each key. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> opt = options ("method", "spa", "tol", 1e-6) ## opt = ## ## scalar structure containing the fields: ## ## method = spa ## tol = 1.0000e-06 ## ## @end group ## @end example ## @example ## @group ## octave:2> save filename opt ## octave:3> # save the struct 'opt' to file 'filename' for later use ## octave:4> load filename ## octave:5> # load struct 'opt' from file 'filename' ## @end group ## @end example ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function opt = options (varargin) if (nargin == 0) print_usage (); endif if (rem (nargin, 2)) error ("options: properties and values must come in pairs"); endif ## alternative: opt = struct (varargin{:}); key = reshape (varargin(1:2:end-1), [], 1); val = reshape (varargin(2:2:end), [], 1); opt = cell2struct (val, key, 1); opt = orderfields (opt); endfunction control/inst/optiPID.m0000644000076500000240000001650512614620313014210 0ustar lukasstaff%% -*- texinfo -*- %% Numerical optimization of a PID controller using an objective function. %% The objective function is located in the file @command{optiPIDfun}. %% Type @code{which optiPID} to locate, @code{edit optiPID} to open %% and simply @code{optiPID} to run the example file. %% In this example called @code{optiPID}, loosely based on [1], it is assumed %% that the plant %% @iftex %% @tex %% $$ P(s) = {1 \\over (s^{2} + s + 1)\\ (s + 1)^{4}} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% 1 %% P(s) = ----------------------- %% (s^2 + s + 1) (s + 1)^4 %% @end example %% @end ifnottex %% is controlled by a PID controller with second-order roll-off %% @iftex %% @tex %% $$ C(s) = k_p \\ (1 + {1 \\over T_i \\ s} + T_d \\ s) \\ {1 \\over (\\tau \\ s + 1)^{2}} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% 1 1 %% C(s) = Kp (1 + ---- + Td s) ------------- %% Ti s (tau s + 1)^2 %% @end example %% @end ifnottex %% in the usual negative feedback structure %% @iftex %% @tex %% $$ T(s) = {L(s) \\over 1 + L(s)} = {P(s) \\ C(s) \\over 1 + P(s) \\ C(s)} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% L(s) P(s) C(s) %% T(s) = -------- = ------------- %% 1 + L(s) 1 + P(s) C(s) %% @end example %% @end ifnottex %% The plant P(s) is of higher order but benign. The initial values for the %% controller parameters %% @iftex %% @tex %% $k_p$, $T_i$ and $T_d$ %% @end tex %% @end iftex %% @ifnottex %% Kp, Ti and Td %% @end ifnottex %% are obtained by applying the %% Astroem and Haegglund rules [2]. These values are to be improved using a %% numerical optimization as shown below. %% As with all numerical methods, this approach can never guarantee that a %% proposed solution is a global minimum. Therefore, good initial guesses for %% the parameters to be optimized are very important. %% The Octave function @code{fminsearch} minimizes the objective function @var{J}, %% which is chosen to be %% @iftex %% @tex %% $$ J(k_p, T_i, T_d) = \\mu_1 \\cdot \\int_0^{\\infty} \\! t \\ |e(t)| \\ dt \\ + \\ \\mu_2 \\cdot (|| y(t) ||_{\\infty} - 1) \\ + \\ \\mu_3 \\cdot ||S(jw)||_{\\infty} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% inf %% J(Kp, Ti, Td) = mu1 INT t |e(t)| dt + mu2 (||y(t)|| - 1) + mu3 ||S(jw)|| %% 0 inf inf %% @end example %% @end ifnottex %% This particular objective function penalizes the integral of time-weighted absolute error %% @iftex %% @tex %% $$ ITAE = \\int_0^{\\infty} \\! t \\ |e(t)| \\ dt $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% inf %% ITAE = INT t |e(t)| dt %% 0 %% @end example %% @end ifnottex %% and the maximum overshoot %% @iftex %% @tex %% $$ y_{max} - 1 = || y(t) ||_{\\infty} - 1 $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% y - 1 = ||y(t)|| - 1 %% max inf %% @end example %% @end ifnottex %% to a unity reference step %% @iftex %% @tex %% $r(t) = \\varepsilon (t)$ %% @end tex %% @end iftex %% in the time domain. In the frequency domain, the sensitivity %% @iftex %% @tex %% $$ M_s = ||S(jw)||_{\\infty} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% Ms = ||S(jw)|| %% inf %% @end example %% @end ifnottex %% is minimized for good robustness, where S(jw) denotes the @emph{sensitivity} transfer function %% @iftex %% @tex %% $$ S(s) = {1 \\over 1 + L(s)} = {1 \\over 1 + P(s) \\ C(s)} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% 1 1 %% S(s) = -------- = ------------- %% 1 + L(s) 1 + P(s) C(s) %% @end example %% @end ifnottex %% The constants %% @iftex %% @tex %% $\\mu_1$, $\\mu_2$ and $\\mu_3$ %% @end tex %% @end iftex %% @ifnottex %% mu1, mu2 and mu3 %% @end ifnottex %% are @emph{relative weighting factors} or @guillemetleft{}tuning knobs@guillemetright{} %% which reflect the importance of the different design goals. Varying these factors %% corresponds to changing the emphasis from, say, high performance to good robustness. %% The main advantage of this approach is the possibility to explore the tradeoffs of %% the design problem in a systematic way. %% In a first approach, all three design objectives are weigthed equally. %% In subsequent iterations, the parameters %% @iftex %% @tex %% $\\mu_1 = 1$, $\\mu_2 = 10$ and $\\mu_3 = 20$ %% @end tex %% @end iftex %% @ifnottex %% mu1 = 1, mu2 = 10 and mu3 = 20 %% @end ifnottex %% are found to yield satisfactory closed-loop performance. This controller results %% in a system with virtually no overshoot and a phase margin of 64 degrees. %% %% @*@strong{References}@* %% [1] Guzzella, L. %% @cite{Analysis and Design of SISO Control Systems}, %% VDF Hochschulverlag, ETH Zurich, 2007@* %% [2] Astroem, K. and Haegglund, T. %% @cite{PID Controllers: Theory, Design and Tuning}, %% Second Edition, %% Instrument Society of America, 1995 % =============================================================================== % optiPID Lukas Reichlin July 2009 % =============================================================================== % Numerical Optimization of an A/H PID Controller % Required OCTAVE Packages: control % Required MATLAB Toolboxes: Control, Optimization % =============================================================================== % Tabula Rasa clear all, close all, clc; % Global Variables global P t dt mu_1 mu_2 mu_3 % Plant numP = [1]; denP = conv ([1, 1, 1], [1, 4, 6, 4, 1]); P = tf (numP, denP); % Relative Weighting Factors: PLAY AROUND WITH THESE! mu_1 = 1; % Minimize ITAE Criterion mu_2 = 10; % Minimize Max Overshoot mu_3 = 20; % Minimize Sensitivity Ms % Simulation Settings: PLANT-DEPENDENT! t_sim = 30; % Simulation Time [s] dt = 0.05; % Sampling Time [s] t = 0 : dt : t_sim; % Time Vector [s] % A/H PID Controller: Ms = 2.0 [gamma, phi, w_gamma, w_phi] = margin (P); ku = gamma; Tu = 2*pi / w_gamma; kappa = inv (dcgain (P)); disp ('optiPID: Astrom/Hagglund PID controller parameters:'); kp_AH = ku * 0.72 * exp ( -1.60 * kappa + 1.20 * kappa^2 ) Ti_AH = Tu * 0.59 * exp ( -1.30 * kappa + 0.38 * kappa^2 ) Td_AH = Tu * 0.15 * exp ( -1.40 * kappa + 0.56 * kappa^2 ) C_AH = optiPIDctrl (kp_AH, Ti_AH, Td_AH); % Initial Values C_par_0 = [kp_AH; Ti_AH; Td_AH]; % Optimization warning ('optiPID: optimization starts, please be patient ...'); C_par_opt = fminsearch (@optiPIDfun, C_par_0); % Optimized Controller disp ('optiPID: optimized PID controller parameters:'); kp_opt = C_par_opt(1) Ti_opt = C_par_opt(2) Td_opt = C_par_opt(3) C_opt = optiPIDctrl (kp_opt, Ti_opt, Td_opt); % Open Loop L_AH = P * C_AH; L_opt = P * C_opt; % Closed Loop T_AH = feedback (L_AH, 1); T_opt = feedback (L_opt, 1); % A Posteriori Stability Check disp ('optiPID: closed-loop stability check:'); st_AH = isstable (T_AH) st_opt = isstable (T_opt) % Stability Margins disp ('optiPID: gain margin gamma [-] and phase margin phi [deg]:'); [gamma_AH, phi_AH] = margin (L_AH) [gamma_opt, phi_opt] = margin (L_opt) % Plot Step Response figure (1) step (T_AH, 'b', T_opt, 'r', t) legend ('Astroem/Haegglund PID', 'Optimized PID', 'Location', 'SouthEast') % =============================================================================== control/inst/optiPIDctrl.m0000644000076500000240000000122212614620313015063 0ustar lukasstaff% =============================================================================== % optiPIDctrl Lukas Reichlin February 2012 % =============================================================================== % Return PID controller with roll-off for given parameters Kp, Ti and Td. % =============================================================================== function C = optiPIDctrl (Kp, Ti, Td) tau = Td / 10; % roll-off num = Kp * [Ti*Td, Ti, 1]; den = conv ([Ti, 0], [tau^2, 2*tau, 1]); C = tf (num, den); end % =============================================================================== control/inst/optiPIDfun.m0000644000076500000240000000310312614620313014707 0ustar lukasstaff% =============================================================================== % optiPIDfun Lukas Reichlin July 2009 % =============================================================================== % Objective Function % Reference: Guzzella, L. (2007) Analysis and Synthesis of SISO Control Systems. % vdf Hochschulverlag, Zurich % =============================================================================== function J = optiPIDfun (C_par) % Global Variables global P t dt mu_1 mu_2 mu_3 % Function Argument -> Controller Parameters kp = C_par(1); Ti = C_par(2); Td = C_par(3); % PID Controller with Roll-Off C = optiPIDctrl (kp, Ti, Td); % Open Loop L = P * C; % Sum Block: e = r - y SUM = ss ([1, -1]); % Matlab converts to SS (and back) for MIMO TF connections % Group Sum Block and Open Loop SUML = append (SUM, L); % Build System Interconnections CM = [3, 1; % Controller Input with Sum Block Output 2, 2]; % Sum Block Negative Input with Plant Output inputs = [1]; % Input 1: reference r(t) outputs = [1, 2]; % Output 1: error e(t), Output 2: output y(t) SUML = connect (SUML, CM, inputs, outputs); % Simulation [y, t_y] = step (SUML, t); % ITAE Criterion itae = dt * (t_y.' * abs (y(:, 1))); % Sensitivity S = inv (1 + L); Ms = norm (S, inf); % Objective Function J = mu_1 * itae + mu_2 * (max (y(:, 2)) - 1) + mu_3 * Ms; end % function % =============================================================================== control/inst/pid.m0000644000076500000240000000366412614620313013456 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{C} =} pid (@var{Kp}) ## @deftypefnx{Function File} {@var{C} =} pid (@var{Kp}, @var{Ki}) ## @deftypefnx{Function File} {@var{C} =} pid (@var{Kp}, @var{Ki}, @var{Kd}) ## @deftypefnx{Function File} {@var{C} =} pid (@var{Kp}, @var{Ki}, @var{Kd}, @var{Tf}) ## Return the transfer function @var{C} of the @acronym{PID} controller ## in parallel form with first-order roll-off. ## ## @example ## @group ## Ki Kd s ## C(s) = Kp + ---- + -------- ## s Tf s + 1 ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: June 2015 ## Version: 0.1 ## TODO: discrete-time case, dozens of options, ... ## If you wish to kill time with this repetitive task, ## I'm happy to add your work :-) function C = pid (Kp = 1, Ki = 0, Kd = 0, Tf = 0) if (! is_real_scalar (Kp, Ki, Kd, Tf) || nargin > 4) print_usage (); endif if (Kd == 0) # catch cases like pid (2, 0, 0, 3) Tf = 0; endif if (Ki == 0) # minimal realization if num(3) == 0 and den(3) == 0 C = tf ([Kp*Tf+Kd, Kp], [Tf, 1]); else C = tf ([Kp*Tf+Kd, Kp+Ki*Tf, Ki], [Tf, 1, 0]); endif endfunction control/inst/pidstd.m0000644000076500000240000000470712614620313014170 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{C} =} pidstd (@var{Kp}) ## @deftypefnx{Function File} {@var{C} =} pidstd (@var{Kp}, @var{Ti}) ## @deftypefnx{Function File} {@var{C} =} pidstd (@var{Kp}, @var{Ti}, @var{Td}) ## @deftypefnx{Function File} {@var{C} =} pidstd (@var{Kp}, @var{Ti}, @var{Td}, @var{N}) ## Return the transfer function @var{C} of the @acronym{PID} controller ## in standard form with first-order roll-off. ## ## @example ## @group ## 1 Td s ## C(s) = Kp (1 + ---- + ----------) ## Ti s Td/N s + 1 ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2015 ## Version: 0.1 ## TODO: discrete-time case, dozens of options, ... ## NOTE: I don't see any need to implement 'pid' and 'pidstd' ## as LTI classes like the 'dark side' does. ## Returning a transfer function seems to be sufficient. ## These functions' sole purpose is to help novice users ## running their scripts with as little changes as possible. function C = pidstd (Kp = 1, Ti = inf, Td = 0, N = inf) if (! is_real_scalar (Kp, Ti, Td, N) || nargin > 4) print_usage (); endif if (Kp == 0) # pidstd (0) C = tf (0); elseif (Ti == inf && N == inf) # pidstd (Kp, inf, Td) C = tf (Kp*[Td, 1], [1]); elseif (Ti == inf) # pidstd (Kp, inf, Td, N) C = tf (Kp*[N*Td+Td, N], [Td, N]); elseif (N == inf) # pidstd (Kp, Ti, Td), pidstd (Kp, Ti) C = tf (Kp*[Td*Ti, Ti, 1], [Ti, 0]); else # pidstd (Kp, Ti, Td, N) C = tf (Kp*[N*Td*Ti+Td*Ti, N*Ti+Td, N], [Td*Ti, N*Ti, 0]); endif endfunction control/inst/place.m0000644000076500000240000001406612614620313013764 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{f} =} place (@var{sys}, @var{p}) ## @deftypefnx {Function File} {@var{f} =} place (@var{a}, @var{b}, @var{p}) ## @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{sys}, @var{p}, @var{alpha}) ## @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{a}, @var{b}, @var{p}, @var{alpha}) ## Pole assignment for a given matrix pair (@var{A},@var{B}) such that @code{p = eig (A-B*F)}. ## If parameter @var{alpha} is specified, poles with real parts (continuous-time) ## or moduli (discrete-time) below @var{alpha} are left untouched. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous- or discrete-time @acronym{LTI} system. ## @item a ## State matrix (n-by-n) of a continuous-time system. ## @item b ## Input matrix (n-by-m) of a continuous-time system. ## @item p ## Desired eigenvalues of the closed-loop system state-matrix @var{A-B*F}. ## @code{length (p) <= rows (A)}. ## @item alpha ## Specifies the maximum admissible value, either for real ## parts or for moduli, of the eigenvalues of @var{A} which will ## not be modified by the eigenvalue assignment algorithm. ## @code{alpha >= 0} for discrete-time systems. ## @end table ## ## @strong{Outputs} ## @table @var ## @item f ## State feedback gain matrix. ## @item info ## Structure containing additional information. ## @item info.nfp ## The number of fixed poles, i.e. eigenvalues of @var{A} having ## real parts less than @var{alpha}, or moduli less than @var{alpha}. ## These eigenvalues are not modified by @command{place}. ## @item info.nap ## The number of assigned eigenvalues. @code{nap = n-nfp-nup}. ## @item info.nup ## The number of uncontrollable eigenvalues detected by the ## eigenvalue assignment algorithm. ## @item info.z ## The orthogonal matrix @var{z} reduces the closed-loop ## system state matrix @code{A + B*F} to upper real Schur form. ## Note the positive sign in @code{A + B*F}. ## @end table ## ## @strong{Note} ## @example ## Place is also suitable to design estimator gains: ## @group ## L = place (A.', C.', p).' ## L = place (sys.', p).' # useful for discrete-time systems ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB01BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Special thanks to Peter Benner from TU Chemnitz for his advice. ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.5 function [f, info] = place (a, b, p = [], alpha = [], tol = []) if (nargin < 2 || nargin > 5) print_usage (); endif if (isa (a, "lti")) # place (sys, p), place (sys, p, alpha), place (sys, p, alpha, tol) if (nargin > 4) # nargin < 2 already tested print_usage (); endif tol = alpha; alpha = p; p = b; sys = a; [a, b] = ssdata (sys); # descriptor matrice e should be regular discrete = ! isct (sys); # treat tsam = -2 as continuous system else # place (a, b, p), place (a, b, p, alpha), place (a, b, p, alpha, tol) if (nargin < 3) # nargin > 5 already tested print_usage (); endif if (! is_real_square_matrix (a) || ! is_real_matrix (b) || rows (a) != rows (b)) error ("place: matrices a and b not conformal"); endif discrete = 0; # assume continuous system endif if (! isnumeric (p) || ! isvector (p) || isempty (p)) # p could be complex error ("place: p must be a vector"); endif p = sort (reshape (p, [], 1)); # complex conjugate pairs must appear together wr = real (p); wi = imag (p); n = rows (a); # number of states np = length (p); # number of given eigenvalues if (np > n) error ("place: at most %d eigenvalues can be assigned for the given matrix a (%dx%d)", n, n, n); endif if (isempty (alpha)) if (discrete) alpha = 0; else alpha = - norm (a, inf); endif endif if (isempty (tol)) tol = 0; endif [f, nfp, nap, nup, z] = __sl_sb01bd__ (a, b, wr, wi, discrete, alpha, tol); f = -f; # A + B*F --> A - B*F info = struct ("nfp", nfp, "nap", nap, "nup", nup, "z", z); endfunction ## Test from "legacy" control package 1.0.* %!shared A, B, C, P, Kexpected %! A = [0, 1; 3, 2]; %! B = [0; 1]; %! C = [2, 1]; # C is needed for ss; it doesn't matter what the value of C is %! P = [-1, -0.5]; %! Kexpected = [3.5, 3.5]; %!assert (place (ss (A, B, C), P), Kexpected, 2*eps); %!assert (place (A, B, P), Kexpected, 2*eps); ## FIXME: Test from SLICOT example SB01BD fails with 4 eigenvalues in P %!shared F, F_exp, ev_ol, ev_cl %! A = [-6.8000 0.0000 -207.0000 0.0000 %! 1.0000 0.0000 0.0000 0.0000 %! 43.2000 0.0000 0.0000 -4.2000 %! 0.0000 0.0000 1.0000 0.0000]; %! %! B = [ 5.6400 0.0000 %! 0.0000 0.0000 %! 0.0000 1.1800 %! 0.0000 0.0000]; %! %! P = [-0.5000 + 0.1500i %! -0.5000 - 0.1500i]; #%! -2.0000 + 0.0000i #%! -0.4000 + 0.0000i]; %! %! ALPHA = -0.4; %! TOL = 1e-8; %! %! F = place (A, B, P, ALPHA, TOL); %! %! F_exp = - [-0.0876 -4.2138 0.0837 -18.1412 %! -0.0233 18.2483 -0.4259 -4.8120]; %! %! ev_ol = sort (eig (A)); %! ev_cl = sort (eig (A - B*F)); %! %!assert (F, F_exp, 1e-4); %!assert (ev_ol(3:4), ev_cl(3:4), 1e-4); control/inst/pzmap.m0000644000076500000240000001030212614620313014014 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} pzmap (@var{sys}) ## @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{p}, @var{z}] =} pzmap (@var{sys}) ## Plot the poles and zeros of an LTI system in the complex plane. ## If no output arguments are given, the result is plotted on the screen. ## Otherwise, the poles and zeros are computed and returned. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item p ## Poles of @var{sys}. ## @item z ## Invariant zeros of @var{sys}. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function [pol_r, zer_r] = pzmap (varargin) if (nargin == 0) print_usage (); endif sys_idx = cellfun (@isa, varargin, {"lti"}); # look for LTI models sty_idx = cellfun (@ischar, varargin); # look for strings (plot styles) inv_idx = ! (sys_idx | sty_idx); # invalid arguments if (any (inv_idx)) warning ("pzmap: arguments number %s are invalid and are being ignored", ... mat2str (find (inv_idx)(:).')); endif if (nnz (sys_idx) == 0) error ("pzmap: require at least one LTI model"); endif if (nargout > 0 && (nnz (sys_idx) > 1 || any (sty_idx))) print_usage (); endif if (any (find (sty_idx) < find (sys_idx)(1))) warning ("pzmap: strings in front of first LTI model are being ignored"); endif pol = cellfun (@pole, varargin(sys_idx), "uniformoutput", false); zer = cellfun (@zero, varargin(sys_idx), "uniformoutput", false); if (! nargout) pol_re = cellfun (@real, pol, "uniformoutput", false); pol_im = cellfun (@imag, pol, "uniformoutput", false); zer_re = cellfun (@real, zer, "uniformoutput", false); zer_im = cellfun (@imag, zer, "uniformoutput", false); ## extract plotting styles tmp = cumsum (sys_idx); tmp(sys_idx | ! sty_idx) = 0; n = nnz (sys_idx); sty = arrayfun (@(x) varargin(tmp == x), 1:n, "uniformoutput", false); colororder = get (gca, "colororder"); rc = rows (colororder); def_pol = arrayfun (@(k) {"x", "color", colororder(1+rem (k-1, rc), :)}, 1:n, "uniformoutput", false); def_zer = arrayfun (@(k) {"o", "color", colororder(1+rem (k-1, rc), :)}, 1:n, "uniformoutput", false); idx = cellfun (@isempty, sty); sty_pol = sty_zer = sty; sty_pol(idx) = def_pol(idx); sty_zer(idx) = def_zer(idx); pol_args = horzcat (cellfun (@horzcat, pol_re, pol_im, sty_pol, "uniformoutput", false){:}); zer_args = horzcat (cellfun (@horzcat, zer_re, zer_im, sty_zer, "uniformoutput", false){:}); leg_args = cell (1, n); idx = find (sys_idx); for k = 1 : n try leg_args{k} = inputname (idx(k)); catch leg_args{k} = ""; # needed for pzmap (lticell{:}) end_try_catch endfor ## FIXME: try to combine "x", "o" and style for custom colors h = plot (pol_args{:}, zer_args{:}); grid ("on") title ("Pole-Zero Map") xlabel ("Real Axis") ylabel ("Imaginary Axis") legend (h(1:n), leg_args) else pol_r = pol{1}; zer_r = zer{1}; endif endfunction control/inst/ramp.m0000644000076500000240000000634612614620313013641 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} ramp (@var{sys}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{t}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}, @var{dt}) ## Ramp response of @acronym{LTI} system. ## If no output arguments are given, the response is printed on the screen. ## @iftex ## @tex ## $$ r(t) = t \\, \\cdot \\, h(t) $$ ## @end tex ## @end iftex ## @ifnottex ## ## @example ## r(t) = t * h(t) ## @end example ## ## @end ifnottex ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item t ## Time vector. Should be evenly spaced. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{impulse, initial, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2012 ## Version: 1.0 function [y_r, t_r, x_r] = ramp (varargin) if (nargin == 0) print_usage (); endif [y, t, x] = __time_response__ ("ramp", varargin, nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction control/inst/repsys.m0000644000076500000240000000275712614620313014231 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{rsys} =} repsys (@var{sys}, @var{m}, @var{n}) ## @deftypefnx {Function File} {@var{rsys} =} repsys (@var{sys}, [@var{m}, @var{n}]) ## @deftypefnx {Function File} {@var{rsys} =} repsys (@var{sys}, @var{m}) ## Form a block transfer matrix of @var{sys} with @var{m} copies vertically ## and @var{n} copies horizontally. If @var{n} is not specified, it is set to @var{m}. ## @code{repsys (sys, 2, 3)} is equivalent to @code{[sys, sys, sys; sys, sys, sys]}. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2014 ## Version: 0.1 function sys = repsys (varargin) if (nargin == 0) print_usage (); endif sys = repmat (varargin{:}); # repmat is overloaded for LTI systems endfunction control/inst/rlocus.m0000644000076500000240000002456312614620313014212 0ustar lukasstaff## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {} rlocus (@var{sys}) ## @deftypefnx {Function File} {[@var{rldata}, @var{k}] =} rlocus (@var{sys}, @var{increment}, @var{min_k}, @var{max_k}) ## Display root locus plot of the specified @acronym{SISO} system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Must be a single-input and single-output (SISO) system. ## @item increment ## The increment used in computing gain values. ## @item min_k ## Minimum value of @var{k}. ## @item max_k ## Maximum value of @var{k}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item rldata ## Data points plotted: in column 1 real values, in column 2 the imaginary values. ## @item k ## Gains for real axis break points. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u + +---+ +------+ y ## ------>(+)----->| k |----->| SISO |-------+-------> ## ^ - +---+ +------+ | ## | | ## +---------------------------------+ ## @end group ## @end example ## @end deftypefn ## Author: David Clem ## Author: R. Bruce Tenison ## Updated by Kristi McGowan July 1996 for intelligent gain selection ## Updated by John Ingram July 1996 for systems ## Adapted-By: Lukas Reichlin ## Date: December 2009 ## Version: 0.6 function [rldata_r, k_break, rlpol, gvec, real_ax_pts] = rlocus (sys, increment, min_k, max_k) ## TODO: improve compatibility to the "dark side" ## TODO: untangle spaghetti code ## TODO: multiplot feature: rlocus (sys1, "b", sys2, "r", ...) if (nargin < 1 || nargin > 4) print_usage (); endif if (! isa (sys, "lti") || ! issiso (sys)) error ("rlocus: first argument must be a SISO LTI model"); endif ## Convert the input to a transfer function if necessary [num, den] = tfdata (sys, "vector"); # extract numerator/denominator polynomials lnum = length (num); lden = length (den); ## equalize length of num, den polynomials ## TODO: handle case lnum > lden (non-proper models) if (lden < 2) error ("rlocus: system has no poles"); elseif (lnum < lden) num = [zeros(1,lden-lnum), num]; # so that derivative is shortened by one endif olpol = roots (den); olzer = roots (num); nas = lden - lnum; # number of asymptotes maxk = 0; if (nas > 0) cas = (sum (olpol) - sum (olzer)) / nas; angles = (2*[1:nas]-1)*pi/nas; ## printf("rlocus: there are %d asymptotes centered at %f\n", nas, cas); else cas = angles = []; maxk = 100*den(1)/num(1); endif ## compute real axis break points and corresponding gains dnum = polyder (num); dden = polyder (den); brkp = conv (den, dnum) - conv (num, dden); real_ax_pts = roots (brkp); real_ax_pts = real_ax_pts(find (imag (real_ax_pts) == 0)); real_ax_pts(polyval (num, real_ax_pts) == 0) = []; # avoid division by zero and therefore infinite k_break k_break = -polyval (den, real_ax_pts) ./ polyval (num, real_ax_pts); idx = find (k_break >= 0); k_break = k_break(idx); real_ax_pts = real_ax_pts(idx); if (! isempty (k_break)) maxk = max (max (k_break), maxk); endif if (nas == 0) maxk = max (1, 2*maxk); # get at least some root locus else ## get distance from breakpoints, poles, and zeros to center of asymptotes dmax = 3*max (abs ([vec(olzer); vec(olpol); vec(real_ax_pts)] - cas)); if (dmax == 0) dmax = 1; endif ## get gain for dmax along each asymptote, adjust maxk if necessary svals = cas + dmax * exp (j*angles); kvals = -polyval (den, svals) ./ polyval (num, svals); maxk = max (maxk, max (real (kvals))); endif ## check for input arguments: if (nargin > 2) mink = min_k; else mink = 0; endif if (nargin > 3) maxk = max_k; endif if (nargin > 1) if (increment <= 0) error ("rlocus: increment must be positive"); else ngain = fix ((maxk-mink)/increment); endif else ngain = 30; endif ## vector of gains ngain = max (30, ngain); gvec = linspace (mink, maxk, ngain); if (length (k_break)) gvec = sort ([gvec, reshape(k_break, 1, [])]); endif ## Find the open loop zeros and the initial poles rlzer = roots (num); ## update num to be the same length as den lnum = length (num); if (lnum < lden) num = [zeros(1,lden - lnum),num]; endif ## compute preliminary pole sets nroots = lden - 1; for ii = 1:ngain gain = gvec(ii); rlpol(1:nroots,ii) = vec(sort_complex_roots (roots (den + gain*num))); endfor ## set smoothing tolerance smtolx = 0.01*(max (max (real (rlpol))) - min (min (real (rlpol)))); smtoly = 0.01*(max (max (imag (rlpol))) - min (min (imag (rlpol)))); smtol = max (smtolx, smtoly); ## sort according to nearest-neighbor rlpol = sort_roots (rlpol, smtolx, smtoly); done = (nargin == 4); # perform a smoothness check while (! done && ngain < 1000) done = 1 ; # assume done dp = abs (diff (rlpol.')).'; maxdp = max (dp); ## search for poles whose neighbors are distant if (lden == 2) idx = find (dp > smtol); else idx = find (maxdp > smtol); endif for ii = 1:length(idx) i1 = idx(ii); g1 = gvec(i1); p1 = rlpol(:,i1); i2 = idx(ii)+1; g2 = gvec(i2); p2 = rlpol(:,i2); ## isolate poles in p1, p2 if (max (abs (p2-p1)) > smtol) newg = linspace (g1, g2, 5); newg = newg(2:4); gvec = [gvec,newg]; done = 0; # need to process new gains endif endfor ## process new gain values ngain1 = length (gvec); for ii = (ngain+1):ngain1 gain = gvec(ii); rlpol(1:nroots,ii) = vec(sort_complex_roots (roots (den + gain*num))); endfor [gvec, idx] = sort (gvec); rlpol = rlpol(:,idx); ngain = length (gvec); ## sort according to nearest-neighbor rlpol = sort_roots (rlpol, smtolx, smtoly); endwhile rldata = rlpol; ## Plot the data if (nargout == 0) rlpolv = vec(rlpol); axdata = [real(rlpolv), imag(rlpolv); real(olzer), imag(olzer)]; axlim = __axis_limits__ (axdata); rldata = [real(rlpolv), imag(rlpolv) ]; %inname = get (sys, "inname"); %outname = get (sys, "outname"); ## build plot command args pole by pole n_rlpol = rows (rlpol); nelts = n_rlpol+1; if (! isempty (rlzer)) nelts++; endif ## add asymptotes n_A = length (olpol) - length (olzer); if (n_A > 0) nelts += n_A; endif args = cell (3, nelts); kk = 0; ## asymptotes first if (n_A > 0) len_A = 2*max (abs (axlim)); sigma_A = (sum(olpol) - sum(olzer))/n_A; for i_A=0:n_A-1 phi_A = pi*(2*i_A + 1)/n_A; args{1,++kk} = [sigma_A sigma_A+len_A*cos(phi_A)]; args{2,kk} = [0 len_A*sin(phi_A)]; if (i_A == 1) args{3,kk} = "k--;asymptotes;"; else args{3,kk} = "k--"; endif endfor endif ## locus next for ii = 1:rows(rlpol) args{1,++kk} = real (rlpol (ii,:)); args{2,kk} = imag (rlpol (ii,:)); if (ii == 1) args{3,kk} = "b-;locus;"; else args{3,kk} = "b-"; endif endfor ## poles and zeros last args{1,++kk} = real (olpol); args{2,kk} = imag (olpol); args{3,kk} = "rx;open loop poles;"; if (! isempty (rlzer)) args{1,++kk} = real (rlzer); args{2,kk} = imag (rlzer); args{3,kk} = "go;zeros;"; endif hplt = plot (args{:}); # yes, line 288 is a duplicate of line 290 - needed for subplots set (gcf,"visible","off"); hplt = plot (args{:}); set (hplt(kk--), "markersize", 2); if (! isempty (rlzer)) set (hplt(kk--), "markersize", 2); endif for ii = 1:rows(rlpol) set (hplt(kk--), "linewidth", 2); endfor legend ("boxon", 2); grid ("on"); axis (axlim); title (["Root Locus of ", inputname(1)]); xlabel (sprintf ("Real Axis gain = [%g, %g]", gvec(1), gvec(ngain))); ylabel ("Imaginary Axis"); set (gcf (), "visible", "on"); else rldata_r = rldata; endif endfunction function rlpol = sort_roots (rlpol, tolx, toly) ## no point sorting of you've only got one pole! if (rows (rlpol) == 1) return; endif ## reorder entries in each column of rlpol to be by their nearest-neighbors rlpol dp = diff (rlpol.').'; drp = max (real (dp)); dip = max (imag (dp)); idx = find (drp > tolx | dip > toly); if (isempty (idx)) return; endif [np, ng] = size (rlpol); # num poles, num gains for jj = idx vals = rlpol(:,[jj,jj+1]); jdx = (jj+1):ng; for ii = 1:rows(rlpol-1) rdx = ii:np; dval = abs (rlpol(rdx,jj+1)-rlpol(ii,jj)); mindist = min (dval); sidx = min (find (dval == mindist)) + ii - 1; if (sidx != ii) c1 = norm (diff(vals.')); [vals(ii,2), vals(sidx,2)] = swap (vals(ii,2), vals(sidx,2)); c2 = norm (diff (vals.')); if (c1 > c2) ## perform the swap [rlpol(ii,jdx), rlpol(sidx,jdx)] = swap (rlpol(ii,jdx), rlpol(sidx,jdx)); vals = rlpol(:,[jj,jj+1]); endif endif endfor endfor endfunction function [b, a] = swap (a, b) endfunction function c = sort_complex_roots (c) ## This function sorts complex numbers such that ## 1) All the pure reals come first and are sorted. ## 2) All complex numbers are sorted by the regular sort. c = vec (c); idx = (imag (c) == 0); cre = sort (c(idx)); cim = sort (c(! idx)); c = vertcat (cre, cim); endfunction control/inst/sensitivity.m0000644000076500000240000001074012614620313015265 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{L}) ## @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C}) ## @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C1}, @var{C2}, @dots{}) ## Return sensitivity margin @var{Ms}. ## The quantity @var{Ms} is simply the inverse of the shortest ## distance from the Nyquist curve to the critical point -1. ## Reasonable values of @var{Ms} are in the range from 1.3 to 2. ## @iftex ## @tex ## $$ M_s = ||S(j\\omega)||_{\\infty} $$ ## @end tex ## @end iftex ## @ifnottex ## ## @example ## Ms = ||S(jw)|| ## inf ## @end example ## ## @end ifnottex ## If no output arguments are given, the critical distance 1/Ms ## is plotted on a Nyquist diagram. ## In contrast to gain and phase margin as computed by function ## @command{margin}, the sensitivity @var{Ms} is a more robust ## criterion to assess the stability of a feedback system. ## ## @strong{Inputs} ## @table @var ## @item L ## Open loop transfer function. ## @var{L} can be any type of @acronym{LTI} system, but it must be square. ## @item P ## Plant model. Any type of @acronym{LTI} system. ## @item C ## Controller model. Any type of @acronym{LTI} system. ## @item C1, C2, @dots{} ## If several controllers are specified, function @command{sensitivity} ## computes the sensitivity @var{Ms} for each of them in combination ## with plant @var{P}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Ms ## Sensitivity margin @var{Ms} as defined in [1]. ## Scalar value. ## If several controllers are specified, @var{Ms} becomes ## a row vector with as many entries as controllers. ## @item ws ## The frequency [rad/s] corresponding to the sensitivity peak. ## Scalar value. ## If several controllers are specified, @var{ws} becomes ## a row vector with as many entries as controllers. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB13DD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## to calculate the infinity norm of the sensitivity function. ## ## @strong{References}@* ## [1] Astr@"om, K. and H@"agglund, T. (1995) ## PID Controllers: ## Theory, Design and Tuning, ## Second Edition. ## Instrument Society of America. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: August 2012 ## Version: 0.2 function [ret, ws] = sensitivity (G, varargin) if (nargin == 0) print_usage (); elseif (nargin == 1) # L := G L = G; I = eye (size (L)); S = feedback (I, L); # S = inv (I + L), S = feedback (I, L*-I, "+") [Ms, ws] = norm (S, inf); else # P := G, C := varargin L = cellfun (@(C) G*C, varargin, "uniformoutput", false); I = cellfun (@(L) eye (size (L)), L, "uniformoutput", false); S = cellfun (@feedback, I, L, "uniformoutput", false); [Ms, ws] = cellfun (@(S) norm (S, inf), S); endif if (nargout == 0) ## TODO: don't show entire Nyquist curve if critical distance becomes small on plot if (length (Ms) > 1) error ("sensitivity: plotting only works for a single controller"); endif if (! iscell (L)) L = {L}; endif if (! issiso (L{1})) error ("sensitivity: Nyquist plot requires SISO systems"); endif [H, w] = __frequency_response__ ("sensitivity", L); H = H{1}(:); re = real (H); im = imag (H); Hs = freqresp (L{1}, ws); res = real (Hs); ims = imag (Hs); plot (re, im, "b", [-1, res], [0, ims], "r") axis ("equal") xlim (__axis_margin__ (xlim)) ylim (__axis_margin__ (ylim)) grid ("on") title (sprintf ("Sensitivity Ms = %g (at %g rad/s)", Ms, ws)) xlabel ("Real Axis") ylabel ("Imaginary Axis") else ret = Ms; endif endfunction control/inst/sigma.m0000644000076500000240000001003312614620313013766 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} sigma (@var{sys}) ## @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} sigma (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}) ## Singular values of frequency response. If no output arguments are given, ## the singular value plot is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Multiple inputs and/or outputs (MIMO systems) make practical sense. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sv ## Array of singular values. For a system with m inputs and p outputs, the array sv ## has @code{min (m, p)} rows and as many columns as frequency points @code{length (w)}. ## The singular values at the frequency @code{w(k)} are given by @code{sv(:,k)}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bodemag, svd} ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2009 ## Version: 1.0 function [sv_r, w_r] = sigma (varargin) if (nargin == 0) print_usage (); endif [H, w, sty, leg] = __frequency_response__ ("sigma", varargin, nargout); sv = cellfun (@(H) cellfun (@svd, H, "uniformoutput", false), H, "uniformoutput", false); sv = cellfun (@(sv) horzcat (sv{:}), sv, "uniformoutput", false); if (! nargout) # plot the information ## convert to dB for plotting sv_db = cellfun (@mag2db, sv, "uniformoutput", false); len = numel (H); colororder = get (gca, "colororder"); rc = rows (colororder); def = arrayfun (@(k) {"-", "color", colororder(1+rem (k-1, rc), :)}, 1:len, "uniformoutput", false); idx = cellfun (@isempty, sty); sty(idx) = def(idx); plot_args = horzcat (cellfun (@horzcat, w, sv_db, sty, "uniformoutput", false){:}); ## adjust line colors in legend idx = horzcat (1, cellfun (@rows, sv_db)(1:end-1)); idx = cumsum (idx); ## plot results h = semilogx (plot_args{:}); axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") title ("Singular Values") xlabel ("Frequency [rad/s]") ylabel ("Singular Values [dB]") legend (h(idx), leg) else # return values sv_r = sv{1}; w_r = reshape (w{1}, [], 1); endif endfunction %!shared sv_exp, w_exp, sv_obs, w_obs %! A = [1, 2; 3, 4]; %! B = [5, 6; 7, 8]; %! C = [4, 3; 2, 1]; %! D = [8, 7; 6, 5]; %! w = [2, 3, 4]; %! sv_exp = [7.9176, 8.6275, 9.4393; %! 0.6985, 0.6086, 0.5195]; %! w_exp = [2; 3; 4]; %! [sv_obs, w_obs] = sigma (ss (A, B, C, D), w); %!assert (sv_obs, sv_exp, 1e-4); %!assert (w_obs, w_exp, 1e-4); control/inst/spaconred.m0000644000076500000240000001724312614620313014656 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) ## ## Controller reduction by frequency-weighted Singular Perturbation Approximation (SPA). ## Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced ## order controller @var{Kr} such that the closed-loop system is stable and closed-loop ## performance is retained. ## ## The algorithm tries to minimize the frequency-weighted error ## @iftex ## @tex ## $$ || V \\ (K - K_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||V (K-Kr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the plant. ## It has m inputs, p outputs and n states. ## @item K ## @acronym{LTI} model of the controller. ## It has p inputs, m outputs and nc states. ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @item info.ncs ## The order of the alpha-stable part of original controller @var{K}. ## @item info.hsvc ## The Hankel singular values of the alpha-stable part of @var{K}. ## The @var{ncs} Hankel singular values are ordered decreasingly. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsvc} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. Default method. ## @end table ## ## @item 'weight' ## Specifies the type of frequency-weighting as follows: ## @table @var ## @item 'none' ## No weightings are used (V = I, W = I). ## ## @item 'left', 'output' ## Use stability enforcing left (output) weighting ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = I $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = (I-G*K) *G , W = I ## @end example ## @end ifnottex ## ## @item 'right', 'input' ## Use stability enforcing right (input) weighting ## @iftex ## @tex ## $$ V = I, \\qquad W = (I - G K)^{-1} G $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = I , W = (I-G*K) *G ## @end example ## @end ifnottex ## ## @item 'both', 'performance' ## Use stability and performance enforcing weightings ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = (I - G K)^{-1} $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 -1 ## V = (I-G*K) *G , W = (I-G*K) ## @end example ## @end ifnottex ## Default value. ## @end table ## ## @item 'feedback' ## Specifies whether @var{K} is a positive or negative feedback controller: ## @table @var ## @item '+' ## Use positive feedback controller. Default value. ## @item '-' ## Use negative feedback controller. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{K.A}. For a continuous-time ## controller, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## controller, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time controllers and ## 1 for discrete-time controllers. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced controller. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ncs*eps*info.hsvc(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## controller. TOL2 <= TOL1. ## If not specified, ncs*eps*info.hsvc(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on @var{G} and @var{K} prior to order reduction. ## Default value is false if both @code{G.scaled == true, K.scaled == true} ## and true otherwise. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = spaconred (varargin) [Kr, info] = __conred_sb16ad__ ("spa", varargin{:}); endfunction ## TODO: add a test control/inst/spamodred.m0000644000076500000240000002035212614620313014651 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by frequency weighted Singular Perturbation Approximation (SPA). ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## SPA is an absolute error method which tries to minimize ## @iftex ## @tex ## $$ || G - G_r ||_{\\infty} = \\min $$ ## $$ || V \\ (G - G_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||G-Gr|| = min ## inf ## ## ||V (G-Gr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values of the @var{alpha}-stable part of ## the original system @var{G}, ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'left', 'output' ## @acronym{LTI} model of the left/output frequency weighting @var{V}. ## Default value is an identity matrix. ## ## @item 'right', 'input' ## @acronym{LTI} model of the right/input frequency weighting @var{W}. ## Default value is an identity matrix. ## ## @item 'method' ## Approximation method for the L-infinity norm to be used as follows: ## @table @var ## @item 'sr', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. Default method. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced model. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ns*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## model. TOL2 <= TOL1. ## If not specified, ns*eps*info.hsv(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'alpha-ctrb' ## Combination method parameter for defining the ## frequency-weighted controllability Grammian. ## abs(alphac) <= 1. ## If alphac = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphac = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'alpha-obsv' ## Combination method parameter for defining the ## frequency-weighted observability Grammian. ## abs(alphao) <= 1. ## If alphao = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphao = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} function ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## @strong{References}@* ## [1] Enns, D. ## @cite{Model reduction with balanced realizations: An error bound ## and a frequency weighted generalization}. ## Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. ## ## [2] Lin, C.-A. and Chiu, T.-Y. ## @cite{Model reduction via frequency-weighted balanced realization}. ## Control Theory and Advanced Technology, vol. 8, ## pp. 341-351, 1992. ## ## [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. ## @cite{New results on frequency weighted balanced reduction ## technique}. ## Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. ## ## [4] Varga, A. and Anderson, B.D.O. ## @cite{Square-root balancing-free methods for the frequency-weighted ## balancing related model reduction}. ## (report in preparation) ## ## ## @strong{Algorithm}@* ## Uses SLICOT AB09ID by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [Gr, info] = spamodred (varargin) [Gr, info] = __modred_ab09id__ ("spa", varargin{:}); endfunction ## TODO: add a test control/inst/step.m0000644000076500000240000000607312614620313013652 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} step (@var{sys}) ## @deftypefnx{Function File} {} step (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx{Function File} {} step (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{t}) ## @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}) ## @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}, @var{dt}) ## Step response of @acronym{LTI} system. ## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item t ## Time vector. Should be evenly spaced. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{impulse, initial, lsim} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 1.0 function [y_r, t_r, x_r] = step (varargin) if (nargin == 0) print_usage (); endif [y, t, x] = __time_response__ ("step", varargin, nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction control/inst/strseq.m0000644000076500000240000000256712614620313014224 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{strvec} =} strseq (@var{str}, @var{idx}) ## Return a cell vector of indexed strings by appending the indices @var{idx} ## to the string @var{str}. ## ## @example ## strseq ("x", 1:3) = @{"x1"; "x2"; "x3"@} ## strseq ("u", [1, 2, 5]) = @{"u1"; "u2"; "u5"@} ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function strvec = strseq (str, idx) if (nargin != 2 || ! ischar (str) || ! isnumeric (idx)) print_usage (); endif strvec = arrayfun (@(x) sprintf ("%s%d", str, x), idx(:), "uniformoutput", false); endfunction control/inst/sumblk.m0000644000076500000240000000707212614620313014174 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{S} =} sumblk (@var{formula}) ## @deftypefnx{Function File} {@var{S} =} sumblk (@var{formula}, @var{n}) ## Create summing junction @var{S} from string @var{formula} ## for name-based interconnections. ## ## @strong{Inputs} ## @table @var ## @item formula ## String containing the formula of the summing junction, ## e.g. @code{e = r - y + d} ## @item n ## Signal size. Default value is 1. ## @end table ## ## @strong{Outputs} ## @table @var ## @item S ## State-space model of the summing junction. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> S = sumblk ('e = r - y + d') ## ## S.d = ## r y d ## e 1 -1 1 ## ## Static gain. ## octave:2> S = sumblk ('e = r - y + d', 2) ## ## S.d = ## r1 r2 y1 y2 d1 d2 ## e1 1 0 -1 0 1 0 ## e2 0 1 0 -1 0 1 ## ## Static gain. ## @end group ## @end example ## @seealso{connect} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2013 ## Version: 0.2 function s = sumblk (formula, n = 1) if (nargin == 0 || nargin > 2) print_usage (); endif if (! ischar (formula)) error ("sumblk: require string as first argument"); endif if (! is_real_scalar (n) || n < 1) error ("sumblk: require integer as second argument"); endif if (length (strfind (formula, "=")) != 1) error ("sumblk: formula requires exactly one '='"); endif ## if the first signal has no sign, add a plus if (isempty (regexp (formula, "=\\s*[+-]", "once"))) formula = regexprep (formula, "=", "=+", "once"); endif ## extract operators, remove "=" from formula operator = regexp (formula, "[=+-]", "match"); if (! strcmp (operator{1}, "=")) error ("sumblk: formula has misplaced '='"); endif operator = operator(2:end); formula = formula(formula != "="); ## extract signal names signal = regexp (formula, "\\s*[+-]\\s*", "split"); if (any (cellfun (@isempty, signal))) error ("sumblk: formula is missing some input/output names"); endif outname = signal(1); inname = signal(2:end); signs = ones (1, numel (inname)); signs(strcmp (operator, "-")) = -1; d = kron (signs, eye (n)); s = ss (d); ## NOTE: the dark side returns a tf, but i prefer an ss model ## because in general, transfer functions and mimo ## interconnections don't mix well if (n > 1) outgroup = struct (outname{1}, 1:n); outname = strseq (outname{1}, 1:n); idx = 1 : n*numel (inname); idx = reshape (idx, n, []); idx = num2cell (idx, 1); ingroup = cell2struct (idx, inname, 2); tmp = cellfun (@strseq, inname, {1:n}, "uniformoutput", false); inname = vertcat (tmp{:}); s = set (s, "outgroup", outgroup, "ingroup", ingroup); endif s = set (s, "inname", inname, "outname", outname); endfunction control/inst/test_control.m0000644000076500000240000000617112614620313015415 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Script File} {} test_control ## Execute all available tests at once. ## The Octave control package is based on the @uref{http://www.slicot.org, @acronym{SLICOT}} library. ## @acronym{SLICOT} needs @acronym{BLAS} and @acronym{LAPACK} libraries which are also prerequisites ## for Octave itself. ## In case of failing tests, it is highly recommended to use ## @uref{http://www.netlib.org/blas/, Netlib's reference @acronym{BLAS}} and ## @uref{http://www.netlib.org/lapack/, @acronym{LAPACK}} ## for building Octave. Using @acronym{ATLAS} may lead to sign changes ## in some entries of the state-space matrices. ## In general, these sign changes are not 'wrong' and can be regarded as ## the result of state transformations. Such state transformations ## (but not input/output transformations) have no influence on the ## input-output behaviour of the system. For better numerics, ## the control package uses such transformations by default when ## calculating the frequency responses and a few other things. ## However, arguments like the Hankel singular Values (@acronym{HSV}) must not change. ## Differing @acronym{HSV}s and failing algorithms are known for using Framework Accelerate ## from Mac OS X 10.7. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2010 ## Version: 0.6 ## test collection test ltimodels ## LTI methods test @lti/c2d test @lti/connect test @lti/d2c test @lti/d2d test @lti/feedback test @lti/horzcat test @lti/inv test @lti/isminimumphase test @lti/minreal test @lti/mtimes test @lti/norm test @lti/plus test @lti/pole test @lti/prescale test @lti/sminreal test @lti/subsref test @lti/zero ## robust control test h2syn test hinfsyn test ncfsyn ## ARE solvers test care test dare test kalman ## Lyapunov test covar test dlyap ## test dlyapchol # TODO: add tests test gram test lyap test lyapchol ## model order reduction test bstmodred test btamodred test hnamodred ## test spamodred # TODO: create test case ## controller order reduction test btaconred test cfconred test fwcfconred ## test spaconred # TODO: create test case ## various oct-files test ctrbf test hsvd test place ## various m-files test db2mag test ctrb test filt test initial test issample test mag2db test margin test obsv test sigma test thiran test __dss2ss__ ## identification test @iddata/iddata test @iddata/cat test @iddata/detrend test @iddata/fft test fitfrd test moen4 control/inst/tfpoly2str.m0000644000076500000240000000507412614620313015027 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{str} =} tfpoly2str (@var{p}) ## @deftypefnx {Function File} {@var{str} =} tfpoly2str (@var{p}, @var{tfvar}) ## Return the string of polynomial vector @var{p} with string @var{tfvar^-1} ## as variable. Note that there is an almost identical function for the ## @command{tfpoly} class which returns a string with @var{tfvar} ## (not @var{tfvar^-1}) as variable. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function str = tfpoly2str (p, tfvar = "x") ## TODO: simplify this ugly code str = ""; lp = numel (p); if (lp > 0) # first element (lowest order) idx = find (p); # first non-zero element if (isempty (idx)) str = "0"; return; else idx = idx(1); endif a = p(idx); if (a < 0) cs = "-"; else cs = ""; endif if (idx == 1) str = [cs, num2str(abs (a), 4)]; else if (abs (a) == 1) str = [cs, __variable__(tfvar, idx-1)]; else str = [cs, __coefficient__(a), " ", __variable__(tfvar, idx-1)]; endif endif if (lp > idx) # remaining elements of higher order for k = idx+1 : lp a = p(k); if (a != 0) if (a < 0) cs = " - "; else cs = " + "; endif if (abs (a) == 1) str = [str, cs, __variable__(tfvar, k-1)]; else str = [str, cs, __coefficient__(a), " ", __variable__(tfvar, k-1)]; endif endif endfor endif endif endfunction function str = __coefficient__ (a) b = abs (a); if (b == 1) str = ""; else str = num2str (b, 4); endif endfunction function str = __variable__ (tfvar, n) str = [tfvar, "^-", num2str(n)]; endfunction control/inst/tfpolyones.m0000644000076500000240000000177612614620313015106 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return (pxm) cell of tfpoly([1]). For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function ret = tfpolyones (p, m) ret = cell (p, m); one = tfpoly ([1]); ret(:) = {one}; endfunction control/inst/tfpolyzeros.m0000644000076500000240000000200112614620313015262 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return (pxm) cell of tfpoly([0]). For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function ret = tfpolyzeros (p, m) ret = cell (p, m); zero = tfpoly ([0]); ret(:) = {zero}; endfunction control/inst/thiran.m0000644000076500000240000000736212614620313014166 0ustar lukasstaff## Copyright (C) 2013-2015 Thomas Vasileiou ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} thiran (@var{tau}, @var{tsam}) ## Approximation of continuous-time delay using a discrete-time ## allpass Thiran filter. ## ## Thiran filters can approximate continuous-time delays that are ## non-integer multiples of the sampling time (fractional delays). ## This approximation gives a better matching of the phase shift ## between the continuous- and the discrete-time system. ## If there is no fractional part in the delay, then the standard ## discrete-time delay representation is used. ## ## @strong{Inputs} ## @table @var ## @item tau ## A continuous-time delay, given in time units (seconds). ## @item tsam ## The sampling time of the resulting Thiran filter. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Transfer function model of the resulting filter. ## The order of the filter is determined automatically. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> sys = thiran (1.33, 0.5) ## ## Transfer function 'sys' from input 'u1' to output ... ## ## 0.003859 z^3 - 0.03947 z^2 + 0.2787 z + 1 ## y1: ----------------------------------------- ## z^3 + 0.2787 z^2 - 0.03947 z + 0.003859 ## ## Sampling time: 0.5 s ## Discrete-time model. ## @end group ## @end example ## @example ## @group ## octave:2> sys = thiran (1, 0.5) ## ## Transfer function 'sys' from input 'u1' to output ... ## ## 1 ## y1: --- ## z^2 ## ## Sampling time: 0.5 s ## Discrete-time model. ## @end group ## @end example ## ## @seealso{absorbdelay, pade} ## @end deftypefn ## Author: Thomas Vasileiou ## Created: January 2013 ## Version: 0.1 function sys = thiran (del, tsam) ## check args if (nargin != 2) print_usage (); endif if (! issample (del, 0)) error ("thiran: the delay parameter 'tau' must be a non-negative scalar."); endif if (! issample (tsam)) error ("thiran: the second parameter 'tsam' is not a valid sampling time."); endif if (del == 0) sys = tf (1); return; endif ## find fractional and discrete delay N = floor (del/tsam + eps); # put eps or sometimes it misses d = del - N*tsam; ## check if we do need a thiran filter if (d/tsam < eps) sys = tf (1, [1, zeros(1, N)], tsam); else ## make filter order ~ del to ensure stability N = N + 1; # order of the filter d = del/tsam; tmp = ((d-N+(0:N).') * ones (1,N)) ./ (d-N + bsxfun (@plus, 1:N, (0:N).')); a = horzcat (1, (-1).^(1:N) .* bincoeff (N, 1:N) .* prod (tmp)); sys = tf (fliplr (a), a, tsam); endif endfunction %!shared num, den, expc %! expc = [1, 0.5294, -0.04813, 0.004159]; %! sys = thiran (2.4, 1); %! [num, den] = tfdata (sys, "vector"); %!assert (den, expc, 1e-4); %!assert (num, fliplr (expc), 1e-4); %!shared num, den %! sys = thiran (0.5, 0.1); %! [num, den] = tfdata (sys, "vector"); %!assert (den, [1, 0, 0, 0, 0, 0], eps); %!assert (num, 1, eps); %!error (thiran (-1, 1)); %!error (thiran (1, -1)); %!error (thiran ([1 2 3], 1)); control/inst/VLFamp.m0000644000076500000240000004105512614620313014023 0ustar lukasstaff## Copyright (C) 2015 Thomas D. Dean ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} VLFamp ## @deftypefnx{Function File} {@var{result} =} VLFamp (@var{verbose}) ## Calculations on a two stage preamp for a multi-turn, ## air-core solenoid loop antenna for the reception of ## signals below 30kHz. ## ## The Octave Control Package functions are used extensively to ## approximate the behavior of operational amplifiers and passive ## electrical circuit elements. ## ## This example presents several 'screen' pages of documentation of the ## calculations and some reasoning about why. Plots of the results are ## presented in most cases. ## ## The process is to display a 'screen' page of text followed by the ## calculation and a 'Press return to continue' message. To proceed in ## the example, press return. ^C to exit. ## ## At one point in the calculations, the process may seem to hang, but, ## this is because of extensive calculations. ## ## The returned transfer function is more than 100 characters long so ## will wrap in screens that are narrow and appear jumbled. ## @end deftypefn ## Author: Thomas D. Dean ## Created: June 2015 ## Version: 0.1 function retval = VLFamp (verbose = false) if (nargin > 1) print_usage (); endif clc; disp ("---- VLF Pre-Amplifier Design ----"); disp (""); disp ("This example covers the design of a pre-amplifier for use in"); disp ("receiving radio frequencies below 30kHz."); disp (""); disp ("See http://www.vlf.it for details of Narural Radio Sources"); disp (""); disp ("The Octave Control Package functions are used extensively to"); disp ("approximate the behavior of operational amplifiers and passive"); disp ("electrical circuit elements."); disp (""); disp ("This example presents several 'screen' pages of documentation of the"); disp ("calculations and some reasoning about why. Plots of the results are"); disp ("presented in most cases."); disp (""); disp ("Often, when multiple plots are displayed, they may be overlaid"); disp ("on the screen. You may use the mouse and move them for better viewing."); disp (""); disp ("The process is to display a 'screen' page of text followed by the"); disp ("calculation and a 'Press return to continue' message. To proceed in"); disp ("the example, press return. ^C to exit."); disp (""); disp ("At one point in the calculations, the process may seem to hang, but,"); disp ("this is because of extensive calculations."); disp (""); disp ("The returned transfer function is more than 100 characters long so"); disp ("will wrap in screens that are narrow and appear jumbled."); disp (""); ## input ("Press Return to continue:"); blanks (); ## disp (""); disp ("The amplifier consists of two AD797 op amps and a low pass filter."); disp ("With biasing and blocking capacitors omitted, three blocks remain."); disp (""); disp (""); disp (" Gain = 10"); disp (" +-------------+"); disp (" | | -- Low Pass Filter --"); disp (" ---+ p |"); disp (" Loop | Stage 1 +--+----R3--+--R4--+--R5--+---> To Stage 2"); disp (" | Amplifier | | | | |"); disp (" -+-+ n | | C1 C2 C3"); disp (" | | | | | | |"); disp (" | +-------------+ | Gnd Gnd Gnd"); disp (" | |"); disp (" +----+---R2--------+"); disp (" |"); disp (" R1"); disp (" |"); disp (" Gnd"); disp (""); disp (""); disp (""); disp (" Gain = 10"); disp (" +-------------+"); disp (" | |"); disp (" Gnd--+ p |"); disp (" | Stage 2 +--+----R8--+----> Output"); disp (" | Amplifier | | |"); disp (" From >---+-+ n | | R9"); disp (" Filter | | | | |"); disp (" | +-------------+ | Gnd"); disp (" | |"); disp (" +----+---R6--------+"); disp (" |"); disp (" R7"); disp (" |"); disp (" Gnd"); disp (""); disp (""); disp ("R1 and R2 profide feedback to control the gain of Stage 1."); disp ("R3 through R5 with C1 through C3 form a low pass filter to limit the"); disp (" bandwidth."); disp ("R6 and R7 profide feedback to control the gain of Stage 2."); disp ("R8 and R9 provide impedance matching to the cable and/or receiver,"); disp (" possibly a PC sound card."); disp (""); ## input ("Press Return to continue:"); blanks (); ## disp (""); disp (""); disp ("The graphs in the ad797 datasheet reveal the following parameters:"); disp (""); show ("a0 = 1e7; ## Open Loop Gain"); show ("p1 = 55; ## Pole (Hz)"); show ("p2 = 1e6; ## Pole (Hz)"); show ("z1 = 4.3e6; ## Zero (Hz)"); disp (""); disp ("The open loop transfer function of an op amp with m zeros and n"); disp ("poles is expressed in the form:"); disp (" tf = open_loop_gain * zero_expressions / pole_expressions"); disp ("where "); disp (" zero_expressions = (1+s/z1) * (1+s/z2) * ... * (1+s/zm) "); disp (" pole_expressions = (1+s/p1) * (1+s/p2) * ... * (1+s/pn)"); disp (" z1 ... zm are the m zeros"); disp (" p1 ... pn are the n poles"); disp (""); ## input ("Press Return to continue:"); blanks (); ## disp (""); disp ("The amplifier stages have 1 zero and 2 poles:"); disp (""); show ("s = tf ('s')") disp (""); show ("TFopen = a0 * (1+s/z1) / (1+s/p1) / (1+s/p2)") disp (""); show ("TFopen_norm = minreal (TFopen)") disp (""); disp ("Note: The difference between the op amp expression and the usual"); disp ("Zero-Pole-Gain expression is in the modification of the gain"); disp ("parameter. The gain argument to zpk() is modified by the zeros"); disp ("and poles, so the derived transfer function matches actual"); disp ("measurements."); disp (""); show ("Azpk = zpk ([-z1], [-p1, -p2], 1e7*p1*p2/z1)") ## input ("Press Return to continue:"); blanks (); ## disp (""); disp ("The bode plot of these two open loop transfer functions produce"); disp ("identical results. And, the plots show the same shape as the"); disp ("graphs in the datasheet."); disp (""); show ("figure 1"); show ("bode (TFopen)"); show ("subplot (2,1,1)"); show ("title ('Equation Bode Diagram')"); show ("figure 2"); show ("bode (Azpk)"); show ("subplot (2,1,1)"); show ("title ('ZPK Bode Diagram')"); disp (""); disp ("Two Bode Diagrams should be visible, possibly overlaid."); disp (""); ## input ("Press Return to close the plots and continue:"); blanks (); ## close all; disp (""); disp ("The normalized step response of the ad797 is:"); disp (""); show ("TFnorm = TFopen/dcgain(TFopen)") disp (""); show ("step (TFnorm, 'b')"); show ("title ('AD797 Normalized Open-Loop Step Response')"); show ("ylabel ('Normalized Amplitude')"); disp (""); ## input ("Press Return to close the plot and continue:"); blanks (); ## close all; disp (""); disp ("--- Design Stage 1 of the VLFamp ---"); disp (""); disp ("Resistors R1 and R2 form a feedback system to control the gain of "); disp ("Stage 1. This feedback system returns a portion of the output to the"); disp ("negative input. This is normally expressed as:"); disp (" Vfb = Vout * R1 / (R1 + R2)"); disp ("So, the transfer function of the feedback network is:"); disp (" tf = Vfb / Vout = R1 / (R1 + R2)"); disp ("The effects of the AD797 gain on the input and the feedback may be "); disp ("represented as TFstage1 = Vout/Vp = gain / (1 + dcgain * TFfeedback)."); disp ("If dcgain is sufficiently large, this reduces to"); disp (" TFstage1 = 1 / TFfeedback."); disp ("The dcgain of the AD797 is >> 1, so, the feedback completely controls"); disp ("the output and variations in the dcgain will not effect the Stage gain."); disp (""); disp ("The feedback is added to the AD797 using the feedback function"); disp (""); show ("Gfb = 10"); show ("b = 1 / Gfb"); show ("R1 = 10e3"); show ("R2 = R1 * (1/b - 1)") disp (""); show ("TFstage1 = feedback (TFopen, b)"); disp (""); show ("bodemag (TFopen, 'r', TFstage1, 'b')"); show ("legend ('Open Loop Gain (TFopen)', 'Closed Loop Gain (TFstage1)')"); disp (""); disp ("The use of negative feedback to reduce the low-frequency (LF) gain"); disp ("has led to a corresponding increase in the system bandwidth (defined"); disp ("as the frequency where the gain drops 3dB below its maximum value)."); disp (""); disp ("With this feedback, we have a gain of 10, or 20db up to 10MHz,"); disp ("far more than the frequency range of interest."); disp (""); ## input ("Press Return to close the plot and continue:"); blanks (); ## close all; disp (""); disp ("Since the gain is now dominated by the feedback network, a useful"); disp ("relationship to consider is the sensitivity of this gain to variation"); disp ("in the op amp's open-loop gain."); disp (""); disp ("Before deriving the system sensitivity, however, it is useful to"); disp ("define the loop gain, L(s)=a(s)b(s), which is the total gain a signal"); disp ("experiences traveling around the loop:"); disp (""); disp ("Sensitivity = partial(TFstage1/TFopen)*TFopen/TFstage1"); disp ("or S(s) = 1 / (1 + TFopen(s) * TFstage1(s))"); disp ("or S(s) = 1 / (1 + L(s)), which has the same form as feedback"); disp ("So, use the feedback function to develop the sensitivity."); disp (""); show ("L = TFopen * b") disp (""); show ("Sens = feedback (1, L)") disp (""); show ("figure 1"); show ("bodemag (TFstage1, 'b', Sens, 'g')"); disp (""); disp ("The very small low-frequency sensitivity (more than -100 dB) indicates"); disp ("a design whose closed-loop gain suffers minimally from open-loop gain"); disp ("variation. Such variation in a(s) is common due to manufacturing"); disp ("variability, temperature change, etc."); disp (""); ## input ("Press Return to close the plot and continue:"); blanks (); ## disp (""); disp ("You can check the step response of A(s) using the STEP command:"); disp (""); show ("figure 2"); show ("step (TFstage1)"); disp (""); disp ("The stability margin can be analyzed by plotting the loop gain, L(s)"); disp ("with the margin function."); disp (" "); disp ("This plot may display warning messages, you can safely ignore them."); disp (" "); fflush(stdout); show ("margin (L)"); disp (" "); fflush(stdout); fflush(stderr); disp (" "); disp ("Two plots are displayed, possibly overlaid."); disp (" "); ## input ("Press Return to close the plots and continue:"); blanks (); ## disp (""); disp ("The plot indicates a phase margin of less than 3 degrees. Stage 1"); disp ("needs to be compensated to increase this to an acceptible level,"); disp ("more than 45 degrees, if possible."); disp (""); disp ("Feedback Lead Compensation"); disp (""); disp ("A commonly used method of compensation in this type of circuit is"); disp ("feedback lead compensation. This technique modifies b(s) by adding"); disp ("a capacitor, C, in parallel with the feedback resistor, R2."); disp ("The capacitor value is chosen so as to introduce a phase lead to b(s)"); disp ("near the crossover frequency, thus increasing the amplifier's phase"); disp ("margin."); disp ("The new feedback transfer function is shown below."); disp ("You can approximate a value for C by placing the zero of b(s) at the"); disp ("0dB crossover frequency of L(s):"); disp (""); show ("[Gm, Pm, Wcg, Wcp] = margin (L)"); show ("C = 1/(R2*Wcp)") disp (""); if (C < 1e-12) disp ("The calculated value of C is very small."); disp ("Now, look at a range of values."); endif; disp (" "); disp ("The next plots take some time..."); disp (" "); ## input ("Press Return to close the plot and continue:"); blanks (); ## close all; disp ("The next plots take some time..."); disp (""); show ("K = R1/(R1+R2);"); show ("C = [10:10:200]*1e-12;"); show ("b_array = arrayfun (@(C) tf ([K*R2*C, K], [K*R2*C, 1]), C,'uniformoutput',false);"); show ("A_array = cellfun (@feedback, {TFopen}, b_array, 'uniformoutput', false);"); show ("L_array = cellfun (@mtimes, {TFopen}, b_array, 'uniformoutput', false);"); show ("S_array = cellfun (@feedback, {1}, L_array, 'uniformoutput', false);"); disp (" "); fflush(stdout); show ("[Gm, Pm, Wcg, Wcp] = cellfun (@margin, L_array);"); disp (" "); close all show ("figure 1"); show ("step (TFstage1, 'r', A_array{:})"); show ("figure 2"); show ("bode (TFstage1, A_array{:})"); show ("figure 3"); show ("plot (C, Pm)"); show ("grid"); show ("xlabel ('Compensation Capacitor, C (pF)')"); show ("ylabel ('Phase Margin (deg)')"); show ("figure 4"); show ("step (A_array{C==50e-12}, 'r', A_array{C==100e-12}, 'b', A_array{C==200e-12}, 'g')"); show ("legend ('Compensated (50 pF)', 'Compensated (100 pF)', 'Compensated (200 pF)')"); disp (" "); disp ("Four plots are displayed, possibly overlaid."); disp (" "); ## input ("Press Return to close the plots and continue:"); blanks (); ## close all; disp (""); disp (""); disp (" Gain = 10"); disp (" +-------------+"); disp (" | |"); disp (" ---+ p |"); disp (" Loop | Stage 1 +--+---->"); disp (" | Amplifier | |"); disp (" -+-+ n | |"); disp (" | | | |"); disp (" | +-------------+ |"); disp (" | |"); disp (" +----+------R2-----+"); disp (" | |"); disp (" +-----Ccomp---+"); disp (" |"); disp (" |"); disp (" R1"); disp (" |"); disp (" Gnd"); disp (""); disp ("The selected compensation capacitor is 100pf."); show ("TFcomp = A_array{C==100e-12}"); show ("bode (TFopen, 'b', TFstage1, 'g', TFcomp, 'r')"); show ("legend ('TFopen', 'TFstage1', 'TFcomp')"); disp (""); ## input ("Press Return to close the plot and continue:"); blanks (); ## close all; disp (""); disp ("--- Low Pass Filter Design ---"); disp (""); disp ("The low pass filter is composed of three equal sections."); disp ("Develop one section and put three in series."); disp (""); show ("C = 20e-9"); show ("R = 1000"); show ("TFsection = tf ([1], [C*R, 1])"); disp (""); show ("TFfilter = TFsection * TFsection * TFsection;"); if (verbose) TFfilter endif; disp (""); disp ("---- Final Design ----"); disp (""); disp ("The final configuration is: AD797 --> LP Filter --> AD797"); disp (""); show ("TFpreamp = TFcomp * TFfilter * TFcomp;"); show ("figure 1"); show ("bode (TFpreamp, {1, 1e5})"); show ("figure 2"); show ("margin (TFpreamp)"); disp (""); disp ("Two plots are displayed, possibly overlaid."); disp (""); ## input ("Press Return to close the plots and continue:"); blanks (); ## disp (""); disp ("As can be seen from the plots, the gain margin is almost 30db."); disp ("The phase margin is 230 degrees."); disp (""); ## disp ("Use 'close all' to close the plots."); ## close all blanks (); disp ("The resultant transfer function is over 100 characters long"); disp ("and will appear jumbled on narrower screens."); disp (""); show ("TFpreamp") ## if (nargout > 0) retval = TFpreamp; endif endfunction ## support function to display a command and then ## execute it in the caller's environment. function show (str) disp ([">> ", str]); evalin ("caller", str); endfunction ## support function to insert blank lines in the display function blanks (n = 5) for idx = 1:n disp (""); endfor endfunction control/inst/WestlandLynx.m0000644000076500000240000001067312614620313015334 0ustar lukasstaff## -*- texinfo -*- ## @deftypefn{Function File} {@var{sys} =} WestlandLynx () ## Model of the Westland Lynx Helicopter about hover. ## @example ## @group ## INPUTS ## main rotor collective ## longitudinal cyclic ## lateral cyclic ## tail rotor collective ## @end group ## @end example ## @example ## @group ## STATES ## pitch attitude theta [rad] ## roll attitude phi [rad] ## roll rate (body-axis) p [rad/s] ## pitch rate (body-axis) q [rad/s] ## yaw rate xi [rad/s] ## forward velocity v_x [ft/s] ## lateral velocity v_y [ft/s] ## vertical velocity v_z [ft/s] ## @end group ## @end example ## @example ## @group ## OUTPUTS ## heave velocity H_dot [ft/s] ## pitch attitude theta [rad] ## roll attitude phi [rad] ## heading rate psi_dot [rad/s] ## roll rate p [rad/s] ## pitch rate q [rad/s] ## @end group ## @end example ## ## @strong{References}@* ## [1] Skogestad, S. and Postlethwaite I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley. ## @url{http://www.nt.ntnu.no/users/skoge/book/2nd_edition/matlab_m/matfiles.html} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.1 function sys = WestlandLynx () if (nargin) print_usage (); endif a01 = [ 0 0 0 0.99857378005981; 0 0 1.00000000000000 -0.00318221934140; 0 0 -11.57049560546880 -2.54463768005371; 0 0 0.43935656547546 -1.99818229675293; 0 0 -2.04089546203613 -0.45899915695190; -32.10360717773440 0 -0.50335502624512 2.29785919189453; 0.10216116905212 32.05783081054690 -2.34721755981445 -0.50361156463623; -1.91097259521484 1.71382904052734 -0.00400543212891 -0.05741119384766]; a02 = [ 0.05338427424431 0 0 0; 0.05952465534210 0 0 0; -0.06360262632370 0.10678052902222 -0.09491866827011 0.00710757449269; 0 0.01665188372135 0.01846204698086 -0.00118747074157; -0.73502779006958 0.01925575733185 -0.00459562242031 0.00212036073208; 0 -0.02121581137180 -0.02116791903973 0.01581159234047; 0.83494758605957 0.02122657001019 -0.03787973523140 0.00035400385968; 0 0.01398963481188 -0.00090675335377 -0.29051351547241]; a0 = [a01 a02]; b0 = [ 0 0 0 0; 0 0 0 0; 0.12433505058289 0.08278584480286 -2.75247764587402 -0.01788876950741; -0.03635892271996 0.47509527206421 0.01429074257612 0; 0.30449151992798 0.01495801657438 -0.49651837348938 -0.20674192905426; 0.28773546218872 -0.54450607299805 -0.01637935638428 0; -0.01907348632812 0.01636743545532 -0.54453611373901 0.23484230041504; -4.82063293457031 -0.00038146972656 0 0]; c0 = [ 0 0 0 0 0 0.0595 0.05329 -0.9968; 1.0 0 0 0 0 0 0 0; 0 1.0 0 0 0 0 0 0; 0 0 0 -0.05348 1.0 0 0 0; 0 0 1.0 0 0 0 0 0; 0 0 0 1.0 0 0 0 0]; d0 = zeros (6, 4); inname = {"main rotor collective", "longitudinal cyclic", "lateral cyclic", "tail rotor collective"}; stname = {"theta", "phi", "p", "q", "xi", "v_x", "v_y", "v_z"}; outname = {"H_dot", "theta", "phi", "psi_dot", "p", "q"}; sys = ss (a0, b0, c0, d0, "inname", inname, "stname", stname, "outname", outname); endfunction control/inst/zpk.m0000644000076500000240000001072012614620313013475 0ustar lukasstaff## Copyright (C) 2009-2015 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{s} =} zpk (@var{'s'}) ## @deftypefnx {Function File} {@var{z} =} zpk (@var{'z'}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{k}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) ## Create transfer function model from zero-pole-gain data. ## This is just a stop-gap compatibility wrapper since zpk ## models are not yet implemented. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to transfer function. ## @item z ## Cell of vectors containing the zeros for each channel. ## z@{i,j@} contains the zeros from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item p ## Cell of vectors containing the poles for each channel. ## p@{i,j@} contains the poles from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item k ## Matrix containing the gains for each channel. ## k(i,j) contains the gain from input j to output i. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (tf)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Transfer function model. ## @end table ## ## @seealso{tf, ss, dss, frd} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.2 function sys = zpk (varargin) if (nargin <= 1) # zpk (), zpk (sys), zpk (k), zpk ('s') sys = tf (varargin{:}); return; elseif (nargin == 2 ... && ischar (varargin{1})) # zpk ('z', tsam) sys = tf (varargin{:}); return; endif z = {}; p = {}; k = []; # default values tsam = 0; # default sampling time [mat_idx, opt_idx] = __lti_input_idx__ (varargin); switch (numel (mat_idx)) case 1 k = varargin{mat_idx}; case 3 [z, p, k] = varargin{mat_idx}; case 4 [z, p, k, tsam] = varargin{mat_idx}; if (isempty (tsam) && is_real_matrix (tsam)) tsam = -1; elseif (! issample (tsam, -10)) error ("zpk: invalid sampling time"); endif case 0 ## nothing to do here, just prevent case 'otherwise' otherwise print_usage (); endswitch varargin = varargin(opt_idx); if (isempty (z) && isempty (p) && is_real_matrix (k)) sys = tf (k, varargin{:}); return; endif if (! iscell (z)) z = {z}; endif if (! iscell (p)) p = {p}; endif if (! size_equal (z, p, k)) error ("zpk: arguments 'z', 'p' and 'k' must have equal dimensions"); endif ## NOTE: accept [], scalars and vectors but not matrices as 'z' and 'p' ## because poly (matrix) returns the characteristic polynomial ## if the matrix is square! if (! is_zp_vector (z{:}, 1)) # last argument 1 needed if z is empty cell error ("zpk: first argument 'z' must be a vector or a cell of vectors"); endif if (! is_zp_vector (p{:}, 1)) error ("zpk: second argument 'p' must be a vector or a cell of vectors") endif if (! is_real_matrix (k)) error ("zpk: third argument 'k' must be a real-valued gain matrix"); endif num = cellfun (@(zer, gain) real (gain * poly (zer)), z, num2cell (k), "uniformoutput", false); den = cellfun (@(pol) real (poly (pol)), p, "uniformoutput", false); sys = tf (num, den, tsam, varargin{:}); endfunction control/NEWS0000644000076500000240000012204112614620313012235 0ustar lukasstaffSummary of important user-visible changes for releases of the control package =============================================================================== control-3.0.0 Release Date: 2015-10-30 Release Manager: Lukas Reichlin =============================================================================== ** Substantial parts of the most vital internals have been rewritten and streamlined in order to improve compatibility and reliability. These changes to the codebase also result in better error handling in many situations and facilitate the integration of new features in upcoming releases. ** While many issues and pitfalls existing in previous releases of the control package have been fixed, the author isn't aware (at release date) of any regressions one might expect from a x.0.0 release. Note that the absence of regressions doesn't mean the absence of bugs. Especially it doesn't mean that *all* bugs from control-2.8.5 have been fixed. Also note that to err is human, and software is written by humans. Therefore, any larger piece of software is likely to contain bugs. But the author is confident that he squashed considerably more bugs than he introduced in this release. So if you waver between updating now and waiting for control-3.0.x, the author's suggestion is definitely to update now. ** As always, your feedback is highly appreciated! Even if you think that the control package is "fubar". If you just follow the German saying "gesehen, gelacht, geloescht" - which roughly translates into "seen it, laughed at it, deleted it" - there's only little chance for improvement! So if you think you've found a bug, please take the time to report your findings on Octave's bugtracker: See the link below for more information about how to report problems: ** Your help is welcome! There are many ways you can help the project fix the remaining problems, complete the documentation, and improve the overall user experience for both novices and experts alike. The author is aware of the fact that the documentation still leaves a lot to be desired. As it is often the case with developers, writing documentation and tutorials is neither his key skill nor his favorite occupation. After all, the author wrote the control package due to his personal interest in the field of control systems and not to make a living out of it. The developer's profits are the insights and experience he obtained from his work. Consequently, the control project doesn't ask you for money. In case you like the control package and should feel like donating, then consider donating to GNU Octave or the Free Software Foundation according to the information on their websites. Thank you! ** LTI models in general Improved handling of key-value pairs in all constructors for LTI models: tf (matrix, 'key1', val1, ...), ss (a, b, 'key1', val1, ...) Support inheritance of LTI properties in many variations: tf (num, den, ltisys), ss (a, b, ltisys, 'key1', val1, ...) sys.lti = ltisys, zpk (z, p, k, Ts, 'var', 'q', 'lti', ltisys, ...) Accept [] as an alias for unspecified sampling time (Ts = -1): filt ('q^-1', []), ss (a, b, c, d, []), sys.Ts = [] Automatic vector expansion for input and output names: sys.inname = 'str', sys.outname = '' (for MIMO systems) ** dss Fixed a long-standing but undiscovered bug where 'dss (sys)' overwrites sys.e with an identity matrix even if sys.e was not empty. D'oh! ** ss Support for the following special cases has been added: ss (sys, 'explicit') % convert descriptor system to regular one ss (sys, 'minimal') % equivalent to minreal (ss (sys)) ** tf, zpk, filt Restrict transfer function variable to the candidates 's', 'p' for continuous-time and 'z', 'q', 'z^-1', 'q^-1' for discrete-time models. s = tf ('s'), z = tf ('z^-1', Ts), tf (num, den, Ts, 'var', 'q') Previous control versions supported any string, which could be quite misleading, see bug #45371. ** bode, bodemag, nichols, nyquist, sigma Fixed bug #42495. It is now possible to specify a frequency vector of length 1, e.g. [mag, phase] = bode (sys, 1) Furthermore, the functions raise an error or warning if invalid arguments are passed to them. Previously, invalid arguments were simply ignored, which could be confusing. ** step, impulse, initial, ramp The time response functions now raise an error or warning if invalid arguments are passed to them. As it was the case for frequency response functions, they used to simply ignore invalid arguments. ** lsim Fixed bug #46247. (Reported by Lutz Mager and Piet Wertelaers) Support logical arrays as input signal. Before, logical arrays were simply ignored without notice, which could lead to unexpected results. Additionally, lsim received the same improvements as the other time and frequency response functions regarding invalid arguments. ** pzmap Improved argument checks. ** augstate New function for state-space models. Adds the state vector to the output vector. ** connect The function no longer raises an error for name-based interconnections if some systems have common input names and one of these inputs are to be kept. ** estim Add input/output/state names to the returned system. Support name-based selection of inputs (arguments 'sensors' and 'known'). ** sumblk Add signal names as input/output groups if argument n > 1. ** minreal If state-space models already have a minimal realization, then no state transformations are applied to the returned model. In other words, if the number of states cannot be reduced (with the chosen tolerance), the model is returned unchanged. Note that if the user sets the tolerance to the maximum value of 1, every state-space model will be reduced to zero states. There's nothing wrong with that, it's just how numerical computation works. =============================================================================== control-2.8.5 Release Date: 2015-10-01 Release Manager: Lukas Reichlin =============================================================================== ** nyquist, nichols Specifying a frequency range no longer errors out, i.e. nyquist (sys, {wmin, wmax}) ** pid, pidstd New functions for improved Matlab compatibility. ** ss Support ss (a, b, c, 0) for Matlab compatibility. (Thanks to Thomas Vasileiou) ** tf Fixed a problem which caused the expression below to fail. tf (Boeing707) \ tf (Boeing707) =============================================================================== control-2.8.4 Release Date: 2015-09-02 Release Manager: Lukas Reichlin =============================================================================== ** tf Fixed a bug which affected interconnections of MIMO transfer functions. (Reported by Piet Wertelaers) ** VLFamp Included new demo created by Thomas D. Dean. =============================================================================== control-2.8.3 Release Date: 2015-07-01 Release Manager: Lukas Reichlin =============================================================================== ** LTI models & iddata datasets Support partial matching of property names. ** mpower Fixed bug #45336. Improved reliability for the power computation of MIMO transfer functions. (Reported by Nick Jankowski) ** set Fixed bug #45371. The iddata properties 'name', 'notes' and 'userdata' are now stored as expected. (Thanks to Petr Ledvina) =============================================================================== control-2.8.2 Release Date: 2015-06-15 Release Manager: Lukas Reichlin =============================================================================== ** tf Fixed a problem when converting certain MIMO descriptor state-space systems to transfer function models. ** minreal Fixed bug #43263. Affected were transfer function models. (Thanks to Endre Kozma) ** n4sid, moesp, moen4 Fixed bug #41716. Display a meaningful error message when the iddata dataset contains not enough samples per experiment. (Reported by John W. Eaton) ** rlocus Fixed bug #44949. Fixed a problem with discontinuous plots for systems like the one below. (Thanks to Doug Stewart) sys = tf ([1 0 0 0 0 0 1], [1 0 0 0 1 0 0 0 0 1]) rlocus (sys) =============================================================================== control-2.8.1 Release Date: 2015-05-03 Release Manager: Lukas Reichlin =============================================================================== ** tf -- Revamped the modifications of TB01ZD from control version 2.8.0. The function now uses LAPACK routines to find the maximum norm element. (Thanks to Thomas Vasileiou) -- Improved error handling when converting state-space models. =============================================================================== control-2.8.0 Release Date: 2015-03-22 Release Manager: Lukas Reichlin =============================================================================== ** zero Compatibility fix in the C++ oct-file to support the upcoming Octave 4.0. (Thanks to Andreas Weber) ** isminimumphase Reverted changes from control-2.6.6. According to the definition of Byrnes/Isidori, the function tests whether the system has asymptotically stable zero dynamics. The poles are not tested. Note that the definition from Wikipedia is mixed up. For details, see the help text of the function (help @lti/isminimumphase) and the papers referenced therein. (Thanks to Ulf Schaper) ** series Fixed a bug which gave unnecessary error messages when the function is called with 4 arguments. (Thanks to Ulf Schaper) ** tf Resolved issues in MIMO state-space to transfer function conversion by implementing a more robust algorithm in SLICOT routine TB01ZD. The same algorithm is used in Octave's krylov function. (Thanks to Thomas Vasileiou) ** It is now possible to cross-compile the control package. (Thanks to John Donoghue) ** Support for 64bit indexing, i.e. Octave versions built with the --enable-64 option. (Thanks to Mike Miller) ** The control package now depends on Octave version 3.8.0 or beyond. ** In order to comply with modified Octave Forge rules, the package no longer auto-loads by default. See "help pkg" for details on auto-loading. =============================================================================== control-2.6.6 Release Date: 2014-10-11 Release Manager: Lukas Reichlin =============================================================================== ** isminimumphase According to , both the zeros and the poles of a minimum-phase system must be strictly inside the left complex half-plane (continuous-time case) or inside the unit circle (discrete-time case). Previously, the poles were not tested. (Thanks to Endre Kozma) =============================================================================== control-2.6.5 Release Date: 2014-06-16 Release Manager: Lukas Reichlin =============================================================================== ** LTI models -- The operator "times" (.*) no longer errors out when it is called with one SISO and one MIMO LTI system. The operator behaves now the same way as Octave's built-in "times" for one scalar and one matrix. -- The function "repmat" is now overloaded for LTI systems. -- Added function "repsys" as an alias for "repmat" for the sake of Matlab compatibility. ** zero Fix crash in case of empty state-space models, e.g. zero (ss) =============================================================================== control-2.6.4 Release Date: 2014-05-05 Release Manager: Lukas Reichlin =============================================================================== ** LTI models -- Fixed bug #42082. The operators mtimes (*), mldivide (\) and mrdivide (/) no longer error out when they are called with one SISO and one MIMO LTI system. They now behave the same way as they do with one scalar and one matrix. -- Refuse struct arrays as input and output groups. -- Display non-empty properties of type 'name'. ** TF models -- Added TF-specific horzcat ([tf1, tf2]) and vertcat ([tf1; tf2]) operators which override the general LTI operators. Their introduction avoids the conversion to state-space and back when MIMO transfer functions are concatenated horizontally and/or vertically. -- Added operator times (.*) to compute Hadamard/Schur product of two transfer function matrices. This operator is useful to compute the Relative-Gain Array (RGA), e.g. G = tf (Boeing707) RGA = G .* inv (G).' RGA(0) =============================================================================== control-2.6.3 Release Date: 2014-04-22 Release Manager: Lukas Reichlin =============================================================================== ** SS models For interconnections, support special case where the internal matrix (I - D*M) is singular, e.g. feedback (ss (-1, 1, 4, 1), '+') ** FRD models Fixed bug which let frequency response plots fail, e.g. bode (frd (tf (1, [1, 1]))) ** tf Refuse denominators which are zero. ** c2d For zero-order hold approximation, use SLICOT MB05ND instead of Octave's "expm" to compute the matrix exponential. Better accuracy is to be expected. ** connect -- Improved argument checking for legacy connection matrix. -- Document usage of index-based interconnections. ** inv -- Handle i/o names and groups correctly. -- Conserve the meaning of states by using the Matlab-compatible formula instead of the SLICOT-compatible one. -- Always use conversion to state-space and back for the inversion of MIMO transfer functions, even for 2x2 systems. ** pole Compute poles of descriptor state-space models with SLICOT AG08BD instead of Octave's built-in "eig" function. ** zero The gain of descriptor state-space models is now computed correctly. (Special thanks to Thomas Vasileiou for all the fixes above) ** rlocus -- Function "rlocus" now supports the fltk graphics toolkit. (Thanks to Doug Stewart) -- Fixed bug #41820. Function "rlocus" no longer errors out for certain systems like rlocus (tf ([1, 4, 4], [1, 8, 1, 8, 0])) ** transpose, ctranspose Delete i/o groups of transposed (sys.') or conjugate transposed (sys') LTI models. ** IDDATA identification datasets Raise an error if non-real-valued input or output matrices are assigned to time-domain datasets via the "set" function or subscripted assignment. =============================================================================== control-2.6.2 Release Date: 2014-02-02 Release Manager: Lukas Reichlin =============================================================================== ** hinfsyn, mixsyn By default, hinfsyn and mixsyn compute now an optimal instead of a suboptimal controller. Furthermore, Matlab compatibility is improved if hinfsyn/mixsyn is called with more than three/four input arguments. (Thanks to Thomas Vasileiou for the gamma iteration) The old behavior (sub-optimal controller) can be restored by the expressions hinfsyn (P, nmeas, ncont, 'method', 'sub') mixsyn (G, W1, W2, W3, 'method', 'sub') ** h2syn, hinfsyn, mixsyn, ncfsyn For Matlab compatibility, the third return argument is now norm "gamma". The info struct is now returned as fourth argument. [K, N, gamma, info] = *syn (G, …) ** mktito New function to partition plant for robust control. "mktito" is also used by function "augw". If a plant is partitioned that way, one can omit the inputs "nmeas" and "ncon" when calling the functions "hinfsyn" and "h2syn". ** ss The conversion of realizable descriptor systems to regular state-space form is now possible, even when the descriptor matrix "E" is singular. (Thanks to Thomas Vasileiou and Bruce Minaker) =============================================================================== control-2.6.1 Release Date: 2013-12-10 Release Manager: Lukas Reichlin =============================================================================== ** LTI models Raise an error if the user tries to create an ingroup or outgroup with indices larger than the number of inputs m or outputs p. ** thiran New function to approximate a continuous-time delay by a discrete-time allpass Thiran filter. (Thanks to Thomas Vasileiou and Spencer Jackson) ** end "end" indexing for LTI and IDDATA objects works now as expected. =============================================================================== control-2.6.0 Release Date: 2013-10-24 Release Manager: Lukas Reichlin =============================================================================== ** LTI models -- Support for name-based channel selection in various commands. Example: sys = Boeing707, sys('pitch', {'rudder', 'thrust'}) instead of sys(2, [2, 1]). -- New properties "ingroup" and "outgroup" to pool several channels: sys.ingroup.controls = [3, 1], sys.outgroup.measurements = [1, 2] sys('measurements', 'controls') instead of sys([1, 2], [3, 1]). -- Support names instead of indices in commands like "feedback" and "xperm". ** connect Support name-based interconnections. This means that the LTI models passed to "connect" will be interconnected automatically if they have their inputs and outputs named accordingly. ** sumblk New function to build summing junctions for name-based interconnections by "connect". Example: Sum = sumblk ('e = r - y + n') ** tf State-space to transfer function conversions of static gains, e.g. "tf (ss (5))", no longer error out. (Thanks to Thomas Vasileiou) ** IDDATA identification datasets Support for name-based output, input and experiment selection similar to LTI models. =============================================================================== control-2.4.5 Release Date: 2013-10-07 Release Manager: Lukas Reichlin =============================================================================== ** Compatibility to GNU Octave 3.8 Replaced line continuation marker "\" by "..." to avoid deprecated syntax warning. (Thanks to John W. Eaton) ** db2mag, mag2db New functions to convert Decibels to Magnitude and vice versa. ** d2d New function for resampling of discrete-time models. =============================================================================== control-2.4.4 Release Date: 2013-08-11 Release Manager: Lukas Reichlin =============================================================================== ** zero -- Fix documentation. Function "zero" computes the invariant zeros, not the transmission zeros when it is called with one input argument. -- Added new options to compute the system, transmission, input decoupling and output decoupling zeros besides the already existing invariant zeros. Examples: z = zero (sys, 'system'), z = zero (sys, 'transmission') -- Return an "info" struct as third output argument. It contains additional rank information as well as Kronecker indices and the numbers of infinite elementary divisors. Example: [z, k, info] = zero (sys) (Special thanks to Ferdinand Svaricek) ** resample The "resample" function for "iddata" identification datasets now handles unspecified sampling times (tsam = -1) correctly. ** Time response functions (impulse, initial, lsim, ramp, step) Fix a thinko introduced with control-2.4.3. In some cases, several responses were mistakingly plotted on the same subplot. (Thanks to Thomas Vasileiou) ** Various documentation enhancements and fixes. =============================================================================== control-2.4.3 Release Date: 2013-07-12 Release Manager: Lukas Reichlin =============================================================================== ** resample The resample function for iddata sets now adjusts the sampling time correctly after resampling. ** Time response functions (impulse, initial, lsim, ramp, step) Don't use subplot for SISO models. This allows the user to plot different responses on a single figure by calling subplot. (Thanks to Matthias Meier) ** h2syn, hinfsyn, mixsyn, ncfsyn Third return argument is now an info struct. [K, N, info] = *syn (G, …) ** optiPID Beef up documentation. =============================================================================== control-2.4.2 Release Date: 2013-02-16 Release Manager: Lukas Reichlin =============================================================================== ** Transfer function to state-space conversion (Thanks to Thomas Vasileiou): -- Fix crash. -- Fix bug if denominators are zero. ** minreal Fix crash in minreal for state-space systems. (Thanks to Thomas Vasileiou) ** sigma The plot types 1, 2, 3 were no longer supported since the introduction of multi-system plots in control-2.3.54. The help text is now updated accordingly and cruft is removed from the codebase. ** mixsyn, ncfsyn, Madievski Beef up help text. =============================================================================== control-2.4.1 Release Date: 2012-11-01 Release Manager: Lukas Reichlin =============================================================================== ** impulse, initial, lsim, step These time response functions now error out correctly when the user tries to plot multiple systems in one window with mismatching numbers of inputs and outputs. The problem was caused by Octave's built-in function "size_equal" which gave false positives for LTI objects. The problem is solved by overloading the built-in function with a new LTI method "size_equal". ** ramp Added a new time domain analysis function "ramp" which plots/computes the system's response to a ramp signal. ** c2d, d2c Added matched pole/zero discretization method "matched". Usage: Gd = c2d (Gc, Ts, 'matched'), Gc = d2c (Gd, 'matched') ** doc/control.pdf Revised PDF manual. There is now a function index at the end of the manual. Improved docstrings in several functions. =============================================================================== control-2.4.0 Release Date: 2012-09-26 Release Manager: Lukas Reichlin =============================================================================== ** Multiplot feature for time-domain plotting: impulse lsim initial step Supported are now function calls like impulse (sys1, sys2, ...), step (sys1, 'b', sys2, 'r', ...) lsim (sys1, '-k', sys2, '--k', u), initial (sys, sys2, x0) The multiplot feature for frequency-domain plotting has already been introduced with control-2.3.54. ** Anderson, Madievski, MDSSystem, optiPID Updated example scripts to use new multiplot feature. ** sensitivity Fixed a problem with plotting, introduced with control-2.3.54. ** doc/control.pdf Updated PDF manual. =============================================================================== control-2.3.54 Release Date: 2012-09-15 Release Manager: Lukas Reichlin =============================================================================== ** Multiplot feature for frequency-domain plotting: bode nichols pzmap bodemag nyquist sigma The functions above support calls like sigma (sys1, sys2, ...), nyquist (sys1, 'b', sys2, 'r', ...), bode (sys1, '-k', sys2, '-.k', sys3, ':k', {wmin, wmax}). Time domain functions are not yet multiplot ready, but they will follow in control-2.4.0. ** plot A selection of experiments from iddata identification datasets can be plotted by plot (dat, exp) instead of plot (dat(:,:,:,exp)). ** sensitivity Fixed a problem where an error was raised about an undefined function "issiso". ** All SLICOT function names have now leading and trailing underscores to emphasize their private nature. =============================================================================== control-2.3.53 Release Date: 2012-08-27 Release Manager: Lukas Reichlin =============================================================================== ** Added new functions for system identification, including: arx iddata ifft moen4 detrend nkshift moesp fft plot n4sid filter resample ** sensitivity Added new function to compute and plot the sensitivity margin Ms. ** feedback Fixed an argument check which caused false positive error messages. It was a copy-paste mistake affecting non-square systems. (Thanks to Tony Olivo) =============================================================================== control-2.3.52 Release Date: 2012-06-25 Release Manager: Lukas Reichlin =============================================================================== ** Fixed a silly mistake in MIMO transfer function to state-space conversion. The bug has been introduced with control-2.3.51. (Thanks to Jim Rawlings for providing the test case) ** dlqe, lqe Added new functions for linear quadratic estimators. (Thanks to Megan Zagrobelny) ** Upon request of the Debian maintainers, the tex-files control.tex and functions.texi for generating control.pdf are included in the doc folder, next to control.pdf. Note that functions.texi is generated automatically by the scripts in the control/devel folder and the package generate_html. They are not included in the control package and can be found on the OctaveForge SVN server. ** Minor improvements in various help texts. =============================================================================== control-2.3.51 Release Date: 2012-06-03 Release Manager: Lukas Reichlin =============================================================================== ** filt, filtdata, tf -- Added function "filt" to specify disrete-time transfer functions in DSP format, i.e. z^-1. -- Added function "filtdata" to return any type of discrete-time LTI model in DSP format. -- tf models have a new property "inv". To display a discrete-time TF sys in z^-1, set sys.inv=true. In order to switch to z, set sys.inv=false. "filt" sets property "inv" to true (z^-1) by default, while "tf" uses false (z) as default value. ** ctranspose Conjugate transpose or pertransposition of LTI objects. Used by Octave for "sys'". For a transfer-function matrix G, G' denotes the conjugate of G given by G.'(-s) for a continuous-time system or G.'(1/z) for a discrete-time system. The frequency response of the pertransposition of G is the Hermitian (conjugate) transpose of G(jw), i.e. freqresp (G', w) = freqresp (G, w)'. WARNING: Do NOT use this for dual problems, use the transpose "sys.'" (note the dot) instead. ** test_control Add a few remarks to the help text regarding the severity of failing tests. ** Makefile fixed to work with non-standard linker options e.g on Apple. ** The conversion to state-space of multi-input transfer functions with common row denominators is now handled more efficiently. =============================================================================== control-2.3.50 Release Date: 2012-03-06 Release Manager: Lukas Reichlin =============================================================================== ** Added new functions for frequency-weighted model and controller order reduction: bstmodred btaconred btamodred cfconred hnamodred fwcfconred spamodred spaconred ** Anderson, Madievski -- Added two examples for controller reduction. The m-files are named after the authors of the corresponding papers. ** fitfrd -- Added function to fit frequency response data with a state-space model. ** set -- The set command doesn't need a return argument anymore in order to save the modified values. set (sys, "key", value) is now equivalent to sys = set (sys, "key", value). ** Require Octave version 3.6.0 or better. (The frequency response plotting commands have been simplified. They now use the fixed "axis tight" command. This is a first step towards multiple systems in one plot, e.g. bode (sys1, sys2, sys3). Furthermore, the code takes advantage of the new "arrayfun" function which became a faster oct-file instead of an m-file) ** Revised package installation and cleanup efforts under the hood. The new solution compiles the SLICOT library in a less barbaric way and creates only a single oct-file containing all the SLICOT routines. This also brings along faster compile times. (Special thanks to Hans Buchmann, Carlo De Falco and Michael Goffioul for their advice) ** doc/control.pdf -- Extended PDF manual. =============================================================================== control-2.2.5 Release Date: 2012-02-09 Release Manager: Lukas Reichlin =============================================================================== ** Improved Matlab compatibility for frequency response commands. It is now possible to specify a frequency range. Example: bode (sys, {wmin, wmax}) where wmin and wmax denote frequencies in rad/s. ** margin -- Fixed a variable name such that discrete-time models are plotted without an error. (Thanks to Renato Caldas) =============================================================================== control-2.2.4 Release Date: 2012-01-07 Release Manager: Lukas Reichlin =============================================================================== ** Compatibility with Octave 3.6.0. (The makefile must specify the libraries that mkoctfile needs to link. Thanks to Marco Atzeri and Carlo De Falco) ** ctrbf, obsvf -- Added new functions to compute controllable and observable block Hessenberg realizations based on SLICOT TB01UD. (Thanks to Benjamin Fernandez and Alexandre Felipe) =============================================================================== control-2.2.3 Release Date: 2011-12-07 Release Manager: Lukas Reichlin =============================================================================== ** Improved performance when computing the frequency response of transfer function models by orders of magnitude. (I realized that "polyval" can evaluate a polynomial at several values at once in a vectorized manner.) ** bode, bodemag, nichols, sigma -- Fixed a hang when plotting pairs of purely imaginary poles or zeros. The hang was caused by nonsensical (Inf, NaN) axis values. (Reported by Laurent Tissier) ** Use single instead of double quotes when displaying names of TF and FRD models. =============================================================================== control-2.2.2 Release Date: 2011-12-04 Release Manager: Lukas Reichlin =============================================================================== ** Improved error messages for place, ARE solvers and robust control commands. ** minreal, ss -- Fixed a crash for descriptor models. minreal for dss models as well as conversion from non-proper transfer functions to descriptor state-space models should work now as expected. ** ss -- Revised default tolerance for transfer function to state-space conversion by SLICOT TD04AD. ** Better performance when computing the frequency response of SISO transfer function models. ** Reorganized tests. Most tests have been moved from "ltimodels" to the files of the LTI methods being tested. All available tests can be executed by "test_control". ** The NEWS file is handled correctly when using Octave version 3.6. Type "news("control")" or "news control" to display the news (3.6 only). =============================================================================== control-2.2.1 Release Date: 2011-10-24 Release Manager: Lukas Reichlin =============================================================================== ** tf -- Fixed a nasty bug that prevented shortening of numerator and denominator polynomials consisting solely of zeros. -- MIMO support for descriptor state-space to transfer function conversion. Usage: tf_sys = tf (dss_sys) -- MIMO support for interconnections of non-proper transfer functions via internal conversion to state-space. ** ss -- Support conversion from non-proper transfer function to descriptor state- space. Usage: dss_sys = ss (tf_sys) ** c2d, d2c -- Support bilinear transformation of descriptor state-space models. ** inv -- Support the inversion of MIMO transfer functions. Inverses of 2x2 TFs are computed directly, larger models are computed internally in state-space. ** place -- Return the number of fixed, assigned and uncontrollable poles in a single "info" struct instead of three individual output arguments. ** rlocus -- Clarify usage statement in help string. -- Check whether system is SISO. ** MDSSystem -- Display bode plots of controllers instead of singular value plots of the closed loops. ** hsvd -- Added option "alpha" to specify the alpha-stability boundary for the eigenvalues of the state dynamics matrix A. ** isctrb, isobsv -- Return number of controllable/observable states as a second output argument. ** doc/control.pdf -- Added preface to PDF manual. =============================================================================== control-2.2.0 Release Date: 2011-09-26 Release Manager: Lukas Reichlin =============================================================================== ** ss -- Transfer function to state-space conversion uses now SLICOT TD04AD. Conversion of MIMO models is now supported. Usage: ss_sys = ss (tf_sys) ** tf -- Support for interconnections of MIMO transfer functions. This is done by an internal conversion to a minimal state-space representation. With the current tf2ss and ss2tf conversions, only proper transfer function are supported. This limitation does not exist for SISO transfer functions. -- Fixed a cellfun statement that caused problems on MinGW32 builds and possibly some others. (Reported by Bernhard Weller) ** pole, zero -- Computation of poles and zeros of MIMO transfer functions is now possible via conversion to state-space. Please note that the state-space realization of SLICOT TD04AD is a minimal one. Therefore certain poles and zeros might be missing. ** zpk, zpkdata -- Included wrappers that create transfer function models from zero-pole-gain data (zpk) and zero-pole-gain data from lti models (zpkdata). They are stop-gap measures for compatibility until ZPK models are implemented. ** tfdata -- "vector" option added. For SISO models, it returns numerator and denominator directly as column vectors instead of cells containing a single column vector. ** doc/control.pdf -- Revised PDF manual. =============================================================================== control-2.1.55 Release Date: 2011-09-07 Release Manager: Lukas Reichlin =============================================================================== ** c2d -- Support for "tustin" and "prewarp" method added. -- Transfer functions are now supported via the state-space methods. -- Improved Texinfo string. ** d2c -- Discrete to continuous-time conversion added. However, support is limited to the zero-order hold, tustin and pre-warping methods. ** Conversion from descriptor to regular state-space is now performed by SLICOT routine SB10JD. Better numerical results are to be expected over the previous naive inversion formula. This conversion is used internally for ssdata and some other functions. =============================================================================== control-2.1.54 Release Date: 2011-08-22 Release Manager: Lukas Reichlin =============================================================================== ** tf -- State-space to transfer function conversion uses now SLICOT TB04BD. Conversion of MIMO models is now supported. Usage: tf_sys = tf (ss_sys) -- Display an empty line between title and numerator for better readability. -- Display whether model is static, continuous- or discrete-time. ** A PDF manual is included for the first time. It is located inside the "doc" folder. It has been generated automatically from the Texinfo help strings and is not yet completely sorted out. =============================================================================== control-2.1.53 Release Date: 2011-08-08 Release Manager: Lukas Reichlin =============================================================================== ** ncfsyn -- Added support for McFarlane/Glover loop shaping design procedure. "ncfsyn" stands for Normalized Coprime Factor Synthesis. ** MDSSystem -- Added example script which demonstrates the usage of the robust control commands "mixsyn" and "ncfsyn". ** Texinfo help strings of several functions have been extended, although documentation still leaves a lot to be desired. =============================================================================== control-2.1.52 Release Date: 2011-07-27 Release Manager: Lukas Reichlin =============================================================================== ** hsvd -- Use scaling unless state-space model property "scaled" is set to true. ** norm -- Use scaling for computation of L-infinity norm unless state-space model property "scaled" is set to true. ** minreal -- Use scaling for state-space and descriptor state-space models unless property "scaled" is set to true. -- More accurate results are to be expected for descriptor state-space models by performing only those reduction phases where effective order reduction occurs. This is achieved by saving the system matrices before each phase and restoring them if no order reduction took place. ** zero -- Use scaling for state-space and descriptor state-space models unless property "scaled" is set to true. ** frdata -- The frequency response is now returned correctly as an array and not as a vector, unless the "vector" option is set and the system is single-input single-output. -- Added help text. =============================================================================== control-2.1.51 Release Date: 2011-07-21 Release Manager: Lukas Reichlin =============================================================================== ** frd -- Support for Frequency Response Data (frd) measurement "models". =============================================================================== control-2.1.50 Release Date: 2011-07-06 Release Manager: Lukas Reichlin =============================================================================== ** ss -- Support for property "scaled". By default, it is set to "false". ** prescale -- Scaling for state-space models (SLICOT TB01ID) and descriptor models (SLICOT TG01AD). ** freqresp -- Scale state-space models using @lti/prescale.m if property "scaled" is set to "false". Frequency response commands now perform automatic scaling unless model property "scaled" is set to "true". =============================================================================== control-2.0.2 Release Date: 2011-03-18 Release Manager: Lukas Reichlin =============================================================================== ** lsim -- Fixed a logical error that refused valid initial state vectors. It was due to a thinko introduced with the changes in control-2.0.1. (Thanks to Rob Frohne) =============================================================================== control-2.0.1 Release Date: 2011-03-06 Release Manager: Lukas Reichlin =============================================================================== ** lsim -- Support time vectors not starting at zero. (Thanks to Rob Frohne) -- Improved help text. ** zero -- The gain of descriptor state-space models is now computed correctly. (fingers crossed) =============================================================================== control-2.0.0 Release Date: 2011-02-08 Release Manager: Lukas Reichlin =============================================================================== ** First official release. =============================================================================== control/src/0000755000076500000240000000000012614620313012325 5ustar lukasstaffcontrol/src/__control_helper_functions__.cc0000644000076500000240000000116412614620313020541 0ustar lukasstaff#include "is_real_scalar.cc" #include "is_real_vector.cc" #include "is_real_matrix.cc" #include "is_real_square_matrix.cc" #include "is_matrix.cc" #include "is_zp_vector.cc" #include "lti_input_idx.cc" #include "nfields2.cc" // delete this if support for Octave 3.8 gets dropped // stub function to avoid gen_doc_cache warning upon package installation DEFUN_DLD (__control_helper_functions__, args, nargout, "-*- texinfo -*-\n\ Helper functions for the control package.\n\ For internal use only.") { octave_value_list retval; error ("__control_helper_functions__: for internal use only"); return retval; } control/src/__control_slicot_functions__.cc0000644000076500000240000000735512614620313020567 0ustar lukasstaff#include "sl_ab08nd.cc" // invariant zeros of state-space models #include "sl_ab13dd.cc" // L-infinity norm #include "sl_sb10hd.cc" // H-2 controller synthesis - continuous-time #include "sl_sb10ed.cc" // H-2 controller synthesis - discrete-time #include "sl_ab13bd.cc" // H-2 norm #include "sl_sb01bd.cc" // pole assignment #include "sl_sb10fd.cc" // H-infinity controller synthesis - continuous-time #include "sl_sb10dd.cc" // H-infinity controller synthesis - discrete-time #include "sl_sb03md.cc" // Lyapunov equations #include "sl_sb04md.cc" // Sylvester equations - continuous-time #include "sl_sb04qd.cc" // Sylvester equations - discrete-time #include "sl_sg03ad.cc" // generalized Lyapunov equations #include "sl_sb02od.cc" // algebraic Riccati equations #include "sl_ab13ad.cc" // Hankel singular values #include "sl_ab01od.cc" // staircase form using orthogonal transformations #include "sl_tb01pd.cc" // minimal realization of state-space models #include "sl_sb03od.cc" // Cholesky factor of Lyapunov equations #include "sl_sg03bd.cc" // Cholesky factor of generalized Lyapunov equations #include "sl_ag08bd.cc" // finite Smith zeros of descriptor state-space models #include "sl_tg01jd.cc" // minimal realization of descriptor state-space models #include "sl_tg01hd.cc" // controllability staircase form of descriptor state-space models #include "sl_tg01id.cc" // observability staircase form of descriptor state-space models #include "sl_sg02ad.cc" // solution of algebraic Riccati equations for descriptor systems #include "sl_tg04bx.cc" // gain of descriptor state-space models #include "sl_tb01id.cc" // scaling of state-space models #include "sl_tg01ad.cc" // scaling of descriptor state-space models #include "sl_sb10id.cc" // H-infinity loop shaping - continuous-time #include "sl_sb10kd.cc" // H-infinity loop shaping - discrete-time - strictly proper case #include "sl_sb10zd.cc" // H-infinity loop shaping - discrete-time - proper case #include "sl_tb04bd.cc" // state-space to transfer function conversion #include "sl_ab04md.cc" // bilinear transformation #include "sl_sb10jd.cc" // descriptor to regular state-space conversion #include "sl_td04ad.cc" // transfer function to state-space conversion #include "sl_tb01ud.cc" // controllable block Hessenberg realization #include "sl_ab09hd.cc" // balanced stochastic truncation model reduction #include "sl_ab09id.cc" // balanced truncation & singular perturbation approximation model reduction #include "sl_ab09jd.cc" // Hankel-norm approximation model reduction #include "sl_sb16ad.cc" // balanced truncation & singular perturbation approximation controller reduction #include "sl_sb16bd.cc" // coprime factorization state-feedback controller reduction #include "sl_sb16cd.cc" // frequency-weighted coprime factorization state-feedback controller reduction #include "sl_sb10yd.cc" // fit state-space model to frequency response data #include "sl_ident.cc" // system identification #include "sl_ib01cd.cc" // compute initial state vector #include "sl_ib01ad.cc" // compute singular values // #include "sl_are.cc" // solve ARE with Schur vector approach and scaling #include "sl_tg01fd.cc" // orthogonal reduction of dss to a SVD-like coordinate form #include "sl_sb10ad.cc" // H-infinity optimal controller using modified Glover's and Doyle's formulas (continuous-time) #include "sl_mb05nd.cc" // matrix exponential and integral for a real matrix // stub function to avoid gen_doc_cache warning upon package installation DEFUN_DLD (__control_slicot_functions__, args, nargout, "-*- texinfo -*-\n\ Slicot Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_value_list retval; error ("__control_slicot_functions__: for internal use only"); return retval; } control/src/common.cc0000644000076500000240000000507512614620313014133 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Common code for oct-files. Author: Lukas Reichlin Created: April 2010 Version: 0.4 */ #include octave_idx_type max (octave_idx_type a, octave_idx_type b) { if (a > b) return a; else return b; } octave_idx_type max (octave_idx_type a, octave_idx_type b, octave_idx_type c) { return max (max (a, b), c); } octave_idx_type max (octave_idx_type a, octave_idx_type b, octave_idx_type c, octave_idx_type d) { return max (max (a, b), max (c, d)); } octave_idx_type max (octave_idx_type a, octave_idx_type b, octave_idx_type c, octave_idx_type d, octave_idx_type e) { return max (max (a, b, c, d), e); } octave_idx_type min (octave_idx_type a, octave_idx_type b) { if (a < b) return a; else return b; } void error_msg (const char name[], octave_idx_type index, octave_idx_type max, const char* msg[]) { if (index == 0) return; if (index < 0) error ("%s: the %d-th argument had an invalid value", name, index); else if (index <= max) error ("%s: %s", name, msg[index]); else error ("%s: unknown error, info = %d", name, index); } void warning_msg (const char name[], octave_idx_type index, octave_idx_type max, const char* msg[]) { if (index == 0) return; if (index > 0 && index <= max) warning ("%s: %s", name, msg[index]); else warning ("%s: unknown warning, iwarn = %d", name, index); } void warning_msg (const char name[], octave_idx_type index, octave_idx_type max, const char* msg[], octave_idx_type offset) { if (index == 0) return; if (index > 0 && index <= max) warning ("%s: %s", name, msg[index]); else if (index > offset) warning ("%s: %d+%d: %d %s", name, offset, index-offset, index-offset, msg[max+1]); else warning ("%s: unknown warning, iwarn = %d", name, index); } control/src/common.h0000644000076500000240000000307312614620313013771 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Common code for oct-files. Author: Lukas Reichlin Created: February 2012 Version: 0.2 */ #ifndef COMMON_H #define COMMON_H octave_idx_type max (octave_idx_type a, octave_idx_type b); octave_idx_type max (octave_idx_type a, octave_idx_type b, octave_idx_type c); octave_idx_type max (octave_idx_type a, octave_idx_type b, octave_idx_type c, octave_idx_type d); octave_idx_type max (octave_idx_type a, octave_idx_type b, octave_idx_type c, octave_idx_type d, octave_idx_type e); octave_idx_type min (octave_idx_type a, octave_idx_type b); void error_msg (const char name[], octave_idx_type index, octave_idx_type max, const char* msg[]); void warning_msg (const char name[], octave_idx_type index, octave_idx_type max, const char* msg[]); void warning_msg (const char name[], octave_idx_type index, octave_idx_type max, const char* msg[], octave_idx_type offset); #endif control/src/is_matrix.cc0000644000076500000240000000342012614620313014632 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if all arguments are matrices and false otherwise. Author: Lukas Reichlin Created: June 2012 Version: 0.2 */ #include // PKG_ADD: autoload ("is_matrix", "__control_helper_functions__.oct"); DEFUN_DLD (is_matrix, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_matrix (@var{a}, @dots{})\n\ Return true if all arguments are matrices and false otherwise.\n\ @var{[]} is a valid matrix.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_square_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; octave_idx_type nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (octave_idx_type i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! args(i).is_numeric_type () || ! (args(i).is_complex_type () || args(i).is_real_type ())) { retval = false; break; } } } return retval; } control/src/is_real_matrix.cc0000644000076500000240000000341412614620313015640 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if all arguments are real-valued matrices and false otherwise. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include // PKG_ADD: autoload ("is_real_matrix", "__control_helper_functions__.oct"); DEFUN_DLD (is_real_matrix, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_matrix (@var{a}, @dots{})\n\ Return true if all arguments are real-valued matrices and false otherwise.\n\ @var{[]} is a valid matrix.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_square_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; octave_idx_type nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (octave_idx_type i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_real_scalar.cc0000644000076500000240000000342612614620313015604 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if all arguments are real-valued scalars and false otherwise. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include // PKG_ADD: autoload ("is_real_scalar", "__control_helper_functions__.oct"); DEFUN_DLD (is_real_scalar, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_scalar (@var{a}, @dots{})\n\ Return true if all arguments are real-valued scalars and false otherwise.\n\ @var{[]} is not a valid scalar.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_vector}\n\ @end deftypefn") { octave_value retval = true; octave_idx_type nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (octave_idx_type i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! args(i).is_scalar_type () || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_real_square_matrix.cc0000644000076500000240000000353212614620313017221 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if all arguments are real-valued, square matrices and false otherwise. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include // PKG_ADD: autoload ("is_real_square_matrix", "__control_helper_functions__.oct"); DEFUN_DLD (is_real_square_matrix, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_square_matrix (@var{a}, @dots{})\n\ Return true if all arguments are real-valued, square matrices and false otherwise.\n\ @var{[]} is a valid square matrix.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; octave_idx_type nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (octave_idx_type i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || args(i).rows () != args(i).columns () || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_real_vector.cc0000644000076500000240000000350512614620313015637 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if all arguments are real-valued vectors and false otherwise. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include // PKG_ADD: autoload ("is_real_vector", "__control_helper_functions__.oct"); DEFUN_DLD (is_real_vector, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_vector (@var{a}, @dots{})\n\ Return true if all arguments are real-valued vectors and false otherwise.\n\ @var{[]} is not a valid vector.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_square_matrix, is_real_matrix, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; octave_idx_type nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (octave_idx_type i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! (args(i).rows () == 1 || args(i).columns () == 1) || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_zp_vector.cc0000644000076500000240000000360712614620313015350 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if all arguments zero-pole vectors and false otherwise. Author: Lukas Reichlin Created: October 2015 Version: 0.1 */ #include // PKG_ADD: autoload ("is_zp_vector", "__control_helper_functions__.oct"); DEFUN_DLD (is_zp_vector, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_zp_vector (@var{a}, @dots{})\n\ Return true if all arguments are zero-pole vectors and false otherwise.\n\ @var{[]} is a valid zero-pole vector.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_square_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; octave_idx_type nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (octave_idx_type i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || (args(i).rows () > 1 && args(i).columns () > 1) || ! args(i).is_numeric_type () || ! (args(i).is_complex_type () || args(i).is_real_type ())) { retval = false; break; } } } return retval; } control/src/lti_input_idx.cc0000644000076500000240000000630212614620313015510 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . First, this function implemented the following Octave function in C++ function [mat_idx, opt_idx] = __lti_input_idx__ (varargin) str_idx = find (cellfun (@ischar, varargin)); if (isempty (str_idx)) mat_idx = 1 : nargin; opt_idx = []; else mat_idx = 1 : str_idx(1)-1; opt_idx = str_idx(1) : nargin; endif endfunction Later on, the C++ function was extended such that it recognizes classes in some cases. See comment block in the code for details. I know this looks like a horrible definition for a function, but it is exactly the behavior I need. Author: Lukas Reichlin Created: October 2015 Version: 0.1 */ #include // PKG_ADD: autoload ("__lti_input_idx__", "__control_helper_functions__.oct"); DEFUN_DLD (__lti_input_idx__, args, , "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {[@var{mat_idx}, @var{opt_idx}, @var{obj_flg}] =} __lti_input_idx__ (@var{args})\n\ Return some indices for cell @var{args}. For internal use only.\n\ Read the source code in @code{lti_input_idx.cc} for details.\n\ @end deftypefn") { octave_value_list retval; octave_idx_type nargin = args.length (); // first, check whether a cell is passed if (nargin == 1 && args(0).is_defined () && args(0).is_cell ()) { octave_idx_type len = args(0).cell_value().nelem(); octave_idx_type idx = len; octave_idx_type offset = 0; // if the cell is not empty, look for the first string for (octave_idx_type i = 0; i < len; i++) { if (args(0).cell_value().elem(i).is_string ()) { idx = i; break; } } // ** If the element before the first string is an object, // then this object belongs to the option index. // ss (d, ltisys, 'key', val) // ** If there is no string at all in cell args(0), check // whether the last element in args(0) is an object. // If so, this object also belongs to the option index. // tf (num, den, ltisys) // ** All other objects (before built-in types (except chars) // and after strings) are not recognized as objects. // ss (a, b, ltisys, c, d, 'key', val, 'lti', ltisys) if (len > 0 && idx > 0 && args(0).cell_value().elem(idx-1).is_object ()) { offset = 1; } Range mat_idx (1, idx-offset); Range opt_idx (idx+1-offset, len); retval(2) = offset; // abused as logical in the LTI constructors retval(1) = opt_idx; retval(0) = mat_idx; } else { print_usage (); } return retval; } control/src/Makefile0000644000076500000240000000255612614620313013775 0ustar lukasstaffMKOCTFILE ?= mkoctfile ifndef LAPACK_LIBS LAPACK_LIBS := $(shell $(MKOCTFILE) -p LAPACK_LIBS) endif ifndef BLAS_LIBS BLAS_LIBS := $(shell $(MKOCTFILE) -p BLAS_LIBS) endif ifndef FLIBS FLIBS := $(shell $(MKOCTFILE) -p FLIBS) endif LFLAGS := $(shell $(MKOCTFILE) -p LFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) AR := $(shell $(MKOCTFILE) -p AR) all: __control_slicot_functions__.oct \ __control_helper_functions__.oct # TODO: Private oct-files for control package. # unpack and compile SLICOT library # Note that TG04BX is a custom routine. # It has the extension .fortran such that # it is not deleted by rm *.f when using # the developer makefile makefile_control.m slicotlibrary.a: slicot.tar.gz tar -xzf slicot.tar.gz mkdir sltmp mv slicot/src/*.f ./sltmp mv slicot/src_aux/*.f ./sltmp cp TG04BX.fortran ./sltmp/TG04BX.f cp TB01ZD.fortran ./sltmp/TB01ZD.f cd sltmp; $(MKOCTFILE) -c *.f $(AR) -rc slicotlibrary.a ./sltmp/*.o rm -rf sltmp slicot # slicot functions __control_slicot_functions__.oct: __control_slicot_functions__.cc slicotlibrary.a LFLAGS="$(LFLAGS)" \ $(MKOCTFILE) __control_slicot_functions__.cc common.cc slicotlibrary.a # helper functions __control_helper_functions__.oct: __control_helper_functions__.cc $(MKOCTFILE) __control_helper_functions__.cc clean: rm -rf *.o core octave-core *.oct *~ *.f slicot sltmp realclean: clean rm -rf *.a control/src/nfields2.cc0000644000076500000240000000103512614620313014341 0ustar lukasstaff#include #include // PKG_ADD: autoload ("nfields2", "__control_helper_functions__.oct"); DEFUN_DLD (nfields2, args, , "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {} nfields (@var{s})\n\ Return the number of fields of the structure @var{s}.\n\ @end deftypefn") { octave_value retval; octave_idx_type nargin = args.length (); if (nargin == 1 && args(0).is_map ()) { retval = static_cast (args(0).nfields ()); } else print_usage (); return retval; } control/src/readme0000644000076500000240000000624412614620313013513 0ustar lukasstaffSLICOT Library Root Directory ----------------------------- SLICOT - Subroutine Library In COntrol Theory - is a general purpose basic mathematical library for control theoretical computations. The library provides tools to perform essential system analysis and synthesis tasks. The main emphasis in SLICOT is on numerical reliability of implemented algorithms and the numerical robustness and efficiency of routines. Providing algorithmic flexibility and the use of rigorous implementation and documentation standards are other SLICOT features. The SLICOT Library is available as standard Fortran 77 code in double precision. Each user-callable subroutine for control computations is accompanied by an example program which illustrates the use of the subroutine and can act as a template for the user's own routines. The SLICOT Library is organized by chapters, sections and subsections. The following chapters are currently included: A : Analysis Routines B : Benchmark and Test Problems D : Data Analysis F : Filtering I : Identification M : Mathematical Routines N : Nonlinear Systems (not yet available, except for some auxiliary routines for Wiener systems) S : Synthesis Routines T : Transformation Routines U : Utility Routines SLICOT Library Root Directory contains few, basic files for the SLICOT Library distribution and generation. When distributed, SLICOT software comes with several filled-in subdirectories (benchmark_data, doc, examples, examples77, src, and src_aux), and five files in this root directory: - this file, readme, - the file Installation.txt, describing the SLICOT software installation, - the main SLICOT Library documentation index, libindex.html, and - two template files for building the object library and executable programs, make.inc and makefile, - GNU GENERAL PUBLIC LICENSE Version 2 text file. The last two files might need few changes for being adapted to the specific platform used. Details about installing/updating the SLICOT software are given in the file Installation.txt. After software installation, this directory will also contain the library file slicot.a or slicot.lib, for Unix or Windows platforms, respectively. The library file could then be linked in applications programs, as usual. Specific examples are contained in the directories examples and examples77. The on-line documentation of the SLICOT user's callable routines is accessible via the main SLICOT Library documentation index, libindex.html. This file also contains a link to the documentation of the lower-level, support routines. The SLICOT Library is built on LAPACK (Linear Algebra PACKage) and BLAS (Basic Linear Algebra Subprograms) collections. Therefore, these packages should be available on the platform used. Basic References: 1. P. Benner, V. Mehrmann, V. Sima, S. Van Huffel, and A. Varga, "SLICOT - A Subroutine Library in Systems and Control Theory", Applied and Computational Control, Signals, and Circuits (Birkhauser), Vol. 1, Ch. 10, pp. 505-546, 1999. 2. S. Van Huffel, V. Sima, A. Varga, S. Hammarling, and F. Delebecque, "Development of High Performance Numerical Software for Control", IEEE Control Systems Magazine, Vol. 24, Nr. 1, Feb., pp. 60-76, 2004. control/src/sl_ab01od.cc0000644000076500000240000000771612614620313014413 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Staircase controllability form. Uses SLICOT AB01OD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: August 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab01od, AB01OD) (char& STAGES, char& JOBU, char& JOBV, octave_idx_type& N, octave_idx_type& M, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* U, octave_idx_type& LDU, double* V, octave_idx_type& LDV, octave_idx_type& NCONT, octave_idx_type& INDCON, octave_idx_type* KSTAIR, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab01od__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab01od__, args, nargout, "-*- texinfo -*-\n\ Slicot AB01OD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in char stages = 'F'; char jobu = 'I'; char jobv = 'N'; // not referenced because stages = 'F' Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); double tol = args(2).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldu = max (1, n); octave_idx_type ldv = 1; // arguments out Matrix u (ldu, n); double* v = 0; // not referenced because stages = 'F' octave_idx_type ncont; octave_idx_type indcon; OCTAVE_LOCAL_BUFFER (octave_idx_type, kstair, n); // workspace octave_idx_type ldwork = max (1, n + max (n, 3*m)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info; // SLICOT routine AB01OD F77_XFCN (ab01od, AB01OD, (stages, jobu, jobv, n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, u.fortran_vec (), ldu, v, ldv, ncont, indcon, kstair, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_ab01od__: exception in SLICOT subroutine AB01OD"); if (info != 0) error ("__sl_ab01od__: AB01OD returned info = %d", info); // resize a.resize (n, n); b.resize (n, m); u.resize (n, n); // return values retval(0) = a; retval(1) = b; retval(2) = u; retval(3) = octave_value (ncont); } return retval; } control/src/sl_ab04md.cc0000644000076500000240000000734712614620313014414 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Discrete-time <--> continuous-time systems conversion by a bilinear transformation. Uses SLICOT AB04MD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab04md, AB04MD) (char& TYPE, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double& ALPHA, double& BETA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab04md__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab04md__, args, nargout, "-*- texinfo -*-\n\ Slicot AB04MD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char type; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); double alpha = args(4).double_value (); double beta = args(5).double_value (); octave_idx_type discrete = args(6).int_value (); if (discrete == 0) type = 'C'; else type = 'D'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); // workspace octave_idx_type ldwork = max (1, n); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine AB04MD F77_XFCN (ab04md, AB04MD, (type, n, m, p, alpha, beta, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_ab04md__: exception in SLICOT subroutine AB04MD"); if (info != 0) error ("__sl_ab04md__: AB04MD returned info = %d", info); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; } return retval; } control/src/sl_ab08nd.cc0000644000076500000240000001746612614620313014424 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Invariant zeros of state-space models. Uses SLICOT AB08ND by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.8 */ #include #include #include "common.h" #include #include extern "C" { int F77_FUNC (ab08nd, AB08ND) (char& EQUIL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, const double* A, octave_idx_type& LDA, const double* B, octave_idx_type& LDB, const double* C, octave_idx_type& LDC, const double* D, octave_idx_type& LDD, octave_idx_type& NU, octave_idx_type& RANK, octave_idx_type& DINFZ, octave_idx_type& NKROR, octave_idx_type& NKROL, octave_idx_type* INFZ, octave_idx_type* KRONR, octave_idx_type* KRONL, double* AF, octave_idx_type& LDAF, double* BF, octave_idx_type& LDBF, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); int F77_FUNC (dggev, DGGEV) (char& JOBVL, char& JOBVR, octave_idx_type& N, double* AF, octave_idx_type& LDAF, double* BF, octave_idx_type& LDBF, double* ALPHAR, double* ALPHAI, double* BETA, double* VL, octave_idx_type& LDVL, double* VR, octave_idx_type& LDVR, double* WORK, octave_idx_type& LWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab08nd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab08nd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB08ND Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char equil; const Matrix a = args(0).matrix_value (); const Matrix b = args(1).matrix_value (); const Matrix c = args(2).matrix_value (); const Matrix d = args(3).matrix_value (); const octave_idx_type scaled = args(4).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); // arguments out octave_idx_type nu; octave_idx_type rank; octave_idx_type dinfz; octave_idx_type nkror; octave_idx_type nkrol; octave_idx_type ldaf = max (1, n + m); octave_idx_type ldbf = max (1, n + p); OCTAVE_LOCAL_BUFFER (octave_idx_type, infz, n); OCTAVE_LOCAL_BUFFER (octave_idx_type, kronr, 1 + max (n, m)); OCTAVE_LOCAL_BUFFER (octave_idx_type, kronl, 1 + max (n, p)); OCTAVE_LOCAL_BUFFER (double, af, ldaf * (n + min (p, m))); OCTAVE_LOCAL_BUFFER (double, bf, ldbf * (n + m)); // workspace octave_idx_type s = max (m, p); octave_idx_type ldwork = max (1, max (s, n) + max (3*s-1, n+s)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, s); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // tolerance double tol = 0; // AB08ND uses DLAMCH for default tolerance // SLICOT routine AB08ND F77_XFCN (ab08nd, AB08ND, (equil, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, nu, rank, dinfz, nkror, nkrol, infz, kronr, kronl, af, ldaf, bf, ldbf, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("ss: zero: __sl_ab08nd__: exception in SLICOT subroutine AB08ND"); if (info != 0) error ("ss: zero: __sl_ab08nd__: AB08ND returned info = %d", info); // DGGEV Part char jobvl = 'N'; char jobvr = 'N'; double* vl = 0; // not referenced because jobvl = 'N' octave_idx_type ldvl = 1; double* vr = 0; // not referenced because jobvr = 'N' octave_idx_type ldvr = 1; octave_idx_type lwork = max (1, 8*nu); OCTAVE_LOCAL_BUFFER (double, work, lwork); ColumnVector alphar (nu); ColumnVector alphai (nu); ColumnVector beta (nu); octave_idx_type info2; F77_XFCN (dggev, DGGEV, (jobvl, jobvr, nu, af, ldaf, bf, ldbf, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), vl, ldvl, vr, ldvr, work, lwork, info2)); if (f77_exception_encountered) error ("ss: zero: __sl_ab08nd__: exception in LAPACK subroutine DGGEV"); if (info2 != 0) error ("ss: zero: __sl_ab08nd__: DGGEV returned info = %d", info2); // calculate gain octave_value gain = Matrix (0, 0);; if (m == 1 && p == 1) { if (nu < n) gain = c * xpow (a, double (n-1-nu)).matrix_value() * b; else gain = d; } // assemble complex vector - adapted from DEFUN complex in data.cc ColumnVector zeror (nu); ColumnVector zeroi (nu); zeror = quotient (alphar, beta); zeroi = quotient (alphai, beta); ComplexColumnVector zero (nu, Complex ()); for (octave_idx_type i = 0; i < nu; i++) zero.xelem (i) = Complex (zeror(i), zeroi(i)); // prepare additional outputs for info struct RowVector infzr (dinfz); RowVector kronrr (nkror); RowVector kronlr (nkrol); for (octave_idx_type i = 0; i < dinfz; i++) infzr.xelem (i) = infz[i]; for (octave_idx_type i = 0; i < nkror; i++) kronrr.xelem (i) = kronr[i]; for (octave_idx_type i = 0; i < nkrol; i++) kronlr.xelem (i) = kronl[i]; // return values retval(0) = zero; retval(1) = gain; retval(2) = octave_value (rank); retval(3) = infzr; retval(4) = kronrr; retval(5) = kronlr; } return retval; } control/src/sl_ab09hd.cc0000644000076500000240000001747612614620313014420 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Model reduction based on balanced stochastic truncation method. Uses SLICOT AB09HD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab09hd, AB09HD) (char& DICO, char& JOB, char& EQUIL, char& ORDSEL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, octave_idx_type& NR, double& ALPHA, double& BETA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, octave_idx_type& NS, double* HSV, double& TOL1, double& TOL2, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab09hd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab09hd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB09HD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 13) { print_usage (); } else { // arguments in char dico; char job; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type idico = args(4).int_value (); const octave_idx_type iequil = args(5).int_value (); const octave_idx_type ijob = args(6).int_value (); octave_idx_type nr = args(7).int_value (); const octave_idx_type iordsel = args(8).int_value (); double alpha = args(9).double_value (); double beta = args(10).double_value (); double tol1 = args(11).double_value (); double tol2 = args(12).double_value (); switch (ijob) { case 0: job = 'B'; break; case 1: job = 'F'; break; case 2: job = 'S'; break; case 3: job = 'P'; break; default: error ("__sl_ab09hd__: argument job invalid"); } if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); // arguments out octave_idx_type ns; ColumnVector hsv (n); // workspace octave_idx_type liwork = max (1, 2*n); octave_idx_type mb; if (beta == 0) mb = m; else mb = m + p; octave_idx_type ldwork = 2*n*n + mb*(n+p) + max (2, n*(max (n,mb,p)+5), 2*n*p + max (p*(mb+2), 10*n*(n+1))); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicators octave_idx_type iwarn = 0; octave_idx_type info = 0; // SLICOT routine AB09HD F77_XFCN (ab09hd, AB09HD, (dico, job, equil, ordsel, n, m, p, nr, alpha, beta, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ns, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, bwork, iwarn, info)); if (f77_exception_encountered) error ("bstmodred: exception in SLICOT subroutine AB09HD"); static const char* err_msg[] = { "0: OK", "1: the computation of the ordered real Schur form of A " "failed", "2: the reduction of the Hamiltonian matrix to real " "Schur form failed", "3: the reordering of the real Schur form of the " "Hamiltonian matrix failed", "4: the Hamiltonian matrix has less than N stable " "eigenvalues", "5: the coefficient matrix U11 in the linear system " "X*U11 = U21 to determine X is singular to working " "precision", "6: BETA = 0 and D has not a maximal row rank", "7: the computation of Hankel singular values failed", "8: the separation of the ALPHA-stable/unstable diagonal " "blocks failed because of very close eigenvalues", "9: the resulting order of reduced stable part is less " "than the number of unstable zeros of the stable " "part"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "system; in this case, the resulting NR is set equal " "to NSMIN.", "2: with ORDSEL = 'F', the selected order NR corresponds " "to repeated singular values for the ALPHA-stable " "part, which are neither all included nor all " "excluded from the reduced model; in this case, the " "resulting NR is automatically decreased to exclude " "all repeated singular values.", "3: with ORDSEL = 'F', the selected order NR is less " "than the order of the ALPHA-unstable part of the " "given system; in this case NR is set equal to the " "order of the ALPHA-unstable part."}; error_msg ("bstmodred", info, 9, err_msg); warning_msg ("bstmodred", iwarn, 3, warn_msg); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); hsv.resize (ns); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (nr); retval(5) = hsv; retval(6) = octave_value (ns); } return retval; } control/src/sl_ab09id.cc0000644000076500000240000003212012614620313014400 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Model reduction based on Balance & Truncate (B&T) or Singular Perturbation Approximation (SPA) method. Uses SLICOT AB09ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab09id, AB09ID) (char& DICO, char& JOBC, char& JOBO, char& JOB, char& WEIGHT, char& EQUIL, char& ORDSEL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, octave_idx_type& NV, octave_idx_type& PV, octave_idx_type& NW, octave_idx_type& MW, octave_idx_type& NR, double& ALPHA, double& ALPHAC, double& ALPHAO, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AV, octave_idx_type& LDAV, double* BV, octave_idx_type& LDBV, double* CV, octave_idx_type& LDCV, double* DV, octave_idx_type& LDDV, double* AW, octave_idx_type& LDAW, double* BW, octave_idx_type& LDBW, double* CW, octave_idx_type& LDCW, double* DW, octave_idx_type& LDDW, octave_idx_type& NS, double* HSV, double& TOL1, double& TOL2, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab09id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab09id__, args, nargout, "-*- texinfo -*-\n\ Slicot AB09ID Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 25) { print_usage (); } else { // arguments in char dico; char jobc; char jobo; char job; char weight; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type idico = args(4).int_value (); const octave_idx_type iequil = args(5).int_value (); octave_idx_type nr = args(6).int_value (); const octave_idx_type iordsel = args(7).int_value (); double alpha = args(8).double_value (); const octave_idx_type ijob = args(9).int_value (); Matrix av = args(10).matrix_value (); Matrix bv = args(11).matrix_value (); Matrix cv = args(12).matrix_value (); Matrix dv = args(13).matrix_value (); Matrix aw = args(14).matrix_value (); Matrix bw = args(15).matrix_value (); Matrix cw = args(16).matrix_value (); Matrix dw = args(17).matrix_value (); const octave_idx_type iweight = args(18).int_value (); const octave_idx_type ijobc = args(19).int_value (); double alphac = args(20).double_value (); const octave_idx_type ijobo = args(21).int_value (); double alphao = args(22).double_value (); double tol1 = args(23).double_value (); double tol2 = args(24).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobc == 0) jobc = 'S'; else jobc = 'E'; if (ijobo == 0) jobo = 'S'; else jobo = 'E'; switch (ijob) { case 0: job = 'B'; break; case 1: job = 'F'; break; case 2: job = 'S'; break; case 3: job = 'P'; break; default: error ("__sl_ab09id__: argument job invalid"); } switch (iweight) { case 0: weight = 'N'; break; case 1: weight = 'L'; break; case 2: weight = 'R'; break; case 3: weight = 'B'; break; default: error ("__sl_ab09id__: argument weight invalid"); } octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type nv = av.rows (); octave_idx_type pv = cv.rows (); octave_idx_type nw = aw.rows (); octave_idx_type mw = bw.columns (); octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); octave_idx_type ldav = max (1, nv); octave_idx_type ldbv = max (1, nv); octave_idx_type ldcv = max (1, pv); octave_idx_type lddv = max (1, pv); octave_idx_type ldaw = max (1, nw); octave_idx_type ldbw = max (1, nw); octave_idx_type ldcw = max (1, m); octave_idx_type lddw = max (1, m); // arguments out octave_idx_type ns; ColumnVector hsv (n); // workspace octave_idx_type liwork; octave_idx_type liwrk1; octave_idx_type liwrk2; octave_idx_type liwrk3; switch (job) { case 'B': liwrk1 = 0; break; case 'F': liwrk1 = n; break; default: liwrk1 = 2*n; } if (nv == 0 || weight == 'R' || weight == 'N') liwrk2 = 0; else liwrk2 = nv + max (p, pv); if (nw == 0 || weight == 'L' || weight == 'N') liwrk3 = 0; else liwrk3 = nw + max (m, mw); liwork = max (3, liwrk1, liwrk2, liwrk3); octave_idx_type ldwork; octave_idx_type lminl; octave_idx_type lrcf; octave_idx_type lminr; octave_idx_type llcf; octave_idx_type lleft; octave_idx_type lright; if (nw == 0 || weight == 'L' || weight == 'N') { lrcf = 0; lminr = 0; } else { lrcf = mw*(nw+mw) + max (nw*(nw+5), mw*(mw+2), 4*mw, 4*m); if (m == mw) lminr = nw + max (nw, 3*m); else lminr = 2*nw*max (m, mw) + nw + max (nw, 3*m, 3*mw); } llcf = pv*(nv+pv) + pv*nv + max (nv*(nv+5), pv*(pv+2), 4*pv, 4*p); if (nv == 0 || weight == 'R' || weight == 'N') lminl = 0; else if (p == pv) lminl = max (llcf, nv + max (nv, 3*p)); else lminl = max (p, pv) * (2*nv + max (p, pv)) + max (llcf, nv + max (nv, 3*p, 3*pv)); if (pv == 0 || weight == 'R' || weight == 'N') lleft = n*(p+5); else lleft = (n+nv) * (n + nv + max (n+nv, pv) + 5); if (mw == 0 || weight == 'L' || weight == 'N') lright = n*(m+5); else lright = (n+nw) * (n + nw + max (n+nw, mw) + 5); ldwork = max (lminl, lminr, lrcf, 2*n*n + max (1, lleft, lright, 2*n*n+5*n, n*max (m, p))); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type iwarn = 0; octave_idx_type info = 0; // SLICOT routine AB09ID F77_XFCN (ab09id, AB09ID, (dico, jobc, jobo, job, weight, equil, ordsel, n, m, p, nv, pv, nw, mw, nr, alpha, alphac, alphao, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, av.fortran_vec (), ldav, bv.fortran_vec (), ldbv, cv.fortran_vec (), ldcv, dv.fortran_vec (), lddv, aw.fortran_vec (), ldaw, bw.fortran_vec (), ldbw, cw.fortran_vec (), ldcw, dw.fortran_vec (), lddw, ns, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("modred: exception in SLICOT subroutine AB09ID"); static const char* err_msg[] = { "0: OK", "1: the computation of the ordered real Schur form of A " "failed", "2: the separation of the ALPHA-stable/unstable " "diagonal blocks failed because of very close " "eigenvalues", "3: the reduction to a real Schur form of the state " "matrix of a minimal realization of V failed", "4: a failure was detected during the ordering of the " "real Schur form of the state matrix of a minimal " "realization of V or in the iterative process to " "compute a left coprime factorization with inner " "denominator", "5: if DICO = 'C' and the matrix AV has an observable " "eigenvalue on the imaginary axis, or DICO = 'D' and " "AV has an observable eigenvalue on the unit circle", "6: the reduction to a real Schur form of the state " "matrix of a minimal realization of W failed", "7: a failure was detected during the ordering of the " "real Schur form of the state matrix of a minimal " "realization of W or in the iterative process to " "compute a right coprime factorization with inner " "denominator", "8: if DICO = 'C' and the matrix AW has a controllable " "eigenvalue on the imaginary axis, or DICO = 'D' and " "AW has a controllable eigenvalue on the unit circle", "9: the computation of eigenvalues failed", "10: the computation of Hankel singular values failed"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "system; in this case, the resulting NR is set equal " "to NSMIN.", "2: with ORDSEL = 'F', the selected order NR corresponds " "to repeated singular values for the ALPHA-stable " "part, which are neither all included nor all " "excluded from the reduced model; in this case, the " "resulting NR is automatically decreased to exclude " "all repeated singular values.", "3: with ORDSEL = 'F', the selected order NR is less " "than the order of the ALPHA-unstable part of the " "given system; in this case NR is set equal to the " "order of the ALPHA-unstable part.", /* 10+%d: %d */ "violations of the numerical stability condition " "occured during the assignment of eigenvalues in the " "SLICOT Library routines SB08CD and/or SB08DD."}; error_msg ("modred", info, 10, err_msg); warning_msg ("modred", iwarn, 3, warn_msg, 10); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); hsv.resize (ns); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (nr); retval(5) = hsv; retval(6) = octave_value (ns); } return retval; } control/src/sl_ab09jd.cc0000644000076500000240000003167612614620313014420 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Model reduction based on Hankel-norm approximation method. Uses SLICOT AB09JD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: July 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab09jd, AB09JD) (char& JOBV, char& JOBW, char& JOBINV, char& DICO, char& EQUIL, char& ORDSEL, octave_idx_type& N, octave_idx_type& NV, octave_idx_type& NW, octave_idx_type& M, octave_idx_type& P, octave_idx_type& NR, double& ALPHA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AV, octave_idx_type& LDAV, double* BV, octave_idx_type& LDBV, double* CV, octave_idx_type& LDCV, double* DV, octave_idx_type& LDDV, double* AW, octave_idx_type& LDAW, double* BW, octave_idx_type& LDBW, double* CW, octave_idx_type& LDCW, double* DW, octave_idx_type& LDDW, octave_idx_type& NS, double* HSV, double& TOL1, double& TOL2, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab09jd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab09jd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB09JD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 22) { print_usage (); } else { // arguments in char jobv; char jobw; char jobinv; char dico; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type idico = args(4).int_value (); const octave_idx_type iequil = args(5).int_value (); octave_idx_type nr = args(6).int_value (); const octave_idx_type iordsel = args(7).int_value (); double alpha = args(8).double_value (); const octave_idx_type ijobv = args(9).int_value (); Matrix av = args(10).matrix_value (); Matrix bv = args(11).matrix_value (); Matrix cv = args(12).matrix_value (); Matrix dv = args(13).matrix_value (); const octave_idx_type ijobw = args(14).int_value (); Matrix aw = args(15).matrix_value (); Matrix bw = args(16).matrix_value (); Matrix cw = args(17).matrix_value (); Matrix dw = args(18).matrix_value (); const octave_idx_type ijobinv = args(19).int_value (); double tol1 = args(20).double_value (); double tol2 = args(21).double_value (); switch (ijobv) { case 0: jobv = 'N'; break; case 1: jobv = 'V'; break; case 2: jobv = 'I'; break; case 3: jobv = 'C'; break; case 4: jobv = 'R'; break; default: error ("__sl_ab09jd__: argument jobv invalid"); } switch (ijobw) { case 0: jobw = 'N'; break; case 1: jobw = 'W'; break; case 2: jobw = 'I'; break; case 3: jobw = 'C'; break; case 4: jobw = 'R'; break; default: error ("__sl_ab09jd__: argument jobw invalid"); } switch (ijobinv) { case 0: jobinv = 'N'; break; case 1: jobinv = 'I'; break; case 2: jobinv = 'A'; break; default: error ("__sl_ab09jd__: argument jobinv invalid"); } if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type nv = av.rows (); octave_idx_type nw = aw.rows (); octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); octave_idx_type ldav = max (1, nv); octave_idx_type ldbv = max (1, nv); octave_idx_type ldcv = max (1, p); octave_idx_type lddv = max (1, p); octave_idx_type ldaw = max (1, nw); octave_idx_type ldbw = max (1, nw); octave_idx_type ldcw = max (1, m); octave_idx_type lddw = max (1, m); // arguments out octave_idx_type ns; ColumnVector hsv (n); // workspace octave_idx_type liwork; octave_idx_type tmpc; octave_idx_type tmpd; if (jobv == 'N') tmpc = 0; else tmpc = max (2*p, nv+p+n+6, 2*nv+p+2); if (jobw == 'N') tmpd = 0; else tmpd = max (2*m, nw+m+n+6, 2*nw+m+2); if (dico == 'C') liwork = max (1, m, tmpc, tmpd); else liwork = max (1, n, m, tmpc, tmpd); octave_idx_type ldwork; octave_idx_type nvp = nv + p; octave_idx_type nwm = nw + m; octave_idx_type ldw1; octave_idx_type ldw2; octave_idx_type ldw3 = n*(2*n + max (n, m, p) + 5) + n*(n+1)/2; octave_idx_type ldw4 = n*(m+p+2) + 2*m*p + min (n, m) + max (3*m+1, min (n, m) + p); if (jobv == 'N') { ldw1 = 0; } else { ldw1 = 2*nvp*(nvp+p) + p*p + max (2*nvp*nvp + max (11*nvp+16, p*nvp), nvp*n + max (nvp*n+n*n, p*n, p*m)); } if (jobw == 'N') { ldw2 = 0; } else { ldw2 = 2*nwm*(nwm+m) + m*m + max (2*nwm*nwm + max (11*nwm+16, m*nwm), nwm*n + max (nwm*n+n*n, m*n, p*m)); } ldwork = max (ldw1, ldw2, ldw3, ldw4); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type iwarn = 0; octave_idx_type info = 0; // SLICOT routine AB09JD F77_XFCN (ab09jd, AB09JD, (jobv, jobw, jobinv, dico, equil, ordsel, n, nv, nw, m, p, nr, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, av.fortran_vec (), ldav, bv.fortran_vec (), ldbv, cv.fortran_vec (), ldcv, dv.fortran_vec (), lddv, aw.fortran_vec (), ldaw, bw.fortran_vec (), ldbw, cw.fortran_vec (), ldcw, dw.fortran_vec (), lddw, ns, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("hnamodred: exception in SLICOT subroutine AB09JD"); static const char* err_msg[] = { "0: OK", "1: the computation of the ordered real Schur form of A " "failed", "2: the separation of the ALPHA-stable/unstable " "diagonal blocks failed because of very close eigenvalues", "3: the reduction of AV to a real Schur form failed", "4: the reduction of AW to a real Schur form failed", "5: the reduction to generalized Schur form of the " "descriptor pair corresponding to the inverse of V " "failed", "6: the reduction to generalized Schur form of the " "descriptor pair corresponding to the inverse of W " "failed", "7: the computation of Hankel singular values failed", "8: the computation of stable projection in the " "Hankel-norm approximation algorithm failed", "9: the order of computed stable projection in the " "Hankel-norm approximation algorithm differs " "from the order of Hankel-norm approximation", "10: the reduction of AV-BV*inv(DV)*CV to a " "real Schur form failed", "11: the reduction of AW-BW*inv(DW)*CW to a " "real Schur form failed", "12: the solution of the Sylvester equation failed " "because the poles of V (if JOBV = 'V') or of " "conj(V) (if JOBV = 'C') are not distinct from " "the poles of G1 (see METHOD)", "13: the solution of the Sylvester equation failed " "because the poles of W (if JOBW = 'W') or of " "conj(W) (if JOBW = 'C') are not distinct from " "the poles of G1 (see METHOD)", "14: the solution of the Sylvester equation failed " "because the zeros of V (if JOBV = 'I') or of " "conj(V) (if JOBV = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "15: the solution of the Sylvester equation failed " "because the zeros of W (if JOBW = 'I') or of " "conj(W) (if JOBW = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "16: the solution of the generalized Sylvester system " "failed because the zeros of V (if JOBV = 'I') or " "of conj(V) (if JOBV = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "17: the solution of the generalized Sylvester system " "failed because the zeros of W (if JOBW = 'I') or " "of conj(W) (if JOBW = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "18: op(V) is not antistable", "19: op(W) is not antistable", "20: V is not invertible", "21: W is not invertible"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "system. In this case, the resulting NR is set equal " "to NSMIN.", "2: with ORDSEL = 'F', the selected order NR is less " "than the order of the ALPHA-unstable part of the " "given system. In this case NR is set equal to the " "order of the ALPHA-unstable part."}; error_msg ("hnamodred", info, 21, err_msg); warning_msg ("hnamodred", iwarn, 2, warn_msg); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); hsv.resize (ns); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (nr); retval(5) = hsv; retval(6) = octave_value (ns); } return retval; } control/src/sl_ab13ad.cc0000644000076500000240000000752512614620313014376 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Hankel singular values. Uses SLICOT AB13AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab13ad, AB13AD) (char& DICO, char& EQUIL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double& ALPHA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, octave_idx_type& NS, double* HSV, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab13ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab13ad__, args, nargout, "-*- texinfo -*-\n\ Slicot AB13AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in char dico; char equil; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); octave_idx_type discrete = args(3).int_value (); double alpha = args(4).double_value (); const octave_idx_type scaled = args(5).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (scaled == 0) equil = 'S'; else equil = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); // arguments out octave_idx_type ns = 0; ColumnVector hsv (n); // workspace octave_idx_type ldwork = max (1, n*(max (n, m, p) + 5) + n*(n+1)/2); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info = 0; // SLICOT routine AB13AD F77_XFCN (ab13ad, AB13AD, (dico, equil, n, m, p, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, ns, hsv.fortran_vec (), dwork, ldwork, info)); if (f77_exception_encountered) error ("hsvd: __sl_ab13ad__: exception in SLICOT subroutine AB13AD"); if (info != 0) error ("hsvd: __sl_ab13ad__: AB13AD returned info = %d", info); // resize hsv.resize (ns); // return values retval(0) = hsv; retval(1) = octave_value (ns); } return retval; } control/src/sl_ab13bd.cc0000644000076500000240000001013612614620313014367 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-2 norm of a SS model. Uses SLICOT AB13BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.5 */ #include #include #include "common.h" extern "C" { double F77_FUNC (ab13bd, AB13BD) (char& DICO, char& JOBN, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, octave_idx_type& NQ, double& TOL, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab13bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab13bd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB13BD Release 5.\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char dico; char jobn = 'H'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); octave_idx_type discrete = args(4).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); // arguments out double norm; octave_idx_type nq; // tolerance double tol = 0; // workspace octave_idx_type ldwork = max (1, m*(n+m) + max (n*(n+5), m*(m+2), 4*p ), n*(max (n, p) + 4 ) + min (n, p)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type iwarn; octave_idx_type info; // SLICOT routine AB13BD norm = F77_FUNC (ab13bd, AB13BD) (dico, jobn, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, nq, tol, dwork, ldwork, iwarn, info); if (f77_exception_encountered) error ("lti: norm: __sl_ab13bd__: exception in SLICOT subroutine AB13BD"); if (info != 0) error ("lti: norm: __sl_ab13bd__: AB13BD returned info = %d", info); if (iwarn != 0) warning ("lti: norm: __sl_ab13bd__: AB13BD returned iwarn = %d", iwarn); // return value retval(0) = octave_value (norm); } return retval; } control/src/sl_ab13dd.cc0000644000076500000240000001223312614620313014371 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . L-infinity norm of a SS model. Uses SLICOT AB13DD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.5 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ab13dd, AB13DD) (char& DICO, char& JOBE, char& EQUIL, char& JOBD, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* FPEAK, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* GPEAK, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, Complex* CWORK, octave_idx_type& LCWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ab13dd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab13dd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB13DD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 9) { print_usage (); } else { // arguments in char dico; char jobe; char equil; char jobd = 'D'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); Matrix d = args(4).matrix_value (); octave_idx_type discrete = args(5).int_value (); octave_idx_type descriptor = args(6).int_value (); double tol = args(7).double_value (); const octave_idx_type scaled = args(8).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (descriptor == 0) jobe = 'I'; else jobe = 'G'; if (scaled == 0) equil = 'S'; else equil = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); ColumnVector fpeak (2); ColumnVector gpeak (2); fpeak(0) = 0; fpeak(1) = 1; // workspace octave_idx_type ldwork = max (1, 15*n*n + p*p + m*m + (6*n+3)*(p+m) + 4*p*m + n*m + 22*n + 7*min(p,m)); octave_idx_type lcwork = max (1, (n+m)*(n+p) + 2*min(p,m) + max(p,m)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (Complex, cwork, lcwork); // error indicator octave_idx_type info; // SLICOT routine AB13DD F77_XFCN (ab13dd, AB13DD, (dico, jobe, equil, jobd, n, m, p, fpeak.fortran_vec (), a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, gpeak.fortran_vec (), tol, iwork, dwork, ldwork, cwork, lcwork, info)); if (f77_exception_encountered) error ("lti: norm: __sl_ab13dd__: exception in SLICOT subroutine AB13DD"); static const char* err_msg[] = { "0: OK", "1: the matrix E is (numerically) singular", "2: the (periodic) QR (or QZ) algorithm for computing " "eigenvalues did not converge", "3: the SVD algorithm for computing singular values did " "not converge", "4: the tolerance is too small and the algorithm did " "not converge"}; error_msg ("__sl_ab13dd__", info, 4, err_msg); // return values retval(0) = fpeak; retval(1) = gpeak; } return retval; } control/src/sl_ag08bd.cc0000644000076500000240000002041412614620313014400 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Finite Smith zeros of descriptor state-space models. Uses SLICOT AG08BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.5 */ #include #include #include "common.h" #include #include extern "C" { int F77_FUNC (ag08bd, AG08BD) (char& EQUIL, octave_idx_type& L, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, octave_idx_type& NFZ, octave_idx_type& NRANK, octave_idx_type& NIZ, octave_idx_type& DINFZ, octave_idx_type& NKROR, octave_idx_type& NINFE, octave_idx_type& NKROL, octave_idx_type* INFZ, octave_idx_type* KRONR, octave_idx_type* INFE, octave_idx_type* KRONL, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); int F77_FUNC (dggev, DGGEV) (char& JOBVL, char& JOBVR, octave_idx_type& N, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* ALPHAR, double* ALPHAI, double* BETA, double* VL, octave_idx_type& LDVL, double* VR, octave_idx_type& LDVR, double* WORK, octave_idx_type& LWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ag08bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ag08bd__, args, nargout, "-*- texinfo -*-\n\ Slicot AG08BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in char equil; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); Matrix d = args(4).matrix_value (); const octave_idx_type scaled = args(5).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; octave_idx_type l = a.rows (); // l: number of states octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, l); octave_idx_type lde = max (1, l); octave_idx_type ldb = max (1, l); if (m == 0) ldb = 1; octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); // arguments out octave_idx_type nfz; octave_idx_type nrank; octave_idx_type niz; octave_idx_type dinfz; octave_idx_type nkror; octave_idx_type ninfe; octave_idx_type nkrol; OCTAVE_LOCAL_BUFFER (octave_idx_type, infz, n+1); OCTAVE_LOCAL_BUFFER (octave_idx_type, kronr, n+m+1); OCTAVE_LOCAL_BUFFER (octave_idx_type, infe, 1 + min (l+p, n+m)); OCTAVE_LOCAL_BUFFER (octave_idx_type, kronl, l+p+1); // workspace octave_idx_type ldwork = max (l+p, m+n) * (m+n) + max (1, 5 * max (l+p, m+n)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n + max (1, m)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // tolerance double tol = 0; // AG08BD uses DLAMCH for default tolerance // SLICOT routine AG08BD F77_XFCN (ag08bd, AG08BD, (equil, l, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, nfz, nrank, niz, dinfz, nkror, ninfe, nkrol, infz, kronr, infe, kronl, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("dss: zero: __sl_ag08bd__: exception in SLICOT subroutine AG08BD"); if (info != 0) error ("dss: zero: __sl_ag08bd__: AG08BD returned info = %d", info); // DGGEV Part a.resize (nfz, nfz); // Af e.resize (nfz, nfz); // Ef lda = max (1, nfz); lde = max (1, nfz); char jobvl = 'N'; char jobvr = 'N'; ColumnVector alphar (nfz); ColumnVector alphai (nfz); ColumnVector beta (nfz); double* vl = 0; // not referenced because jobvl = 'N' octave_idx_type ldvl = 1; double* vr = 0; // not referenced because jobvr = 'N' octave_idx_type ldvr = 1; octave_idx_type lwork = max (1, 8*nfz); OCTAVE_LOCAL_BUFFER (double, work, lwork); octave_idx_type info2; F77_XFCN (dggev, DGGEV, (jobvl, jobvr, nfz, a.fortran_vec (), lda, e.fortran_vec (), lde, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), vl, ldvl, vr, ldvr, work, lwork, info2)); if (f77_exception_encountered) error ("dss: zero: __sl_ag08bd__: exception in LAPACK subroutine DGGEV"); if (info2 != 0) error ("dss: zero: __sl_ag08bd__: DGGEV returned info = %d", info2); // assemble complex vector - adapted from DEFUN complex in data.cc // LAPACK DGGEV.f says: // // Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j) // may easily over- or underflow, and BETA(j) may even be zero. // Thus, the user should avoid naively computing the ratio // alpha/beta. However, ALPHAR and ALPHAI will be always less // than and usually comparable with norm(A) in magnitude, and // BETA always less than and usually comparable with norm(B). // // Since we need the zeros explicitly ... ColumnVector zeror (nfz); ColumnVector zeroi (nfz); zeror = quotient (alphar, beta); zeroi = quotient (alphai, beta); ComplexColumnVector zero (nfz, Complex ()); for (octave_idx_type i = 0; i < nfz; i++) zero.xelem (i) = Complex (zeror(i), zeroi(i)); // prepare additional outputs for info struct RowVector infzr (dinfz); RowVector kronrr (nkror); RowVector kronlr (nkrol); for (octave_idx_type i = 0; i < dinfz; i++) infzr.xelem (i) = infz[i]; for (octave_idx_type i = 0; i < nkror; i++) kronrr.xelem (i) = kronr[i]; for (octave_idx_type i = 0; i < nkrol; i++) kronlr.xelem (i) = kronl[i]; // return values retval(0) = zero; retval(1) = octave_value (nrank); retval(2) = infzr; retval(3) = kronrr; retval(4) = kronlr; } return retval; } control/src/sl_are.cc0000644000076500000240000002211212614620313014077 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solve algebraic Riccati equation. Uses SLICOT SB02RD and SB02MT by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2012 Version: 0.2 */ #include #include #include "common.h" #include extern "C" { int F77_FUNC (sb02mt, SB02MT) (char& JOBG, char& JOBL, char& FACT, char& UPLO, octave_idx_type& N, octave_idx_type& M, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* Q, octave_idx_type& LDQ, double* R, octave_idx_type& LDR, double* L, octave_idx_type& LDL, octave_idx_type* IPIV, octave_idx_type& OUFACT, double* G, octave_idx_type& LDG, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); int F77_FUNC (sb02rd, SB02RD) (char& JOB, char& DICO, char& HINV, char& TRANA, char& UPLO, char& SCAL, char& SORT, char& FACT, char& LYAPUN, octave_idx_type& N, double* A, octave_idx_type& LDA, double* T, octave_idx_type& LDT, double* V, octave_idx_type& LDV, double* G, octave_idx_type& LDG, double* Q, octave_idx_type& LDQ, double* X, octave_idx_type& LDX, double& SEP, double& RCOND, double& FERR, double* WR, double* WI, double* S, octave_idx_type& LDS, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_are__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_are__, args, nargout, "-*- texinfo -*-\n\ Slicot SB02RD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // SB02MT // arguments in char dico; char jobg = 'G'; char jobl; char fact = 'N'; char uplo = 'U'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix q = args(2).matrix_value (); Matrix r = args(3).matrix_value (); Matrix l = args(4).matrix_value (); octave_idx_type discrete = args(5).int_value (); octave_idx_type ijobl = args(6).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (ijobl == 0) jobl = 'Z'; else jobl = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldq = max (1, n); octave_idx_type ldr = max (1, m); octave_idx_type ldl = max (1, n); // arguments out octave_idx_type ldg = max (1, n); Matrix g (ldg, n); // unused output arguments OCTAVE_LOCAL_BUFFER (octave_idx_type, ipiv, m); octave_idx_type oufact; // workspace OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_a, m); octave_idx_type ldwork_a = max (2, 3*m, n*m); OCTAVE_LOCAL_BUFFER (double, dwork_a, ldwork_a); // error indicator octave_idx_type info; // SLICOT routine SB02MT F77_XFCN (sb02mt, SB02MT, (jobg, jobl, fact, uplo, n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, q.fortran_vec (), ldq, r.fortran_vec (), ldr, l.fortran_vec (), ldl, ipiv, oufact, g.fortran_vec (), ldg, iwork_a, dwork_a, ldwork_a, info)); if (f77_exception_encountered) error ("are: __sl_are__: exception in SLICOT subroutine SB02MT"); if (info != 0) { if (info < 0) error ("are: sb02mt: the %d-th argument had an illegal value", info); else if (info == m+1) error ("are: sb02mt: the matrix R is numerically singular"); else error ("are: sb02mt: the %d-th element (1 <= %d <= %d) of the d factor is " "exactly zero; the UdU' (or LdL') factorization has " "been completed, but the block diagonal matrix d is " "exactly singular", info, info, m); } // SB02RD // arguments in char job = 'A'; char hinv = 'D'; char trana = 'N'; char scal = 'G'; char sort = 'S'; char lyapun = 'O'; octave_idx_type ldt = max (1, n); octave_idx_type ldv = max (1, n); octave_idx_type ldx = max (1, n); octave_idx_type lds = max (1, 2*n); // arguments out Matrix x (ldx, n); double sep; double rcond; double ferr; ColumnVector wr (2*n); ColumnVector wi (2*n); // unused output arguments Matrix t (ldt, n); Matrix v (ldv, n); Matrix s (lds, 2*n); // workspace octave_idx_type liwork_b = max (2*n, n*n); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_b, liwork_b); octave_idx_type ldwork_b = 5 + max (1, 4*n*n + 8*n); OCTAVE_LOCAL_BUFFER (double, dwork_b, ldwork_b); OCTAVE_LOCAL_BUFFER (bool, bwork_b, 2*n); // SLICOT routine SB02RD F77_XFCN (sb02rd, SB02RD, (job, dico, hinv, trana, uplo, scal, sort, fact, lyapun, n, a.fortran_vec (), lda, t.fortran_vec (), ldt, v.fortran_vec (), ldv, g.fortran_vec (), ldg, q.fortran_vec (), ldq, x.fortran_vec (), ldx, sep, rcond, ferr, wr.fortran_vec (), wi.fortran_vec (), s.fortran_vec (), lds, iwork_b, dwork_b, ldwork_b, bwork_b, info)); static const char* err_msg[] = { "0: OK", "1: matrix A is (numerically) singular in discrete-" "time case", "2: the Hamiltonian or symplectic matrix H cannot be " "reduced to real Schur form", "3: the real Schur form of the Hamiltonian or " "symplectic matrix H cannot be appropriately ordered", "4: the Hamiltonian or symplectic matrix H has less " "than N stable eigenvalues", "5: if the N-th order system of linear algebraic " "equations, from which the solution matrix X would " "be obtained, is singular to working precision", "6: the QR algorithm failed to complete the reduction " "of the matrix Ac to Schur canonical form, T", "7: if T and -T' have some almost equal eigenvalues, if " "DICO = 'C', or T has almost reciprocal eigenvalues, " "if DICO = 'D'; perturbed values were used to solve " "Lyapunov equations, but the matrix T, if given (for " "FACT = 'F'), is unchanged. (This is a warning " "indicator.)"}; error_msg ("are", info, 7, err_msg); // resize x.resize (n, n); wr.resize (n); wi.resize (n); // assemble complex vector - adapted from DEFUN complex in data.cc ComplexColumnVector pole (n, Complex ()); for (octave_idx_type i = 0; i < n; i++) pole.xelem (i) = Complex (wr(i), wi(i)); // return value retval(0) = x; retval(1) = pole; retval(2) = octave_value (ferr); retval(3) = octave_value (rcond); retval(4) = octave_value (sep); } return retval; } control/src/sl_ib01ad.cc0000644000076500000240000003256212614620313014402 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . SLICOT system identification Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: March 2012 Version: 0.2 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ib01ad, IB01AD) (char& METH, char& ALG, char& JOBD, char& BATCH, char& CONCT, char& CTRL, octave_idx_type& NOBR, octave_idx_type& M, octave_idx_type& L, octave_idx_type& NSMP, double* U, octave_idx_type& LDU, double* Y, octave_idx_type& LDY, octave_idx_type& N, double* R, octave_idx_type& LDR, double* SV, double& RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ib01ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ib01ad__, args, nargout, "-*- texinfo -*-\n\ Slicot IB01AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 10) { print_usage (); } else { //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01AD - preprocess the input-output data // //////////////////////////////////////////////////////////////////////////////////// // arguments in char meth_a; char meth_b; char alg; char jobd; char batch; char conct; char ctrl = 'N'; const Cell y_cell = args(0).cell_value (); const Cell u_cell = args(1).cell_value (); octave_idx_type nobr = args(2).int_value (); octave_idx_type nuser = args(3).int_value (); const octave_idx_type imeth = args(4).int_value (); const octave_idx_type ialg = args(5).int_value (); const octave_idx_type iconct = args(6).int_value (); const octave_idx_type ictrl = args(7).int_value (); // ignored double rcond = args(8).double_value (); double tol_a = args(9).double_value (); double tol_b = rcond; double tol_c = rcond; switch (imeth) { case 0: meth_a = 'M'; meth_b = 'M'; break; case 1: meth_a = 'N'; meth_b = 'N'; break; case 2: meth_a = 'N'; // no typo here meth_b = 'C'; break; default: error ("__sl_ib01ad__: argument 'meth' invalid"); } switch (ialg) { case 0: alg = 'C'; break; case 1: alg = 'F'; break; case 2: alg = 'Q'; break; default: error ("__sl_ib01ad__: argument 'alg' invalid"); } if (meth_a == 'M') jobd = 'M'; else // meth_a == 'N' jobd = 'N'; // IB01AD.f says: This parameter is not relevant for METH = 'N' if (iconct == 0) conct = 'C'; else conct = 'N'; /* if (ictrl == 0) ctrl = 'C'; else ctrl = 'N'; */ // m and l are equal for all experiments, checked by iddata class octave_idx_type n_exp = y_cell.nelem (); // number of experiments octave_idx_type m = u_cell.elem(0).columns (); // m: number of inputs octave_idx_type l = y_cell.elem(0).columns (); // l: number of outputs octave_idx_type nsmpl = 0; // total number of samples // arguments out octave_idx_type n; octave_idx_type ldr; if (meth_a == 'M' && jobd == 'M') ldr = max (2*(m+l)*nobr, 3*m*nobr); else if (meth_a == 'N' || (meth_a == 'M' && jobd == 'N')) ldr = 2*(m+l)*nobr; else error ("__sl_ib01ad__: could not handle 'ldr' case"); Matrix r (ldr, 2*(m+l)*nobr); ColumnVector sv (l*nobr); // repeat for every experiment in the dataset for (octave_idx_type i = 0; i < n_exp; i++) { if (n_exp == 1) batch = 'O'; // one block only else if (i == 0) batch = 'F'; // first block else if (i == n_exp-1) batch = 'L'; // last block else batch = 'I'; // intermediate block Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); // y.rows == u.rows is checked by iddata class // octave_idx_type m = u.columns (); // m: number of inputs // octave_idx_type l = y.columns (); // l: number of outputs octave_idx_type nsmp = y.rows (); // nsmp: number of samples in the current experiment nsmpl += nsmp; // nsmpl: total number of samples of all experiments // minimal nsmp size checked by __slicot_identification__.m if (batch == 'O') { if (nsmp < 2*(m+l+1)*nobr - 1) error ("__sl_ident__: require NSMP >= 2*(M+L+1)*NOBR - 1"); } else { if (nsmp < 2*nobr) error ("__sl_ident__: require NSMP >= 2*NOBR"); } octave_idx_type ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; octave_idx_type ldy = nsmp; // workspace octave_idx_type liwork_a; if (meth_a == 'N') // if METH = 'N' liwork_a = (m+l)*nobr; else if (alg == 'F') // if METH = 'M' and ALG = 'F' liwork_a = m+l; else // if METH = 'M' and ALG = 'C' or 'Q' liwork_a = 0; // TODO: Handle 'k' for DWORK octave_idx_type ldwork_a; octave_idx_type ns = nsmp - 2*nobr + 1; if (alg == 'C') { if (batch == 'F' || batch == 'I') { if (conct == 'C') ldwork_a = (4*nobr-2)*(m+l); else // (conct == 'N') ldwork_a = 1; } else if (meth_a == 'M') // && (batch == 'L' || batch == 'O') { if (conct == 'C' && batch == 'L') ldwork_a = max ((4*nobr-2)*(m+l), 5*l*nobr); else if (jobd == 'M') ldwork_a = max ((2*m-1)*nobr, (m+l)*nobr, 5*l*nobr); else // (jobd == 'N') ldwork_a = 5*l*nobr; } else // meth_b == 'N' && (batch == 'L' || batch == 'O') { ldwork_a = 5*(m+l)*nobr + 1; } } else if (alg == 'F') { if (batch != 'O' && conct == 'C') ldwork_a = (m+l)*2*nobr*(m+l+3); else if (batch == 'F' || batch == 'I') // && conct == 'N' ldwork_a = (m+l)*2*nobr*(m+l+1); else // (batch == 'L' || '0' && conct == 'N') ldwork_a = (m+l)*4*nobr*(m+l+1)+(m+l)*2*nobr; } else // (alg == 'Q') { // octave_idx_type ns = nsmp - 2*nobr + 1; if (ldr >= ns && batch == 'F') { ldwork_a = 4*(m+l)*nobr; } else if (ldr >= ns && batch == 'O') { if (meth_a == 'M') ldwork_a = max (4*(m+l)*nobr, 5*l*nobr); else // (meth == 'N') ldwork_a = 5*(m+l)*nobr + 1; } else if (conct == 'C' && (batch == 'I' || batch == 'L')) { ldwork_a = 4*(nobr+1)*(m+l)*nobr; } else // if ALG = 'Q', (BATCH = 'F' or 'O', and LDR < NS), or (BATCH = 'I' or 'L' and CONCT = 'N') { ldwork_a = 6*(m+l)*nobr; } } /* IB01AD.f Lines 438-445 C FURTHER COMMENTS C C For ALG = 'Q', BATCH = 'O' and LDR < NS, or BATCH <> 'O', the C calculations could be rather inefficient if only minimal workspace C (see argument LDWORK) is provided. It is advisable to provide as C much workspace as possible. Almost optimal efficiency can be C obtained for LDWORK = (NS+2)*(2*(M+L)*NOBR), assuming that the C cache size is large enough to accommodate R, U, Y, and DWORK. */ ldwork_a = max (ldwork_a, (ns+2)*(2*(m+l)*nobr)); /* IB01AD.f Lines 291-195: c the workspace used for alg = 'q' is c ldrwrk*2*(m+l)*nobr + 4*(m+l)*nobr, c where ldrwrk = ldwork/(2*(m+l)*nobr) - 2; recommended c value ldrwrk = ns, assuming a large enough cache size. c for good performance, ldwork should be larger. somehow ldrwrk and ldwork must have been mixed up here */ OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_a, liwork_a); OCTAVE_LOCAL_BUFFER (double, dwork_a, ldwork_a); // error indicators octave_idx_type iwarn_a = 0; octave_idx_type info_a = 0; // SLICOT routine IB01AD F77_XFCN (ib01ad, IB01AD, (meth_a, alg, jobd, batch, conct, ctrl, nobr, m, l, nsmp, u.fortran_vec (), ldu, y.fortran_vec (), ldy, n, r.fortran_vec (), ldr, sv.fortran_vec (), rcond, tol_a, iwork_a, dwork_a, ldwork_a, iwarn_a, info_a)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01AD"); static const char* err_msg[] = { "0: OK", "1: a fast algorithm was requested (ALG = 'C', or 'F') " "in sequential data processing, but it failed; the " "routine can be repeatedly called again using the " "standard QR algorithm", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg[] = { "0: OK", "1: the number of 100 cycles in sequential data " "processing has been exhausted without signaling " "that the last block of data was get; the cycle " "counter was reinitialized", "2: a fast algorithm was requested (ALG = 'C' or 'F'), " "but it failed, and the QR algorithm was then used " "(non-sequential data processing)", "3: all singular values were exactly zero, hence N = 0 " "(both input and output were identically zero)", "4: the least squares problems with coefficient matrix " "U_f, used for computing the weighted oblique " "projection (for METH = 'N'), have a rank-deficient " "coefficient matrix", "5: the least squares problem with coefficient matrix " "r_1 [6], used for computing the weighted oblique " "projection (for METH = 'N'), has a rank-deficient " "coefficient matrix"}; error_msg ("ident: IB01AD", info_a, 2, err_msg); warning_msg ("ident: IB01AD", iwarn_a, 5, warn_msg); } // resize octave_idx_type rs = 2*(m+l)*nobr; r.resize (rs, rs); // return values retval(0) = sv; retval(1) = octave_value (n); } return retval; } control/src/sl_ib01cd.cc0000644000076500000240000001550012614620313014375 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Compute initial state vector x0 Uses IB01CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: May 2012 Version: 0.2 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ib01cd, IB01CD) (char& JOBX0, char& COMUSE, char& JOB, octave_idx_type& N, octave_idx_type& M, octave_idx_type& L, octave_idx_type& NSMP, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* U, octave_idx_type& LDU, double* Y, octave_idx_type& LDY, double* X0, double* V, octave_idx_type& LDV, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ib01cd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ib01cd__, args, nargout, "-*- texinfo -*-\n\ Slicot IB01CD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char jobx0 = 'X'; char comuse = 'U'; char jobbd = 'D'; const Cell y_cell = args(0).cell_value (); const Cell u_cell = args(1).cell_value (); Matrix a = args(2).matrix_value (); Matrix b = args(3).matrix_value (); Matrix c = args(4).matrix_value (); Matrix d = args(5).matrix_value (); double rcond = args(6).double_value (); double tol_c = rcond; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type l = c.rows (); // l: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, l); octave_idx_type ldd = max (1, l); // m and l are equal for all experiments, checked by iddata class octave_idx_type n_exp = y_cell.nelem (); // number of experiments // arguments out Cell x0_cell (n_exp, 1); // cell of initial state vectors x0 // repeat for every experiment in the dataset // compute individual initial state vector x0 for every experiment for (octave_idx_type i = 0; i < n_exp; i++) { Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); octave_idx_type nsmp = y.rows (); // nsmp: number of samples octave_idx_type ldv = max (1, n); octave_idx_type ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; octave_idx_type ldy = nsmp; // arguments out ColumnVector x0 (n); Matrix v (ldv, n); // workspace octave_idx_type liwork_c = n; // if JOBX0 = 'X' and COMUSE <> 'C' octave_idx_type ldwork_c; octave_idx_type t = nsmp; octave_idx_type ldw1_c = 2; octave_idx_type ldw2_c = t*l*(n + 1) + 2*n + max (2*n*n, 4*n); octave_idx_type ldw3_c = n*(n + 1) + 2*n + max (n*l*(n + 1) + 2*n*n + l*n, 4*n); ldwork_c = ldw1_c + n*( n + m + l ) + max (5*n, ldw1_c, min (ldw2_c, ldw3_c)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_c, liwork_c); OCTAVE_LOCAL_BUFFER (double, dwork_c, ldwork_c); // error indicators octave_idx_type iwarn_c = 0; octave_idx_type info_c = 0; // SLICOT routine IB01CD F77_XFCN (ib01cd, IB01CD, (jobx0, comuse, jobbd, n, m, l, nsmp, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, u.fortran_vec (), ldu, y.fortran_vec (), ldy, x0.fortran_vec (), v.fortran_vec (), ldv, tol_c, iwork_c, dwork_c, ldwork_c, iwarn_c, info_c)); if (f77_exception_encountered) error ("__sl_ib01cd__: exception in SLICOT subroutine IB01CD"); static const char* err_msg_c[] = { "0: OK", "1: the QR algorithm failed to compute all the " "eigenvalues of the matrix A (see LAPACK Library " "routine DGEES); the locations DWORK(i), for " "i = g+1:g+N*N, contain the partially converged " "Schur form", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg_c[] = { "0: OK", "1: warning message not specified", "2: warning message not specified", "3: warning message not specified", "4: the least squares problem to be solved has a " "rank-deficient coefficient matrix", "5: warning message not specified", "6: the matrix A is unstable; the estimated x(0) " "and/or B and D could be inaccurate"}; error_msg ("__sl_ib01cd__", info_c, 2, err_msg_c); warning_msg ("__sl_ib01cd__", iwarn_c, 6, warn_msg_c); x0_cell.elem(i) = x0; // add x0 from the current experiment to cell of initial state vectors } // return values retval(0) = x0_cell; } return retval; } control/src/sl_ident.cc0000644000076500000240000006351212614620313014444 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . SLICOT system identification Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: March 2012 Version: 0.2 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ib01ad, IB01AD) (char& METH, char& ALG, char& JOBD, char& BATCH, char& CONCT, char& CTRL, octave_idx_type& NOBR, octave_idx_type& M, octave_idx_type& L, octave_idx_type& NSMP, double* U, octave_idx_type& LDU, double* Y, octave_idx_type& LDY, octave_idx_type& N, double* R, octave_idx_type& LDR, double* SV, double& RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); int F77_FUNC (ib01bd, IB01BD) (char& METH, char& JOB, char& JOBCK, octave_idx_type& NOBR, octave_idx_type& N, octave_idx_type& M, octave_idx_type& L, octave_idx_type& NSMPL, double* R, octave_idx_type& LDR, double* A, octave_idx_type& LDA, double* C, octave_idx_type& LDC, double* B, octave_idx_type& LDB, double* D, octave_idx_type& LDD, double* Q, octave_idx_type& LDQ, double* RY, octave_idx_type& LDRY, double* S, octave_idx_type& LDS, double* K, octave_idx_type& LDK, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& IWARN, octave_idx_type& INFO); int F77_FUNC (ib01cd, IB01CD) (char& JOBX0, char& COMUSE, char& JOB, octave_idx_type& N, octave_idx_type& M, octave_idx_type& L, octave_idx_type& NSMP, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* U, octave_idx_type& LDU, double* Y, octave_idx_type& LDY, double* X0, double* V, octave_idx_type& LDV, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_ident__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ident__, args, nargout, "-*- texinfo -*-\n\ Slicot IB01AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 10) { print_usage (); } else { //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01AD - preprocess the input-output data // //////////////////////////////////////////////////////////////////////////////////// // arguments in char meth_a; char meth_b; char alg; char jobd; char batch; char conct; char ctrl; const Cell y_cell = args(0).cell_value (); const Cell u_cell = args(1).cell_value (); octave_idx_type nobr = args(2).int_value (); octave_idx_type nuser = args(3).int_value (); const octave_idx_type imeth = args(4).int_value (); const octave_idx_type ialg = args(5).int_value (); const octave_idx_type iconct = args(6).int_value (); const octave_idx_type ictrl = args(7).int_value (); double rcond = args(8).double_value (); double tol_a = args(9).double_value (); double tol_b = rcond; double tol_c = rcond; switch (imeth) { case 0: meth_a = 'M'; meth_b = 'M'; break; case 1: meth_a = 'N'; meth_b = 'N'; break; case 2: meth_a = 'N'; // no typo here meth_b = 'C'; break; default: error ("__sl_ib01ad__: argument 'meth' invalid"); } switch (ialg) { case 0: alg = 'C'; break; case 1: alg = 'F'; break; case 2: alg = 'Q'; break; default: error ("__sl_ib01ad__: argument 'alg' invalid"); } if (meth_a == 'M') jobd = 'M'; else // meth_a == 'N' jobd = 'N'; // IB01AD.f says: This parameter is not relevant for METH = 'N' if (iconct == 0) conct = 'C'; else conct = 'N'; if (ictrl == 0) ctrl = 'C'; else ctrl = 'N'; // m and l are equal for all experiments, checked by iddata class octave_idx_type n_exp = y_cell.nelem (); // number of experiments octave_idx_type m = u_cell.elem(0).columns (); // m: number of inputs octave_idx_type l = y_cell.elem(0).columns (); // l: number of outputs octave_idx_type nsmpl = 0; // total number of samples // arguments out octave_idx_type n; octave_idx_type ldr; if (meth_a == 'M' && jobd == 'M') ldr = max (2*(m+l)*nobr, 3*m*nobr); else if (meth_a == 'N' || (meth_a == 'M' && jobd == 'N')) ldr = 2*(m+l)*nobr; else error ("__sl_ib01ad__: could not handle 'ldr' case"); Matrix r (ldr, 2*(m+l)*nobr); ColumnVector sv (l*nobr); // repeat for every experiment in the dataset for (octave_idx_type i = 0; i < n_exp; i++) { if (n_exp == 1) batch = 'O'; // one block only else if (i == 0) batch = 'F'; // first block else if (i == n_exp-1) batch = 'L'; // last block else batch = 'I'; // intermediate block Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); // y.rows == u.rows is checked by iddata class // octave_idx_type m = u.columns (); // m: number of inputs // octave_idx_type l = y.columns (); // l: number of outputs octave_idx_type nsmp = y.rows (); // nsmp: number of samples in the current experiment nsmpl += nsmp; // nsmpl: total number of samples of all experiments // minimal nsmp size checked by __slicot_identification__.m if (batch == 'O') { if (nsmp < 2*(m+l+1)*nobr - 1) error ("__sl_ident__: require NSMP >= 2*(M+L+1)*NOBR - 1"); } else { if (nsmp < 2*nobr) error ("__sl_ident__: require NSMP >= 2*NOBR"); } octave_idx_type ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; octave_idx_type ldy = nsmp; // workspace octave_idx_type liwork_a; if (meth_a == 'N') // if METH = 'N' liwork_a = (m+l)*nobr; else if (alg == 'F') // if METH = 'M' and ALG = 'F' liwork_a = m+l; else // if METH = 'M' and ALG = 'C' or 'Q' liwork_a = 0; // TODO: Handle 'k' for DWORK octave_idx_type ldwork_a; octave_idx_type ns = nsmp - 2*nobr + 1; if (alg == 'C') { if (batch == 'F' || batch == 'I') { if (conct == 'C') ldwork_a = (4*nobr-2)*(m+l); else // (conct == 'N') ldwork_a = 1; } else if (meth_a == 'M') // && (batch == 'L' || batch == 'O') { if (conct == 'C' && batch == 'L') ldwork_a = max ((4*nobr-2)*(m+l), 5*l*nobr); else if (jobd == 'M') ldwork_a = max ((2*m-1)*nobr, (m+l)*nobr, 5*l*nobr); else // (jobd == 'N') ldwork_a = 5*l*nobr; } else // meth_b == 'N' && (batch == 'L' || batch == 'O') { ldwork_a = 5*(m+l)*nobr + 1; } } else if (alg == 'F') { if (batch != 'O' && conct == 'C') ldwork_a = (m+l)*2*nobr*(m+l+3); else if (batch == 'F' || batch == 'I') // && conct == 'N' ldwork_a = (m+l)*2*nobr*(m+l+1); else // (batch == 'L' || '0' && conct == 'N') ldwork_a = (m+l)*4*nobr*(m+l+1)+(m+l)*2*nobr; } else // (alg == 'Q') { // octave_idx_type ns = nsmp - 2*nobr + 1; if (ldr >= ns && batch == 'F') { ldwork_a = 4*(m+l)*nobr; } else if (ldr >= ns && batch == 'O') { if (meth_a == 'M') ldwork_a = max (4*(m+l)*nobr, 5*l*nobr); else // (meth == 'N') ldwork_a = 5*(m+l)*nobr + 1; } else if (conct == 'C' && (batch == 'I' || batch == 'L')) { ldwork_a = 4*(nobr+1)*(m+l)*nobr; } else // if ALG = 'Q', (BATCH = 'F' or 'O', and LDR < NS), or (BATCH = 'I' or 'L' and CONCT = 'N') { ldwork_a = 6*(m+l)*nobr; } } /* IB01AD.f Lines 438-445 C FURTHER COMMENTS C C For ALG = 'Q', BATCH = 'O' and LDR < NS, or BATCH <> 'O', the C calculations could be rather inefficient if only minimal workspace C (see argument LDWORK) is provided. It is advisable to provide as C much workspace as possible. Almost optimal efficiency can be C obtained for LDWORK = (NS+2)*(2*(M+L)*NOBR), assuming that the C cache size is large enough to accommodate R, U, Y, and DWORK. */ ldwork_a = max (ldwork_a, (ns+2)*(2*(m+l)*nobr)); /* IB01AD.f Lines 291-195: c the workspace used for alg = 'q' is c ldrwrk*2*(m+l)*nobr + 4*(m+l)*nobr, c where ldrwrk = ldwork/(2*(m+l)*nobr) - 2; recommended c value ldrwrk = ns, assuming a large enough cache size. c for good performance, ldwork should be larger. somehow ldrwrk and ldwork must have been mixed up here */ OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_a, liwork_a); OCTAVE_LOCAL_BUFFER (double, dwork_a, ldwork_a); // error indicators octave_idx_type iwarn_a = 0; octave_idx_type info_a = 0; // SLICOT routine IB01AD F77_XFCN (ib01ad, IB01AD, (meth_a, alg, jobd, batch, conct, ctrl, nobr, m, l, nsmp, u.fortran_vec (), ldu, y.fortran_vec (), ldy, n, r.fortran_vec (), ldr, sv.fortran_vec (), rcond, tol_a, iwork_a, dwork_a, ldwork_a, iwarn_a, info_a)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01AD"); static const char* err_msg[] = { "0: OK", "1: a fast algorithm was requested (ALG = 'C', or 'F') " "in sequential data processing, but it failed; the " "routine can be repeatedly called again using the " "standard QR algorithm", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg[] = { "0: OK", "1: the number of 100 cycles in sequential data " "processing has been exhausted without signaling " "that the last block of data was get; the cycle " "counter was reinitialized", "2: a fast algorithm was requested (ALG = 'C' or 'F'), " "but it failed, and the QR algorithm was then used " "(non-sequential data processing)", "3: all singular values were exactly zero, hence N = 0 " "(both input and output were identically zero)", "4: the least squares problems with coefficient matrix " "U_f, used for computing the weighted oblique " "projection (for METH = 'N'), have a rank-deficient " "coefficient matrix", "5: the least squares problem with coefficient matrix " "r_1 [6], used for computing the weighted oblique " "projection (for METH = 'N'), has a rank-deficient " "coefficient matrix"}; error_msg ("ident: IB01AD", info_a, 2, err_msg); warning_msg ("ident: IB01AD", iwarn_a, 5, warn_msg); } // resize octave_idx_type rs = 2*(m+l)*nobr; r.resize (rs, rs); if (nuser > 0) { if (nuser < nobr) { n = nuser; // warning ("ident: nuser (%d) < nobr (%d), n = nuser", nuser, nobr); } else error ("ident: 'nuser' invalid"); } //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01BD - estimating system matrices, Kalman gain, and covariances // //////////////////////////////////////////////////////////////////////////////////// // arguments in char job = 'A'; char jobck = 'K'; //octave_idx_type nsmpl = nsmp; if (nsmpl < 2*(m+l)*nobr) error ("__sl_ident__: nsmpl (%d) < 2*(m+l)*nobr (%d)", nsmpl, nobr); // arguments out octave_idx_type lda = max (1, n); octave_idx_type ldc = max (1, l); octave_idx_type ldb = max (1, n); octave_idx_type ldd = max (1, l); octave_idx_type ldq = n; // if JOBCK = 'C' or 'K' octave_idx_type ldry = l; // if JOBCK = 'C' or 'K' octave_idx_type lds = n; // if JOBCK = 'C' or 'K' octave_idx_type ldk = n; // if JOBCK = 'K' Matrix a (lda, n); Matrix c (ldc, n); Matrix b (ldb, m); Matrix d (ldd, m); Matrix q (ldq, n); Matrix ry (ldry, l); Matrix s (lds, l); Matrix k (ldk, l); // workspace octave_idx_type liwork_b; octave_idx_type liw1; octave_idx_type liw2; liw1 = max (n, m*nobr+n, l*nobr, m*(n+l)); liw2 = n*n; // if JOBCK = 'K' liwork_b = max (liw1, liw2); octave_idx_type ldwork_b; octave_idx_type ldw1; octave_idx_type ldw2; octave_idx_type ldw3; if (meth_b == 'M') { octave_idx_type ldw1a = max (2*(l*nobr-l)*n+2*n, (l*nobr-l)*n+n*n+7*n); octave_idx_type ldw1b = max (2*(l*nobr-l)*n+n*n+7*n, (l*nobr-l)*n+n+6*m*nobr, (l*nobr-l)*n+n+max (l+m*nobr, l*nobr + max (3*l*nobr+1, m))); ldw1 = max (ldw1a, ldw1b); octave_idx_type aw; if (m == 0 || job == 'C') aw = n + n*n; else aw = 0; ldw2 = l*nobr*n + max ((l*nobr-l)*n+aw+2*n+max(5*n,(2*m+l)*nobr+l), 4*(m*nobr+n)+1, m*nobr+2*n+l ); } else if (meth_b == 'N') { ldw1 = l*nobr*n + max ((l*nobr-l)*n+2*n+(2*m+l)*nobr+l, 2*(l*nobr-l)*n+n*n+8*n, n+4*(m*nobr+n)+1, m*nobr+3*n+l); if (m == 0 || job == 'C') ldw2 = 0; else ldw2 = l*nobr*n+m*nobr*(n+l)*(m*(n+l)+1)+ max ((n+l)*(n+l), 4*m*(n+l)+1); } else // (meth_b == 'C') { octave_idx_type ldw1a = max (2*(l*nobr-l)*n+2*n, (l*nobr-l)*n+n*n+7*n); octave_idx_type ldw1b = l*nobr*n + max ((l*nobr-l)*n+2*n+(2*m+l)*nobr+l, 2*(l*nobr-l)*n+n*n+8*n, n+4*(m*nobr+n)+1, m*nobr+3*n+l); ldw1 = max (ldw1a, ldw1b); ldw2 = l*nobr*n+m*nobr*(n+l)*(m*(n+l)+1)+ max ((n+l)*(n+l), 4*m*(n+l)+1); } ldw3 = max(4*n*n + 2*n*l + l*l + max (3*l, n*l), 14*n*n + 12*n + 5); ldwork_b = max (ldw1, ldw2, ldw3); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_b, liwork_b); OCTAVE_LOCAL_BUFFER (double, dwork_b, ldwork_b); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicators octave_idx_type iwarn_b = 0; octave_idx_type info_b = 0; // SLICOT routine IB01BD F77_XFCN (ib01bd, IB01BD, (meth_b, job, jobck, nobr, n, m, l, nsmpl, r.fortran_vec (), ldr, a.fortran_vec (), lda, c.fortran_vec (), ldc, b.fortran_vec (), ldb, d.fortran_vec (), ldd, q.fortran_vec (), ldq, ry.fortran_vec (), ldry, s.fortran_vec (), lds, k.fortran_vec (), ldk, tol_b, iwork_b, dwork_b, ldwork_b, bwork, iwarn_b, info_b)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01BD"); static const char* err_msg_b[] = { "0: OK", "1: error message not specified", "2: the singular value decomposition (SVD) algorithm did " "not converge", "3: a singular upper triangular matrix was found", "4: matrix A is (numerically) singular in discrete-" "time case", "5: the Hamiltonian or symplectic matrix H cannot be " "reduced to real Schur form", "6: the real Schur form of the Hamiltonian or " "symplectic matrix H cannot be appropriately ordered", "7: the Hamiltonian or symplectic matrix H has less " "than N stable eigenvalues", "8: the N-th order system of linear algebraic " "equations, from which the solution matrix X would " "be obtained, is singular to working precision", "9: the QR algorithm failed to complete the reduction " "of the matrix Ac to Schur canonical form, T", "10: the QR algorithm did not converge"}; static const char* warn_msg_b[] = { "0: OK", "1: warning message not specified", "2: warning message not specified", "3: warning message not specified", "4: a least squares problem to be solved has a " "rank-deficient coefficient matrix", "5: the computed covariance matrices are too small. " "The problem seems to be a deterministic one; the " "gain matrix is set to zero"}; error_msg ("ident: IB01BD", info_b, 10, err_msg_b); warning_msg ("ident: IB01BD", iwarn_b, 5, warn_msg_b); // resize a.resize (n, n); c.resize (l, n); b.resize (n, m); d.resize (l, m); q.resize (n, n); ry.resize (l, l); s.resize (n, l); k.resize (n, l); //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01CD - estimating the initial state // //////////////////////////////////////////////////////////////////////////////////// // arguments in char jobx0 = 'X'; char comuse = 'U'; char jobbd = 'D'; // arguments out Cell x0_cell (n_exp, 1); // cell of initial state vectors x0 // repeat for every experiment in the dataset // compute individual initial state vector x0 for every experiment for (octave_idx_type i = 0; i < n_exp; i++) { Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); octave_idx_type nsmp = y.rows (); // nsmp: number of samples octave_idx_type ldv = max (1, n); octave_idx_type ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; octave_idx_type ldy = nsmp; // arguments out ColumnVector x0 (n); Matrix v (ldv, n); // workspace octave_idx_type liwork_c = n; // if JOBX0 = 'X' and COMUSE <> 'C' octave_idx_type ldwork_c; octave_idx_type t = nsmp; octave_idx_type ldw1_c = 2; octave_idx_type ldw2_c = t*l*(n + 1) + 2*n + max (2*n*n, 4*n); octave_idx_type ldw3_c = n*(n + 1) + 2*n + max (n*l*(n + 1) + 2*n*n + l*n, 4*n); ldwork_c = ldw1_c + n*( n + m + l ) + max (5*n, ldw1_c, min (ldw2_c, ldw3_c)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork_c, liwork_c); OCTAVE_LOCAL_BUFFER (double, dwork_c, ldwork_c); // error indicators octave_idx_type iwarn_c = 0; octave_idx_type info_c = 0; // SLICOT routine IB01CD F77_XFCN (ib01cd, IB01CD, (jobx0, comuse, jobbd, n, m, l, nsmp, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, u.fortran_vec (), ldu, y.fortran_vec (), ldy, x0.fortran_vec (), v.fortran_vec (), ldv, tol_c, iwork_c, dwork_c, ldwork_c, iwarn_c, info_c)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01CD"); static const char* err_msg_c[] = { "0: OK", "1: the QR algorithm failed to compute all the " "eigenvalues of the matrix A (see LAPACK Library " "routine DGEES); the locations DWORK(i), for " "i = g+1:g+N*N, contain the partially converged " "Schur form", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg_c[] = { "0: OK", "1: warning message not specified", "2: warning message not specified", "3: warning message not specified", "4: the least squares problem to be solved has a " "rank-deficient coefficient matrix", "5: warning message not specified", "6: the matrix A is unstable; the estimated x(0) " "and/or B and D could be inaccurate"}; error_msg ("ident: IB01CD", info_c, 2, err_msg_c); warning_msg ("ident: IB01CD", iwarn_c, 6, warn_msg_c); x0_cell.elem(i) = x0; // add x0 from the current experiment to cell of initial state vectors } // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = q; retval(5) = ry; retval(6) = s; retval(7) = k; retval(8) = x0_cell; } return retval; } control/src/sl_mb05nd.cc0000644000076500000240000000757112614620313014431 0ustar lukasstaff/* Copyright (C) 2014-2015 Thomas Vasileiou This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Matrix exponential and integral for a real matrix. Uses SLICOT MB05ND by courtesy of NICONET e.V. Author: Thomas Vasileiou Created: March 2014 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (mb05nd, MB05ND) (octave_idx_type& N, double& DELTA, double* A, octave_idx_type& LDA, double* EX, octave_idx_type& LDEX, double* EXINT, octave_idx_type& LDEXINT, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_mb05nd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_mb05nd__, args, nargout, "-*- texinfo -*-\n\ Slicot MB05ND Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); double delta = args(1).double_value (); double tol = args(2).double_value (); octave_idx_type n = a.rows (); octave_idx_type lda = max (1, n); octave_idx_type ldex = max (1, n); octave_idx_type ldexin = max (1, n); // arguments out Matrix ex (ldex, n); Matrix exint (ldexin, n); // workspace octave_idx_type ldwork = max (1, 2*n*n); // optimum performance OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info = 0; // SLICOT routine MB05ND F77_XFCN (mb05nd, MB05ND, (n, delta, a.fortran_vec (), lda, ex.fortran_vec (), ldex, exint.fortran_vec (), ldexin, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_mb05nd__: exception in SLICOT subroutine MB05ND"); if (info > 0) { if (info == n+1) info = 2; else info = 1; } static const char* err_msg[] = { "0: OK", "1: some element of the denominator of the Pade " "approximation is zero, so the denominator " "is exactly singular.", "2: DELTA = (delta * frobenius norm of matrix A) is " "probably too large to permit meaningful computation. " "That is, DELTA > SQRT(BIG), where BIG is a " "representable number near the overflow threshold of " "the machine."}; error_msg ("__sl_mb05nd__", info, 2, err_msg); // return values retval(0) = ex; retval(1) = exint; } return retval; } control/src/sl_sb01bd.cc0000644000076500000240000001302212614620313014403 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Pole assignment for a given matrix pair (A,B). Uses SLICOT SB01BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.6 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb01bd, SB01BD) (char& DICO, octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, double& ALPHA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* WR, double* WI, octave_idx_type& NFP, octave_idx_type& NAP, octave_idx_type& NUP, double* F, octave_idx_type& LDF, double* Z, octave_idx_type& LDZ, double& TOL, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb01bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb01bd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB01BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char dico; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); ColumnVector wr = args(2).column_vector_value (); ColumnVector wi = args(3).column_vector_value (); octave_idx_type discrete = args(4).int_value (); double alpha = args(5).double_value (); double tol = args(6).double_value (); if (discrete == 1) dico = 'D'; else dico = 'C'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = wr.rows (); octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldf = max (1, m); octave_idx_type ldz = max (1, n); // arguments out octave_idx_type nfp; octave_idx_type nap; octave_idx_type nup; Matrix f (ldf, n); Matrix z (ldz, n); // workspace octave_idx_type ldwork = max (1, 5*m, 5*n, 2*n+4*m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type iwarn; octave_idx_type info; // SLICOT routine SB01BD F77_XFCN (sb01bd, SB01BD, (dico, n, m, np, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, wr.fortran_vec (), wi.fortran_vec (), nfp, nap, nup, f.fortran_vec (), ldf, z.fortran_vec (), ldz, tol, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("place: __sl_sb01bd__: exception in SLICOT subroutine SB01BD"); static const char* err_msg[] = { "0: OK", "1: the reduction of A to a real Schur form failed.", "2: a failure was detected during the ordering of the " "real Schur form of A, or in the iterative process " "for reordering the eigenvalues of Z'*(A + B*F)*Z " "along the diagonal.", "3: the number of eigenvalues to be assigned is less " "than the number of possibly assignable eigenvalues; " "NAP eigenvalues have been properly assigned, " "but some assignable eigenvalues remain unmodified.", "4: an attempt is made to place a complex conjugate " "pair on the location of a real eigenvalue. This " "situation can only appear when N-NFP is odd, " "NP > N-NFP-NUP is even, and for the last real " "eigenvalue to be modified there exists no available " "real eigenvalue to be assigned. However, NAP " "eigenvalues have been already properly assigned."}; static const char* warn_msg[] = { "0: OK", /* 0+%d: %d */ "violations of the numerical stability condition " "NORM(F) <= 100*NORM(A)/NORM(B) occured during the " "assignment of eigenvalues."}; error_msg ("place", info, 4, err_msg); warning_msg ("place", iwarn, 0, warn_msg, 0); // return values retval(0) = f; retval(1) = octave_value (nfp); retval(2) = octave_value (nap); retval(3) = octave_value (nup); retval(4) = z; } return retval; } control/src/sl_sb02od.cc0000644000076500000240000001530512614620313014427 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solve algebraic Riccati equation. Uses SLICOT SB02OD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: February 2010 Version: 0.5 */ #include #include #include "common.h" #include extern "C" { int F77_FUNC (sb02od, SB02OD) (char& DICO, char& JOBB, char& FACT, char& UPLO, char& JOBL, char& SORT, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* Q, octave_idx_type& LDQ, double* R, octave_idx_type& LDR, double* L, octave_idx_type& LDL, double& RCOND, double* X, octave_idx_type& LDX, double* ALFAR, double* ALFAI, double* BETA, double* S, octave_idx_type& LDS, double* T, octave_idx_type& LDT, double* U, octave_idx_type& LDU, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb02od__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb02od__, args, nargout, "-*- texinfo -*-\n\ Slicot SB02OD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char dico; char jobb = 'B'; char fact = 'N'; char uplo = 'U'; char jobl; char sort = 'S'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix q = args(2).matrix_value (); Matrix r = args(3).matrix_value (); Matrix l = args(4).matrix_value (); octave_idx_type discrete = args(5).int_value (); octave_idx_type ijobl = args(6).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (ijobl == 0) jobl = 'Z'; else jobl = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = 0; // p: number of outputs, not used because FACT = 'N' octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldq = max (1, n); octave_idx_type ldr = max (1, m); octave_idx_type ldl = max (1, n); // arguments out double rcond; octave_idx_type ldx = max (1, n); Matrix x (ldx, n); octave_idx_type nu = 2*n; ColumnVector alfar (nu); ColumnVector alfai (nu); ColumnVector beta (nu); octave_idx_type lds = max (1, 2*n + m); Matrix s (lds, lds); // unused output arguments octave_idx_type ldt = max (1, 2*n + m); OCTAVE_LOCAL_BUFFER (double, t, ldt * 2*n); octave_idx_type ldu = max (1, 2*n); OCTAVE_LOCAL_BUFFER (double, u, ldu * 2*n); // tolerance double tol = 0; // use default value // workspace octave_idx_type liwork = max (1, m, 2*n); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); octave_idx_type ldwork = max (7*(2*n + 1) + 16, 16*n, 2*n + m, 3*m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB02OD F77_XFCN (sb02od, SB02OD, (dico, jobb, fact, uplo, jobl, sort, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, q.fortran_vec (), ldq, r.fortran_vec (), ldr, l.fortran_vec (), ldl, rcond, x.fortran_vec (), ldx, alfar.fortran_vec (), alfai.fortran_vec (), beta.fortran_vec (), s.fortran_vec (), lds, t, ldt, u, ldu, tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("are: __sl_sb02od__: exception in SLICOT subroutine SB02OD"); static const char* err_msg[] = { "0: OK", "1: the computed extended matrix pencil is singular, " "possibly due to rounding errors", "2: the QZ (or QR) algorithm failed", "3: reordering of the (generalized) eigenvalues " "failed", "4: after reordering, roundoff changed values of " "some complex eigenvalues so that leading eigenvalues " "in the (generalized) Schur form no longer satisfy " "the stability condition; this could also be caused " "due to scaling", "5: the computed dimension of the solution does not " "equal N", "6: a singular matrix was encountered during the " "computation of the solution matrix X"}; error_msg ("are", info, 6, err_msg); // assemble complex vector - adapted from DEFUN complex in data.cc alfar.resize (n); alfai.resize (n); beta.resize (n); ColumnVector poler (n); ColumnVector polei (n); poler = quotient (alfar, beta); polei = quotient (alfai, beta); ComplexColumnVector pole (n, Complex ()); for (octave_idx_type i = 0; i < n; i++) pole.xelem (i) = Complex (poler(i), polei(i)); // return value retval(0) = x; retval(1) = pole; } return retval; } control/src/sl_sb03md.cc0000644000076500000240000000732112614620313014425 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of Lyapunov equations. Uses SLICOT SB03MD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2009 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb03md, SB03MD) (char& DICO, char& JOB, char& FACT, char& TRANA, octave_idx_type& N, double* A, octave_idx_type& LDA, double* U, octave_idx_type& LDU, double* C, octave_idx_type& LDC, double& SCALE, double& SEP, double& FERR, double* WR, double* WI, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb03md__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb03md__, args, nargout, "-*- texinfo -*-\n\ Slicot SB03MD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in char dico; char job = 'X'; char fact = 'N'; char trana = 'T'; Matrix a = args(0).matrix_value (); Matrix c = args(1).matrix_value (); octave_idx_type discrete = args(2).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type lda = max (1, n); octave_idx_type ldu = max (1, n); octave_idx_type ldc = max (1, n); // arguments out double scale; double sep = 0; double ferr = 0; Matrix u (ldu, n); ColumnVector wr (n); ColumnVector wi (n); // workspace octave_idx_type* iwork = 0; // not referenced because job = X octave_idx_type ldwork = max (n*n, 3*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SB03MD F77_XFCN (sb03md, SB03MD, (dico, job, fact, trana, n, a.fortran_vec (), lda, u.fortran_vec (), ldu, c.fortran_vec (), ldc, scale, sep, ferr, wr.fortran_vec (), wi.fortran_vec (), iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sb03md__: exception in SLICOT subroutine SB03MD"); if (info != 0) error ("lyap: __sl_sb03md__: SB03MD returned info = %d", info); // return values retval(0) = c; retval(1) = octave_value (scale); } return retval; } control/src/sl_sb03od.cc0000644000076500000240000000733012614620313014427 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Square-root solver for Lyapunov equations. Uses SLICOT SB03OD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb03od, SB03OD) (char& DICO, char& FACT, char& TRANS, octave_idx_type& N, octave_idx_type& M, double* A, octave_idx_type& LDA, double* Q, octave_idx_type& LDQ, double* B, octave_idx_type& LDB, double& SCALE, double* WR, double* WI, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb03od__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb03od__, args, nargout, "-*- texinfo -*-\n\ Slicot SB03OD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in char dico; char fact = 'N'; char trans = 'N'; // char trans = 'T'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); octave_idx_type discrete = args(2).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; octave_idx_type n = a.rows (); octave_idx_type m = b.rows (); // octave_idx_type m = b.columns (); octave_idx_type lda = max (1, n); octave_idx_type ldq = max (1, n); octave_idx_type ldb = max (1, n, m); // octave_idx_type ldb = max (1, n); b.resize (ldb, n); // b.resize (ldb, max (m, n)); // arguments out double scale; Matrix q (ldq, n); ColumnVector wr (n); ColumnVector wi (n); // workspace octave_idx_type ldwork = max (1, 4*n + min (m, n)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SB03OD F77_XFCN (sb03od, SB03OD, (dico, fact, trans, n, m, a.fortran_vec (), lda, q.fortran_vec (), ldq, b.fortran_vec (), ldb, scale, wr.fortran_vec (), wi.fortran_vec (), dwork, ldwork, info)); if (f77_exception_encountered) error ("lyapchol: __sl_sb03od__: exception in SLICOT subroutine SB03OD"); if (info != 0) error ("lyapchol: __sl_sb03od__: SB03OD returned info = %d", info); // resize b.resize (n, n); // return values retval(0) = b; // b has been overwritten by cholesky factor u retval(1) = octave_value (scale); } return retval; } control/src/sl_sb04md.cc0000644000076500000240000000622412614620313014427 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of continuous-time Sylvester equations. Uses SLICOT SB04MD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb04md, SB04MD) (octave_idx_type& N, octave_idx_type& M, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* Z, octave_idx_type& LDZ, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb04md__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb04md__, args, nargout, "-*- texinfo -*-\n\ Slicot SB04MD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); octave_idx_type n = a.rows (); octave_idx_type m = b.rows (); octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, m); octave_idx_type ldc = max (1, n); octave_idx_type ldz = max (1, m); // arguments out Matrix z (ldz, m); // workspace octave_idx_type ldwork = max (1, 2*n*n + 8*n, 5*m, n + m); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, 4*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SB04MD F77_XFCN (sb04md, SB04MD, (n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, z.fortran_vec (), ldz, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sb04md__: exception in SLICOT subroutine SB04MD"); if (info != 0) error ("lyap: __sl_sb04md__: SB04MD returned info = %d", info); // return values retval(0) = c; } return retval; } control/src/sl_sb04qd.cc0000644000076500000240000000622412614620313014433 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of discrete-time Sylvester equations. Uses SLICOT SB04QD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb04qd, SB04QD) (octave_idx_type& N, octave_idx_type& M, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* Z, octave_idx_type& LDZ, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb04qd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb04qd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB04QD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); octave_idx_type n = a.rows (); octave_idx_type m = b.rows (); octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, m); octave_idx_type ldc = max (1, n); octave_idx_type ldz = max (1, m); // arguments out Matrix z (ldz, m); // workspace octave_idx_type ldwork = max (1, 2*n*n + 9*n, 5*m, n + m); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, 4*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SB04QD F77_XFCN (sb04qd, SB04QD, (n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, z.fortran_vec (), ldz, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("dlyap: __sl_sb04qd__: exception in SLICOT subroutine SB04QD"); if (info != 0) error ("dlyap: __sl_sb04qd__: SB04QD returned info = %d", info); // return values retval(0) = c; } return retval; } control/src/sl_sb10ad.cc0000644000076500000240000002215412614620313014410 0ustar lukasstaff/* Copyright (C) 2014-2015 Thomas Vasileiou This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-infinity optimal controller using modified Glover's and Doyle's formulas (continuous-time). Uses SLICOT SB10AD by courtesy of NICONET e.V. Author: Thomas Vasileiou Created: January 2014 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10ad, SB10AD) (octave_idx_type& JOB, octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, octave_idx_type& NCON, octave_idx_type& NMEAS, double& GAMMA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* AC, octave_idx_type& LDAC, double* BC, octave_idx_type& LDBC, double* CC, octave_idx_type& LDCC, double* DC, octave_idx_type& LDDC, double* RCOND, double& GTOL, double& ACTOL, octave_idx_type* IWORK, octave_idx_type& LIWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& LBWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 9) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); octave_idx_type ncon = args(4).int_value (); octave_idx_type nmeas = args(5).int_value (); double gamma = args(6).double_value (); double gtol = args(7).double_value (); double actol = args(8).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, ncon); octave_idx_type lddk = max (1, ncon); octave_idx_type ldac = max (1, 2*n); octave_idx_type ldbc = max (1, 2*n); octave_idx_type ldcc = max (1, np-nmeas); octave_idx_type lddc = max (1, np-nmeas); octave_idx_type job = 1; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); Matrix ac (ldac, 2*n); Matrix bc (ldbc, m-ncon); Matrix cc (ldcc, 2*n); Matrix dc (lddc, m-ncon); ColumnVector rcond (4); // workspace octave_idx_type m2 = ncon; octave_idx_type m1 = m - m2; octave_idx_type np2 = nmeas; octave_idx_type np1 = np - np2; octave_idx_type nd1 = np1 - m2; octave_idx_type nd2 = m1 - np2; octave_idx_type liwork = max (2*max (n, m-ncon, np-nmeas, ncon, nmeas), n*n); octave_idx_type lw1 = n*m + np*n + np*m + m2*m2 + np2*np2; octave_idx_type lw2 = max ((n + np1 + 1)*(n + m2) + max (3*(n + m2) + n + np1, 5*(n + m2)), (n + np2)*(n + m1 + 1) + max (3*(n + np2) + n + m1, 5*(n + np2)), m2 + np1*np1 + max (np1*max (n, m1), 3*m2 + np1, 5*m2), np2 + m1*m1 + max (max (n, np1)*m1, 3*np2 + m1, 5*np2)); octave_idx_type lw3 = max (nd1*m1 + max (4*min (nd1, m1) + max (nd1,m1), 6*min (nd1, m1)), np1*nd2 + max (4*min (np1, nd2) + max (np1, nd2), 6*min (np1, nd2))); octave_idx_type lw4 = 2*m*m + np*np + 2*m*n + m*np + 2*n*np; octave_idx_type lw5 = 2*n*n + m*n + n*np; octave_idx_type lw6 = max (m*m + max (2*m1, 3*n*n + max (n*m, 10*n*n + 12*n + 5)), np*np + max (2*np1, 3*n*n + max (n*np, 10*n*n + 12*n + 5))); octave_idx_type lw7 = m2*np2 + np2*np2 + m2*m2 + max (nd1*nd1 + max (2*nd1, (nd1 + nd2)*np2), nd2*nd2 + max (2*nd2, nd2*m2), 3*n, n*(2*np2 + m2) + max (2*n*m2, m2*np2 + max (m2*m2 + 3*m2, np2*(2*np2 + m2 + max (np2, n))))); octave_idx_type ldwork = lw1 + max (1, lw2, lw3, lw4, lw5 + max (lw6,lw7)); octave_idx_type lbwork = 2*n; OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, lbwork); // error indicator octave_idx_type info; // SLICOT routine SB10AD F77_XFCN (sb10ad, SB10AD, (job, n, m, np, ncon, nmeas, gamma, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, ac.fortran_vec (), ldac, bc.fortran_vec (), ldbc, cc.fortran_vec (), ldcc, dc.fortran_vec (), lddc, rcond.fortran_vec (), gtol, actol, iwork, liwork, dwork, ldwork, bwork, lbwork, info)); if (f77_exception_encountered) error ("hinfsyn: __sl_sb10ad__: exception in SLICOT subroutine SB10AD"); static const char* err_msg[] = { "0: successful exit", "1: the matrix [A-j*omega*I, B2; C1, D12] had " "not full column rank in respect to the tolerance EPS", "2: the matrix [A-j*omega*I, B1; C2, D21] " "had not full row rank in respect to the tolerance EPS", "3: the matrix D12 had not full column rank in " "respect to the tolerance SQRT(EPS)", "4: the matrix D21 had not full row rank in respect " "to the tolerance SQRT(EPS)", "5: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of the matrices " "[A, B2; C1, D12], [A, B1; C2, D21], D12 or D21)", "6: the controller is not admissible (too small value " "of gamma)", "7: the X-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "8: the Y-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "9: the determinant of Im2 + Tu*D11HAT*Ty*D22 is " "zero [3]", "10: there was numerical problems when estimating" "the singular values of D1111, D1112, D1111', D1121'", "11: the matrices Inp2 - D22*DK or Im2 - DK*D22" "are singular to working precision", "12: a stabilizing controller cannot be found"}; error_msg ("hinfsyn", info, 12, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = ac; retval(5) = bc; retval(6) = cc; retval(7) = dc; retval(8) = gamma; retval(9) = rcond; } return retval; } control/src/sl_sb10dd.cc0000644000076500000240000001503312614620313014411 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-infinity (sub)optimal state controller for a discrete-time system. Uses SLICOT SB10DD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2009 Version: 0.6 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10dd, SB10DD) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, octave_idx_type& NCON, octave_idx_type& NMEAS, double& GAMMA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* X, octave_idx_type& LDX, double* Z, octave_idx_type& LDZ, double* RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10dd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10dd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10DD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); octave_idx_type ncon = args(4).int_value (); octave_idx_type nmeas = args(5).int_value (); double gamma = args(6).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, ncon); octave_idx_type lddk = max (1, ncon); octave_idx_type ldx = max (1, n); octave_idx_type ldz = max (1, n); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); Matrix x (ldx, n); Matrix z (ldz, n); ColumnVector rcond (8); // workspace octave_idx_type m2 = ncon; octave_idx_type m1 = m - m2; octave_idx_type np1 = np - nmeas; octave_idx_type np2 = nmeas; octave_idx_type liwork = max (2*max (m2, n), m, m2+np2, n*n); octave_idx_type q = max (m1, m2, np1, np2); octave_idx_type ldwork = max ((n+q)*(n+q+6), 13*n*n + m*m + 2*q*q + n*(m+q) + max (m*(m+7*n), 2*q*(8*n+m+2*q)) + 6*n + max (14*n+23, 16*n, 2*n + max (m, 2*q), 3*max (m, 2*q))); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10DD F77_XFCN (sb10dd, SB10DD, (n, m, np, ncon, nmeas, gamma, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, x.fortran_vec (), ldx, z.fortran_vec (), ldz, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("hinfsyn: __sl_sb10dd__: exception in SLICOT subroutine SB10DD"); static const char* err_msg[] = { "0: OK", "1: the matrix [A-exp(j*Theta)*I, B2; C1, D12] " "had not full column rank", "2: the matrix | A-exp(j*Theta)*I, B1; C2, D21] " "had not full row rank", "3: the matrix D12 had not full column rank", "4: the matrix D21 had not full row rank", "5: the controller is not admissible " "(too small value of gamma)", "6: the X-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "7: the Z-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "8: the matrix Im2 + DKHAT*D22 is singular", "9: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of " "the matrices [A, B2; C1, D12], [A, B1; C2, D21], D12 or D21)"}; error_msg ("hinfsyn", info, 9, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10ed.cc0000644000076500000240000001457012614620313014417 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H2 optimal state controller for a discrete-time system. Uses SLICOT SB10ED by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.6 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10ed, SB10ED) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, octave_idx_type& NCON, octave_idx_type& NMEAS, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10ed__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10ed__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10ED Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); octave_idx_type ncon = args(4).int_value (); octave_idx_type nmeas = args(5).int_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, ncon); octave_idx_type lddk = max (1, ncon); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); ColumnVector rcond (7); // workspace octave_idx_type m2 = ncon; octave_idx_type m1 = m - m2; octave_idx_type np1 = np - nmeas; octave_idx_type np2 = nmeas; octave_idx_type q = max (m1, m2, np1, np2); octave_idx_type ldwork = 2*q*(3*q+2*n)+max(1,(n+q)*(n+q+6),q*(q+max(n,q,5)+1), 2*n*n+max(1,14*n*n+6*n+max(14*n+23,16*n), q*(n+q+max(q,3)))); octave_idx_type liwork = max (2*m2, 2*n, n*n, np2); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10ED F77_XFCN (sb10ed, SB10ED, (n, m, np, ncon, nmeas, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("h2syn: __sl_sb10ed__: exception in SLICOT subroutine SB10ED"); static const char* err_msg[] = { "0: OK", "1: the matrix [A-exp(j*Theta)*I, B2; C1, D12] " "had not full column rank in respect to the tolerance EPS", "2: the matrix [A-exp(j*Theta)*I, B1; C2, D21] " "had not full row rank in respect to the tolerance EPS", "3: the matrix D12 had not full column rank in " "respect to the tolerance TOL", "4: the matrix D21 had not full row rank in respect " "to the tolerance TOL", "5: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of the matrices " "[A-I, B2; C1, D12], [A-I, B1; C2, D21], D12 or D21)", "6: the X-Riccati equation was not solved successfully", "7: the matrix Im2 + B2'*X2*B2 is not positive " "definite, or it is numerically singular (with " "respect to the tolerance TOL)", "8: the Y-Riccati equation was not solved successfully", "9: the matrix Ip2 + C2*Y2*C2' is not positive " "definite, or it is numerically singular (with " "respect to the tolerance TOL)", "10: the matrix Im2 + DKHAT*D22 is singular, or its " "estimated condition number is larger than or equal " "to 1/TOL"}; error_msg ("h2syn", info, 10, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10fd.cc0000644000076500000240000001503012614620313014410 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-infinity (sub)optimal state controller for a continuous-time system. Uses SLICOT SB10FD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2009 Version: 0.6 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10fd, SB10FD) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, octave_idx_type& NCON, octave_idx_type& NMEAS, double& GAMMA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10fd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10fd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10FD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); octave_idx_type ncon = args(4).int_value (); octave_idx_type nmeas = args(5).int_value (); double gamma = args(6).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, ncon); octave_idx_type lddk = max (1, ncon); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); ColumnVector rcond (4); // workspace octave_idx_type m2 = ncon; octave_idx_type m1 = m - m2; octave_idx_type np1 = np - nmeas; octave_idx_type np2 = nmeas; octave_idx_type liwork = max (2*max (n, m-ncon, np-nmeas, ncon), n*n); octave_idx_type q = max (m1, m2, np1, np2); octave_idx_type ldwork = 2*q*(3*q+2*n) + max (1, (n+q)*(n+q+6), q*(q + max (n, q, 5) + 1), 2*n*(n+2*q) + max (1, 4*q*q + max (2*q, 3*n*n + max (2*n*q, 10*n*n+12*n+5)), q*(3*n + 3*q + max (2*n, 4*q + max (n, q))))); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10FD F77_XFCN (sb10fd, SB10FD, (n, m, np, ncon, nmeas, gamma, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("hinfsyn: __sl_sb10fd__: exception in SLICOT subroutine SB10FD"); static const char* err_msg[] = { "0: OK", "1: the matrix [A-j*omega*I, B2; C1, D12] had " "not full column rank in respect to the tolerance EPS", "2: the matrix [A-j*omega*I, B1; C2, D21] " "had not full row rank in respect to the tolerance EPS", "3: the matrix D12 had not full column rank in " "respect to the tolerance TOL", "4: the matrix D21 had not full row rank in respect " "to the tolerance TOL", "5: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of the matrices " "[A, B2; C1, D12], [A, B1; C2, D21], D12 or D21)", "6: the controller is not admissible (too small value " "of gamma)", "7: the X-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "8: the Y-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "9: the determinant of Im2 + Tu*D11HAT*Ty*D22 is " "zero [3]"}; error_msg ("hinfsyn", info, 9, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10hd.cc0000644000076500000240000001265112614620313014420 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H2 optimal state controller for a continuous-time system. Uses SLICOT SB10HD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.6 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10hd, SB10HD) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, octave_idx_type& NCON, octave_idx_type& NMEAS, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10hd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10hd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10HD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); octave_idx_type ncon = args(4).int_value (); octave_idx_type nmeas = args(5).int_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, a.rows ()); octave_idx_type ldb = max (1, b.rows ()); octave_idx_type ldc = max (1, c.rows ()); octave_idx_type ldd = max (1, d.rows ()); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, ncon); octave_idx_type lddk = max (1, ncon); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); ColumnVector rcond (4); // workspace octave_idx_type m2 = ncon; octave_idx_type m1 = m - m2; octave_idx_type np1 = np - nmeas; octave_idx_type np2 = nmeas; octave_idx_type q = max (m1, m2, np1, np2); octave_idx_type ldwork = 2*q*(3*q + 2*n) + max (1, q*(q + max (n, 5) + 1), n*(14*n + 12 + 2*q) + 5); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, max (2*n, n*n)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10HD F77_XFCN (sb10hd, SB10HD, (n, m, np, ncon, nmeas, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("h2syn: __sl_sb10hd__: exception in SLICOT subroutine SB10HD"); static const char* err_msg[] = { "0: OK", "1: the matrix D12 had not full column rank in " "respect to the tolerance TOL", "2: the matrix D21 had not full row rank in respect " "to the tolerance TOL", "3: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of " "the matrices D12 or D21)", "4: the X-Riccati equation was not solved successfully", "5: the Y-Riccati equation was not solved successfully"}; error_msg ("h2syn", info, 5, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10id.cc0000644000076500000240000001214312614620313014415 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Positive feedback controller for a continuous-time system. Uses SLICOT SB10ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: July 2011 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10id, SB10ID) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double& FACTOR, octave_idx_type& NK, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* RCOND, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10id__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10ID Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); double factor = args(4).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, np); octave_idx_type ldd = max (1, np); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, m); octave_idx_type lddk = max (1, m); // arguments out octave_idx_type nk; Matrix ak (ldak, n); Matrix bk (ldbk, np); Matrix ck (ldck, n); Matrix dk (lddk, np); ColumnVector rcond (2); // workspace octave_idx_type liwork = max (2*n, n*n, m, np); octave_idx_type ldwork = 10*n*n + m*m + np*np + 2*m*n + 2*n*np + 4*n + 5 + max (1, 4*n*n + 8*n); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10ID F77_XFCN (sb10id, SB10ID, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, factor, nk, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("ncfsyn: __sl_sb10id__: exception in SLICOT subroutine SB10ID"); static const char* err_msg[] = { "0: OK", "1: the X-Riccati equation is not solved successfully", "2: the Z-Riccati equation is not solved successfully", "3: the iteration to compute eigenvalues or singular " "values failed to converge", "4: the matrix Ip - D*Dk is singular", "5: the matrix Im - Dk*D is singular", "6: the closed-loop system is unstable"}; error_msg ("ncfsyn", info, 6, err_msg); // resizing ak.resize (nk, nk); bk.resize (nk, np); ck.resize (m, nk); dk.resize (m, np); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10jd.cc0000644000076500000240000000717512614620313014427 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Convert descriptor state-space system into regular state-space form. Uses SLICOT SB10JD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10jd, SB10JD) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* E, octave_idx_type& LDE, octave_idx_type& NSYS, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10jd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10jd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10JD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); Matrix e = args(4).matrix_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, np); octave_idx_type ldd = max (1, np); octave_idx_type lde = max (1, n); // arguments out octave_idx_type nsys; // workspace octave_idx_type ldwork = max (1, 2*n*n + 2*n + n*max (5, n + m + np)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SB10JD F77_XFCN (sb10jd, SB10JD, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, e.fortran_vec (), lde, nsys, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_sb10jd__: exception in SLICOT subroutine SB10JD"); if (info != 0) error ("__sl_sb10jd__: SB10JD returned info = %d", info); // resize a.resize (nsys, nsys); b.resize (nsys, m); c.resize (np, nsys); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; } return retval; } control/src/sl_sb10kd.cc0000644000076500000240000001167112614620313014424 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Positive feedback controller for a discrete-time system (D == 0). Uses SLICOT SB10KD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: July 2011 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10kd, SB10KD) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double& FACTOR, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* RCOND, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10kd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10kd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10KD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double factor = args(3).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, np); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, m); octave_idx_type lddk = max (1, m); // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, np); Matrix ck (ldck, n); Matrix dk (lddk, np); ColumnVector rcond (4); // workspace octave_idx_type liwork = 2 * max (n, np+m); octave_idx_type ldwork = 15*n*n + 6*n + max (14*n+23, 16*n, 2*n+np+m, 3*(np+m)) + max (n*n, 11*n*np + 2*m*m + 8*np*np + 8*m*n + 4*m*np + np); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10KD F77_XFCN (sb10kd, SB10KD, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, factor, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("ncfsyn: slsb10kd: exception in SLICOT subroutine SB10KD"); static const char* err_msg[] = { "0: OK", "1: the P-Riccati equation is not solved successfully", "2: the Q-Riccati equation is not solved successfully", "3: the X-Riccati equation is not solved successfully", "4: the iteration to compute eigenvalues failed to " "converge", "5: the matrix Rx + Bx'*X*Bx is singular", "6: the closed-loop system is unstable"}; error_msg ("ncfsyn", info, 6, err_msg); // resizing ak.resize (n, n); bk.resize (n, np); ck.resize (m, n); dk.resize (m, np); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10yd.cc0000644000076500000240000001111312614620313014431 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Fit FRD with SS model. Uses SLICOT SB10YD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.2 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (sb10yd, SB10YD) (octave_idx_type& DISCFL, octave_idx_type& FLAG, octave_idx_type& LENDAT, double* RFRDAT, double* IFRDAT, double* OMEGA, octave_idx_type& N, double* A, octave_idx_type& LDA, double* B, double* C, double* D, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, Complex* ZWORK, octave_idx_type& LZWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10yd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10yd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10YD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix rfrdat = args(0).matrix_value (); Matrix ifrdat = args(1).matrix_value (); Matrix omega = args(2).matrix_value (); octave_idx_type n = args(3).int_value (); octave_idx_type discfl = args(4).int_value (); octave_idx_type flag = args(5).int_value (); octave_idx_type lendat = omega.rows (); // number of frequencies octave_idx_type lda = max (1, n); // arguments out Matrix a (lda, n); Matrix b (n, 1); Matrix c (1, n); Matrix d (1, 1); // workspace octave_idx_type liwork = max (2, 2*n + 1); octave_idx_type ldwork; octave_idx_type lzwork; octave_idx_type hnpts = 2048; octave_idx_type lw1 = 2*lendat + 4*hnpts; octave_idx_type lw2 = lendat + 6*hnpts; octave_idx_type mn = min (2*lendat, 2*n+1); octave_idx_type lw3; octave_idx_type lw4; if (n > 0) { lw3 = 2*lendat*(2*n+1) + max (2*lendat, 2*n+1) + max (mn + 6*n + 4, 2*mn + 1); lzwork = lendat*(2*n+3); } else { lw3 = 4*lendat + 5; lzwork = lendat; } if (flag == 1) lw4 = max (n*n + 5*n, 6*n + 1 + min (1, n)); else lw4 = 0; ldwork = max (2, lw1, lw2, lw3, lw4); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (Complex, zwork, lzwork); // tolerance double tol = 0; // error indicator octave_idx_type info; // SLICOT routine SB10YD F77_XFCN (sb10yd, SB10YD, (discfl, flag, lendat, rfrdat.fortran_vec (), ifrdat.fortran_vec (), omega.fortran_vec (), n, a.fortran_vec (), lda, b.fortran_vec (), c.fortran_vec (), d.fortran_vec (), tol, iwork, dwork, ldwork, zwork, lzwork, info)); if (f77_exception_encountered) error ("fitfrd: __sl_sb10yd__: exception in SLICOT subroutine SB10YD"); if (info != 0) error ("fitfrd: __sl_sb10yd__: SB10YD returned info = %d", info); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (n); } return retval; } control/src/sl_sb10zd.cc0000644000076500000240000001265112614620313014442 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Positive feedback controller for a discrete-time system (D != 0). Uses SLICOT SB10ZD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: August 2011 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10zd, SB10ZD) (octave_idx_type& N, octave_idx_type& M, octave_idx_type& NP, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double& FACTOR, double* AK, octave_idx_type& LDAK, double* BK, octave_idx_type& LDBK, double* CK, octave_idx_type& LDCK, double* DK, octave_idx_type& LDDK, double* RCOND, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb10zd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10zd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10ZD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); double factor = args(4).double_value (); double tol = args(5).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type np = c.rows (); // np: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, np); octave_idx_type ldd = max (1, np); octave_idx_type ldak = max (1, n); octave_idx_type ldbk = max (1, n); octave_idx_type ldck = max (1, m); octave_idx_type lddk = max (1, m); // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, np); Matrix ck (ldck, n); Matrix dk (lddk, np); ColumnVector rcond (6); // workspace octave_idx_type liwork = 2 * max (n, m+np); octave_idx_type ldwork = 16*n*n + 5*m*m + 7*np*np + 6*m*n + 7*m*np + 7*n*np + 6*n + 2*(m + np) + max (14*n+23, 16*n, 2*m-1, 2*np-1); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type info; // SLICOT routine SB10ZD F77_XFCN (sb10zd, SB10ZD, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, factor, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("ncfsyn: __sl_sb10zd__: exception in SLICOT subroutine SB10ZD"); static const char* err_msg[] = { "0: OK", "1: the P-Riccati equation is not solved successfully", "2: the Q-Riccati equation is not solved successfully", "3: the iteration to compute eigenvalues or singular " "values failed to converge", "4: the matrix (gamma^2-1)*In - P*Q is singular", "5: the matrix Rx + Bx'*X*Bx is singular", "6: the matrix Ip + D*Dk is singular", "7: the matrix Im + Dk*D is singular", "8: the matrix Ip - D*Dk is singular", "9: the matrix Im - Dk*D is singular", "10: the closed-loop system is unstable"}; error_msg ("ncfsyn", info, 10, err_msg); // resizing ak.resize (n, n); bk.resize (n, np); ck.resize (m, n); dk.resize (m, np); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb16ad.cc0000644000076500000240000002414112614620313014414 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Controller reduction based on Balance & Truncate (B&T) or Singular Perturbation Approximation (SPA) method. Uses SLICOT SB16AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb16ad, SB16AD) (char& DICO, char& JOBC, char& JOBO, char& JOBMR, char& WEIGHT, char& EQUIL, char& ORDSEL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, octave_idx_type& NC, octave_idx_type& NCR, double& ALPHA, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* AC, octave_idx_type& LDAC, double* BC, octave_idx_type& LDBC, double* CC, octave_idx_type& LDCC, double* DC, octave_idx_type& LDDC, octave_idx_type& NCS, double* HSVC, double& TOL1, double& TOL2, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb16ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb16ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SB16AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 19) { print_usage (); } else { // arguments in char dico; char jobc; char jobo; char jobmr; char weight; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type idico = args(4).int_value (); const octave_idx_type iequil = args(5).int_value (); octave_idx_type ncr = args(6).int_value (); const octave_idx_type iordsel = args(7).int_value (); double alpha = args(8).double_value (); const octave_idx_type ijobmr = args(9).int_value (); Matrix ac = args(10).matrix_value (); Matrix bc = args(11).matrix_value (); Matrix cc = args(12).matrix_value (); Matrix dc = args(13).matrix_value (); const octave_idx_type iweight = args(14).int_value (); const octave_idx_type ijobc = args(15).int_value (); const octave_idx_type ijobo = args(16).int_value (); double tol1 = args(17).double_value (); double tol2 = args(18).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobc == 0) jobc = 'S'; else jobc = 'E'; if (ijobo == 0) jobo = 'S'; else jobo = 'E'; switch (ijobmr) { case 0: jobmr = 'B'; break; case 1: jobmr = 'F'; break; case 2: jobmr = 'S'; break; case 3: jobmr = 'P'; break; default: error ("__sl_sb16ad__: argument jobmr invalid"); } switch (iweight) { case 0: weight = 'N'; break; case 1: weight = 'O'; break; case 2: weight = 'I'; break; case 3: weight = 'P'; break; default: error ("__sl_sb16ad__: argument weight invalid"); } octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type nc = ac.rows (); octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); octave_idx_type ldac = max (1, nc); octave_idx_type ldbc = max (1, nc); octave_idx_type ldcc = max (1, m); octave_idx_type lddc = max (1, m); // arguments out octave_idx_type ncs; ColumnVector hsvc (n); // workspace octave_idx_type liwork; octave_idx_type liwrk1; octave_idx_type liwrk2; switch (jobmr) { case 'B': liwrk1 = 0; break; case 'F': liwrk1 = nc; break; default: liwrk1 = 2*nc; } if (weight == 'N') liwrk2 = 0; else liwrk2 = 2*(m+p); liwork = max (1, liwrk1, liwrk2); octave_idx_type ldwork; octave_idx_type lfreq; octave_idx_type lsqred; if (weight == 'N') { if (equil == 'N') // if WEIGHT = 'N' and EQUIL = 'N' lfreq = nc*(max (m, p) + 5); else // if WEIGHT = 'N' and EQUIL = 'S' lfreq = max (n, nc*(max (m, p) + 5)); } else // if WEIGHT = 'I' or 'O' or 'P' { lfreq = (n+nc)*(n+nc+2*m+2*p) + max ((n+nc)*(n+nc+max(n+nc,m,p)+7), (m+p)*(m+p+4)); } lsqred = max (1, 2*nc*nc+5*nc); ldwork = 2*nc*nc + max (1, lfreq, lsqred); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type iwarn = 0; octave_idx_type info = 0; // SLICOT routine SB16AD F77_XFCN (sb16ad, SB16AD, (dico, jobc, jobo, jobmr, weight, equil, ordsel, n, m, p, nc, ncr, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ac.fortran_vec (), ldac, bc.fortran_vec (), ldbc, cc.fortran_vec (), ldcc, dc.fortran_vec (), lddc, ncs, hsvc.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("conred: exception in SLICOT subroutine SB16AD"); static const char* err_msg[] = { "0: OK", "1: the closed-loop system is not well-posed; " "its feedthrough matrix is (numerically) singular", "2: the computation of the real Schur form of the " "closed-loop state matrix failed", "3: the closed-loop state matrix is not stable", "4: the solution of a symmetric eigenproblem failed", "5: the computation of the ordered real Schur form " "of Ac failed", "6: the separation of the ALPHA-stable/unstable " "diagonal blocks failed because of very close eigenvalues", "7: the computation of Hankel singular values failed"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NCR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "controller; in this case, the resulting NCR is set " "equal to NSMIN.", "2: with ORDSEL = 'F', the selected order NCR " "corresponds to repeated singular values for the " "ALPHA-stable part of the controller, which are " "neither all included nor all excluded from the " "reduced model; in this case, the resulting NCR is " "automatically decreased to exclude all repeated " "singular values.", "3: with ORDSEL = 'F', the selected order NCR is less " "than the order of the ALPHA-unstable part of the " "given controller. In this case NCR is set equal to " "the order of the ALPHA-unstable part."}; error_msg ("conred", info, 7, err_msg); warning_msg ("conred", iwarn, 3, warn_msg); // resize ac.resize (ncr, ncr); bc.resize (ncr, p); // p: number of plant outputs cc.resize (m, ncr); // m: number of plant inputs hsvc.resize (ncs); // return values retval(0) = ac; retval(1) = bc; retval(2) = cc; retval(3) = dc; retval(4) = octave_value (ncr); retval(5) = hsvc; retval(6) = octave_value (ncs); } return retval; } control/src/sl_sb16bd.cc0000644000076500000240000001722512614620313014422 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . TODO Uses SLICOT SB16BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb16bd, SB16BD) (char& DICO, char& JOBD, char& JOBMR, char& JOBCF, char& EQUIL, char& ORDSEL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, octave_idx_type& NCR, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* F, octave_idx_type& LDF, double* G, octave_idx_type& LDG, double* DC, octave_idx_type& LDDC, double* HSV, double& TOL1, double& TOL2, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb16bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb16bd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB16BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 15) { print_usage (); } else { // arguments in char dico; char jobd; char jobmr; char jobcf; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type idico = args(4).int_value (); const octave_idx_type iequil = args(5).int_value (); octave_idx_type ncr = args(6).int_value (); const octave_idx_type iordsel = args(7).int_value (); const octave_idx_type ijobd = args(8).int_value (); const octave_idx_type ijobmr = args(9).int_value (); Matrix f = args(10).matrix_value (); Matrix g = args(11).matrix_value (); const octave_idx_type ijobcf = args(12).int_value (); double tol1 = args(13).double_value (); double tol2 = args(14).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobd == 0) jobd = 'Z'; else jobd = 'D'; if (ijobcf == 0) jobcf = 'L'; else jobcf = 'R'; switch (ijobmr) { case 0: jobmr = 'B'; break; case 1: jobmr = 'F'; break; case 2: jobmr = 'S'; break; case 3: jobmr = 'P'; break; default: error ("__sl_sb16bd__: argument jobmr invalid"); } octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd; if (jobd == 'Z') ldd = 1; else ldd = max (1, p); octave_idx_type ldf = max (1, m); octave_idx_type ldg = max (1, n); octave_idx_type lddc = max (1, m); // arguments out Matrix dc (lddc, p); ColumnVector hsv (n); // workspace octave_idx_type liwork; octave_idx_type pm; octave_idx_type ldwork; octave_idx_type lwr = max (1, n*(2*n+max(n,m+p)+5)+n*(n+1)/2); switch (jobmr) { case 'B': pm = 0; break; case 'F': pm = n; break; default: // if JOBMR = 'S' or 'P' pm = max (1, 2*n); } if (ordsel == 'F' && ncr == n) { liwork = 0; ldwork = p*n; } else if (jobcf == 'L') { liwork = max (pm, m); ldwork = (n+m)*(m+p) + max (lwr, 4*m); } else // if JOBCF = 'R' { liwork = max (pm, p); ldwork = (n+p)*(m+p) + max (lwr, 4*p); } OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type iwarn = 0; octave_idx_type info = 0; // SLICOT routine SB16BD F77_XFCN (sb16bd, SB16BD, (dico, jobd, jobmr, jobcf, equil, ordsel, n, m, p, ncr, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, f.fortran_vec (), ldf, g.fortran_vec (), ldg, dc.fortran_vec (), lddc, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("cfconred: exception in SLICOT subroutine SB16BD"); static const char* err_msg[] = { "0: OK", "1: the reduction of A-L*C to a real Schur form " "failed", "2: the matrix A-L*C is not stable (if DICO = 'C'), " "or not convergent (if DICO = 'D')", "3: the computation of Hankel singular values failed", "4: the reduction of A-B*F to a real Schur form " "failed", "5: the matrix A-B*F is not stable (if DICO = 'C'), " "or not convergent (if DICO = 'D')"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NCR is " "greater than the order of a minimal " "realization of the controller."}; error_msg ("cfconred", info, 5, err_msg); warning_msg ("cfconred", iwarn, 1, warn_msg); // resize a.resize (ncr, ncr); // Ac g.resize (ncr, p); // Bc f.resize (m, ncr); // Cc dc.resize (m, p); // Dc // return values retval(0) = a; retval(1) = g; retval(2) = f; retval(3) = dc; retval(4) = octave_value (ncr); retval(5) = hsv; } return retval; } control/src/sl_sb16cd.cc0000644000076500000240000001577512614620313014433 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . TODO Uses SLICOT SB16CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb16cd, SB16CD) (char& DICO, char& JOBD, char& JOBMR, char& JOBCF, char& ORDSEL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, octave_idx_type& NCR, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double* F, octave_idx_type& LDF, double* G, octave_idx_type& LDG, double* HSV, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sb16cd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb16cd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB16CD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 13) { print_usage (); } else { // arguments in char dico; char jobd; char jobmr; char jobcf; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type idico = args(4).int_value (); octave_idx_type ncr = args(5).int_value (); const octave_idx_type iordsel = args(6).int_value (); const octave_idx_type ijobd = args(7).int_value (); const octave_idx_type ijobmr = args(8).int_value (); Matrix f = args(9).matrix_value (); Matrix g = args(10).matrix_value (); const octave_idx_type ijobcf = args(11).int_value (); double tol = args(12).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobd == 0) jobd = 'Z'; else jobd = 'D'; if (ijobcf == 0) jobcf = 'L'; else jobcf = 'R'; switch (ijobmr) { case 0: jobmr = 'B'; break; case 1: jobmr = 'F'; break; default: error ("__sl_sb16cd__: argument jobmr invalid"); } octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd; if (jobd == 'Z') ldd = 1; else ldd = max (1, p); octave_idx_type ldf = max (1, m); octave_idx_type ldg = max (1, n); // arguments out ColumnVector hsv (n); // workspace octave_idx_type liwork; if (jobmr == 'B') liwork = 0; else // if JOBMR = 'F' liwork = n; octave_idx_type ldwork; octave_idx_type mp; if (jobcf == 'L') mp = m; else // if JOBCF = 'R' mp = p; ldwork = 2*n*n + max (1, 2*n*n + 5*n, n*max(m,p), n*(n + max(n,mp) + min(n,mp) + 6)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type iwarn = 0; octave_idx_type info = 0; // SLICOT routine SB16CD F77_XFCN (sb16cd, SB16CD, (dico, jobd, jobmr, jobcf, ordsel, n, m, p, ncr, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, f.fortran_vec (), ldf, g.fortran_vec (), ldg, hsv.fortran_vec (), tol, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("fwcfconred: exception in SLICOT subroutine SB16CD"); static const char* err_msg[] = { "0: OK", "1: eigenvalue computation failure", "2: the matrix A-L*C is not stable", "3: the matrix A-B*F is not stable", "4: the Lyapunov equation for computing the " "observability Grammian is (nearly) singular", "5: the Lyapunov equation for computing the " "controllability Grammian is (nearly) singular", "6: the computation of Hankel singular values failed"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NCR is " "greater than the order of a minimal realization " "of the controller.", "2: with ORDSEL = 'F', the selected order NCR " "corresponds to repeated singular values, which are " "neither all included nor all excluded from the " "reduced controller. In this case, the resulting NCR " "is set automatically to the largest value such that " "HSV(NCR) > HSV(NCR+1)."}; error_msg ("fwcfconred", info, 6, err_msg); warning_msg ("fwcfconred", iwarn, 2, warn_msg); // resize a.resize (ncr, ncr); // Ac g.resize (ncr, p); // Bc f.resize (m, ncr); // Cc // Dc = 0 // return values retval(0) = a; retval(1) = g; retval(2) = f; retval(3) = octave_value (ncr); retval(4) = hsv; } return retval; } control/src/sl_sg02ad.cc0000644000076500000240000001677512614620313014432 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of algebraic Riccati equations for descriptor systems. Uses SLICOT SG02AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2010 Version: 0.4 */ #include #include #include "common.h" #include extern "C" { int F77_FUNC (sg02ad, SG02AD) (char& DICO, char& JOBB, char& FACT, char& UPLO, char& JOBL, char& SCAL, char& SORT, char& ACC, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* Q, octave_idx_type& LDQ, double* R, octave_idx_type& LDR, double* L, octave_idx_type& LDL, double& RCONDU, double* X, octave_idx_type& LDX, double* ALFAR, double* ALFAI, double* BETA, double* S, octave_idx_type& LDS, double* T, octave_idx_type& LDT, double* U, octave_idx_type& LDU, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, bool* BWORK, octave_idx_type& IWARN, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sg02ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sg02ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SG02AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 8) { print_usage (); } else { // arguments in char dico; char jobb = 'B'; char fact = 'N'; char uplo = 'U'; char jobl; char scal = 'N'; char sort = 'S'; char acc = 'N'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix q = args(3).matrix_value (); Matrix r = args(4).matrix_value (); Matrix l = args(5).matrix_value (); octave_idx_type discrete = args(6).int_value (); octave_idx_type ijobl = args(7).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (ijobl == 0) jobl = 'Z'; else jobl = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = 0; // p: number of outputs, not used because FACT = 'N' octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldq = max (1, n); octave_idx_type ldr = max (1, m); octave_idx_type ldl = max (1, n); // arguments out double rcondu; octave_idx_type ldx = max (1, n); Matrix x (ldx, n); octave_idx_type nu = 2*n; ColumnVector alfar (nu); ColumnVector alfai (nu); ColumnVector beta (nu); // unused output arguments octave_idx_type lds = max (1, 2*n + m); OCTAVE_LOCAL_BUFFER (double, s, lds * lds); octave_idx_type ldt = max (1, 2*n + m); OCTAVE_LOCAL_BUFFER (double, t, ldt * 2*n); octave_idx_type ldu = max (1, 2*n); OCTAVE_LOCAL_BUFFER (double, u, ldu * 2*n); // tolerance double tol = 0; // use default value // workspace octave_idx_type liwork = max (1, m, 2*n); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); octave_idx_type ldwork = max (7*(2*n + 1) + 16, 16*n, 2*n + m, 3*m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator octave_idx_type iwarn; octave_idx_type info; // SLICOT routine SG02AD F77_XFCN (sg02ad, SG02AD, (dico, jobb, fact, uplo, jobl, scal, sort, acc, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, q.fortran_vec (), ldq, r.fortran_vec (), ldr, l.fortran_vec (), ldl, rcondu, x.fortran_vec (), ldx, alfar.fortran_vec (), alfai.fortran_vec (), beta.fortran_vec (), s, lds, t, ldt, u, ldu, tol, iwork, dwork, ldwork, bwork, iwarn, info)); if (f77_exception_encountered) error ("are: __sl_sg02ad__: exception in SLICOT subroutine SG02AD"); static const char* err_msg[] = { "0: OK", "1: the computed extended matrix pencil is singular, " "possibly due to rounding errors", "2: the QZ algorithm failed", "3: reordering of the generalized eigenvalues failed", "4: after reordering, roundoff changed values of " "some complex eigenvalues so that leading eigenvalues " "in the generalized Schur form no longer satisfy the " "stability condition; this could also be caused due " "to scaling", "5: the computed dimension of the solution does not " "equal N", "6: the spectrum is too close to the boundary of " "the stability domain", "7: a singular matrix was encountered during the " "computation of the solution matrix X"}; static const char* warn_msg[] = { "0: OK", "1: solution may be inaccurate due to poor scaling " "or eigenvalues too close to the boundary of the stability domain " "(the imaginary axis, if DICO = 'C', or the unit circle, if DICO = 'D')"}; error_msg ("are", info, 7, err_msg); warning_msg ("are", iwarn, 1, warn_msg); // assemble complex vector - adapted from DEFUN complex in data.cc alfar.resize (n); alfai.resize (n); beta.resize (n); ColumnVector poler (n); ColumnVector polei (n); poler = quotient (alfar, beta); polei = quotient (alfai, beta); ComplexColumnVector pole (n, Complex ()); for (octave_idx_type i = 0; i < n; i++) pole.xelem (i) = Complex (poler(i), polei(i)); // return value retval(0) = x; retval(1) = pole; } return retval; } control/src/sl_sg03ad.cc0000644000076500000240000001041412614620313014413 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of generalized Lyapunov equations. Uses SLICOT SG03AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sg03ad, SG03AD) (char& DICO, char& JOB, char& FACT, char& TRANS, char& UPLO, octave_idx_type& N, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* Q, octave_idx_type& LDQ, double* Z, octave_idx_type& LDZ, double* X, octave_idx_type& LDX, double& SCALE, double& SEP, double& FERR, double* ALPHAR, double* ALPHAI, double* BETA, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sg03ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sg03ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SG03AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char dico; char job = 'X'; char fact = 'N'; char trans = 'T'; char uplo = 'U'; // ?!? Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix x = args(2).matrix_value (); octave_idx_type discrete = args(3).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldq = max (1, n); octave_idx_type ldz = max (1, n); octave_idx_type ldx = max (1, n); // arguments out double scale; double sep = 0; double ferr = 0; Matrix q (ldq, n); Matrix z (ldz, n); ColumnVector alphar (n); ColumnVector alphai (n); ColumnVector beta (n); // workspace octave_idx_type* iwork = 0; // not referenced because job = X octave_idx_type ldwork = max (1, 4*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SG03AD F77_XFCN (sg03ad, SG03AD, (dico, job, fact, trans, uplo, n, a.fortran_vec (), lda, e.fortran_vec (), lde, q.fortran_vec (), ldq, z.fortran_vec (), ldz, x.fortran_vec (), ldx, scale, sep, ferr, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sg03ad__: exception in SLICOT subroutine SG03AD"); if (info != 0) error ("lyap: __sl_sg03ad__: SG03AD returned info = %d", info); // return values retval(0) = x; retval(1) = octave_value (scale); } return retval; } control/src/sl_sg03bd.cc0000644000076500000240000001006512614620313014416 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Square-root solver for generalized Lyapunov equations. Uses SLICOT SG03BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sg03bd, SG03BD) (char& DICO, char& FACT, char& TRANS, octave_idx_type& N, octave_idx_type& M, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* Q, octave_idx_type& LDQ, double* Z, octave_idx_type& LDZ, double* B, octave_idx_type& LDB, double& SCALE, double* ALPHAR, double* ALPHAI, double* BETA, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_sg03bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sg03bd__, args, nargout, "-*- texinfo -*-\n\ Slicot SG03BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char dico; char fact = 'N'; char trans = 'N'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); octave_idx_type discrete = args(3).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; octave_idx_type n = a.rows (); octave_idx_type m = b.rows (); octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldq = max (1, n); octave_idx_type ldz = max (1, n); octave_idx_type ldb = max (1, m, n); octave_idx_type n1 = max (m, n); b.resize (ldb, n1); // arguments out double scale; Matrix q (ldq, n); Matrix z (ldz, n); ColumnVector alphar (n); ColumnVector alphai (n); ColumnVector beta (n); // workspace octave_idx_type ldwork = max (1, 4*n, 6*n-6); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine SG03BD F77_XFCN (sg03bd, SG03BD, (dico, fact, trans, n, m, a.fortran_vec (), lda, e.fortran_vec (), lde, q.fortran_vec (), ldq, z.fortran_vec (), ldz, b.fortran_vec (), ldb, scale, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sg03bd__: exception in SLICOT subroutine SG03BD"); if (info != 0) error ("lyap: __sl_sg03bd__: SG03BD returned info = %d", info); // resize b.resize (n, n); // return values retval(0) = b; // b has been overwritten by cholesky factor u retval(1) = octave_value (scale); } return retval; } control/src/sl_tb01id.cc0000644000076500000240000000623712614620313014425 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Balance state-space model. Uses SLICOT TB01ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: May 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb01id, TB01ID) (char& JOB, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double& MAXRED, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* SCALE, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tb01id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb01id__, args, nargout, "-*- texinfo -*-\n\ Slicot TB01ID Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char job = 'A'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double maxred = args(3).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); // arguments out ColumnVector scale (n); // error indicators octave_idx_type info = 0; // SLICOT routine TB01ID F77_XFCN (tb01id, TB01ID, (job, n, m, p, maxred, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, scale.fortran_vec (), info)); if (f77_exception_encountered) error ("ss: prescale: __sl_tb01id__: exception in SLICOT subroutine TB01ID"); if (info != 0) error ("ss: prescale: __sl_tb01id__: TB01ID returned info = %d", info); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = octave_value (maxred); retval(4) = scale; } return retval; } control/src/sl_tb01pd.cc0000644000076500000240000000771112614620313014432 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Minimal realization of state-space models. Uses SLICOT TB01PD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb01pd, TB01PD) (char& JOB, char& EQUIL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, octave_idx_type& NR, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tb01pd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb01pd__, args, nargout, "-*- texinfo -*-\n\ Slicot TB01PD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char job = 'M'; char equil; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double tol = args(3).double_value (); const octave_idx_type scaled = args(4).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc; if (n == 0) ldc = 1; else ldc = max (1, m, p); b.resize (ldb, max (m, p)); c.resize (ldc, n); // arguments out octave_idx_type nr = 0; // workspace octave_idx_type liwork = n + max (m, p); octave_idx_type ldwork = max (1, n + max (n, 3*m, 3*p)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info = 0; // SLICOT routine TB01PD F77_XFCN (tb01pd, TB01PD, (job, equil, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, nr, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("ss: minreal: __sl_tb01pd__: exception in SLICOT subroutine TB01PD"); if (info != 0) error ("ss: minreal: __sl_tb01pd__: TB01PD returned info = %d", info); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = octave_value (nr); } return retval; } control/src/sl_tb01ud.cc0000644000076500000240000000777612614620313014452 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Orthogonal canonical form. Uses SLICOT TB01UD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb01ud, TB01UD) (char& JOBZ, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, octave_idx_type& NCONT, octave_idx_type& INDCON, octave_idx_type* NBLK, double* Z, octave_idx_type& LDZ, double* TAU, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tb01ud__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb01ud__, args, nargout, "-*- texinfo -*-\n\ Slicot TB01UD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char jobz = 'I'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double tol = args(3).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldz = max (1, n); // arguments out Matrix z (ldz, n); octave_idx_type ncont; octave_idx_type indcon; OCTAVE_LOCAL_BUFFER (octave_idx_type, nblk, n); OCTAVE_LOCAL_BUFFER (double, tau, n); // workspace octave_idx_type ldwork = max (1, n, 3*m, p); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info; // SLICOT routine TB01UD F77_XFCN (tb01ud, TB01UD, (jobz, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, ncont, indcon, nblk, z.fortran_vec (), ldz, tau, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_tb01ud__: exception in SLICOT subroutine TB01UD"); if (info != 0) error ("__sl_tb01ud__: TB01UD returned info = %d", info); // resize a.resize (n, n); b.resize (n, m); c.resize (p, n); z.resize (n, n); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = z; retval(4) = octave_value (ncont); } return retval; } control/src/sl_tb04bd.cc0000644000076500000240000001130412614620313014410 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Transfer matrix of a given state-space representation (A,B,C,D), using the pole-zeros method. Uses SLICOT TB04BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb04bd, TB04BD) (char& JOBD, char& ORDER, char& EQUIL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, octave_idx_type& MD, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, octave_idx_type* IGN, octave_idx_type& LDIGN, octave_idx_type* IGD, octave_idx_type& LDIGD, double* GN, double* GD, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tb04bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb04bd__, args, nargout, "-*- texinfo -*-\n\ Slicot TB04BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char jobd = 'D'; char order = 'D'; char equil; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const octave_idx_type scaled = args(4).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type md = n + 1; octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldd = max (1, p); // arguments out octave_idx_type ldign = max (1, p); octave_idx_type ldigd = max (1, p); octave_idx_type lg = p * m * md; OCTAVE_LOCAL_BUFFER (octave_idx_type, ign, ldign*m); OCTAVE_LOCAL_BUFFER (octave_idx_type, igd, ldigd*m); RowVector gn (lg); RowVector gd (lg); // tolerance double tol = 0; // use default value // workspace octave_idx_type ldwork = max (1, n*(n + p) + max (n + max (n, p), n*(2*n + 5))); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine TB04BD F77_XFCN (tb04bd, TB04BD, (jobd, order, equil, n, m, p, md, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ign, ldign, igd, ldigd, gn.fortran_vec (), gd.fortran_vec (), tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("ss2tf: __sl_tb04bd__: exception in SLICOT subroutine TB04BD"); if (info != 0) error ("ss2tf: __sl_tb04bd__: TB04BD returned info = %d", info); // return values Cell num(p, m); Cell den(p, m); octave_idx_type ik, istr; for (ik = 0; ik < p*m; ik++) { istr = ik*md; num.xelem (ik) = gn.extract_n (istr, ign[ik]+1); den.xelem (ik) = gd.extract_n (istr, igd[ik]+1); } retval(0) = num; retval(1) = den; } return retval; } control/src/sl_td04ad.cc0000644000076500000240000001122412614620313014412 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Minimal state-space representation (A,B,C,D) for a proper transfer matrix T(s) given as either row or column polynomial vectors over denominator polynomials, possibly with uncancelled common terms. Uses SLICOT TD04AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: August 2011 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (td04ad, TD04AD) (char& ROWCOL, octave_idx_type& M, octave_idx_type& P, octave_idx_type* INDEX, double* DCOEFF, octave_idx_type& LDDCOE, double* UCOEFF, octave_idx_type& LDUCO1, octave_idx_type& LDUCO2, octave_idx_type& NR, double* A, octave_idx_type& LDA, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* D, octave_idx_type& LDD, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_td04ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_td04ad__, args, nargout, "-*- texinfo -*-\n\ Slicot TD04AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char rowcol = 'R'; NDArray ucoeff = args(0).array_value (); Matrix dcoeff = args(1).matrix_value (); Matrix indexd = args(2).matrix_value (); double tol = args(3).double_value (); octave_idx_type p = ucoeff.rows (); // p: number of outputs octave_idx_type m = ucoeff.columns (); // m: number of inputs octave_idx_type lddcoe = max (1, p); // TODO: handle case ucoeff.rows = 0 octave_idx_type lduco1 = max (1, p); octave_idx_type lduco2 = max (1, m); octave_idx_type n = 0; OCTAVE_LOCAL_BUFFER (octave_idx_type, index, p); for (octave_idx_type i = 0; i < p; i++) { index[i] = indexd.xelem (i); n += index[i]; } // arguments out octave_idx_type nr = max (1, n); // initialize to prevent crash if info != 0 octave_idx_type lda = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, m, p); octave_idx_type ldd = max (1, p); Matrix a (lda, n); Matrix b (ldb, max (m, p)); Matrix c (ldc, n); Matrix d (ldd, m); // workspace octave_idx_type ldwork = max (1, n + max (n, 3*m, 3*p)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n + max (m, p)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator octave_idx_type info; // SLICOT routine TD04AD F77_XFCN (td04ad, TD04AD, (rowcol, m, p, index, dcoeff.fortran_vec (), lddcoe, ucoeff.fortran_vec (), lduco1, lduco2, nr, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("tf2ss: __sl_td04ad__: exception in SLICOT subroutine TD04AD"); if (info != 0) error ("tf2ss: __sl_td04ad__: TD04AD returned info = %d", info); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); d.resize (p, m); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; } return retval; } control/src/sl_tg01ad.cc0000644000076500000240000000714112614620313014415 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Balance descriptor state-space model. Uses SLICOT TG01AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: June 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01ad, TG01AD) (char& JOB, octave_idx_type& L, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double& TRESH, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* LSCALE, double *RSCALE, double* DWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tg01ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01ad__, args, nargout, "-*- texinfo -*-\n\ Slicot TG01AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char job = 'A'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tresh = args(4).double_value (); octave_idx_type l = a.rows (); octave_idx_type n = a.columns (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, l); octave_idx_type lde = max (1, l); octave_idx_type ldb = max (1, l); octave_idx_type ldc = max (1, p); // arguments out ColumnVector lscale (l); ColumnVector rscale (n); // workspace OCTAVE_LOCAL_BUFFER (double, dwork, 3*(l+n)); // error indicators octave_idx_type info = 0; // SLICOT routine TG01AD F77_XFCN (tg01ad, TG01AD, (job, l, n, m, p, tresh, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, lscale.fortran_vec (), rscale.fortran_vec (), dwork, info)); if (f77_exception_encountered) error ("ss: prescale: __sl_tg01ad__: exception in SLICOT subroutine TG01AD"); if (info != 0) error ("ss: prescale: __sl_tg01ad__: TG01AD returned info = %d", info); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = lscale; retval(5) = rscale; } return retval; } control/src/sl_tg01fd.cc0000644000076500000240000001123712614620313014423 0ustar lukasstaff/* Copyright (C) 2013-2015 Thomas Vasileiou This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Orthogonal reduction of a descriptor system to a SVD-like coordinate form. Uses SLICOT TG01FD by courtesy of NICONET e.V. Author: Thomas Vasileiou Created: September 2013 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01fd, TG01FD) (char& COMPQ, char& COMPZ, char& JOBA, octave_idx_type& L, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* Q, octave_idx_type& LDQ, double* Z, octave_idx_type& LDZ, octave_idx_type& RANKE, octave_idx_type& RNKA22, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tg01fd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01fd__, args, nargout, "-*- texinfo -*-\n\ Slicot TG01FD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in char compq; char compz; char joba = 'T'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); const octave_idx_type qz_flag = args(4).int_value (); double tol = args(5).double_value (); if (qz_flag == 0) { compq = 'N'; compz = 'N'; } else { compq = 'I'; compz = 'I'; } octave_idx_type l = a.rows (); octave_idx_type n = l; octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, l); octave_idx_type lde = max (1, l); octave_idx_type ldb = max (1, l); octave_idx_type ldc = max (1, p); octave_idx_type ldq = max (1, l); octave_idx_type ldz = max (1, n); // arguments out Matrix q(l, l, 0.); Matrix z(n, n, 0.); Matrix empty(0, 0); octave_idx_type ranke, rnka22; // workspace octave_idx_type ldwork = max (1, n+p, min (l,n) + max (3*n-1, m, l)); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info = 0; // SLICOT routine TG01FD F77_XFCN (tg01fd, TG01FD, (compq, compz, joba, l, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, q.fortran_vec (), ldq, z.fortran_vec (), ldz, ranke, rnka22, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_tg01fd__: exception in SLICOT subroutine TG01FD"); if (info != 0) error ("__sl_tg01fd__: TG01FD returned info = %d", info); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = octave_value (ranke); retval(5) = octave_value (rnka22); if (qz_flag == 0) { retval(6) = empty; retval(7) = empty; } else { retval(6) = q; retval(7) = z; } } return retval; } control/src/sl_tg01hd.cc0000644000076500000240000001070112614620313014420 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Staircase controllability form for descriptor models. Uses SLICOT TG01HD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01hd, TG01HD) (char& JOBCON, char& COMPQ, char& COMPZ, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* Q, octave_idx_type& LDQ, double* Z, octave_idx_type& LDZ, octave_idx_type& NCONT, octave_idx_type& NIUCON, octave_idx_type& NRBLCK, octave_idx_type* RTAU, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tg01hd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01hd__, args, nargout, "Slicot TG01HD Release 5.0") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char jobcon = 'C'; char compq = 'I'; char compz = 'I'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tol = args(4).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, p); octave_idx_type ldq = max (1, n); octave_idx_type ldz = max (1, n); // arguments out Matrix q (ldq, n); Matrix z (ldz, n); octave_idx_type ncont; octave_idx_type niucon; octave_idx_type nrblck; OCTAVE_LOCAL_BUFFER (octave_idx_type, rtau, n); // workspace octave_idx_type ldwork = max (n, 2*m); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info; // SLICOT routine TG01HD F77_XFCN (tg01hd, TG01HD, (jobcon, compq, compz, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, q.fortran_vec (), ldq, z.fortran_vec (), ldz, ncont, niucon, nrblck, rtau, tol, iwork, dwork, info)); if (f77_exception_encountered) error ("__sl_tg01hd__: exception in SLICOT subroutine TG01HD"); if (info != 0) error ("__sl_tg01hd__: TG01HD returned info = %d", info); // resize a.resize (n, n); e.resize (n, n); b.resize (n, m); c.resize (p, n); q.resize (n, n); z.resize (n, n); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = q; retval(5) = z; retval(6) = octave_value (ncont); } return retval; } control/src/sl_tg01id.cc0000644000076500000240000001074712614620313014433 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Staircase observability form for descriptor models. Uses SLICOT TG01ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01id, TG01ID) (char& JOBOBS, char& COMPQ, char& COMPZ, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, double* Q, octave_idx_type& LDQ, double* Z, octave_idx_type& LDZ, octave_idx_type& NOBSV, octave_idx_type& NIUOBS, octave_idx_type& NLBLCK, octave_idx_type* CTAU, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tg01id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01id__, args, nargout, "Slicot TG01ID Release 5.0") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char jobobs = 'O'; char compq = 'I'; char compz = 'I'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tol = args(4).double_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc = max (1, m, p); octave_idx_type ldq = max (1, n); octave_idx_type ldz = max (1, n); b.resize (ldb, max (m, p)); // arguments out Matrix q (ldq, n); Matrix z (ldz, n); octave_idx_type nobsv; octave_idx_type niuobs; octave_idx_type nlblck; OCTAVE_LOCAL_BUFFER (octave_idx_type, ctau, n); // workspace octave_idx_type ldwork = max (n, 2*p); OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, p); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info; // SLICOT routine TG01ID F77_XFCN (tg01id, TG01ID, (jobobs, compq, compz, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, q.fortran_vec (), ldq, z.fortran_vec (), ldz, nobsv, niuobs, nlblck, ctau, tol, iwork, dwork, info)); if (f77_exception_encountered) error ("__sl_tg01id__: exception in SLICOT subroutine TG01ID"); if (info != 0) error ("__sl_tg01id__: TG01ID returned info = %d", info); // resize a.resize (n, n); e.resize (n, n); b.resize (n, m); c.resize (p, n); q.resize (n, n); z.resize (n, n); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = q; retval(5) = z; retval(6) = octave_value (nobsv); } return retval; } control/src/sl_tg01jd.cc0000644000076500000240000001433712614620313014433 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Minimal realization of descriptor state-space models. Uses SLICOT TG01JD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01jd, TG01JD) (char& JOB, char& SYSTYP, char& EQUIL, octave_idx_type& N, octave_idx_type& M, octave_idx_type& P, double* A, octave_idx_type& LDA, double* E, octave_idx_type& LDE, double* B, octave_idx_type& LDB, double* C, octave_idx_type& LDC, octave_idx_type& NR, octave_idx_type* INFRED, double& TOL, octave_idx_type* IWORK, double* DWORK, octave_idx_type& LDWORK, octave_idx_type& INFO); } // PKG_ADD: autoload ("__sl_tg01jd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01jd__, args, nargout, "-*- texinfo -*-\n\ Slicot TG01JD Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 8) { print_usage (); } else { // arguments in char job; char systyp; char equil; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tol = args(4).double_value (); const octave_idx_type scaled = args(5).int_value (); const octave_idx_type ijob = args(6).int_value (); const octave_idx_type isystyp = args(7).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; switch (ijob) { case 0: job = 'I'; break; case 1: job = 'C'; break; case 2: job = 'O'; break; default: error ("__sl_tg01jd__: argument job invalid"); } switch (isystyp) { case 0: systyp = 'R'; break; case 1: systyp = 'S'; break; case 2: systyp = 'P'; break; default: error ("__sl_tg01jd__: argument systyp invalid"); } octave_idx_type n = a.rows (); // n: number of states octave_idx_type m = b.columns (); // m: number of inputs octave_idx_type p = c.rows (); // p: number of outputs octave_idx_type lda = max (1, n); octave_idx_type lde = max (1, n); octave_idx_type ldb = max (1, n); octave_idx_type ldc; if (n == 0) ldc = 1; else ldc = max (1, m, p); a.resize (lda, n); e.resize (lde, n); if (job == 'C') b.resize (ldb, m); else b.resize (ldb, max (m, p)); c.resize (ldc, n); // arguments out octave_idx_type nr; octave_idx_type infred[7]; // workspace octave_idx_type liwork = n + max (m, p); octave_idx_type ldwork; // octave_idx_type ldwork = max (n, 2*m, 2*p); // octave_idx_type ldwork = n * (2*n + m + p) + max (n, 2*m, 2*p); if (equil == 'S') ldwork = max (8*n, 2*m, 2*p); else // if EQUIL = 'N' ldwork = max (n, 2*m, 2*p); // FIXME: larger ldwork should give better results, // but it breaks the test that Slicot provides. /* LDWORK INTEGER The length of the array DWORK. LDWORK >= MAX(8*N,2*M,2*P), if EQUIL = 'S'; LDWORK >= MAX(N,2*M,2*P), if EQUIL = 'N'. If LDWORK >= MAX(2*N*N+N*M+N*P)+MAX(N,2*M,2*P) then more accurate results are to be expected by performing only those reductions phases (see METHOD), where effective order reduction occurs. This is achieved by saving the system matrices before each phase and restoring them if no order reduction took place. */ OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators octave_idx_type info = 0; // SLICOT routine TG01JD F77_XFCN (tg01jd, TG01JD, (job, systyp, equil, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, nr, infred, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("dss: minreal: __sl_tg01jd__: exception in SLICOT subroutine TG01JD"); if (info != 0) error ("dss: minreal: __sl_tg01jd__: TG01JD returned info = %d", info); // resize a.resize (nr, nr); e.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = octave_value (nr); } return retval; } control/src/sl_tg04bx.cc0000644000076500000240000000713312614620313014446 0ustar lukasstaff/* Copyright (C) 2009-2015 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Gain of descriptor state-space models. Based on SLICOT TB04BX.f. Author: Lukas Reichlin Created: March 2011 Version: 0.2 */ #include #include #include "common.h" #include #include extern "C" { int F77_FUNC (tg04bx, TG04BX) (octave_idx_type& IP, octave_idx_type& IZ, double* A, octave_idx_type& LDA, double* E, double* B, double* C, double* D, double* PR, double* PI, double* ZR, double* ZI, double& GAIN, octave_idx_type* IWORK); } // PKG_ADD: autoload ("__sl_tg04bx__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg04bx__, args, nargout, "-*- texinfo -*-\n\ Slicot TG04BX Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_idx_type nargin = args.length (); octave_value_list retval; if (nargin != 9) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); Matrix d = args(4).matrix_value (); ColumnVector pr = args(5).column_vector_value (); ColumnVector pi = args(6).column_vector_value (); ColumnVector zr = args(7).column_vector_value (); ColumnVector zi = args(8).column_vector_value (); octave_idx_type n = a.rows (); // n: number of states octave_idx_type ip = pr.length (); // ip: number of finite poles octave_idx_type iz = zr.length (); // iz: number of zeros // For ss, IP = n is always true. // However, dss models with poles at infinity // (filtered by pole.m) may have IP <= n // Take pr.length == pi.length == ip for granted, // and the same for iz, zr and zi. octave_idx_type lda = max (1, n); // arguments out double gain; // workspace OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, lda); F77_XFCN (tg04bx, TG04BX, (ip, iz, a.fortran_vec (), lda, e.fortran_vec (), b.fortran_vec (), c.fortran_vec (), d.fortran_vec (), pr.fortran_vec (), pi.fortran_vec (), zr.fortran_vec (), zi.fortran_vec (), gain, iwork)); if (f77_exception_encountered) error ("dss: zero: __sl_tg04bx__: exception in TG04BX"); // return values retval(0) = octave_value (gain); } return retval; } control/src/slicot.tar.gz0000644000076500000240001156520412614620313014767 0ustar lukasstaff}Lslicot.taris9/k~yq-"gbw%kOLܠ%Y2K6)Z\5rĚH$@/G?֟P=Y¿"KbW8L_?7]/Φ_-.'hϚm"0"u_+e~_4jH}q'5`'I!Wпw>A#5OP ֽb&Q4*PQfF1&]deH{ VߋA[[Qjs|TQ!Irn(9Dd[L<%AWOd&,E['>66nEBTu<4ad$ ^;I17E02abA2*ֺ:"okJlFf WWSQ1g_[@UIaEe*pw+F+(EQFj PhvQBlFYs{?ߚͳiB:?aUzo..((uZu-e)2a(oh «KiGaaEᴨ,I(ͭlh.R@I% 3M%ͰS[ CfjStykN=E~\Iv,48]S݌3Օ t$wઽYJj:foYisWZ~~B\.QD>}95j}a8jW֜m??R֜'c$s+R2۳(K#$N#c|)[D|n`7fEP灪4 M0E4ҍFR{%ܣT GxN'8UCtVn@`vd8X/%'gY0W̜h)W]{"*kH;ARVL CuhLH$zpvDB%60vgyj'4݉e~@ɈB90ZS;HHN"PYS2ӑj$K<`ka8ۈ2ŚjEK԰Gńv"6,9q:-SdZfȠ0N"6r{DJ'qǐxjj9J%!pdtNh{lbYl&Ke#pL-"ˇDy{$b:D9&y/CaIPRkpĉɼUC*PzX8US'Ղ<*Qn&C+,tf iQQ0%,jEQX&)I(HfZW|&: *F\MK %#MN 4D"{R' 5 X#qb927JLFIIvL}/*ڧ}:5)uUS;FnMc #TtA1MGFHͭA ZBhM#["#@&m)yT諨.Pșۥ ̷nWI\O-"c@z,raYΏp:2"8u3ޓ̎| e'Z{tjGB_R"Ŀ$q1S% ]ʭלZ3~~ZZ)M0(C-05V>IlgAI?fG#N&iGPP؄%m-Soyfa!M4rgXIdR2+rĻa5#+ QfΜAKHwq\ [Q( `ݢFZY-xhO37\-X[dw1P*hX&F\*v"z2{Xi! :罢0 FJ2]4J\s]R""V6Sv%Xbyh,vl@2;hIlg}f`g,tPv4D` ͻiz/i͑8ب %;/,9%ױdNm$54:Kh 6r UbUZa4bqN%%Ӑ9o9CןQO]1qꞪּ~1f&sOb`ׄQ` R!M0nHFT'@6UTL8u \]YaP J[zA`YecR ׮ТKjߵ Ro'3`#a PmC: xQo=# ajR9tȧƞPQ 1Q0DPL ҏO!KO4bunr! !dVTl e!B.4G@45g-VX&YdNF>ED,wN2C *"7ȉC}ӈpWQcBfd]-T;+‰tKB3qX:/op@ca 5LGamy#aC`SR"w} HUGb} AŽfIG" D!,@E67CFF4C;TϭtdKS0\ܶ=L2$FⲚ>8.z!u)16Z];vRK2L U—d\C4^ vA$\hYVIXWe$%BTN~ArtìCdF1Bn*&OIT\u.@R/N-efFhy.n;-PpADUfA[Ye1r$оoI4ȵNC+a 3 GMMJ+4 eQ3 'G0AVF"AEKlFlm2rܵ-]Vv $IjNc `!5XaYcd6-Th\GXibY`W}?D#3'$T]VeIkV<6jG$mT=t70gXv= Si~Rlq C(B%M 2sW JO \T8-Mv@^JPٕvEj;ҩ( UAfhæuܸ5U͡gjAE5qrT0"ʝ1h" *,:v@cg_J{`QV+UZQE-SDA`S(u*-<_> ~ceVKOf>=Ѳ^x\rfcCJ'B(v>`/vZ>IdKfJ1$(ʐ~GaFX~u,e9-tҫjG~oe[G'Y4|*1+qAqO☍YިYGfH<1Rro3.٥اkU{ףK ^z>='KfKo ]!$eGEt}zGx[؃0MAe>Eyy1ur Kx{(,R>bqG3yi0զZ2-H9Ze>d(aO1Xp.8dEZ'n0Jks&]&q)3B,oZ lE7BVscH,et"TwZn%3ԥZKy.NK )GGĵ% /d8`(=䁪g> mĩy! I RVfB;}#* ^fף4t+2G]YqH_{q>K[BjMc,\,]Bp oT2D`6>iY\~~VK/vLZ7Xy &C+AK}3`&$f˙Ԉ gv$ZPu61#vf\x22f4Tx[8dƥ= 4;pAYZGpSdkMJ# Ԏ;̭hiđ C[;ΊiA2%"a4#kD7Wr7~QWD_$hqz o@P;qY4:XILPJ&)c3Gj?iK9_a$gRJ )Uʹ,vt@I0x(a\Dni,vHl )X!YM'}HqI!VgwBfor)笘K),LDz3S2gOErL̲}"+؜B2^KrHt4V߂KfNQaO|nŵ"vs]zGVXj]VÞt}&اM>LէG9I4ڑ8Y3kFMYcyyjHHs4e|ny> ՐQ5S7#^Js*1MI $6;'S)H0cykL=^JYJ/'`'W !46e4gܚQP)۬Gv4x#a(j8F[I4q}*<>D"8J99=tOngGQ qWjD{)y}Qy3bq2sq ܌~j!ؓ>p>K!ٙgKQ{ż7(L9{{(hdeEOE!͗0f^Dq/)R8'DGqx*W5s8x3.!,#SJGZM*rZB$ (\9C__i|zyJTp.MS.oHcOG[ AĞi%q>xrP~!|J` r]7:ϩ #R)? S,$n !}+~XRF`ejNr(e=65S5SR-{֧O%o(gŤSK!avtCl/Y"2t}@=}=Bݧ '@*#MZɗ͏0{_1x;g>љ'B[}'E/ӯoN~nףRSO!mjFOei؏f?k44Q4PG3ov嬆$|6%z9_r/pOQR 벿U>y w,(h>~1CEdSj(\ׂb6K#>S3xtG]L?I/wRfI[K+2ChdJc!HYƮ9_d(,ɩI$\K8cdCqxE,mW?y>ݵ-ziP [UCɷcO vNIQi~u9jrstCˡE8erdi`ᣌr65xwMt-_'@3̦0FEeR*Y - YEI_M5.?\,k$D^0R̉-\4i[!izi$#2!Yk0ՠrk!a (4V\F ~}sO2$?Q[~ ggj_/400% ͼFQQƲv)re ^0Cޖ׆tH۞m~])J5'@̮il()2=J&]҄L5Xl,41`O &6=穑e<==j.rk]L&ql0&1JrjԆT!* jN$800s#(KP$֓kfҧihávup_8q?%ĭRh-eկ`>hIS9)[8o5IHGa++ɇjPGC`TX6j C.!rvvCQmRUU`4"]l :B#c(f:-`>D):˙FQkS0h`\2 `ݫ;/bi)^ 9>tdGK|Xn>;SHbB@NTXFT6p{澻zVVjsoƃ2Ж[[\]zk͡xC>!:*4K6H/7F<]``i:6ai<ߺGkXE>Tzܨ/Y%"Y;BuddI2ԫE%`0j ZM˸:3¸2j]uP8x,S(49$aQ'D7V>XOdN~`0Hi/NNE, kfej 2BUfL$3oTYٸ^8*5 QeQ FqZb3!_ȴy՟SZ0* jUwiԯ,9jTjr YsXeY/ZO gU-D,tA6VQQt rՈN8\S!jsZ _Q~pݭuY&XeYԴ;UYg͝W6scqNsg-Dw-ƌ򢺙LCv݃v0Y\jVfeBc=5BJзҼ!e  L1ҮZImbld~}5hX_b(hIIZYi!pk-B1«AkaZ#Kh3L1'BV_j[r P`im[*\G a)5" Np9rDHL=48jYXrfٍ5',-\ڐVn ǩ눱 5IX<)jEɰk6`Rd232ȒJKFrʰH&CsT (Lqh'ghedlѱ!>p`˗0fE| v%63C4-=KEqI2$f"EFY[qŠu}X|_mii/Zۼ}-m^q/7Ži3&μAM~'xl?a:{%ֽlE#@@yUj3DQlAMzJa8\"1"yQt5Lֈj1UTbk Mݬz:?I%L¼)oRMh`C;)mc. )X7וĦ Q0ݬ|^xur1sFku ^ u(-S[A!]o&a例|lV^]cb|_/by~ 2**I.({vBGsnjmDcs c̊aƵ ʑb.BeMMLWj>js#qð;ۈ2ŚjE bH06 n/9N©q2I!8DdZ0`D#04ŀ FO^MHp/29p!A^cc[R"0,sS!Q^CB$Ӂ͈M%ȱ0{%1$(b5Y\s"D0W:GCaaa; OBx&xQ  :U b0%,jP8w$LEIe5qgMYp&P8uP(YipgN0Guc4"5kE$09Oj]#qb927h/)q0Ɏ~A銦tjR$&j[5bq #TXǙFAN)+MzJH!C 7DF*5LRէC 73#gnKDP61bŁFr[ch\(*D AAx#3#=x`8mh)uY }IERbi;LKOr5XbXL3i{j4)rOlky@|@p(nHphdR42X4#n( (lŽ9ӗbZj ߄`9 o}% Qf!GV:̜9tnϑ$71҇ za'I7`%4;9cw~ hRoؒ/ư VT,QiEe==N,^aܭ e:`Qw]R"0YNە vcQ[&m3 ;&l@2;hIlg}flagnQv4D` { N `Xbe`bv _8˥YpsJ2cI$5jz%3ۂ0sfzZt1BV%-kp8Qt{bE)Ym%̵4XwG!:z&R)Сq{4fMVճ,AJU#KVj{aȭ/e-5fS='pRb잾7*eAtO #m{ᙄ=x3jj7%.EZ[zZn鋧Nt:n*WG-y]ŎhiZiRi\esa}MZ**yqҲ-I$mɊْX ݧӤ,wXOM@r S24//"< Dd(EaYQ5zv]2minw=kY/ {FGs/dh MH{TjX8vs9툰rT⥕.~>'>! E s@bq9l3c1d`At(Q?*0Q0% aPQ$uՆ̀WGzB~EmU bF}wkĎ'd+9bCpEJ}-AEfYMW#3f>[H_0=]Kp(<SF7ًz ]<$ּp94ɼXO_/Y=3x 68})a8±\D8Pp$=a0 Zu1~TKU45NJb< zYx'J1R. τ͉+ SmC#w_J{}` @1F*i4&:8SB2H6_U8i՗r1Q32An1*p"2s(:M]F)RT"vdL]ROA5)bڠ;V a4-FM$2-2ˁgkݗR/cqJc &#(6xA/#NjbX)`J-j2Ő=RRQ($S0KM` $ [@tVi`3%v_J$L ;6XRѠ 9"$E@850aS 2;KYla#.Oi%xX -͹} y#}) jDeE=T[NSØA 6Ϲ(6rC?1{t2^vdp![0DaHPa9Puk2F 3>BSx#, .!(Ia%\W[44aZLX_  '#E2ѕ2DLKT1jLUYt` #MdVsֿ-2 y_0龁 +(b&g."FR L!N@NܸߣR% 1u,ScUCcw<90;-3hWTb|GT?'}A! $3s# 1>S{tץ 0v[ä3!)oq6.7"yݾD)-q|hJQNݣ0Ie튓*=DW>#z=\0rP YmK(r]ck/&l(M7E՘>@BQc.9LSLTV%zτn3؈98p j3xTaؐ`Uuqs…K#h|j΀!5SYq,h@*kƒׅδOH/\ ;ΏGݖ$2>7Ƒ έaP Uv8I*= ޠ`GLFaZz0b *67rJKho,̮mWŠYKcz\wpTvٖ$xےx:6Bef#:9(Gٝ|?f.z"qwwSr%!>@R)Z]Y HJ%LUB;]lHv"9#%K7p @)Vr\Z4Hs䔤 I-߉^Nc)0jEƍ 0tΩxSksT+ (NP}rs3ݔ3}$a_&ALyeݥΊ끕X|Ӵⶰƶ;*yM <%lQ4]A AOMy)8GȬ(N fg^/FnsW5.Nbz|X(~ڳ n xL&mcsqpy9H/ΘlJ7p6 qj?'{=(Z PϊuφX"cDu֥d8Kv1"tX@<{ Fӗt)8CLibTRDҡ"sb]Κ+Lw>fg>"3bX-VJU>Ir^u E6(RTi=6\5}σw,%tZ~(nLؤQɢYztqZB ?t}Hj84MMyG5Wzǐ\g{00n-5>!>:+; R[L_JM= p&13;=ˍ}vς}) hKς}) cς})Z İ  ɺ5&=gՔRTR/nJY{KYkubܢ3a_28'I_ʺo- iO=ӗr?JAx{ؗJa ٘~`[Ua]W?Q,1c8"C$)}Ob)%"l$"(D\.`NT#3ҹAP aY* eStɅ(t~03f_ҐR#6}8 yl(9Q ӬX5ERI5%4,l&!@]TQ*,Q9Ҥ98|G [&IvQjWMwM"6/(S?aB wWQPYY}M@_# F Fzwr C/ Qf&Qi!(jb?4 TP^5A~(.rB(L)( V3QdټX+hPAV*3vb5uqp{i xyj3wNF.4Gzƫ(s7$DQlSD3] m@E#4QJZ,2\R7m"qBK>!xژRP*"Ҷ3av6=j~l8Rn\`f+${N O,8K?"IA}gW ïqK:ڳ槢$F.(PA!DXXەAյx};82-s&ҫŋ7$sY jju仝3Kۿo8 c&|inWSC1*= ȭ,Km_z&_ǃRfFM;$)R=:C"AX6+yxSXJTHx, 6SKvj2NEjR[MթLВb6Tp.e N'wd(L LM8Kv|\ $eζZylS)hq4$-tZ1؄ ?n\cH:IZƶ3ҁ&: AlԌՒT2g!Qt;&j\]-IdCyF0d]%?$*QRZ(c%L:8Č)űY&%˩J\:"V̑ڗWOEmb G1h"rz/d4>s\O=Mm#R+~m(#%`;n|C*sd{&$l5?_dz\7>a1y c W۽ݝY辁ݯT]ěI[J {#_rKӳ9HczxدtyFh;7 @=sU-Vza~+Żne)j`V]xob+]n_ ˏGQ".pwi١7KQ,p3ZK2nUVuHBFAQ"^T;_G_^3 7܀d]+/;%VD6 .qhQ_70Ƙ l9T20F)^zAvѽٌtoRal^nKnjV9VxOXst 4kxV#Uj\F߃bw͙/9M#ĩ|gPÚmP2c@Gm ʂR$W@6¦I֎KˋT/arVl-?,}[T!n~q!׭>&/OjN/k9 gH3 wun?.%Cr1uu]?4pfQ`@@N(0qj$u02"-'2p5-eUbȺ bNhz]CK}F@S8#,62]<@Bŀta :+q~G~xK'iw>Q-?F1"y +\0*8wp"'|,1|j }CQ 2)쀳#qs;q`2©Ra,ƲQ*LY-$$|$ha&R{e'I<#@ siFʿ#XڹXxHLs1NBwA熁JR,`,6:$;FrcS-BVݘV[]@WR@ڐ{Bk !6&#{aͫs5%~@J׺E })ek?N %4 Jf?xҹZ%SxS*}u ;QQ'ܑqN3th-\5&Kjڢz)N2<*]pg@cEKu*n#׶$W-! qݒ|`{zK3D" Zԍ?Jب9$y -R~EmLS0.y$?A8v)MI(n fR[yĠ:BW^fmIոǶqX R֞bŚ`TMVl%ђ"2|;BRE`9Ys83Ebےɔat9 FnN\i&^Qd03ChGp WjL UлYcWB~<]n?o R7]vu|V77Ijw-!C펨܂Ía`P" -=|(L?d10~ɊJPUw9Y;hcAG(`acԀ~CN0]DK~aO•?γM'$qU<-p,Qh|7 HHPpE,0Ca~KlS}C&ԈGY"2+ 1,A BA1L#U榁V"Ba1bAMJs2eKe2Q[ FQQj2aIP5B0RcH )3Yj9y&: 劅4R@r"bдŸA;JKhΚdEG,S2ŹtPG 1T8ZaƴHy$uipr*O50X(5QV਍"'|uBOdEZ"1|+ YdQPSO\@5I9JwyUxL/4;ʐKd ksyu< Y<-%GHV9D4sLm*Z—F+Eć+b-,7cdT0n½Ido (M,KsěYygV#ǔk^6 YuS$0rjHHb$ҌST8ϓh!,idxr1ã%EI^Ey ;UKV-̂) Y(fg9H_r)! tD/+Ȣ`k$!JR-Sof(2BHW1n,ߥk`y\Y19f1q9b 2~3Xy†8 9{j+˕5RL>0eK8rdm.s$! EY|a9E1kR6!_RsƻIAM.KmbFBrgB᪂ˠvHr&5"J\.X8k@@+I4J4C"[bD\<%hYLyd^AJ?SK_)v">+\,LXN*Uтx6h4P1eC1/I3ᗉZli I-7*i(j9OI25b 1bG.CIiqTb38gt/".o{җ'%[BpI\atɈtD+ir'ٺ9SrL\Y+CLN9)FBz2nbW0avhR/Ou]N ]Lؚ[؆ę=Zf"Ӭ`r6l$.wnּ܁5Gʴ$lCԴn!dxXYҼyV_M!y˽52H΄ ]Ȗk8nuy\[/:\9;5-vVpvOzVo׺" ʢk[FwV`4u:f~)4kLcUgm#.t" uNSNCn^섞JD$$||o׼BsXy-g)+rVs&mZ3xUJ1*|Z]e\";-vtW&ZX$3D6,vࡔ2d2m^(df.aK$lrܴv)qS.˹4PxiS0ȣFz(YJ{] ֻlʘЌrlZ`Fw'V AY)SaW;6\I)OM]&c.4nŖ;8OLˤI)7wI̤z:QӼ%`r1?n^; /}!a&2V̎ $b?|Gشށޟ0w2mo1[M2o4w)Nj[@bJ uy;+D7 ?XH-BB1Zd9CHIiV/SȎ`bdzJ|1Ct5wJfn?ӶaW$n:a]d(mfKkXr@3r)_S ]Ȕ޴9ilQe)6բ.&vV7h^;9K3Oʹ3*y,fZaᝌG;e_"K!2;՟DTL(6Umx.vVpPs'_,ҩ.,w- >&t?e0Iksw-T (85<˗۾8\]EĔδ\2^2u v&Q-"Ә+XV<"au)/B"4RO6^;%Y*Ԣn9 rftf(Λre6%%9Q#jg Iq❛f|alϼs,KMX:^]2ɜHU=-Z؜HJĉF <+K${sp96SrA[^*b_IPJ^ 2Ep d(2K Ŗyh䛄0' Cwy'YV!Z,"^q.< =zqM#u+!@7߮hn(XD^w L5$[MrrEWŮ_dÕEsldx]F,ٮ+L G)6$ӭ-j >^9Pj_&J6P\N-?KhsI\&v&,c>P}W3M 3芓U4OdW Yx"fUQKf! qm]8d"2䲺XDLIk%z I"qX;Z8Jx"g Q;W#-^IhFRfegOLi(9P+3?J0y IhV~LϮ,]! rЍOLfr9`#vМ bgI> G^/W4I+_-.rj*Qd@^UVSp'] @Crqavf %^J#0..쎡B. c_k!`iOf]r\&oPDyjr./v |S]مrOO'_'7jd} f_&٧/<8~8=> ίL.'Ňh믓Jq4P}O.gLN@lx52OՄ}]ojrgo3wWd|5b6X5o[>`U|~͂ *W)g@U1u<=+@=qo'gU>L&Z ˋ/~!cT]ӒzsX | *Rճ_{7}7h'ϴs ;> cmÉj)d&բw~2хϵ.OI.@)pcˣ7ǧ;z1o\|UJ Hgk1XiZ_Ǘ*f4>pz5 _J nC R v~΃oã@w]K0QږI+***t&\Pj 3N稻6M} 'j\AxqE)8J+rqS 9N*'K\nԋ5V_Dz>ܞ\7J>* r kWE&3EO,{MXZw,m O_զX-iVN*ڑk*l 1;cbXag+\^ࠫЍ52!`K3R YPDkBvcGAQ755wOߦWQ`wClVF(fhAx,,fDI}=Hnӻ:g\KٵQQ3Oy1@QkT. MEfQ9nzYMK+hW5gk_HO]N>!Pj4\T > FMxsJrel*_u EDžKW:uJMW/txMT 柡ڦ*nEͣՙ/l( 1zWZ pڿ|gֳ[W;j/Wjx̐gJ LWg.OSqx 5ݮKY`:VUQiL<elU]ݍ vĜ;zdFCVEˋSзq>@U@^\ rkd`ɠVŒ"PCWE@8Z3rPL;50<_:o.)x5_h;8\>~a>_NgWh߈ێ(Qϑa"gt`=8 w%ʕR>)϶]\):Q$V4?|_).* 4_&_U! !kI+8O?to:j:A0+ ms 75kaL{={ƏT+.FDg5;{CDE[ȶe D+jy,ik{l fAqt  R3~|bޥJϯ/QDM.EKrbX=~-{1*%/|sybWf Pe(@ɠgohFѝW$[sj}Ǝ7 ZJ`4~Ue\(h.EmR"(;m2d{qlM!m7pQPʅ/T9^{Mr/jՕ=藦 4 ~W9cx F׊Gű^_j?3#Wt%7Mm}EA7C[~ub!n~e޸%c '/0?|b9fGt1]=dFa0zj|3"v uAɆ/^?s9[q_= HUj^82l ;'37iQ\bW[B>|=:(Sy]b-Y3/& t[_l$R^cRQLq(eh:8zۭiu]>pz\M ,M oCm0mo loRF$v#Rم)%ġ^;ώU?߼QUR ?@6YRPY(E :5KTFo!~~M))Ըu;c[#^Q '4Yi2R-ɦcvc}ӜfyDXT8"=ĈG W@9\FUq\c֡}j{.E-,r5ڃRk\P"f`S|Hia&5 Ry!!/WBQ( 3w}U:NJ ׿ Φ'2>_N>u4A_.ZS֫`Ǵ vǟ&WH/0pڼ?ӯX2o4 |{:h꨾ã\`ASi#ǯlzt6N.C{OT_~ ?+GJYi=Z=Z ]濏:Y/qkk_i1:$%tQmϾmcn8_X@`f/KpDmE%n7ߨMʥ q/./J3(=RR5xūEs_SaHMjF?u_})L#YVIURVg jVr'bY#5e%" TrfSjT"U;bKyYQ]]`ѬW|~鬝r}.N=S]RZE`4|: >^l0=4_}xo릚78k* g5CV\,YMz MzS/Ѿzi1?}sQVp@qHs1hw 6pMP~,@Л¦t~-0.˓/x;2?8dC&is‡ѕUg44;`QaG9\{hGBS=*H5grZpB`E8/:s']n8wGf8o݁巪^}n`rjygz1C{4|W#X^2µi䊄ju(%sz~m-F ??\nk( =7!HM[M.ZAh1Riǜ79#F{SB+z>Y02mf7:@7K# Bo p][jvL8ϦDىV̻ ~wNX+q;׉vݮ4Sڏ/fWj}mq"WwlOY㖼5]ފ#9Q%1򜉚zFeh%GG5GjiSI]U_>3Tb-XҪoq)5%l!k!4qɃC]Jj! fyR󕺟([^cYIժn0Z wjɐ:qj)/48MF(D tŃ TKV-XuUO&-B Q1QK[]ZJL+iʾk5_-VS/v>w3~=_oQΨ4ż?bc/@x{}BærU{G9q#Wp!=4XK{O_7z7D? AՌ\yO Oz(S-64jm\ˮ{UbQOC YMqx^qɁ} h:ڸ\S ,n4$ir^5(QkV'`FMnص\/ƻ]Mۖ*;H|e8x]4RG˦;gշOAxUx)7^o7GnfoV&oV' YZ0f?St=t{Dƈo%'rnRegpqYi=gghq-3Po\[ߒk+{}1Xsm ]]|9⑄fU;X &/ywۃ9xp λ;~H{7ϟܒZQY뽐?zLQR˖T*3^Uw6VU[HJ:7PG}MYkj6N׵֥~qfe. '΍bbL<>$VYFz]VkϭY +h u&j:/8wfBks\X›=vW>@{``YՍ )!Xi?{koo0V-29!9+ukyֆM\iU}XޖE|v~z@t~[cy!ϙwf-4]##6q. f2ײG`e8!\pEr@#4;o7+e>ʊ/Wʰh㙠tCti 5#7,o[]g:"lmcT]/0OK:7߄ ZRLJ-^?I6Mz`zz`QCs6dUHZJޥG>Q0F%P)m6r妹C[c[,mᬌ<!J)ƝA0 vefyhTDZT‘1UT>9޲[ J֐; iLsjf-w uR< fIoM;OvK:wXW2nxvh u!kqѲu}*뛫TbP;cZ_PO):W°W~j雔lT_.N'V C< ADv! NsUd>acl_'45.̽3`72s-J~UnY (_Ppj qs1- ֦Er;%/.. جio vjD0?O..b(dQ>9*-}6.?jBE3 2v!T^ nƪ ^mbvEVKϙj>=?S-jK*imb&Ƞ05Jޒ5!0}Rq@"7yYWsh"o;e7{7+d͐#HBtGzV: dwV}HCBjRMo"oRX=p88b&ԆY"Z8UskEy0V Tٿ-rslzbG|9'+AQĖAxَ>ĭ%q \a`THUFڡr_67k &8 +My`Q>nsK6"#2BBB2or!RJRrH 5삎Q QWi裠H]% J!_XϺa"% Y ! tՈP;3{Sn~}H߀y#oXhfIVn7nǵֽ h(n@kZ[ W_r٩q+MNxR3eJI cYRFu!VHw\idh4!lq5F0Y\vBߌ A+hk:n#^)Dz)̾ލ֥~n֭_>gTſn2TU/3Tmj{Aejˬ:^*\1IsMeǪ.cUV5r7|io0Z]&:]\m 0tM7 2WfG(^mܼE[G..+dw;<8d_[TF]{A:;m|  d`-<-`VoM ̷ fkrY>7Fl '_T_'!ݯ{O6<'`uVQeG+ٔar5}<6lSt_nX8 jCnQAP&]lw J*+W4[$\01_j h:i٨[x`?0CJ‹;2ƪlQJE#^)jg9HS܅E73N#۰jPbdo3r1ca]"r+V;gOC+~j`h4ΚΘqa|6F*6c@\iM9\՞oozdų"m`gôhba†1ąj cLѷPQИrD1J DxkX.:E-aW=S1]%37~n|vp1Y˛+i6(|<Ϡx_'Z%6 _saPRn`K7K鎠$?j2=m}U7ɍM`~l1k14-mc/qejs7u^)M+1?^YB \nɢejF⠃uqKi7ـ𤩹s;x#/ܽDk)c),@7=L ՙ1Es9bD" WioE ' oo;я-51%F(2$80=z>yfM؅srʒA=Y6sT>ؗ܉YE0Wf#[ʿT͎_bMA%ku0nJ_'g># q׬<.ԧاR?;FWLK6e>b W (Ԏ)!ujx%JVbMvS[F)&EGM@њZ:mibޫ(='Jpk(ZZR&+ .]=~6T;R$KB~:h6=Q֯oc nڇ%' ++=bx# NC\{rWw`ug Kq :k|7Hdļjx4\A4l&_NiԺy#ф~$^,1zh`A@%XƥDtnϲWhehT949\&twcw9r9vɱ 9X,R:kr|`1=h-LB'2Sm:MتJO|_!=ԾH6N3|%W%zdӊ22DA&Y(ju,{(ǫ=]Dzz-C6&9O;A#Ȟ, 2ǒ>ғ>IeX7ai'r'گЏ?]dSEbI»MŵlÔfUp^--+D}kcٹT'g_)h\^gY!בcUpѦOla }EY&o'ňJS*}dw>BG; j/8R]r"~_@[o._"m,r `ZO b bv5! ^fbat`,^4^0Uۍ):4eg wO>ug~b/8#0ج;/?@8ؑKД[.CWu)VrS3)a+yk@:tF?L8>c2 '@Rjb$ '|r^}*΀g&)nVMڮ>`:@뙱{4!`z 7ko#/dAw (Kca6z,GJ7෵'2}%vAb.T/]=L bb[7㠷9/ !@ Q')f-3B}nkBX-OO8O4y~0$C^ݱG 4wzşRTH!+䘿纡1!Ú4j mMO}=V_y4P±)o疰KJVl[l+.-_}#64#03E܃,=7z, z 7SւD%9cId,Lf:pX嶶MYQDekUJc: s #)BD\>3k]kq=5h߯X*ڪ|ZLᬬ3{W7ۦw(z7RԒv3`c)OϢN4wKtqo/=mnt槧뼽%sWvv!U ;w4_OGk4_5@m?nA܂&S.-fPs> AR,XCN4&fÆ<~!ϱ'/ɆI/OӐ屌 hu BEq Ha‘ WRALFq7#Vd9qȡGQ3`:zl7#u?:u"Nނi?N/;G;QM;=%S"!WV P?rRZm1O G@Wᙐ[o}ĖlH<"\fJFsԨݺFTɖg߫Zcf%7@8J`sxpVy7@8lʿF5Dt, RJA ҞLtq~F88u55r*zu [;QឮN< q0Z*=;h*!/`^X*X[ EB{7ӽcy8JlS7~+\R`MM%R;( q x\ʐ8A⨀nnǦa7 W}Q%h**Ep zZ.bQ.*s˩@\Ԙd+K\4[, mע;fEh*ڛb7PbwDX퍘>IJm AԜ!,qt34ҽY0 ZRp,\c|ܡ[aCGX*mQBnH&ڿ>1zQ!PT *h"^j'<&W)uhfג7ml !P#j~2[GȚ)Е 0En0-Q??\;C ^jeW6qpo.iAi6/gg*}Պ\*ζZg6h׍kl>CFl<A#)H =BБpQ4xSe߭-|< gowrH9Nߍs>w.[6=X#v6F/3k`Bñ+|x^֢˚xww޽a͝\\o.YQw[<mִw\Tt<ٲC)5ea[7dY,,M"}-we<ҒFY/or/I?̃~7hG_t#=~׍ho}nG-e_n[k8ŭ޹ۛM[gpc8(m٪"U_RjZ[뾥RvnK1jlSNMTf9%y$Y‘ CM[Ɩ =g%ѩE7t;ۯ;IX:&kqp.pWý] X]??mm%"bSc(+/Ujm0MVIlGq=֥;l>'5' 57tH`=mrӵp;CsuA_ ;9Rc&kR|eWoΡ`3+Ml!mYX#;{# RTK]xNJ8|{Wջ$ɹy~u#}Nr!KLVm <ݍ~K{N݈xwNwࣽ_=}{g1.) /[N xٟ+~ZcKd&^}ʳfs݆)W`9]lt%5ԲpȽclc_l'X+7o٩}e-ޑ'kɑ~7c^{2]zrUW]2(xuު7qVm-W"zkgN~[Vx %5:37h-&pw3 ;c6o5&t> utʼ7kx]^r5\8Auf){]>˚i7{-Tr<Οqgw-OWwׯJ;{s0ޖ5WzaYgWNJTE+Y)/oQ6z6ٯ%,+c2ӓ̙(kc h(MԦYL4Pďh>տBRJd]$1߱}Z{ާiEJڧyNGGx kY]WXcihΝo-lEXe \}wp}8>taᠻzހI/oXw+/ A/ҥѠmWE 8̺5̨{0F|^_;~OxT^HzyByBw~bT>w}Q޽jwu~M/ܣWrx;\O2_@b{^=| ]+5 l8 Kqahc޶t8֮pkv0ýWY@n9`+;bDBV 9!Wm3Nѐn,9X66r0[ n,$NfB%4-`rH:w{fntvo{QnhAg:w{TCc+^Ce#w`޶<~k[Cj8~n|g IzhI=C><,uĔ^En䒛6mGT^! 2|?ixzWUaBWthehz!GXIlgbeq5Rg 9"?*I5l8Tx9V{E|[40ozqW?*O[j,n2F|?mrwSضmDm\n: ??ÿ?#$P~՟W{/T],Qmgd+U>B{N-skZnllM+sM Pvl9v47c쀥PucЅ-XP5bm0{d j}݈2o @8xio?o @g}݉'J4#(>wZ(ٜJu ?N'r48B]pL./a1/6MJi,n!`_5g35D۽=e 78\rqXn%ڻxXnAZ]R_sM7`U!ӣby^5[7+sUon/d,!؇ysn`&kO~_{k(1e$Ϝxh?EGȌxS_40qxŏ{sŗ灪M>]M@hFQߧW]k5#GS=ElnHaDc9l<úsD98vLN`c6rJ>dKDh'OS\]k$)Ƞ}sPb,^hU%oiP_Dm>"pN/ye:1mȗr5-k+b_SSN78^==VCUC,!qXqU;eAszot6Ps#%z&v QWHo2Wo9xs7F|BzX5Cɗ3(}o0bKD+Ky| L7?/:W?׌VD9f >|JmX\!Ϡ(U!<~Q>ٰܟ!OXܫ7ҨD4~Z?O' _e^Jiӯ(p{b"Eh041bUZX神<  5zqyosשKboY .Pϧr+{elQT4եȸ_槃}#Ui`? i"OauU`75½FНDe{$|rUg*md|ɺz_7Qqx([tu76_Nr AVEI \y&j:94k3c~!ÿqT[yJ}9oLMmCT D$h,4R8WROՆaupk\ⲴL7*3ݙ)$4­'Q9ca3]^ 15Rcr#( q$wZ~nEm-t17/!b:|#Jp:vG8q^ͣa=|r軥1mߕ3 GZ{f:w{7A ..KџF} 0V,JgcǘkZew(d`ݥAUvb-@VڠH7Ͷ0r,,tcH"0,s)`鎾r~U$dE^Ym+>J[UW)_F4Z2-,R mXW7el+o,u-VB-m(- @(-- 0(-- (,jWE)Xռog ,f<O*w8OR3k]_jW-c&0U" #xPb\2;>TYX\ QEv\i$o෰~''"18I񢻌$]*fHSźBwlt#z4ASP6^(ky*׍ HUXӄz5 >ttxu  Py۠Q<8Rzas-a6$b"8FZqУ@Dbx`4FmX`9怣mAD˄^bq n=IEM^ Iմ{9‰w3>x:ѻ=fG;;i?nvϮwZLܾھm6jov_$*&4*6X*59|Dce.}?δ_⑍벞7_܏ο\fs_kA7G_y'3~u..LrM1dvL(!j{rXtˤ =>޼&;5V/jƢ'-? ~Xs$(յyϜ93g8v@uϊojn2:]׷ŶI:\.acYU]`T!fЂ[P8i= v7t3L*˓'ۻOl*zwǫ^%r J0P`嫹 \Glv cs^{T\.j| R-UPFm{N8N^(Q/Rl9@=%!R0evقcpa;^lA@}M)]aO;[ћ"Yzy6j W 6;]= ySXeY Y撾5# hB3>|*r!6$LU.u @O_h%TxлtONgU!?Q&O1t[4NO5eOVql m< f+80~;CԴ@".S-3R|mWu3b`!vనZCu|,g{bQv~޼|}cc* )vZtV 0 kT1$b*Y8OU#=cnGd豄iJ{6!2SmaD}ʉ\cT}q2e 7l ٚP/oF/gX$k?(&UY@j>pc h[%h2,"5ǟ&pRMPϖUZկ<{bN όD#9O6XPJ 5Hnk7Sv9(z&` \@z4,ir ^C/N&jʹ\ =~I tbSkdfD/`s~ڸQ7e̽g^6-"D_L`۷ׯ@b(SAy_/j1<O犁նjŅvp8[2yw.`Iϩ=Hqb{0>)]3@XƗkCqpo>t}$7W =}?~Fq'I+ 6;w&uP]_u{}+oK0yeK&A[kA\9]#*|I4P=_}CrQ9}+^)wWJRz_Rzt2c#iJtMIz $o&IoM&iOgq&r:?9?eg+ى E{ƯjadTXiX%0ɹr)M4L'Ԏf@U Âhe7Ez `i/Үt2;~ {=Q6lxk7ؤϏU7V4^QDWU;'# ؉L- UW֗jjC^󫗯xSGZ U wow}ջ>&![Sm߀;sH¾,|{_·[{esY\}:ts{he)etEwA.R+'2N'.'xoY %5EOzpEXzU=U×Ȧ:~axQ@ {öfkI]鶾t"VF s(~,\֓Ɵ_eؠMoP\sbF8koyw\J'-詹Oll[\޶=(5bQpdu#$To |rJ;k&^UY5MƜUH=|s{+Saw h%춍aǰfd,5$ . nyH}87w1qFhm0liA,XzS_* G ga69 {{E{5ߕ?QBю"_qo)WoD Dn"e@HS{c.|"ẺÇM0pF}џMe' 'p ef6ɩמN-q pm-ϵTN?Ml=M{;զ7;Q'ہҋaGUX݃)`bys޵9X4egdZF@5-sGC?bm3z"m+ԆU:QRZp a^&tk56uVcר @\Odൃ3=^[5jP*nY&=S뫳ozA:PG2L*fv9ۏ?>{Gɶގ:,nF(*u|qWN}лۍ6Ty٥+p^-w[M|*H= [BnVH0%(.0*=EmHH1f̀7WK,capn];[Q6#2UO[?;lnm1':25"Od*z"UX4X#m1&-M=Z0c lqJ/kflU,w/lGxSI^mԅ}fgN^c9Uy m߀\^GcSd dR/\7nVmX~|J9P*|6= L~'uW7,&mٍce}V_ڼ~M.M!sng޳\J5LotWT!TXSM쿒i8дuIDik)d:ܴ " yA;&]γ5x-n)EZ0TmY,%CؔЌܨmI4' oE -/,%(.:JCXs+-^1iQ+˚|iKmnqK9r"ښUZw$-[LԟT9U!yO[Բ?q۪&9RƟZkզԫ:qnO._'`3{]L|L5N\@m;wӪ\COWiD zosyb6HE?<9؄ra\j<9wZ1ZIڞlohOBMNݰ@ZY=&&f_w~DPTD%|.+[= kl,ψc^y-fG"l.I'~߁<_'/mU䏇;w/Ђ}gw# >^Y L}˩t쀖LbJ-22*!- 6 ]=EuB=,W/yq?4FsP-M?Mpq<˳M;XL  $N Mص+=t0fO_jYWܫ38e޿I>( ICvS^N~ fwN$Sߞ]]|EN2w*_5_rfSBSٗ~ S7yv|MUJ85Z}ߟ` 2w&epG~0Q^/["5o+*{s>l`6^+9 G*pNs9]}xpb߇pT>`hWmBKBq~X,Iw$y%{gI~QKK}$Z݌ZߍQ_ȨaG# i$AhG# }}$;$~?HH}$Ik,4PjIp-PO p8hU1"y^WzD`P{DĊN? k.aSak6BaYeM#wc%*yJc%V>VÍJ7ǽ#dbtхL|PBؖxȉ 93{  ˁ%R `YzN{vb.xRjl}>jX[\*jE@XdA Dr}@} y}@o lԊG@.2 CAA[&ț@>zC C ~?O_3c2)?&i?iTljGUu%] h7'.jzƕA5-HyQ^HzLx9^6z!WՌ\U#MY0G ai.؅O)u *|j}j3~ Wڵ |wu&\^sAf'IghkX{opCdPQ}@loA׉[lxv$ߞCR5CG5A׆'RhXƦB;ld_^h h45W5 -V騤G/3X~5AsוB->;KB2MTnnshq,T+ع~>)N{r<;]NkXx6-N8DCKfrJ2Ž|}|$u jb RI-V Z{~(nW]9Nޢ?NΫAVVb ;aYq/x _7;~myi2%2pjUV;=&kZ/j9L+/8Q(_UC˭h ]ny4$($4H#!NqjSjK'%R4RF/~mG?^A0?T AJh]P,)ZiW:HioV-x9?OAO/4-[R8u=l\)1>TIcxq;!pȝ`F6#ږ_- &i3uAO}/}tV\|0 G bvuLnbhqjǧQk>8ίF vlQDH#)fZCY^^^_0 E%4# (r;{o_T޼Vt9ӶC){g<; /O+^\e"Jtgqh0 6F_*5bz"`z1 ¾a''חojY0sE|\|>%Jh\O/9~* T:.ؼxhAe(ft3ѳh.>aKsvPCyOd.Y8س|ΰt58gC)w a8 c&耊!ҋWeMF!eB!RF(R/CoIԥ4/CJVWK YM%btjQͪ177T`}]YK}[D4C;}2?JDTK)Y4 z&չ`Q$OFaTA #'H,EiץVӠtP[j1Vcb5+R%rZdJ|Ic6$L2A$2e=^(UǙ}TiIB-E{4ԍKE5&eN$ozw"r"i<(T@SraR{xWFi04z_/%OB@ggq2>8%0݅{wal HvS8`_jg!Β4Z)e:4ϰFHA=wz|Qۀf [[`;E ^o_67isV|$bt꽏z>~E-nMj,KmGsVm954~ei hsw_2+_Dosw_vurfqٽP1sWޝ"RN !7#m}?*r#kGV@O{C6,7M7M8l7{$7M2; TI j|:^|i@->Ju.6Nˍ2]"iAHq #wo)im#q}Sfff:Ic鉉.zߍi_7>}xƧ}|{`4ؿnμ;{cIQ4۰Eg +7duWTdnQGUk:puhB*Z&L-Dvcn*pk/?tG鑗35KwQ5QcgϬ8LhmkKmc%|/SYhŠtٳ`n\JOB ErNr$yh޹M(X 4W2?Q%,X/ԇ+2FK txQ2]>ad+f\G9^u.e+ݾb%UMl[}N:xrb<@Jݚ_*uk RhjovVmL]21vP6hbXI-I$z>T]>Ï(UwQ5/7Fu' T qFM8D 4LRc(ԖC '菌Gram0B*,PZu-2.D% ^(Ue}TE$B-,ra$*xY4UQ_d ߘ[2)ERUqՎ FM$*,{\vˮ\:/.(13#*tH02?7uǺu=UJD\+4?>׮[J>,X1.b̢."X$hXM0UAjB fj0mpA]İ/A%b"G1h3=tl?M.̀o0M nl=Vk㸍HdA]DK7wlG'kicÕ/bGbуX AbуX }G.zGUzNj+ŋ+N(=2Mq&-@<Vcz d|6Nz1qvI;do{otrߗ97sYAs?oњxBt?~}@>j̃w ½)>z5N=0+<-MRӫoH1+&mcY Ʋyq+dVg^[!;Be#im=-{⸷8-;wlqio@ RX襁AH*V6;?7>%j mo@KN7e`ā$G57aoo>=~*!::V[p?ؘhjI8co8Γ*e,dK]>ȁ~ q} _//>֯˜tgeo5eՄQBVa?VQXE (5U/f5 _̮6*A`6̧޺XV<[~ ;49PDQM<\:Ķ]"^J,h|UЖB 6wb Bl.u[j Gg`&yAxpaaDKFQ󢑔ެQlrʼO] \(TDzy6YHh h_b1lIT; /D(^( xL"l!P,*RHDstC$ !u(X &aaU{T*&D Mف);h,{0„oT/vQR7 ׇI\SX{(Q%{u<EA\DE,OaB-o(6m=.EK\jjpeP 1zLӡt1zLӡt1zLӡtCC:+Y'Hn qVdz@dC=ƐguT_iosur=_7"$?7޴}oݹNkY;6Yulos4TF6|h~SE4X+֙)v1CĶv@\6w$- +a_]#_{qIt-テrLQ}ÙKE\]9J{߽-LYRnnqKZy--M4+ڱgfɐPXb~fބ5H*ݻ.B$810<] g3:C%ʨܙge=ՙdt9sLJJ8ܮ?C4}ԇ7,MKO@00jCiÝ[ϙ.#ˏ!rs6rkHMŮc_1Noq-]eڏ+6Ib3wXBs~k7u& A%_='X-xK ){5+i굟վr?_ͼ3b`yv_/?6;R=(Jxu|rwڕ?lzzß*<=C3$q W}`Oa6qm0.b.lkD&A{P^4aRWA2ܻǑEalQf(5QcStP|o@2dǃo{N{Wutл\,Mp{4 wI4Uz4v4\k;>V WGCx:8[g9oKO;'s9c!k [m {hu]^L]lio50BiT:ޥ+Ucj դ錐ۼHhLю]O. l AEjЧjKӠT t; m:QiCj1ض$pSvʕ- lQ|0%m{`YS~n8qZ{O?7>{ﻂ=F,ހbӠ? 51Ľ}kg]¬Q[NiZ;z-ZXk7㭍sxfxm  3t:p>g/՗Sπ|.`"y;P\45XCsR;H%JOP#{8bކ?D'[;Mɹ}=q]&?z}A P,ggd?r+m: Zy89MZ+J^! {cͶwg{*^r78VKJ5%:n#Qk_Mcjˬer-521p"Ő_ qԊ8q2`MVC[(i14V-`&mM:%$0F3_ 06ͱis流BdsػPQATeH#J*?~<?>H B}؂JVglqp~I=+v6^D[^Q2떫ufEaY N/e!; vΟZBSY鼏!R֧[ ]Msm]FU@X~BI{) =`6+3 $Ɋ1@0UgW[T`/mk@|JI;_!~ab<>2BGFt=M`Hd[,w޷!Ia{6TQ[F;%qK` ʇ*C'L''sRI/-Gk1T.oNʘ>߇deg_XWYh)AyȜYKvjB W$u(å[WP~16A^N13󫡏V|c@d-M||>ܞvz" 8|?@f-{laж0h66`K$%]bn9c91|xDJFĂ)!VwBm!޶ooM:od7˘,[->Λe'K7"'+ uɯMhym!R@ơ`T@MF0sق5z+s,(iƷO!K/4}RrtCF`uѪ|hr! Q{o [`-XVp!PɴXC:Ӏ K%`7*(Ó{q&tup"F q P!xC?iȎ$U!  CJJf(-\P&]2F&4d2&{ZLjj-x8Qn5ņOn)L"{aT1 )]tTC+ȂAদ;Љc 3gYi(E"=gD9JF*nr65ٓx2We{.1Į#@n`b*Zuj0biVq&F@~+.7YqelV"ף!o /BլӅ?3lT?D,=h6 (CX]D,>5͝^AO|17k.}n!iq,@@!9Zv$c? $> Oxp|g-Z$.F&o${ÐO m;\CWj궥)ugFhBEp.5順(eʉN A5C/b`3 !E|g_cJ\wwQ! m^[5y68#3b,`AIW!8(19yv}?6+xsKx-iDFXAXF\567r_-YF@$Y\0L9-cc<Ɋ%F'l6V' Ge@,$xiXuMӑ_THk~j6p}",YO'J۱ҖQ4H8l&dj]3DZ*,S6H7a17uӘ9d!#4l"\+ݺ.81 " ΃ &zbъA,8-N$"yst6mq=Z}I#6YgzC߱)es9ٜ|sJ?්H+|tg8QP|f%gc 5La}3 B%aXed,Sxk8*0Ј bfX捆h! OL/ýg(KHfM$;!x\bm`۸mڠ`-bb+ݛI{1c݇BX)niKX@X r}_ܶ޿_a;%TVAZ5mrXh7.z![Njx,БK$hO٦[ 8m1%_#&ym]ϋ9^I 05 Pi JXlhz5M۲ɡGUyJУaƖ_9(@5zc@Bu* jQZTZ&sKGbo:s{˒ nƏ(A+nZ=3eki4jtR*"_!2 ï˞-zyE\ =O9p1!%x6PBF$Hr$`|(7; Ec_ !s0¥qBt0.~YnE*`*>Ruf2|,AlK 8`MC J|,>Ǟa-xwe߬wЬ|)D#B+uzЃe~=EG\[ |!{k=Zڭ@-kgL$DRuJΛB%@sze_XJ(}~wP##pW7jzʤQU+U#`0\tI+E%W7耀d;r +aDGe/h*ͭzK#*|pTl+끲TH{`8!JQtpv]#jU*Ar  BEGR+{U:H )G$3k !yP#=d,;ނmNm_q࿕oON6vNLt}Zvq -ALu jבA uk9mZ&Xgؔ/4Sn)J:.[0K/b.򿕦 鹐q"j8b@>>kSzY|-S1q$` Q0G>Ǻ_Kc9适bӧ +%^Zl96+>,Dkt9FrmX[,gxr\ },tLt"kE},wHIAAl P9r Nӂ[X2l&@Kⳝ.=h [-h25L >|` T.0c0S挒߷C'ׅ"kfX"k~ȚK)TB,sTΪ@<(u*GqLjj*eJ-"K}BB"@DDHaH`xs2!Qٛo# F-Y9W')Q%ڇ*^fETN$TN8Q p:bW_K>!rRY{ʹW!}AP:*g.*G+۰tP᨜ )au )9zՐÊ'[l81eŒ OU & WznǵrϠӣ`?z'1O͆@=sRPOY^6ʀtG 2\7h÷ڵH3cl!+_ R; bVy NQ0[[PK jyN3F-_x!LBO_êg;ow'Esv.i\):os&=1T !5J}^uȗJ %ȗ QgRSl{Li@ZEi~h[-ʹž6o}플}6K͢jcXOĂ]5߱EC1!Maܜ*= q}qU ڠ.hZ~V|-9pBG+5]`oKD5HHַTxܵ;Tg0vY@o 'ԮF帍*U'Tl ZV*xxi!i m A%$~Eb9?|N?D0Rir~29[+0ia fKjV < OwS%tdR5\|qʣ vp=crCDtPj#.]Q&Pp4Aݙ׻]uk 6B8̷ T9%OE8s؟!(y( rj܈78x=cW~JU1'S6m-F~6V0B[ ~t|  +O CrV%i*R_mPi `'rp:݀.e~&Ʊ(,+;At509GNUU*Jfq 1 Xg\>{R8q3\g]nW@Lx`~XN FO Av`pA뽊H[b{ &hqc!JaT'~a$ʣN"VAN"Q0s{B=~i&p!Q!rt^') &~PXa;~6@(KUrMN"!la 7Ќ~Y;SBe#@-G4rZ&WOC,02%->p!m<1aNѠ me}%YWčBfB\b\Adzy[L[T@9qM3N䔞!L7EFNvy.qcG/%29(˦_O$p<!v5s@\#$YA4jvE`^_ih.@Y N!RKSa}60z]çՔऌ}ظ2_U8;f5 MtXjv;&J3\os_E[Gse$*6nxkC~,m—fD+Zm뎝:믶uɤ_l_wRvij ?1w[% wľ:{AXߛUJcuv!oAS+-{o'++r LJ%>+:TG]9:4rToJG+GAHy_;(0-]0ײr6@\dc)oX5ʑB F;*VtڥJHVcg(MaÛ r7Tf0vD14ؗ߫uY앹 vint4_= ;xlwO^*}?:?yw]w #9 7xb?,xlU!3XjH .jA“ڐ9pεm|o `cȹٙ 'mI|Ob n9vBojyghA/ c;YG Vk`zqYEF7:|lX,ܣE ~v}MX 7ؾپپ1&'V.K$Sv2_#h;-@;>S|so6TE u*M-佽?\!, b7`7`77` >2bB j'C^fj^%^!I_ ^EWģG8o[~mjo=@[ -x d7:<^Uv/BoB(ILI@ǘOY HVՃU*XX-MĐ+>̞ '^ QV321[m!,@Kb10%,w =XCaC ["p2Ąvxf ǚ`EL},,JX4V/qAy!A8[UK{xw$ .gRmWepЭ-׃;u| p5c8-`rzA .׾t?PwtO.\lp/ stZ~yb/pʥS<^_6 j|?#\ x6^w 7c:m oKB@bv ްT;{X!J;]v؟`&-nKb͝DM|Sy㳋8?yu:N9Es.P~z 7vryJ7As_),rgB iU5$sH1_zSK2LpJwyF{hϬ/,x=<CGC|Rт8](aȍl6~[Q;k5 9=NMoL6%(}9s 7W^u%=-)J:B]/ 5"=+c7$4#j }4 s?&ܪiB@^no+$H[BZrz2N\LR14y=ddKdضIrQzl- j߱y3clK3\R LP'L=\9c\Y^!$"s%ұ\:nٹk 0qm/}(c|=e)cx7f>o4דy2'XǮiE[:ˆ4+ݴx)"iy[7wjZ5FQ*=4V:lEֳ߲NO{E僃}T<9mnONڸ9՗PHLx)vlG^<$ J7<ܷף&$` ~gXv@xdl?KDpqber.y2?4 jLxmr-(s-^ʹTam 9L仿j2ZBC5 Rp bc{Oyb.! A QNiF yY(k ?5[{ xING |wɫ 3"* ?_ghQè DHV1'{;xm;xm;@`pkk5Ir@'=l` j Gjd͜Kx odoy; $ovN 6p 낲 tH~EY\b|YuYhr6(gr6s+T?*r6=C -tѫS6%mh#y %rֽb_2h6qahkݲaEp6-4>PߐS+ ve!̃]hlAv Z;}+XAZo!JIRZ/6>ȝEowi $O2}┭ZOΐd?Ļ :3ˌ9}G*7_:ˊ]pY,#)@Rf#m>m6W:,jb8|KuB@T٬?|9[XMۀp%*p 1:cJf c.s\ WM V6>ߺbޕ?~KDJFtU Hwy*m?Xk }7-YUT-?LsTOǹid~7guuM9Bj[KmMkIϲ)2e;LL^&k4xq4**X UwUPNV\aNRLj2xHbWp3,*TwqAVx>s+ iULBUet҇ɦ L1F=(kN k]$ΎiB8XKOk}~a}jע?UhVZUzj\7ԸWSԸ񰡼Mc܊;*c-ո}[KQͪqc=5njոR'(qӰI5Ӵ:kIDXj2nnݛ{hz\;)YpOiyKva 1~akcœQdxN?ND8WhDVTWh 2.҇ IJδkoKQ$=m>hlmzU:^8֑IvQSrQǥݟY>xȷ<a"b!gb9kuWp&1{a) SD>7IK]pnki@杏7ƽp#ȅ=a}湚L+V,`Mq&"0Ƌ;_m'#ا5Wo˦>0{Ƚ Qm0*w3'"xAcNd^or2fVz*%"!8ٌ<=HA7#fRlNـV|hVѴ#s.؄q% Iքa|glq{=NF)U";W A? s~G{A{݋uT1mb w# j"8GG0ZɱYM]K IqY4f$& II<q .c 9 OfVTg5L 1mZLᶢz DTVf jk-N8NYREC: T|6^`-.pf}-v5~L48 M!,)־'kړrȿ⳵(Ga#dJ߀8uRl^尔SKD?zs஌: 0A56 Te`#)B\JԹJ.4"r,iaccuG T!|lh\q5_!cR 4n&/5Sr(BHDnj8ԩrw*6kEN+qQ#v Y{͞jUlhF % >0@LQiWcQf5.rZ4p7ȬRV"I4)nJ'-8D8Ȋ@֦:or]  a6)eeZЍ">*0;-0r dqCN-S67)dr8vVP a\Tߔ`(nM; +%2_|9ꞇȔLo蛘k ʤ(-k :NUBhtH@pbK΂pAP3qE5P*Hu-8CW**--]#9#Mje{#xyJu0N"Y_l2l"Uj ́_^ i|&yUPzm\@X9ckg3p:`LHFZnh܉Aac#dSdڦƲbj8(Cg$+F5i1 Ft Zb ~}*ùH`J:z}`to;^#승|`*=n1hEO`ŬCP q8[,/#yvQ^7A g2곹1uwW A! ::bVt5 B(U6 ._|4U1rFBЂF'J~Qy6hNpJ5*T"U~zl1b!d,kR6>'TTV`J2v.Z™ &/`Z*U #*?}g$ Q@OYX}xݏpqh2tIeg#ɾ#mj8ۺk.t펌=^Y a^ q\7jqLo=l\]z}r^kwMn++vxeM\)R^rF1F,TUU06s )+g"e?`F/YhWp1Jv%Fh4o*$ʬz5nuVw#M6c_טr psS?Բue<eP@竘  ᬮ#SdcWrܕ0p8){{#EkSKePv2 "<>(BC|@qK d>?%)֟lf-Q?{ll?V뼣J?ڄ{_!mM]v1W.XO;S. Z.{`#yE klmت#l|zz<"ׂVI[AAz'ۑs"I>GArXY8Ba` ԅy hRWDÞ#yܧLųVDI;œbW-M%hgVhY_-{ĺOx܁)Tom6vgigЎS&2YטlLѮhzMj-v9n ,?*PsR_wMyNxv!U:'YJp}G4N"}rIҨ}]}ETV]/ E) u*)ʣ5fƠ$I x7IN so:K:Zth2yy-HP#@!8B !0B V!7B t(#`Im9yl/M=ki3{WiFA#qVH׿=]S 65|o|K|b{ e3Qg5 ^>l֗_$3WH; ^^)}3!={DCRhbFQwmKJqg)aTէsqykW|WȾ" s_q/|)G>~Ư"uL5WgCuGtu];>SVEo'|eh36%2pd^;i2 /vÀg#J_<ء{2oޅLJj~Ⱥ!4ˉzQrVȘ8gI͉660*&Qj{Hvhk9]wjM!!TkUPkNS֞VO33hiyjA.#4/Ptfd JDJpubIy)Lz3g8` bTT\wbpR)#Ρlm]FH?G519*s1/;oHMUWwI iT2,%G"2aJߥowΆ "ןOdW6doQIs2O8&-TayڢT,J{b9 r#'Af;5^ 蝭X(*U25G焅kjQWv뚲bcW笍iLWg/y1]_@#,.⇿\&s0f}6]_\rU>a=O\ΈPltH#,ch suzX!CB;2REV;}u:MƗlG?qq3&x* E?b3]`!lf9(otWſTj_.U!]U6Ʉ﹟C4 ҁSϿIUkgdGbԪ t hU,h?9iRE;KTOKKw("@'MMp;T(,Ni,yc7Ygq|z+ _Q"G{bflbk'zuk9Sw[r^8plG j.G ]I~l] ν/^}lMw{(܂zH=5"~ȅ$y6>RXVܸyi4Pغ@\TۻX>jjRh y#=΋ V[Z,S4l=ll +[uBKo#7T_Eh&jV4Nׁj]Gٷn4Tcj)j̀D( Hmt5 (q%5q]7)(sWpkɓ0 *¸멊&7∬GgFl JAhf 3u*ϛS[}Րb'/3_8$wmAPUJOU'NapH- ԅr%Zse8-܎)"x|=IKJau%YA?XlZ?å^&n|cXV7b%8ygA*ʌ+{MSGơ~n(^VzV $2ǭ.&q jy=HAѬ'cW'_6?'bGM7/ 펜:#A "=Oꙣ9C8>'NL:z*+\3p͎ XQ(#B]-<)2&YVF *-xɡ]AJVzBQZ$ДKCQ:(,-WEԻ@0{3ƶ⑭AE GO̾DG`ZtQ@ZUViMH2 KH3۟wt1ōjs&vr I)JLƿip={F`\&QC|wQiT-EpJXVTFϞ%Fr=N +ڜ՗hwX4$!88C5g.oৢG}8P*Q!TJ!@FH@&޿_as-o;n.=vi8=5ޗBq qU; V٪6::iB&A{z}˦n1Og D <gk<ȶX# 'e\h g= ȦJ%zR?҃$Ru~80ۍa!-!NNe^?7R4x%~ZcbJ{st' /ct4rB$LUtPd_:;: rǺp8hs>/OwPmep_ ?MZ+]a:D)3Ma6almac6xa$/A}2yi3Ew(1dkwG6,sXV/5)õy ϙ^24Qm(8 ]hq h<2"t;ܘ\`O ( AqG3n}Yǭq .B8IX=K/.Hs6Ӕk]bȋInODG", l|[rk%0!!h "p0l«qw1&nF ފ'r;VfRY(uUHFEddS6!38|!kL?Kˊ3HfzqAʉnG*!tsm0Ψ3"Bs e1O̫FZI Q~gƴBƀ%;gLW ҍ#4BQԏ_ ={gpb0?̧]Vb /"%r[gh,JI}5&]*z$W^G}}EbB &1} #5liCJӼShY/WUԵuܔ5~ZafiB*iA~WsC< L۰WN[Jr!VūMm1RjyF1鼏7ȾRc) ]-O(&Ym*jvfܕg‘w=^K|^]Uh n)|bsUKOvyZ*cNMp#u×Giq-o-]Ș k}]:ڝS:;w}\O&[_!z]iꍗhkU[^֍V٪ZN6:1ma+7lcm a5lsm]kulzt7vrr6kۦѶ5۶Z֌=OBQ{342R̼e}fμ60fށ>F>̼%ͭ[_1zz^w!Zp}v׮u]kk}vmӮuq{^lLkX]F6vmlֆݬ 6i:Vguͼ̼+7msmM\i+5 a"(=z5P@Jɕ>3208:8? |,}P6wY(JFbLb YsV`-m)H?&y*i.Cy0ϋ2TYp1@yS-H ..7}Gce}<GW|h{69byJ`o@8.m[ibH@!pߦCjiB':6Sj~]^NQ`cUXilr]եgM{w0 1)S6NW1Ll}?gB|qh(%z&Emg25.S6]r>fxxp*jMe)`?5ZV stG[Q!@٪lGR1@LM+z9AȚN_MFW,FB}ePoSnЗOym|bMuH5lJcP[?.KLw{Po7U'c'jOo7S f_.śzu@!7%|F.H/1"wXYKbȘx+|grɃXKdJ- 7@ML5e̓@K$Ķc1!\DOZ՚Б)iW3Dk'J" ld!<TSp٘2)07׫Ts$꼑*@!HڠoFY*jb ޸0a,@lC^( V3ӱTx=l1d${@=R|YwL2e8n1t d|$l}N>=2=!}ۆܸ ?5^4"؉e17<^glHvRF|D`bV/ |;}]UH4FjLyh'J~$>J5*T"*(Kl4°b(B{]F5tx">s*pTIY%.Z\F.GR^=8Ӱ*BBA108<7nFeg#psg|-j5{},O*wP?<q c{eli2 =,[o5 a-ͤ5A"LpKaz,ggD85!aC6d*G7 ${nn[8<: !*'=ܜ!XU 6"B(}?%W<܃QY )р P RBy@hgh ԕj2|25FۈyX(sILL?ZD%q! Z%ݸ)}Α;,xc @YX#䋂ɁQ|UE=ݿȟI"Q:3LNvy. Dvы`>%O,hUb@x7oOd@mdmj OHlp?؀ Aw 6Wqb Jo/ S0A8ܤAOJ0! Q}@!1"E+RlWx \&'$0+% sGTXFO}SG 5Uj>m pAjK8=\ QY)+ɹ/ DO:G| kQ;;A;'A"l: _w`}#@y.$ƈ ,{ Of >g>7 <9..1|zѨexEkh~d]&\Kq/\0=P@S_ FEl{`Ziu8k1 X_O`!M; `nI{nPl*z=EC gm  DdVqe9րAppgTNKs!j@(!\ɬ"iqs&%ar/DDW8=3yde!IX"қҍ&e)'jEmV;o~[lUX=}oeZhfJTxPCRowۧ,6y3 !ON,ĢMW`,䎄FQnikhj E0]lwҡ%”C* H á>ogk>M,)^]R:(OVs!y*b(<ȝ:A͈q?,$:5-\  W|B-)ĥ_u%mGj̏Ǯ31Uq9?<H%Cb-vA-&p"Y@QhOǹiоd"5OufI9&E[KxMk^ϲ)l8F*:9`B~0x:5A t?q +AWf<^uQO+Z35Ҍ@C˚Ƀ8J;u+BWkͣ!5P4ˬFCޟ2Wkz,R楨U+.;Lܛܻk-t$,f /b+R]Q'G2AS%مR cuh+!@ZOeJ0-K*8\gu뮨yDyݥGvL1Ǭ\j(RѕQbM DE=`6,*:]ktt=G%UM{+jҕ!b-]sJIgYt+ځkZ\a'rf5fq.7Kըp3Gf+LL$s$MZےFG 3--VQf,BZzV\ |~칫s˺lbKgʘq,nƙ:xZq(i{,ԅle5aYj24KDK x ~g/͖k`Yui6XqiR-}0xV~R!-iU7٪}R9{$ShJPϹ/Q;4N#Y]"Rd]ͦl'HP'9?i&I57Ma]K4 Q触G\# 6&o":†*bc hѨ<5[op,cV* vvף"A:a*4_qqxocddۿhFؿ}wGvݔ:p VEa!o^h~FK3FKջľ,́pE=1ְ2Gf2dҪIK})X.-ԄVo9sW5 6?K'Τdi&]R!~8ڙrv~X۲8 qkY~;CQ>-{|2/7:t񵂯aA?pd8hG&GCU,hKn.<hC7e/ފ ˔X|ڍÀy0ȇv;惗v hTTvl*;hڻmlPYTe *NUARe+Ya4ۃFe#[UBgXc3vB+JU9̥Һ '6p(xS~P}KlhOU8F#KRnjU޲77Z8 雞'q0_?88嫰Ѣۮ^D[^Q|)E<֖.Z-jl䍀ۦB {PR_Udi@5]P*KW_8#8nƉ=}ud:wVckFWOQ ;VuR@aϢJX:VK].U}N;2" x}'C7 ѵ] c80G?Nz_߿gut693˒}Jis 4"]PPV!h:Wޗɧ<`:.I1 qb uPqS pu-y%9vJvvГUHU۞\ANK8UncjzvU糤=Rev]VY]j?ƚaip~6>xjZ_'jCob|-#ĻX\B0pPiF;T~p"bxo2 e# 3x?߳/Vn s< ^\/`FKl~)9bt s \I%$1e1kҘ84d&%Hji-_xe3 (xq@@.eط;֏hL8|~C@uGWSZgN4πJwbxY좣@,h|~03X4f`Tu;d_B9xI ]fO$RT(xѧaxdDٳ]BO {8rF 7G& F83qDCeO@:[z6"OPF'eVQKVp2b59FhS6歩}1EL!0I͹2b"9Icdۣ,Kq fg~ u¡vDf. V@ YfD_$ʃc % 8wU >PHť Cf9PǬpw>LvO F 9Tl.{UZ+nM_0<Ǐ\Hu(`Lbio ;eg! Wp6+JшmY^]N&K;CQG UXA+ΆlX PXojB\^p/2:vb+Gre#YH'&Rmdm21sj3hs!V˧lLQ#~1g-.U8]q`cpDսBU(YGdl{$ty8^08/fLdC_X!Zo^T*^dJtT*2}`DZTZqG߳ HB(a0l$#::nJrgz==bXJaUB5sLV-of PQGʎr˜WpW\*EA tŔEGvV*9K<4 C^~6b#!Viԡ-a]E'vpzwS4w_`5{*ʥtN;`T3yXTi;p{yB(HR-({/-jvKG}K/EB< bmG%NrW?]- Nzyv%o׆4^hFB'9O"@Tz:˳4ٗ$uHT7M?AhtAhfd ";=h+bSp+-U1ؓz'S `!+ ؙ$dT5eTlduM,Y)y첻I KBB\9&O_.vlQtRR$W-[ˇJS$9*oA[" b0L x+o6h>Qx\RG{zYA% UcpcU:iGIKHЄm(I%U>) Jg+EjivqlY!(5Оz\xox2,QQ\Ӯ1) pR|MyDl.} ډ$(BgC)l@KؠX @!B$A܌:$UmWJ [8t$M1w;ʯM'oVni.~6\ʝvz,xQ]ӡ` d4<18?hap܆M< f#a‡an(),!H\z/s_|_ѕ`za1 kkPzZ&%x^Ѧ)%|t L4YP9;{ej>xD50P4oq5c׬HKG9ơA&<[9^R4xq [/@x`tAht~,vZIݷ^Ud=|ta# WG~4ˊhy|'rcweTX1Si4^w.N;o=3JՇ3oNuCxߗwd*{' _ɑF:˪\keDᨄYлxeԏ_kAvwQy=/w Yq&vN| ۮep 3c@Kj}3+}`ɼR6z9~˘q\k`9"-8gI͉xXbèa#5G۝8Tst9Z=m&mǚwwlD?ԥԼx dٕYq.35k ې֫h#Hyf * S_ } ЙP)WA_bTt`=魔wwd|?!͜L~2qf.ەYeeb/=3j^R:~'L&<UbőA*M6a\7Q)#E4s +D[90wtPFF9?DAHM+^)F2$ J=z/nڡ̸v&zEG2wFʐ2TJ 8,+Zs9Q0}.V蛃CKUܹ&l*9ӭdbw6/ PpVp/Yj C Z`.taXuϧ+zt C&# ]!^ս m4y-^Fzgf#N s3uū2>{/LӦH,:A*eRz?ZKUHM2{|o x)yԧUkg4O~A{ 6aboe$aFD4j;KTO L~ʐ:*r ^ЌWH]Ӿ=6p38( &?:+^{g2W3fL? i۽b rvHC^^.ۮ?/ 4>x=B Jg8dkdxsy=̷a6a|. 8 ~I`lp$}X?DH>VU'ˑ7(eF 3 > :hť/KXbrYH!.tgT2x .rDTӀ=~IK3Ç~iE[>n ioл7^ݤkG'$-yUA~:u#Mm9:(,&%bHg앸fîX u/:Ƀ*~\ń+ X2UjyP ޓY^1='Y^2d:Wƒh49!S,ʁ1m }z4A3Q2mam+D^,+ϱa\ɍ>?"Nn}ҁ(v]"'cS en$=r,&_wNKiǾG6GKRҍل/4D}>jxzR^nq[EX'I~!N(,5"@9 ? RŴ9(LR;D!п"YIYCQo}`8]ƒDkp$(vfW!#ej XB8F|@֍p3y?@NOKiZWu YpR8CKxꪌ"'(#~: C?4qbFa80)'A!paTR 6Dž; Οq7Uyh,9.mm$)аLAZ (!c(9V2L;ĭrXYɻXmYD"ی吱ENY[5Z˂NڊqYhtAJNOPې[tDIX V'Ic8x9ǚ[ZkC#Z-F43q8\gk#͐z~q2?[1uE?JRYz_Fk#2N\xvS$ j =/L7;yE"QGXޏ1؜G&qf,&& Q@O .Nk=606-ǻA(Ԥ۰;S_ ڇ'JpKy:uϿYʨDqh*hj0%ܷݍa ]ͻ|}b'9Mx(#j u;>MC胙ևG j`GWNy+A3@\26izr)&%sw/oe !X`ɾ70x`+mww5#хzLZ0-!'_ *ÂjlPTutzv91'h~Z-s6T_gɣdt5_Z''xjċ 6K w۫$PMCm f#hYu΅\0v~^HA- }mلm,dJC8rq^;[!l-QWḹc6#I]jZ_uy*PDA/Ga"揫-ZeW0]{9|xlRLqoRG `M] ơH (%KQF)$m,{!H'Li\qBt;\;w"e3o_t.$?E%s}2x/I\@A=~eK\%#ȫ8tk$9Gij kbz0J<A!?:ˆ{_?‚ڤ/PmFT J_sx1͝15t0W[~lo};ؼK[o$?I^ ݼ@ l `%̄;ؠlxr$LХ`OIZ*g9VtVW b`) = '` c<2cMta% `("0n 3A.LUd))XpvMp<98)`n蠘YVK)sX`i14 [!?loCǼO[`xky@j0&OHVpa9]Jhym{_^qY3L՝0e7#xwtNYu>A=ͳLy$a+zC#Aܫ .~UԁP|ŠN30r[uo|d2_wAC'~ZwOLtnc M/iM)r ^mA<5ا<ذkUj78k\RÇZ5sU=ݣ~A?~GfwO 0J/O;Hh>ϯӖRA>ˤ>緓W;H>e_eLCV;G%'_Wvi>}~kϯb jSH9H>j?Z>|~ߖϯCX>4}__w,&0 We_,X%O=+97ˤh@9d9#f62wwPu+:zgޚs22 eu:n~N?'RՎ}n;؞8ō}ַwC^"r'Y"3y=oև]{ .ۀTKz;e N;X$6DȎXl?[gq)E$Ss}b' UZty%d)n]hfE|2lzI*T5kM6Gyp5]MFeYΎocAM?U /,~)@jFYTcCo!Ŗ-V: g z83VnW:rE䲌C9Ku$4#![M5ԗ{ѱuqwVoVwl@}/o:{ 3sLƓQxse82.f~26'v!- q^ATxS7?`|V,C6wkL7"Hi7x@˴S|¾~|5^LYه>>?a?Aj\?f^)}Y}SkH@-(h6#>2*/ DFg=Zu||1Sbxw7z] eN;t.qb2bY5k(kŮAT*KQ^Fv/R*G@;c8WMs&q4G/Hw{}6X?7`oq[ݞ>;ߟ䤍_Ŧu{1PG¦rkRg{0~I,l,'NK` `"Yvޫ|YiIk\ٓ,Gm $8=EoZg Jy. uɰΊ!YV| |M|^ dO?N/ ^xkY~yg-DP;n@M>H/D'`C1x RHu}Wye ([O,SWԛS5SK42`0.BtiW$vϳA \2mF5Z&poq9[5 Nx K3Ȉs3;3ˌ*>9uy9ec 0/AtlVlY[?lnn gcaz< B,`Ϸ.kB s6ژWL943GnM?; NшDѵt-9,vd 7'8˶br8}-KW™8F.R{IEX7՝)!mnģtpo_twfo=>i漽$rbkZfan$2MU>Όwh~!6xo5gP~B§‘Qo2ĥMnsa :w-5(pXy?vN و jP'TťnR9/t~>ߍra}-=>o@"d$ G*!] I]wGSKP cDk^pꇾʹB[FE ׅ di_u^yXy?gD-oW @d>gnyܫhڍWh(OOޣy'n%vL@XkZ# 7F)bKt+AqzaR|rN %'Z}m]Wse~tOe_QK Y/y18A;*1̪E=Bc屧]8\OGd4sQ{EQ7ًdCmX:Ki%c+0{ʝ#kfER[*up9^Q 5t0yJ?Mt%9}3KʉT6)L_oPkZhw~M-f1B'L/V6xqYG}#!}qLe!vMWDvK3J&/k& m Jje biZFe\|dZ;^\;Xq;}/1?8sJ᭛ }TB EѼT;jzk}g=`?T u[l,S|r^aN&QuϤzT׎@#=Y[+Ii#{?|:4gおv7ӯ:Dm_iiU^wڪjԧ mkj]F8Gj6C<70IuI35ݙͼJ7eC~+rn,@1Q z\yl+oEvXaہ~+J2al{.Wђ0U2i¦f݌~HVtaMq7p,1uOZL؈}xg9m>۲D/LkS`˧Yv()2DT[Aq1Be$^ Y:q&-@4 "| ntf:e:AFV"ITOTDC7X,( hbD{W VI, мyh|vopFMՙFܙ9Y2 ;3#j$˸?zRY}ǣꇘ"S MM l1QG?/n{Q6Zlnұ>P`_ٲA V]Z"nXzƬJj0'_ NVgD@w. ϒ4$inlUчVkb0NIUc'Nb93b~P w1]?z81 ڷ Y ZzRB9tY[gDd wGd9|ȕf ?9!Ɓ1'0CBF/4Г` 7}5T[h&vˡ6h5"(;dhDۭWt~wXٚ8G:Hk2 D";m @{Wish:_ ^\/y`0c Z:̓匟q 9BgK1?fI/!Y/.Y^ƌ!4)G"2J-Hic>I0Q9#vOhY)lj<5(E/jN;)Zn> lyO5.U@PM`"q 'Ye*(u eQ@]TqOh-=q \Є? "h'iIST(Ga#aʀy z{6nP?nqtXqGPj)T(j2ւ!GwA%˧h ʿo<ԳQa6ep2j/D( *M_ĹҔ{"4x̃!qxXtM#g3B\[1H˄@|BAYB^N?!@,Իc<& N"9nY\,NKj{V!.9|K\#a=P1l^{@\>*+>pO<0Δ@O<E|('MYp$EnYE1I }2訂WC\΃vGN 냟Tо1 Ar%fmA? S1rxY +Q!TJ\QR X'eT=H*Yb{FGGu?ލXiBo_LgS81e3\QztTaHëG>*- 5c&*8〦z<Q"VJL 7bco>jFD]z}r^kwšCB<[+"M⚇/I$$ǥI b$I!$EYBA\cSi%mJ PrC1 v>S}p3bQwmM1"곔Ic{N0xݹ8r+>dZꆹ/ߗwa~j}#Zt: +w#q>o.{{v _DryL8MɫL8O˔@fxЭ5pOgW(#@m&GGdV|+B`j`_RLp JYddnd|ɶ?7}g^X/(.9k;;&ˀpP*`}T߯#~TtQeRGP$~J||3LH6OO?&}V_^Cj6ćM2j 6٠3ҡ@H4;KTOEN4GIJVd/ ^Ӿ=683]3a[ٙ\3M|r&U~4CA13Z,g(F<셍^b?dA^m47t e#PKr-.0ByP3-zҽ]q3ߪDwG/PdX.) 4s T&Jw@i ޵׳&ϣɿsknRi==`AxȾNx%J59fo({l<ǚ+΍qu5AMjW+Խdjw5pGFDh?_}Tx&<ْ}YNǩ5|?(ZI~UFNh8V<ذwXa{ћ_ ^{8<(%ĔO(4dͶq~8FӆUU*dbow͈.]` NjE]i\kmo/ˣYsm~Ad* j f4Ӵz*u ܎ɿ0 WsM[5rfb=mi uA۱̠S)]'Tz Y#m!jB>nn$u7AAF5bg'>*\"$0ƅ!+ʇ`b2%J3P+Rŏ=rpa86)glg!.>}+OE' Kj Q1y` ~Ƀ{\ < 6ytf 2";/<d4GՌ\ | Py B- 2Ty.Ɉ*m{D6 GHr)drLel̂p\01x2a-8O(![=Co9\{Ճ s6@N()94>kx.z4icy vD6$;,QfKFvr8#"2YL'=E;: E-H$yNѫ:Suޘe6='AZ*9iOǹiɲdR32uI9yߢ_o$,d[Zr``~$6@ 1 v1a!ΪqΪQU>~V "|rmr^WT`G쑙Um d"dirP+{/xC7EX/9Tdk9dVў FЬ y/5^lPNBהcM^B[}("RA_ډ0?&]-KxeqͲMʷS%]٦[*FQ~ݝ{bD&}Bµc)K6p!-yIu&ϵ.fp!mn8MQ#:`QTZo]1$zVkbmʭAc.:5bc;@iBl9مf=ξF9 lO?=z9:1;p gyF' =ئ 'S g(T ?JJ7YA-Ŏ->ó;SzQmyENF[IKjû^KZP e%oĘ?-LoMB47,|R0"N ih}j2kE]CϺؤpơO-h(Vof5x |uj&`$5 X[P{ؚ ~0* C}NO"('e,|2PVp 6/I3݇qoeDO{YhZߨfϝ'|> ʹ퍠icG @22u' S^X$f[ᝧwܯj΍9}K¬1N\1݆wBh jS FoM-Z[wGp}j(ӛy.خ|1a~b%g, &U O?.OEa'TC4*Q!TJ`xb3mIcW @C5PMY%N۵Fq0ڍ^[lEg&A{z}LbP @ ym]ϋ^ZV˅7^]φW_G8&hbtv™ FZy6^'!v阵d'L7⊠[?@T5fֻ̋ 1BW\* RT :lh.Q_ybQIBvRPc,$a%c65Ig_5(%Jv[->Bx@[$i.!Tvv)ˮV>,`;*DOC!+J2P^@Dv?g4JVAb3X$NC'VUxa>_K4]*+i,jL-fV>kO'73 Ϭ;3I8;+g*8+{gvz tD-ytuO L89ϳ"I1G~}o )EN kUk@"Hds;?6:2uOTwN)]KAy?(R7.^[@Jh^+FW˞?1 Cࠜq~d0. qJD.ˠc ].pp!K[& +V>cFm>ǣ&+يz5xE" ""';`[*d H}K~pw?NuLWgCu8,_kAvǷ?oޞ]v[>Pߊ3(-'fL Y~dfٗY^uCydr) T4ˉ8c%5'`XQƺa#5G۝8Tst9Z>~hwrfp#VvQ yZkJAP(7KATl"4LP(Kh%CGe[o_uX0eT.)F_/b8zQ{Q#@X g'<?pe6crb7!Q+zVt(B,#:L{!)W2"REVǻ,Ug2D`ʓ  /co_t6/'&ьa/p aaz0aӉ Y{eBXƮJ5Mn-*&2z`1iߦ%a?Sk>옦d[#VL寂#A7˯- O ͰaA2 -r 9&*nc1 [-t 1Omc1[|1[-v;fc4P4ˬFCޟ2Wkz,R-OKsA1~-P~a~-q~". [eeT?ľO)MvE=Q252N|UsYGkb'T[1{=E`9!u l Ĵb1m@L[ Gb PC_(ON 4H&0>Pjk232SlCƫy Ljb2UL(uԿN7d}$* 6hߴZވRV4v _g?lDaGj@J*$RT/ "fBc#ymJ`cIh d{(UezJ-.}5"dV`+U|U&oc4wjJ%Mܯ)ڔHFw{9-s:=fϡ49tt?Wt?Kꑏ߃k@U9vXUu@U2g\eӵ Z&UTlj u]B]9R.=Ld:PV/UY_O͆a~S)&>F`+G .r}7,7b)Q5{}E"LV& i&m\S6oU*6W^F(?>1Jhڏ_O@ 6$I_Pyͦ%-׆b? )cgp9kabD̲.vx:կ<>Nq}HDŽ V_AZT8\{je$+/N؁+] .C2'TDɝU] A Ko7hK@,7odiwFQGT@:S9b8C%+ 9_(%>clHTnOsp,ȆVQ=;=nO LW B # o XYSڴgVP+C=slu8[='?D~!QB+WR{Ԍ<Ϯ` gg0D{-kClE4X:e#-Em!zlȖ-ȳq;M5;o]}U՗;&PecLoq ]yldvS<` ]Zn3g9" Pv#+-wU[WIܘ}ND%5hb OLGq]v-9;|P#2O7v9 wP'#*{cIǻRFplso\nE[$QBnƌ02d,"Qξ;-:`ҍxĆ|͸xm;Mf6HޭDr l%6.a[*^N4%Z+vz|~ ,-x=2qgv=C[d$-j3ciSSYCj+uRma`Q=hNtk'$ډjL  ۰n:CjFL&Dlܚ5rFk! 4[ݒN^7>Ȇ.]hth1CZm6dpK0x~D>2>#{S?U~>/m7TOu ѳrТn{Cxm]l8$R[e`9𢡄ehV7TxfKwWu5AǾH}tt`0-(EqKo=:TW?fc\6`< lMo}^9hjG@~Q (vW~+RJPl}96n_#ގWggބOqo"h/f{Gu~J8trs;7k ~FOl;=:Do#Mv"gX^îu,5l,vSN:C+ U8Wh͚WTp\UVT8x?YoKv5A"XѮnY_nm 4j.^n@sd(XBaYk{Xh pe~ehLӻ}R%ܩ YCM&#>W# _:z ,Rf XOڢ0FO{ZEKH d2'/G᠀gt tR]LPb_hb:ae-zf[ /l + kO Xz*V :8&!X5M,P4oQB\y=xb0sQ x|s7_/Bz~ZE[)̐:Țn@eXW/6KX8/ЧCn]ޒ >ZKBz\kx&> 4"ܢR*Bם|+\Wp2$.6?ozm5.HH+"@,jqk~VؒȮ+U0}k8!s82~vS:jECeS0mыs ` 8SϸCJǮ bŲI)Er9X`J H #x+ #b "/ٜ2Ek?T7 c79:ᩱ犼2UV'e0lk[VtuVjߏ[Ԉ.+@kᕶhk wp1H65@5@$[Lb/Ôipd8^h&dI\J J \ fZIBqaR90zl9:C \:' C.81Չ?W$!_.>ao.T™\z:MݗڙY<n!o011sz' ߾6bq,& weȝrl;sD/+kB7dĨsB**A#8K5l%ԭSq!h ho X8c"$2S"v.Α2wq  B9(Ul0d[},S+=>aƷxY*&11fpQCdx|ؿz?+IvW<+ /:-4hfִcM3ɦG)OWoQ g;oy`Cy+;< qhVHѾL08eG*YfiZ5!yG/3#_+n4#ƿ<{ cCޗ@L ;7^3}. Bx$}~\ 磍;=:,R]˓L.pOBtPM?ȁ}y9^E9ZQ\27? #`ں׈VMuփS#W\wwO8a!-nx$4 {߈4|Q4 JC!X}rv#J~m}loK5xftAFxz$&] K&R}Ŝf^W5+W%ѤԧV|goۻelgJ[߲=y M?Lת͸XMR C4q Ş隽r7bkboXbobB2fr_Is-r>m{[7a,S6YlcnoL{E:a,^ bijx3,4Eߜ+sVpVfn|Y. :WD֌fDzXw;! Gv%U YGe0NZ2(1''a=P %0*a *<<(2::rYnY+J55'޳'%l8Wm%;[(b[蛱<]b+yM XBդ0WLuVat3S;9([%gYeઌ&d8쬘n+aiʾS.?w2/,;VFM(vO-lVQ5̒F4klMDzk>9A;l57oMeGjX#9eo;th箬nk zҏFQ#<l@-5׃ݠ+2k#/^1ug!4Ce(zzæ06~b7F-4|) )Bpr٢H^Jq{ol#qi;V޼==ME5_lߖxm&>.7d%;lJWlk||zGʒ~e??$^ַg> }+ ?p(o`Tk&&6*hJ p&9Ÿ(AYb+h!2?)pa<l9[wQw>S7<@:=1O%.z!\l|&+g'EM`pl'R/g/Neh/zZa I`ScK|,[Q;Fr"m+,R#n%Gz_V ċ&.>%^GrOjxg%䋯T֏wr #2\%DUEغ.]Ua7霄ՕGt!b3}iWHbʮrBl)3}GAQy4JT{6I2 yx3b|ͭh/iCXJe[<"*pe{:lu|5,>:JJ* Xċ w&e!_[}rZhPjB?Y~%w+hH351==Ng$SקgiI1%ZE>nO1n]B[ƭe?XZNѕ,z#n$ܓACNC<򿣰K)B AAqu^"yy=~U+Ɖt&׫(L҉+ nyuꁴA^- V~魒R"jYmPMKHS!Nbq荮F&o08ܴ c1r]RL!Y`p}-HkZIT+Yݟ5Y zg}l#V8Th[ld""aH^.Q)o:QRRs6/exu;WX>I vk(955W4t%FFQġ8j6cB?P_M< gjҲ8$W21Ѻ5*.'vƟX#!h.LF=w%Ua{46H|Bl/( \0%Ōlp=xaP,-ϗ󍧆z2Fw ".36찝*Am#ohȯ5V!W1F]!]~RmĂϹOcpL]Ÿr9[=aL?j_a/${ >h ':='OJ-WQ} ĺ:(+vi BeZk5VĆڴǚ3opg'[?xEbLLq5!?1/2vإ ClMԭ5ᆬ %Jh1)_@2ƚ6@ sNe xSqv2X|wǤ<lɐ; Jas[z׾j_2k6fU}҈Y-,,X XK$Se[QqXr0#Cv.,P[bI`Ʉgzд9|;UeprL9W bFomt\06ߎףVyBFn?0UZ|!+y%2N xz'hH.H|s[e8AUǓ9qATG(} ˀFF '墖ܱP?noiA&z@d!aH"@f2i?{cyu(D!_pƋC,XkV^FUg10:gux&=,& A-SODDz>T3xAX[p(`)~'(3D&_=eڎ^eHkxD6|FDKt*# #\01Z)Z }- a,6T[N fR)nˇXt)^}]0XI3P"7<syGȃv2JA-^ ]0}ٔV~<a(1UJAZCaD鱓YZcC_>&[_B@ }6m+By/BټLtCs\u1J\Wm-K +'\Ym.{ 7[dGP)I%`<o6'M'_n7c&Vчƕ0ePOy! [&9-y i@~Ԏp*'ӻd[<[B@ F1.+u)Q;#:&63ΗBLF"0>剑IRk`aY1$琧¤u(y C0pA8{`u ,.PZps:p_"Da:4+p:jr)J%)޻`ψS?VU^/#2+`%􏑂&~p4:,!5 JV[~&}_.*G=lm(rpT)Z["+=>scG~:^50׵*6,~3XE c 1 o|lyx]#3|V0Yq3e"<ͱo.jZfmL,]t%k(mCcr)C^; ꪱ-u@K)k.{eë=:)S =h@)KVF= hT (t?e:5A"e{#.uq>EPe%Q -!MRYC 6DPeXN5xi~&FW<=uF'caэ6 z,ʹa`h,m o[4P }D]m IB-ͳbi5><3u<‰~XG 7[4"YŖ#v\+-˘uȬʒyDgpd{0'%a}R4-gqsyT]Ƣed"]}X5鎳$n3""s:Xmܧb2L#ɨw0*,ৈ?F5:eՙM'#|39m `?L6OGwllf %SX:[,ME/b9̐ERвJU%4hzPDLyGKãrZy%֒ip:<=x,XFAm1CNᘗ, 1_OGs+R9j9OfXeXA+٦ifMʌW#= +yC0kR6*V_D(&];^"2=?(2'x@Ń f%ms7ep"8C9/n255jpjrjETCTˌiWS0A~0I A#dLf+%7QZVMeɐo1BKy_}i>6Rz5n>g+(<3ב'fXX!qū-mH! J QmJq/-@qB%Ꜽ!a(n#xw|㠨oX_AAz#UB&ts[;GN$;{Ȓ)%{:[BgOuD}-orWRrIP,deMzi@Bkj](yN|+ ھL`wyv:Ee)Ȝ.%6\}`9PI^"vχFX'0D_ӳZӧE]*_5+7qFj5Y33HZȻTViTt+D7XpS=#\11n`4milV@EAE:z֊>Ucgj,Qf!Se=Xu'yx("A}=E3<~F:hfXh" l gj@ DZ<;vb\liP+yؐKx`5o2hSf{u -bgIEkyj ,dW$2 >)dQdD6B!/TWK"6n$fI 1kp;1J&'K-Nذ8QU(,dq/XB sZ>G=RuΖzZVZ훵eJ9.bh7tNy^Ц mtG_ͬeR{+lRzZű戊"[ű ucn ;<{E-pkĒaH4 6l@F[8cM[M+tR@G*\+iW|;n%*{N5R(H{dR7ۤtru4tQ;]T-)5[|$ftPJmi%H*J;G{#JЊθ}G ?f V 5>c">?b $G9lI8GUsP{pg)P(DwY8UIH8HBF< +RdžLf~җzWM.7K'}`ok`@򟜴lPManA6 볰1 38$N79Cy0La=liF&ޢgVj86'kE|wf1xӚG٠V؟ldk0Rowo%\c;.;AOUXzvЅA[ap:d$O5az[.6Yǿ|sh4ro_)tepͣ3g3d9s0nǽpGU%uK =CK*JRIUw0ODW{cc2RG|E$/+)'"# ~ 1 Hw]qxlеw˲yZVfp=)Bv: )._T[oiO<מpf"j$hdXH4[&jYޙD6%*etdjv@h"ƃX̀{SH|NO٦\G2Fĩ n2 :! g{RY:;St3һ|`k2̵DQ* hJpP} >:翛MI]inNG~i* TF_k&)% Eq@K+'-ωTbidRjH1}ɋJq%}+6]|>Ք!&KsL2Lkl__ew5yb.☠ԘHy*U `)??.JD<7 F+čB ]!~ԅUW挄JM\'IzGWTkD_gCBi$}5(Y!1_S4)tJ>QId83!\$Ґ͋YM}`Je4Aテ yb 苙,9[ pS\9 \<Դ&?qn0{C N9cY&x8=܍ {DS!8c bxw|L\mӋyh0+@$ZFHǾ -Rřuad{e}f:H%0BeEaV]AZكl \w|KQb Uos2ɲ^DW?HX5v΢|)Y\HpC=P.W/鵀F4Tʇ YEnz~;Ŝxf4WgF3OQo f$"byi &b%ӓ|໲ta\Հ>)7XuD݂ 6]f2[mHڄrGiz;cVb~k37+IGE# @FVV`Z#pCbWCRۏBl?"~`Q++U>%|8߀S&2Z2X5&XXՍv^`Vo3F7Κ68]CGh8\Mdn(h1&-8h0K4,uP3r@V9ò h*)Z~5Om*fJUK!N\ȩk](~W.$QV3y>݆̉C@(*B GBP^]PMvdn"6ߠJګY}B%maWZG~#0k|K-)``wCw3m*\SgsH;gc*y|"067i# VZz߁ʢ=}MABOL@x=]M)EȸoXlsR݁=_ݹKJl6Ŵ>o[[l]$N~jI6(l$Kz-ă~C_\>ђ(1AvGݦ{|F#ϰlѺ EN NPZ<^i- }co'lÑLhzJV8,1ÌnJ ܗz k9Xw{B5El1|4'ڱ+1XB%5j6]4bp׬(̮(УaѣÖFF(pY7&I`8OVr)@Ȇ 8X"rSu"Km{ݩOvN8x[SxP9* jj8$5 8A!Vr`bcFXXqZ2 K2Qj hҡ0!aRDJ tECFd ܗ4@){ȭN4H#GPҤ>gJ8 =񠑄bmE}`QpIg" vc7~e7.o>a>UbpU dC/c#f Z@B3)ue lN*[~*Bm"Ozgc͓zk&<`GGw_PʠZOSTFS;zuo:XyLIŀυ|zO\{~ /QeY|eIQ>!I HO\@s)?`-٠l29 KbJ˃Rڎ1v 陸s ':80o˲!Hܹ)6=ՑWX7W/t UuZLzV_\$QWqτ^gYL|;^P tJ2)M4, Z&(ljTQtSdkc)"Bʁ"Ѧ1x5饙H?yeȎB+u@"^t)R%ZsA{28ܘϛ]K#m'*R]O>}DLjh5Nkw.De4q}@5 ;T.ٜ$#atΨ kWr/#}F7fwlyRn> y[m8 _HA7C5 ͘TyMwˊ~ش~'Ǯ'?#7V2ʛ,(%`NH0X> T8"^>+ƢVl@L'أv'm]EB"c!?0^ &IK"ŕe ʓ}!ߕVH/%I6e&XOヾ @9C] ~rNs}-<ЈG D^5įZIG/܅Quh%8K[Z3 /z""ܷCE/tWQ\arr 'V=$KX.T!iuǐJDɔxOh/3fLSj riId)cZD#=4ҋh$ix=*yI%8Zj9jXK#24h1Ԃ9,inemKm%,Ad٣$e{خtmȲe;pSm @EYqʙro']o\/0!ṉud?=\v[EeZM@5_S-2"7͗@Q5WZ ?s]Fj?7Xk&ϳKfnSp!2FiL=D\ lO " fHݡM Gcd&sfR\ܹ⒝ERȻrTtiͧ\5&ѕjٸKMOhct 7Vűdck [j+ M Ღd (aN!xmQ!g$.BB͒x/#UUyW=+W= ZWeN~dI}C"НkW_|/Xz/*:wrq=.3)RDBqLE5^mSjl SxK/)Q{AA4ˆܻG_V3k ;Ei'& /ine&CMMI1R+X`ûv{בQ"FT⪳L^6X_]_-m2{\˗ߵZ|6Y٣Z{= 27x쭅C%ab=#[k!3T)RiOH KaI65g.T=Vh;HPDC.`)v_g+ϊ#%>CG3̪M~JFɼڤ&zF^p(84wP5F"=Ȑ&Z(i TGv]|C<ߨ7(Ho*іˎ|G+w=sZr*T"D`N\$R QE )L?cZ֢_2kd9:u5]I3a$fEoeZ)-O'T%?I$"qh/[VUtBSKT8؂" ')f(Vxbj O-%*tRbkܢEK\r&[b[P1;^ P +sښהCҾz,cPURl6*b#vtSƟ_E1@- %D1k*˄L)/%McRc)!X6>VkLQ7Ji^+%f8E3ά!$kc GFQTM9V eVW(sw+1k#;0MC=bZ,;M˫6E{+h]P3I,syq456wx^﷜ٶ*R0s+2~/?nH0q 'Ry9HPѭjTfF#ˆJIo*t+1[Cd:o:bpYKmH{<\o†'v70l;6=:ğlxqRz*T'|&ȏ9NrTz:t&m8r? $Μe-.{W_-z.X|&0%/~NHd^u 39@b?AAo$KEY5al ,?&Xrn5XS.|eS /[HtK.7f4q~r)5n*UjW9mOR'xŎ[Ҍ |Ѻĵ:^j}zĉrwFya=%_X2'1wqDb^ hkK`DE?BfbK_')Mȿ1uMrsA _D196P<:;0H ƝPp bw޳(~>>?? qN[Җ_ůTU6HGQڵG=Osg9KI_v|2oׇ-UJ9ew_xE}X!oz<y z!yA8q}X։Kծ%/C^YސǞH9y|.x}օa2K~O7E!S6ܷ*J<'HXGm:,Ro69a˭'L;uKrkRPFKztW&j»q2?w/+;&qQ!,NuYUzEȯ۵+;]RDZuB@F zGU ]μ>󆁣͎^LϏ iC. Xpy<V= Nb=> A"_@ѻߊg=VbQ%Od<@"t8d ׹&P;Vcny: l/dK%4)?ch$ @QcccXm,y*%1rXȦ.AEJ4 N~;w6S›A."qזE3t`kPᵮW&7Z'RЛn-"sj-SUQ(OK;A0Q/DPfj+{}~vg,BW .<CMF+q#JսI,DK嗲IAGp4pHB"Hl \,Igr L4NL,U=x<,$~wMvVۉĦJ|kz\Ⱥ/6ɕ*OST^HYAV.88w:>˲OXs!CSto8٨ZLtD5>,0w܇܇? a/ ||x% +p+R] 86H_|><ڇ5}XWWmOa㛅|b_ ^yiLXmfXR,h8D19At2tLU[EMg軴dΝ{'=,mXm ARYF0 .4-1z0M27:d$QWq~":6Ǡ=t%KY$phiڛ-Z|GѵOQTH"P$~8זuvy9%BoD:wOd')GQydtSPk.0ݹ/'3skFw\C(A63ZL;y.xhla8`ʛW#: &$w;^ɽ$:~o޴~oÙrł Dcr DBiu%@h^EqE+ Wാ} ^"@|l NmY?ݯ=*? ٱ]Է~{aGSq4Qw|ɽGVܳK|@Q5[&вtf[?5DEK-8 KsRiO|BZZ ^s~ַJ=YoTFN[#M˨ t:ВCZ.OrB#=4ҋh$;66H:ƛy9G Fki#Ί4h-SK3C-vIh~N^VPdYC]cَvM[ i ]ݐe v|/,8tQ4 MJ=3Fl^/;!Uu΅豕DeqO=jEdnG|:>#mWB:D˵@/pi8c4ec9DES!H!8}h;@eB x^Wj5O!YszBf Vj** Ux" ֯YdSɞJVU2+ٍotQ:e0L=cT]%)QR 6 R~+ >Db;N}IN`7dyN19f*^.jx-h\#t:~1}6lI`‹|4HXtxugFugYJN2ԝ g<u'77QyQ:[gqX>W+@6Qdo Ȯ%;?ɒ$EtW; rY:8?ߩ_^TpMu|/{`]fRCpśP=j^lۦM>_?cҀ=T %o =p1‹{7(ܣj;E'7]HY2&& ύ̽QoLa V#$î3׊))l*uj+5;Pl&-"XWXۺK7Z|G>H3rM7v}d[ﱻD8Kf԰p\ ɠ,fOʄJ{D l}rj Zi|PwtKbm ܪ/D]鏦g(NA~J Fɹڤ&nF^`/ᵨ#j JdH-4 va9:t|߀B.jƺDo*Dc.JhK^\% pX=*W+bB RvӎaXbJhT 9QU-E1mŎ`}S@DmafO䜮6Ѫ[,n1-Vkѯ}UD.Ԥ&LHg /fYWћA5dVq D2U E(:ڥ|+2;*~w#[HRXp*Ub G[P8Xd$  /[L^XᩥQŞNJUlmR[TSWhKU$s B u*fNj@JacpV[rvSW^J"J G2P}Ďnʠ(ӛh9Fu !^Sc)2ŠiY,%Dt&Чj>v&X7w hƙ5Dߖ9d-p_wlݓ(jW0r|Z(3D.ӟl>#bnpV>RLNہ3ي}dٙ\^]".[1DK RT4rEk&ܩS εO:7Cy07T&+ L|5@}t6:3N۽0%&zMCIɴ3Mȭ)lYD5j6̬=!DZhe}+j +8&g9cQV|f2XdIeu7Bэb0R DGָRE6߷~|8b=/{4u((d N}V[Q^E]+e*DϦ'8d X:`U`JT%麽F,+*כ^9FzY@ =>-P(W{0- oIhQY/Qn|v0a1;Ss=*h6cVe;AMmcϭr=A΢}KbsF$J_LIJs.Ј:JUZV_lÒ8/,v)it$x:<M*N e1{N[6tXǼ6\R-9Rȯ |@f yA::l&ȸӤ_9n*EO40oXìr[E? v5H8JSTQ 4!tD_C5C,~#AJ/OI18&sbEjfSz]%[n _̹b&TjHt"PH%Uz33Wf@:+OJo(ܘ2C~qV B6u/ d%㐚6wvO$.|~6.3!6/ͩvAnT]Y"tueK56E6I9.Jؠc餹"  8ƌ1iv@F(0bבZ"k 00{Ma8OQ-_]Vz}Z!ߝ#щx*UZz,4uIV<9H9h*<i JJZsd''W"Uw}i-IO*B+ǚӵ7t=ͪw]dZ~Ԅ[? Μef>e )e;~)÷)cұj!Z2ΛV!Xj]V]VصeyIi((H-On֟[My8% ?$<,rW^ Mx\&|͠dʘ%;AS>l7Uy ^|ciqʷ}~] pY=t}L9;0^[/,ؘ4"])5kI4y0Yq`pcmVy3vpa WL~.O U PV r-'|qV8q5'[-=?_*>m$; "}3k /<6{L/sLduϵk/`՛[v\.2IT;`Ipk[5w0yЖU!Y&f穷&O=Rܕy\%agунSl1cF"_{<+1z}^V/u4tl#3;w4/MF1{U.zſ=y]xճogKp0%D0̫n^' jި ARKJQCٻ=R[ǫ pSJ Φ>QmM50o3|LCo3Q߷e@ȓ"]ɠL F+jvYT/U +Ջ߉Oc^b{=~o^ R=|0Xm҈6[׽ @K&q-0J*QBDJp n97ZE`-*}4tN"Sw5ӂd%RFP.Hˏ=R ?r7' rK \{0=5㛟ZQK (ߴ2Ol53g֥ J/^a7\i/h]Z,|g?]T[MOK?H !:+R|K`ܜ<\C2hȣz?UDC`F,V<ٿE WzMr{8<)\dR O xnXT\mLrLWc:>aI(ĕĔ~Uʖl7' 9 $*[ I_fT3|!9>>"kʙ`Oޟ_{ww}1|%g'揫ز]GPxC_h)ʣ ggeUsPkg^ wb9ѡp 4t*{ݼCNēPXbט-(f[9;_{ 6~bh>X?T/uIYO>ex.ȇǹ-KAmi'v0,"(5 HuõhNqywȽўԭe\ke&1P_t"DA6V=jI@Uم=/Q)CYX|I"-Aa>㵰xåi1^}]@j,ܮWbENRĢ9p W~QU:y5 WvY?l\$5d _greh(Fo [ېc6okVwI3@%MR`k;uEĭ*HXk#936tG208s"6UPr70# i@ SЄ#JLZfHeHJLLxT?xPϴA-ҠiW#h%?C_\#U;?թk X?cg*+<\[a;|L{}S~C/-t%HN@az ֩J = "]B4#&0 rp8S z.RٽB\I-E\BuFoTekbf%d$.@Yi!qol;QorC2'Qc./wFO;gepEiۼשtϒ6y[N,xiYUee!mso!%gFI5l4%vdƙk w&vwy(k8{ԮAfvYMu}ErS]i3|e m#At$C13Q/țIh 87y삇G(OUJ@xai{P%a#A&iLl1:YCp'zֈ)ʋx>!=X&ib`hfv=: n<:ѿYArob~gIMCNo/G\XJ٨tʛ}QlFv؞ؙJ8 ,{fI¡ExP]'mbPGPGLM ^aCX%9 )">d}})2oweA)LUyt/ OnNtWAE&`VP]6ez*8ʆt,b6 ll*Eͦ%fdSLБ+~hK !oa\$E%Px.(x;'ĤZ9}v8Y[KTp;߿<8K;xt0v}0ud`tHT`K,nT ,?F>j8~܇:ׯ;!`̻=pcg;,eex)n3U'_c ؝~</\{Q!/bчJBHB_~IRQ$DzS_Ftp?';'7Pa6u>3E@vJ^{+3&'m) `݋Ej_<Ә4aم Vۺ`NO]p>Vwېa݅x+YNK M#|{(cdj`v.{t$l=/?ѭĄiǴ!mpnnL!8Δϗs 죑0 ՠJ)^7'\`1]Rcy)mn}(PD S^:#Бv/CP8)U"Յneo8(q _"a _vrYߌt B휜s?yw_p\Ru4-/|\iWć&9yK\ZȜCQ~%X7 '[qnKHkkYwUoi墚ҙ=o~ȟƟ mE0?4C 糒]ˍuzE')`!0V3V3A[`[$mCmVju*!odfh? I–$au 1W%W3n!(=S2XFrWLKZ,_HYgCePoC%E|{gR,C:;=K&v]KJ`v$E hi\@Nej $A:A$VH%ʂY~~aYg{z_nTkZoZ=~F.SYP"wPq{_+,/W֥aQ!min |Jp +z&x jJQ~JZ-&win8K$&FR KO6bk\(T .@(@G PeV_VNE|DvYT㪢SNeSyI0ۑ:(:#u־#-qU w5n[GN0j+uڣ:i_n OKEݐ[N.ιXRx>t)z^1^]U;%^](uM>ҙ%jeƲT:@ْREi0 xRj( 5uk5U3pE>?%*Ja[>ʰKpA\3.q-_|Z,N1/zY1UIZw,ȧT޲T!J!~R-ugva|#caN@k6)+J4 cV* :q>(? C0R4w~"R%zch-H'm-,)\x0_()?i-R j'ˀNW?Yftii`@W2 ^_Ggw0uf${aA>ft^;).ó*0$:]̄f<㽟wg^a^C]?(˅."avl8u.#t3"B0_9( FZǜ /#;8'`={P0gN+h9ʞ r=)FaǢ3S /nm"JBZ<ׄ y@E2 sL1u$8d<!>z9+!t172ee`vBYb JHˎ%O`o!CvGgpMp&btTO؛D_+sXJ@S ]VLP1VaaYevh2;VKPR;R ֝١4؞s?sG^ vlAk&,SzETSVCJd}*ea~Z>{=3dQup(R{iZѲa7Aj٫P+\/%6 ^rL?S[NESkh`fPڀ;EԎ כ224,McB[T &YC񧲄`m_7 {:(an x1L0=+`@^4| D@L7 }8pg?P]sB_tr0DZr(l v$ O\8΍v^@s+q&\::KQz9@jr@Z NÇϺuS>mͺCEnG u`Mg zD[y5l@UP\~+nfQ7R{YU*O)"mCHjY(|LOHBh*=F>+DGJF#GkZzMJFOOTp <Ʈ׈k9? c~AM^0߈OṖ2L Oɽy*2akV^lږ;.nhY^?s1 3iB#;$ҕ#ɷxy9hɢq5FT\3B#f'wk?zz> Xg#DxXA҇3yˁYiE5+{G[`cF'4)GDr}uc/ ߿K1j )%QBaoZKJ_F >/}62l8u|-+i .bhDJJ}+I~b4rȓB1ji?: 8-ALh!7 MCO)wXqb0JC4Rc/ b}KY,=pd^f SM`$p:0"gPMز,JLYP!9zzYVeQc@/YSGv0BpK;=0K>ae0Hz8*Ap\\kOWOc"jjvqfpTbX0xBW1a t T!3¨,E'*Qfk6g(r^r|Z RCUfp ϦRa<V^H_+~}{/~Su`Ebߎ @y\ra4nVۻۻ.Oվnj(Ղz@!c,a!W~+\;/3}?vσ@f=;c03xX88ڵ)-x)@ӹ;W#^zJp;ad܉d,nOKC/J0g<{ N{^ Wȳ3{ 9rl,d ҋXZ d)? ?H|43$T_m _K:ֽhs: 1ڜHk!k5GM(c1-3]jȶ@x&n0QخYD~q~Qh#_h`Ҵ %hp?i1a-mZZQ\CLfBFϊR< NJuGq+NgZ|q65mٳGoV3Q?C~6 ^,G sdnfL8L|CPC A4>Wp`M32_ RTMa -Kp*>VCQg*j4N&8pr !"6:|ţbȤ,(!LV)2XC-Ok1]wgR"hM2h1#$qFjp{%h&"$F !zBnqL&Q0ID0MY);MK[rⰙLVx- A3P_!d&-^~La ʡIYyXojV X.TS**7;XBH?+6=]*M?TXeuۼZՠn+oe7WVB͢ȖrT§˵C~TDKbaV|آ|Rl=JZ>R8,X6_))/drV)_DC  V ^)U H<]rUK7~MCS`]%9&!Dᖍ)&9&!],UjHrX,TjJMRRCPa(KC\UYFXZJiN{R.7vl<漚HBgdxZ9R(mvRӽ_*U_]6^_DWikﻋzF_ڨVCd~v_AW~v_k~bv_د].k~bv_د].k~oد].j.W"*"v_L~22滏*"v_ȯv_ȯ].kG~U"JȯhI#]/|_/ɀB@q5UDmȯBEE*Y5S8(*U(ˮRDTDuX-VKe$n\R\KJ) -PlV;.VDJ2IĔYU&)/ ʒQbo%z*ެR1TES$b&9&!X/Y5('Q.:j&IyͩlQgs,Sx$dgsLv6';dgUq6ȯ_zW`m=ˮ._(*U/Bɹσ;Cwh,mPžS/?ȧѯ k.bBvd_nb}㗬tũGgj?*iF^FUީ6_ք éx*U AmdKS5@.Sf5*rȒ]x?"wk9]( Z[TZ@O킧|.#BJ"0qSjR~$(GMLl%)˷GM]e݃7/ Onxx-(łVu r惿, >ė~T|JRQFε3#q|52|ɵ_ddڜ=痉{Ӟ,vӉwY/XWQH@q1mf",.@^XFȸuFƥkHthXDp)`a/0 "84Cre#'Z HBkM%6zTzD0V[PPjGD]2!lyuby0/[c5ǭ5DԷV[3zz+[si x̔ts55TXe.LBjURvQc;/NL<mshtED|cag~Y_~yRq!,.c` Jws@YCtF 7CB6AiM6wNE1iaŤ%I#ei%"lˢB9&J-ֲ٤v|n=)?GZ@7VDPZVh0P(" ء?&FBQ@\l1зHRͪ_].ތx3rX;" s6[DMV4,2z[R#Ϫ >+.e?"\K#4貎]ذ^2dž-JK*d67eMzVbIC+dS1qW AB/PzU\&ʎ"BԨFDTU3" mp4 GT="(,LYJ+e;<\ceo_Wb Be B%!5i83N_WՑpJyY 2T**M@QZv(Rla?z]X42}׿>(O'?7%|M|f.{">vkPHE|">~X.=c{D xowVEб~(s9wkcQ~(s9ʫ:۩q!%bo>LpLWJap5&+PΥ}ҞХvv/ʪVaѾGh>=ڭ3?ޙ9كΙ}̾sf9&tgv{#:cg) 93% d</YjL?΅zIyQ:J2~+řsxυً{tey/xiz|2L],YV.V^ϿrvpŁ;8R\ϯ>|:\ąz\˝׶>@*k< w\W? oә3&Z|~R[7n_8+Ut&|y=(63SV+ ?vg󧨕i#uh$TO6/Wo0݂uQOTOxs}לGștou).8˃_kϯFkZ90/ ֆ@]oNUJ#lPW+/KС7- |GpN1U  HȎ? \%W4]ȗ@/uEB/ѻ۪2s<U+Q-QCjǓ ^<$~ 'Wv,? tѫ˕+.N&|1yrg ? EvmXĂtM rƸx}}~z{mEſ-+1?Ⱦ4pd8y84ߞyr1A~^a(=/B96$gF]$̈6o 3# 3}eXZ" OMG|7U XԞ>'HHh3o:?\UÞ6Ln7L79m8'Bjبp1b1L|)2|ЧOϪt@p/w;O/{_?em2[ՠ[Ϊݪ*< 5ir1'0I~6+/y]Ű>=m􏤋uVj묵RuKYkevVxx!oθF^Mؒ2Gp־1'j}]i'x m= e(h/ǃьW?1Rܝw1׋VEd{d[DvY݋#{:Tg )5φd1/Ќ %!lHC 1O룺=vѮ5H9F,>eJ<S}"օe2Qi}xBf㊁ ]Z $9LA#ywcΖ$f|Ysh! VEEJ=~aq'Khc hQzIQw*Igɂkm]e[vMœ&ê`wnE}~ -XU־xFeV%N^v3ټl"o\о‹ކWWʹVi)$#^ W6 *ݖ{3, Z½!fH%Ez3,c$ِ3͔e3\fa٠]jm_߁SWPFNdg5ø^ƉnUm w1 <:&#I)jCɈ`Ô9SPH& B|K:?qv4ˈMdb¹s a|![O"d\Uw\pL;Yū"ͿC ?svy0-SMĿEx25wfwd\r<{40ħvť,+CS,7? gublE.jXFY6|qit^ڻ"mW_>=pp!1G<n!4sh4LA4*h&p\$0nH#Ɉ!B_bP+fl>䌽`"yA NԙEbAFQ' 'N% Û?Pw7š|#Q}BeO{Tr2ԫ>bO+lM# ?;{Śwdj@|zv3\2t_]+6s~@hZ@*z7MiYJ>[ᬢ2$O~b82sK;F?Vny# Y8|qĸ_/1!5,qXgiI[8Xx` cEP>6T˖i|õƄ59.[[\eRA҇P|p%qzO862"H5_3w\0B~ 7\ HDVl!xXn1cL<0L9K`v5#*v^I3'f/sJYMNGƗHb3Ʒ<@ mPR)q(YR@)qKp(2 X-o+7D.2́ѽ< Ә_Jf-Ls|tDKTw)t^ɰ Vt"ou^+lr$H˧O}{eEVaz vxIuxO*g0:M1íX7jYug{Тh tp?!4!γ>-3RS1}?Ae0c_MuaQI0H:H:[,Ͽs*3oO-Ny㺢DLv7z3MƛNQjk5F 3<t/o+geQbiy+lcޔmt~ձqKáWxZSp״O j !.j\k֗:w5~.9syg۽ta\[0G]%csmkoL@9cyUZƠBg&:p7s0¾ fH5Z!/pyɅ=WX`;s$8yp`rd㊾?gX7Ps q5"6y^XU.{vxB6w)Z/8sg[lg:4o>fJrk@"I=Tʟ-kp;%S :A0l3`֜sͿ#lE7w0&Q<|mOAz jax"?O >7G cñq|:pQ\kńE0 o' kPWyW -]mR(\A;ϛECN{4!˔FT5lD\hRzlsEaQ/ ;=qA$g<G*~~SXN&봰X~v!vfld8ҧQY.Cyd!}uڂrX˰|N'|65Ob -8V7mN_NtǏ,,l#}>-z\}YY->[Bm"6JXhЙ1(yHyk$v :;˳4m8!`b` )WrЯ|NSr7ʯQ `#\>a?觝d޴rKlHD>$bP\ڂ4`㇩Y!H®{g @Ϛ[. W Oݕ)ƵQW2zbB_b;T w7\{l0M0:%}3q"Iz.ZeH"tK6zbӾ ˬm/?>3oTbg"F#2WT WF(yy'K2U1CBƶB֗(d*9A6OY4pQ'f8y>*ۅ!Kxi𖯋[bAdN܍)_PZ~0;S ,Fë#p & ֱRAr0iGC}rHΑ1?ֹLP[D acȿ)QV6OFU7xX}Qgx[ foнvfʗʇ5PŁ#m 7 k0P,9k ?gvX1wd* qysjfp f-1 Xm}t4beOAY(+>Y[lRu'iAdl-éLwkgxk~σR z++b#i77 +t@0a|W8HۣTa8lA=*$D@i6m~T #F_mqIOo=ĚK3Ŧ8:gUr?Уg=g˟\=/~r(`JL'*<xס/w&|pi٤9Рf_`POd,'7'@‹8n~+ 4CW;D:"ʙq@0& r2݋5n0+F]ʉ?(?';E;{wzAAc{[ۓAh/ O"]up|,NDx,~qO=l{l.=d)%1 #E_>~9_r|w9GK4?S:Ҳkgǿ1emW>y>gb: EmEMo9yNdE봼E%Ku =Y2hRB7zb}abD^]'ͅܤĝ?mTlB|<^k?+;@dwtwxԓ9ve )g6qd *\|s0r_"~u}+3 o4Iָ۫@2FaΛ\6dƭݘXܿkl oƋNEq²3Ml3 Uw#͸7,wZ ;xBċOC>Z$\B^6tS$ ]@+($Tv;x˧OFoLeͧZ~Z@Ê[MZ,+^b;AF‹4e}Q*ek[Vr %qxaYC9E}j/ѳ~]70:nRb1۔Pb2Mt%Swo}}aR"r%gϴt8:pӇѽT;pk%6f7MIQRtˍD*6hg_o91ޜ,{ꮓkhi`x9n7bgh|2 j73NsὛ\%ot(]n-ʪGӛ!E30[JKIB)CKd6ZNhmZ‹V)}@6szeo"lXF+)[T5T3`z'^r0x_n&|+ǫk4|p8M~s](p;~|A"[+\Qa̽a@PG{)?spH]kp%ǓhPN)и'SQt~]ygpL9&Cw@q7,x>НxhN;Ew[xUzz3@L;r[U R@Lxx%V h\ԙ=0c#gL q WhJz|->ɍb{bwC|ˎ= iT7Ww|},; k:ԥE3@/YSXtJ4ըB;sv>yp˗ؙܫdop]|]hrysm|'ՔB9kT4SQS/v LpVEMjF`Yμ5w㽧<)I3piCM$CDm_t)Y÷pI]2\4G `d>`rw7e ԩ,pc;<a#j{_.~&TH Si^CL;4yv>wg0rYڇV({=<9MOspg #5v>@ hJ>1ߝ)⩌DeeKsvcTWiۇ'geʹr8yb 7>uwəγK0,p̿ :&ԗ}9x݊ì;AK7DTz{|Naʗvd(>9['_Uvt uj4~q`2{?vwFsjrmCTnC+`=sAP;(o{Vy-Ǜs@:i7N/X@όNTa=᜙)x!=#;,,kggލ]|v5 0&o ZmUڽxjapxB.ߥN>5<-{(ꭑg=gAyV8˓xK._|'neYww㻿LJ) ;Wy,i`CYC~'?/?Y=~L?½0Iwnmk]/ɭ8YݓI"<plx>wwa7s0f͓~^ʉIL kRV/̟<$,`J% FZ޽_R5*N?e1펫  7ۓ鷗>f:~*:-&2\ͲoTwGu}s';Οىŝ2n2 M[Q^_8390on~ ؞wu3{1]|'N1\.?b; ;@vsgNawD^|Jvr 4hrB__|)8ц_xt9N 糃=`̙<_j Wg:? yy+_~/p8z Ckwz7q˹ {;y\q`0w>/NG 1K"qoMұޒ1 zW>;w6xg ]Kyn+UB+d= ^zuADvu[0w<!ĄGgc ;yʂ+swſˑgBÚ>_= aNw'{ށDY|%lpe& `(({K2GؽLlacTrAwX 4Ǿɚ&}9|r?޲!'g2\le ;/\?!*]=0XGRkFND`@ |U߲qAX8m}IUe}:v0uD~qg0]@WRE#_4%Yv5gK!L7gj+ c+\tH$g@LGtAPLZCAA*`#$~\~) ? (^\Ʈ'y: g9ׅq*87C? Q007? |†\Pglpŕx6\0?LQ q62Pď߈UtP./N)b+IQ"w>oe]>$~WL>/lh7q,̱#&~ v|WS=|b>9'V.:}ӯwE 2ſ?:iu16Ōa6_Oou@]I@5 !mwRm꜡eZM9lJOY4~?X_©% j]yK|Y^)HFjX$D֒$kr;wJf il}us<}%.h!_4>Zn7E#vux6~lpk\V/Mk&F~8)s^y\Ӑ +>/xU Y%c4廐5.~muķ~_Se!f9A[SkdK $U%e/Yfs})2Yg@ щ械kL&=H$ XVFWm9|j{Pyy:[R%4ѕL f{$xMMd3d}d%ٸoj6A4E! {1j8B{bxe6m)4~/Xz/o;8W|L-z=.SLx_E-wUvEڂ1דy{Ct ?{^ (+VwV|mHatp0LFi~h_ȉg,9{ z$vE^nHy#45a(L*l$lȚ&*2Wʪ+Juisq6ZN ^G.NVoYW-[?N&mѯmޚ.1W\{i'x'-ӤU6# 0CMFֵ$yC !6nd/,n4N;.;}s 55{lccbHVg.,dҘr˶,y#019/)DYLETwGxPm5pYL kOTm'oڍɪ\}A\9oQNߖNFŽߝt;%!_˲~qE!kCa8-lgeyGr#LwVy iv_ /P}߯>\[Des=}?|M/2K҈?ҳ$mvvi!]zX M%wtW&GWq\s%^/{*}0653~eeaG|܍0{ng^GVn=V]vn9sKRq'in*2D\);puL:`!b?/lhhJA#ol{.hXjNcA+gqʬSFx~^( ?R`ʤB>0p ˲kc 4~9+ &:@/vC"GzᣑZUxoL|lz3`B/k/1ң0jwۏ%AiI&}hވ8E">w-{OĔvbLî1V |##O<򢣏K#?0cG?Wx>J'8"l|C rstp~v^fV ?nӑ3XM\W Sk]ٗ[g_wc\~DdU8nt<K^b ^ ȴ8̜͒3`WkTe0cdw+A6ͥ*م1l|{qK/`x-p Wݞ||l ^ep` fSTz6;^R|cSxbw`< pgA~h|]l?!{sYP[󲝤4NUegCl( ;tv6HA1m( E4OІlPSϴ/;KΒ$;$FdIv43_~xC?’Yv%ijgZvV&PH>m[F: 4b*\=.DWDюY ,wDYgS2 )@h[Sd$l?/#6Ǻd1%$#/qynS}J~[mM_s?+#o1rlqXwc;(Kΐβ`i`g;cL-g܎V\Aprn0_a d3=6_ 1vApg܅zIHΪ|/ 滔b;\VszroO/oAcKG]deC$j1~z+GJ]dg V~NBgɋ~{^3l ?װJbXS4Κ?ʚ);3F4Cvf51~[K2~{bS¨30Y4~4ȠaI4l ;ΦxMᷝIaB(,(Ev5%]ӭ}»MU-hxw폻/1p7|Z=k_Suw®\σ;u9oS}Tf~\)uYpO|N.SuGKZH{!F'Mlr~]M;K`niIC|z+.[YJ֗{8*} _G[ӓ/=_OO{ pqdc^t8\v~q`1wx~?P f*NrtO/Z\-9e.A{mErp&.!_g7#*3pa5X%@L[v;O8)5 mX%S`+Hbdn%V-)ofp8>` gK4,`uC[bsQ'ÙfIGkxѝ'C>%|jqTYU@l,PKtqk+Yw4 / ||4!HqPVU`7ğ1׹2iH} \./I<Sa冶nk ]< ez Y&N2"+\5^Gf(vS- e_Z8P~P99}nO|Nyoŏ9cbݱ:4IZ|Ǟ D%?~ɽVIvxQBw|Q_KBB!Kg<'+CI+_ nEЃ?+%T20A6e;@\IEW{]sN?]]m{1=s lIJ2Vbh`nS}JsH*07:Q_J(C()T/ J"Eț LUjJF Af +|04I}ewܤܤ7ލΫ5:PH'7j]ZBK{wD{_q:u0ol7<{gu/, * V{~Ǜ_/-_SB.]$3e'EG53;Rx2F]#/?]uNp pHW\ ɄTgL3+<ݜ?F{aSkA |{/\89}c:D9R{MJh&8+Mo S;y1܏h[t}3|7?~d}?">*( ge&gq'DP&c d\/%;sɪ^^SD?K*_دZ&!H3y|2iv0(1,@w/ NPn+pT]5)|!cJ݌&PѴۙVkZJc ,?cKK,ao- Σ;Ëz2O30{7DKf~/K׶?UP b^V:`9J%˚Y6P;SL=AǍCy۲y-Sԙ778}!\h‘hLӼxu߶m1"dl(UH{i-9E^,04dp*eG3R`KoC $|[6Pay\/q?e%%ĵdp\C)|t?;u M"pj/?NӶyФPm4xs} }^XV|Y8Jqk⛆;RKD|1vz"Wx K+7gg2?{BEQ}U"~s̿mhBu|ι{ΆS}拚K$//XGt7 VIՋVQ_b˭;17;>qј\ Wdxc%|վ m;@.pLӠ]BB WћnSg8τ vid / }UjQ&/jvk`vW&/fFMu{oOE [ 臁hoq v*X 95C u`jkL5f5̸"Tg)tv|![}0dLA~@r8-`Kc>]'c K_7Bd> ^8L0Qm`uC/n4F40l) \` #bq[iԴA@FCG'0C? !ZLB HB_<-!!'Xy7 2}ep@8DHMY[w X{s #Sޅ6]~F]~"Nhv}#]ՃfK\0͕KSo js x-u}[פ&‘+dTyFu%o0BG>d=͆{`L"B[ubysE3oIdaC"  fD"`CdaoALf78R|lkFDf󘝷8=+% yVJ"T*T cj+VFxFEZ uʅX$ =Rv(n*JPhI+_T rX\)Ң3^umr}W~_W+LŸpZ;K K௃^9d)lW# ˜Jfj.M+hՌEk8i{-C`MB:/7YE KxZ%6:_:jPe=B\?p&ދ,PCyTOBDEDŽQ]OQ止yᾱx3.-,BndpYu)b ˜Ob_ܯhbEŧ# 'Y?(.oa_pNc>eFn2`fqg2X'wmKftk[iNmvik<(uDՠp9P9)8e?Ë>94QPtAz||Yy'yb;߻]߻.0^ópkKPy<駂niь0k+|eoEV\J]nO1y&uFY`4~~vU?!j|i8+TPZҥfF~Kch`]K#| Q6FZ]KBI8rIg6}ȖxTxc$J%dkе1pmC*ڲ 8TU@O~g%|z'&A2K\GgL$;wu{یܫ9_ oF>^9KͿ?7esd2g`'YbaBX@v+Eu:]}p-إO_k6{: )d|3>ry\6~D+  __&L`7MF>uTH^Uw} {)`4!5c *Ӹa4:}%2fm+>R<ܿXJV Uo*%,(aA J$6D1œ5枷Ÿ+UP 9/Z*0raP`5_~ /TY^98̗@jk/=@}ϕZ1m4T%DpۊgA04`x6qfӝYc^S[R1`?x?o׏V࿿5s77W6|EK 0|&پ=[BxkI1gc6Zs'Z#фvJ6HkE |1,~糇5\ 3hWȜ`mœo,W8J{0_p#nw(5*F#/svuFd ES/ pU'3Lr32MUit-N٪DD'01(-U{?og[we 9L-I(}OQ'o)v!u{2=NRWi_폀2c?:)"""ZCpqn^bYT>!{6~ofЁ|іQ ɹBʷSRשׁmEP+ע]-'PTB('1+9ǕpWwVӵ"ZrТzdtB.+B.ЅB2py㣂uߒUV^_R?[)=Q˜L{; 05x氻fYfw)`h -pvfw`0Eu9/p wN\ V6WGU>F%j!T:ZOoGow3q;Y˲s~o{oGI}4 o _o'1U8ω1jܛcH9} E z . BpAUq= CTQi|jфMCwٳ4>qto>#iŝ:άєUjkGi2^nx 6'.# ۟M*A.ו[p]l#oAX.=!g[z|~ wJ.44-df'P5K,GJWs^#82zL$.B&˚3y1+`8'#,sN>+0̤:xğ_Z #\DcD1eaC&B2d8'ztkt-cσU:Ҧ簑殾 :sml>"d 1m#f~mSsH&*X!J Adx6>|a'%1Us9<}tOr*RIpA.&Y%|Xe:g/GMJ`z9A݇07t sz NЃu];\u(ƅH>I⹴ ZTdF؟O{GW ֐̼iDo0dLz$/Xmy*K]^4oy% Mdu/fz鋑aHQ1fiP;j<5E;FUu \`Ϧ,x^1+z DQzڕ^gN?O 3筨!Ԝy]U!Nx% {tH.1j9%?((P L+31D_,`puĝӯma+Key%X}}\@Xu>v?uzp5yHZ\R@`n\AGt}`JN t>/A'/0s) -1UtA/CYavc.E DS7 DzY0_0'WOaF-\IK 4ޫ7JK^HIU+dh*6MѝN|aG2>О.\&d͚DaRi|4ZLLwq~g+,ދn慽߃6%a,O]zls=~/eJ瘯H8w2j~a 5ịXh2tis%y虴=t[77g=놊u83\4|*Bl$F@a;T'](nkgbLB1넫ܷѵM\8_Gw.]v~9oaSEu#k1m|3JkdGr?1g.pF,k?/5kܛYu/7Qmߝ;_oikBl$is)Dk˴2v Xe]*rƱvTщjtt:߸^Y[#/X'_,1fHJF/c1̏")|¿I>,\{JeD }bWFpMٗR񹟤(18Q/nIlu1d O8#Ӡj5bT-Tja=0Z\=4?ĻY!l TK`+n\aR*:b^-k!rѦ1+TH4RH0SҘ4Gy"qO4!_rPl_?K_/yBaVxaM)quAƈ2fpo%v4!XL0Jx w")XLpY녗ǹKm5bQ%q!ddI&CqdvP2K@GBdvH2;$ "Ʉcd^X(HHjlgIBw@4f YFg&WpE)KBaԃdI0hy؝ÅJl=*Ig칉!?X0m4^,:ځxs1]/xy?'_?: O|MO|]bv'ө3IKbPBN)@ b! C !E#i`;X; J68 Z77 s]Azw<+ey)[\X@ vFh11Y P#~D)F6H_E QG5@H.NFPcK4Yk{E>o=@Gh{==JhhNph{JGCF=qqb= ?.ܣܣm UCRj~T)ܑUR >T . Bifp,=%XW|,DS*>U-TS=eKjG&E*V^QO:OF'C ew+_ m鹂>a|"^ II";Ӆ%]ԏ~Cxiwǻ7.K_|KKJ%eU/cX/4T1Q"Jt72i :CX jj.lMK:  Ä{LLe"xf@bb$c`Q bJr?-HE*llK:093֘iđ ģ=6t1}9؍!S9,U~P V =\,6 ط}ڒC(U?9~YlILr?'!,fA x ED\*اo& Iȸ{pK5 +mUX-RL $7c ^5h" +ba<# \э{MnNȫ4Z Qe&S*6u9tá2:\~LAqVuG! \ 3sAġraiS_?DmJ%_]*Qf0sXyiNtˠ`s@(+aσsT xb9F6CGc#t]p=Φ+D +Lfrn{s@|ܹe$8h’x p*$X>_53>ޙ8VZxIV[ϤJ{\;4kE| 0 R !)йgrN.dDkڏ[Q0 0mPaLt~l"m*7 зI)4?^k`鸈r&t hRBw$eW"$Iykv2FU??ѼW pw`O;.#_Kbu O̡uo? Hi~[_f~4"Uu[ww`@Ue``raYub95A+v_̋~'?2!݅pIsςUH9MTDK!V%"R  HË捞 4g+N 4+O SK&[.(b'Wə/>(7l_y+ #IرX,@%`w+"(,D'i12U=\Ι0OR%*чJAo⃉!t&]/OJ)JwhU*#2S+y^(gKz %&S>)_ӀD$yMKHU#Æ!)ݟrZ +VJwDL+ {SNS5"$Zig$)fioW+"$ΔG ݘhbF|.؈lp` BD3CA%$V$ew2`$?F#1 Fb覅D*H=DIk_/T"?SRCY!,*_ g 2Q ({pbJ/MTb$t_$Ȣ&:r>uG||H2/C?X\gQbЀQ$Z:.88u&~Yd$ƝaCO˸"[yRCZ#%it,I1ZuȰ}h?Ru =T?4`ؽBHv9 ,>1LJ䮄%jO("R2)Eq8`UCxȔi4e,ЧQ*; J>QvXkVazVUc*ˏX6XBT@V<挈 {{q!Pr1;D`>.ӟ2;Av)[Tq.!cK#cZE4G42&YF%2&Y9>ĥc$ X)q)%$`LR"VJ\J@uԊEe)+u\JYTJOivER"K "CV2 /TE%%oآ]3B)kQ\RQ[U>>j[j8Pz'MOp8 KѧZ+jWJ-&C-Z6/SYDz6cV UѬX[eO$-2AlڕU)oyfO*aj _E@v U%|ⳖƸ$.ʥGs9wMB*Aϊe?X?0^ńM'Q8} f<ДYTb%dXMZ4F(]Ebɻ3x?Wi?Th2# dcY١`E4Ⱦx B#@Dw`zV`;( {A@)A@ w;$}B8K;`?{;+D\U\W0$$*+ hr#WcosAO[>Zv2dYwZG_]"LrxVWOr'ÓI$wxOr')I$wxIk'Ó$wx;<O^[쾀'9?c MknA(w`*`;ICܡMz_lm{%CV4Mxdńh+&D4VDhʇHN3n2nrF.1W4AT2eJD$6 DpjciF׬d1ӆZb~e_2_W__V׼ OGb؂_ق_kM( E5TXPΆ !L͍;ta,10Y Qzޮwx#nWQ<0e+ YD#G>U~ uS_E iG?&?] U= 3QPsz|XQ !zS`N, CQE5CO=G75N W_9jo2jRTESUU5aC,aWU«XVWH U`Ut `ՅX5X5zZ*eFUЇ]!\aR0UjڇʿQҀU-K|(-C%}61V3f)6Ov>na;`U|?6gѶKg+ .?\1 xoE=ׅIfW3m (8%ZjC`?~ |R~d[/'xrouAx7#v,1mmHtE4#2j*ʷkH&I e[ >&rj>e$`{aAc-vX g7BK_Wml@2T2N.2~/iD).Chl ">\!䑟  8uŶJ@lmE^ Nw?XP1(ę3SL6p;Jc`)QNAPzǗg婰 eʢrƭpE)B9( l56 U y1lt[G`׌kz:I naVN*<>N21>ې{G"'n x6tg$.-݄u\׵2:7& ȳ  Gj߫.}. U9'K.}c6û`̚ ='/,So)lK}/D gV#&:l~}icfa.9Xdy<6,FoE ˠQPv~j8)وEhIvaJ0"` ρtj]mph^ IFk  - XcD;r(-1!Ө[bd5:2.M0j4:bԘiԡ5''f2`% #Ӭm&!`‰ 2ŀN gM5]~Eq$:3DKL?i~0HĿ'Vp']VO18(vr8ܹƤO U9M<#~{΅T0ZH$ֹmlʚK0qж2vSEf~O)|B u틘_b+]]ݎWbwC Կ8 lIJ}F5wKv*O CprsqIDҡC[Ox=M0k/Q`L0lH ;M4Pb`@_Oe_=q,k|2}}w~odׁCL2qDβI}b D}wa)-j/g.ű`BJ(K*QCDYlUL욹+Go$[.[ȍ0œPI% `3.؊`P49RBqj8p)0_{<7Szɺ h|/EВ a^{jx!Y%$DeٖeOP,#ÂxB08Ver2  T'Cd\ ‚p;T'CBHWroYrP9"V& ăP=Ae{Ebj^* k5U+#^ȵjOJؿa}CҢ"p۫ UFу0HVUDyQimP!vʫ+S%o+:v#~Ym:dyb]YU& 1C+QʅCP.w[~d/=Y[+*`_j27IT;ݳyߙXB [Sl2HSejcc4OFk0e3tߡ)S>n.z݀sF Z^p Jj֣znb.=a}FuJu˞?Ϡ9y+\ݵz8^$^T 5qy["r$A<`Z  &Gd}~< {^{Tׇ~S ?$._n4Bz^s_-k<\ĺoG8>Lt>jfGh%cGze*= W/:Sr~ %D= e"c|yЕ~216yՒ8#y;RDkf27[T0[c ~WqAi;_ P7 )%*"x?(mA*#K @&sx2"Ry* ÷FdG.X蘠?k7iPX]!?K|DPgtcBҔ`HZ={aӮR.2b+ke?u7sql#2VUkjD8f,@\2k蛗çYxWY D<=b+1腕 (**"sDb?k -I_"k|"Sj16VN64LQD q.k#!ǯl>ϞdL \z~ !Q7#q:N/˦uJ0EiJO}\r@``$jaH Bpq y{f"w_KQ ^R: ^qzU)/ok;>/S4 Ǽ0Ja:>3^{ p_t 9>e2'ȰO}O|za/p/t\p~J!u rMK>3p^ cc` R%M7?ZQpp*mj,8H8A#c Mh\M>STh@"<%.Jzh+8:+$ > wlFG];YڼHCt@0|q, fnnSoQ LFͿ/09I/E{v] py789áy-geYu$()C]¯%j$x-WN;?n) oyF$Gt}:g\&dh1 ?\cZހ6VB GG%.(U({Rb|U1TCrPydY>}GYaJݥeª%G ` 7̟<%TÓV p ~Qެc01;{[x40k֮O/;::sݓ&]NlQX{ujٹFJ?g,f>߁Tc-=#骁yP@Htb4#z?1w6wJ);Ī G?ЏT1p{]Om&RQ6HtvǺ{*]xzo9u&Qم~s҉{.;}z֊ˮo5PˣaW6$g:IԳJ(VҪu|3g=Rc _`,Oq\]ުU;x"+-ym`G+P0`.TwP,ѬمRQ\s ǔOjWx+0 8C_'AdRsRZ݅cMق&괷sbTZh&gM%V uTI访Ɔץ%m~L;v]+n""mj @*mϝ(զз:Lw:|O\wqhCAnMY'{Gmj?۽] ]eo ߰ ۱[z߰?>V`.*ޗ0VƌX]}vl/ ~٫-2"a>+'aloym/s}F<:w"MXDbF{X2Doy3Lg/"Rh6|‚Z o?"714ʪ>_Qw:?DhmL-@aٸ)aUq5RKX/4 [C Ygpw.4✺VSoww|Isa"=Ydf&p%OrAEb*ŧd1x\8lPG7`IKBǨ̫~G W* r@oփ8DX ʡϜFl/0QLg Zm9` 4Q1Itؐb3$"V/&QۨAxJ3b1&,aRI%bd')GE̦5R-ݨh[MRNcZ8΀Wߪ̞^SUa`d,+áGgRwi䭮%YĥJ-2}ʺbJ^i.ɂ!wr(u#WiCn7vh7fZ\_}A4Q  7j=ܭYA$Ȋ7!Ǿ@~^F & }1rSϳ'{6& jCalڬh=.ymrleM6J< |X߫HY!_yVY&z'<4u7> aW$bW*{>sdh ж+s =  $T&n9Fݬ*TW‰U־}xꟍӃ5:ԡ('%(@cQG4q"ʂpfCH g]B32B:SKN*q*7fxO6+W\ :h\LoBԯ{3sSI(ի"JO BLsރCޗ+\aW0@`+\ʴN)%ɼ?2N!ј:Sѥil_;JR d`hrio:Lƺ_"rMRJ?6F6I؁Hmϕ2czL56Ý/wfsҗ9Hی+Pn@%]|6C ʠ:_1kvr߻|2WL57c{ +ZfFS"Iՙ6)7%U(R+::.ItW] C2)8t[i DNY1MQK ?L4i$.wS;v?:gSTFyzsX\ئ2S%|A'MhqT\@\dY3Wܦ>5a)W{@KLޫs'V@]>TabE:IPC'} PS xKTY|s %NL*E q@kfn o{28941g!t5(N6AIzJU"Ż0Hr1'Ta VQ R]+QWmE+p+o1eO+ <)ȼQvY] 9-znr Ӷq ܔ2Y"+}ݷ0=&[N͉4k)x>Yh2HaenA|([ȅ}n"9%8MtZ1v^^ì6sF1fxZ_)jDCNtt[X?fc҄peZRk֒Dްyڳ|P`L7&/RckE.d4t:8|u `fYdVfThb:&f,Ϛ%J6q $ )ZK]X-Eh5^6D%ì@1٤⌚"ЧZpXn\寿Pl`l_ %Fֆ",Ӟ# 4DxA^RyX+| ,tNT/t\V?Ijb3^M oOzU41 yy*zb$ G8N߶5[ `&SL Y9H;N qBg_*gZ沍}K;9>U+aw&Rmъ~e8;s<:;Ys=\:Rt<ŠvN՘RLe7hghn~k40EwH_q5߼xR``]cR'\` ̨R|nGKT+I}$#'w$B۔3,DQI}->e?wD-Ubi2 (IXP?7n1_( |u1oQ;XM m?50Bw9~vN "[JMJYu؋Q Gs54.C-KP8={ eV3Sl:Fu&*hxޜh)=C F\n9vg}<8p V~EzeU?soJ\axד7dPkq%hXV[G d;W.?ފveeA2^a*c[,$/B4scu$J,0g8.U0*#sGx4׻&Utwǫ8X[Rr?KЫ-e} )Saƞ6O}wB˛ R^?MV*{W_b 6T|#rEo tH6Fthb3^5P ·^.`:ULf}]*Ald+8!G/J5ncqCp#on%?Ⱦ.4E}/lAH]x!uh21gDwNOJ񭢖wl=`:8/``|%cf|1/TJM:[k9Z\" j&6Rꦙ?XǷ)]v 0D</,m*0X(+ uDwi %a[!8[Zz$-(\*SX^Ɖvj9 )6T"0 wCPCQ`bФ7(4+E,r=p [ hs@rOJ?"=`LzjNBi20]U#2Asb471n&̄-fY3 ARqp}N90ESl}$? NWα^/^K[ީ\0.~!e ]~[F1hqxʜ^ܼ}lbbb|E 8pE<Cu`ҚĚ9(g@&5y*;ŖrS^滞X@9[VCC{=tB#ͼ+Qi> AAj}TBO# T iURuT#ޝd)J0.U*% gGG.m 묖T~ȿ8\*4*uHWs; 8Ң"%[*4Υ]FZ/iBRp _ͪW`i%Z&azި+|ҿE% e%L8zD_G)ݦw)Mo71{e~%?n[E]Ut`T' 9I) cJSUVSNWWM. g˧Kcs>jR/l/=}΂G6>G3@ʝlf0F0g]d⻅?XmUvӏt^)QwkU趉!kLULĠ\@ANh#YX;o<%A?(ZQJa  P pW{.E $g4,R< 9!ٰ B@P_A hMIGo<[sDu[* P%\3fy\VPU?N([O(*ťNhAO](Q*0}eV~ %;r#.1g*xLE~C% KIW7ߩ2[TOJܴ* z :+Po1jѵEDAY:<T73+W0`E#i)H׍p q 8ΰgAvqO[#jImbK<9=MlGMDcPFӝU2s=G ΀d1^ͻoA `lCd ڏX#u9Ƿ(oBw< vv~]t!9Z-sǃ%Zn F lsgX *r(wn)IriMKTt C(m.7Fvb&0}ډ!mţEM=?\)g8.7K^olOOAg[Pd+EYRZ(PY.4_@µtL@_rpHhCdƭgU(֝u]\=G\I<ͬ퐳qfB=_ӊL Wa$堋N- .CFe?ip> 2xkCBm6vӆ;j,aNrT׿вe#}3*36ɦC_!_`ڐh%i!0a Y]#MRM aWXbXWvps-%J6qtN˪N彘&hLS^4zy.` >\$8 TUc[fОU^EHj,ȉ[ 4XtVv:*rVګQRDt2;ݱ*V\K6v}&ay ):Uo/rFӢw쩝EoS'L50|r>~6 W.MԽzNL@ZCN^Z19SB@KŁI^]lk.sO%pܥ\/&kב_zW)qgVTL6,.@eQwn+o k<(<*Qi W4Q& anhmFr@BE<og_A<sq9?CP:9Bd1iNg3 1 ,LEf]@zesJM3Ur!Z+;zAY Hٗ>_]Q.z68%ZQh7RvA_;:胡` `6 ;aó=R9^^QhEq?L~T P''E& B3Y6ΕiS um P4-D &BZXOmӌ؏qvNi|;Y]Ҧ'n@NrD`P 10d˒UBC'-]Z^5p†9P7ޠF/ѭ' ` 9޺P}0Ԅ'g6S^ݺ@tOHTub;Ƨɝ8\# 0۬!jQ:8Mhi3lb/ ;ueIb/ t{_vlT6/fҰefÃO/7j,(1砡ԛ|Gٸ,(b' ܀ 8xU&ZCñ xBȦ*>_#rPn#6v{dvZSEd-VA]hMI}MP"E@Mo n|bXx~YeMo;l\ޓT<QP.6뇮5̄ca\]BqxucGO)% ts<K.0Vv2akpJ$}޳XA1>$/EP^4iU_a. U(H ) >r<[[@ǣo6v?]ua^r[؁RSSRDKދ5pXqC͜I{GOXECQVUjq455R,V0n題МGPs?)YCl|73e,T߸NDd{M%k*}~cca}GmII_PR]μm2<eVd"x2ML7NF /I]7M/ڭ |JHҜùx50o36#ʁ9$]Y$֨N[ 'Iͤ`"5t0.]pPڀCCU7At?|يQS-ϯὛLAo h iيiE !thWQ!31}۴Lk-o30|]ugr}F̮|2[!4 lv"97 T./|3n2U+(ٌX*"}땣"PDݒX|d94!.(GVr3z z{'q\Mn0ɘ̤E'_h12IfL&#Ȼu6vAF[QSEoyG,JGik+)a E'92ChRɈPy q耨ǓZ?(kO)"BR`JZ~M7c+*Ŵ?wiy_CI_TBik)j$-nS4Y)``';8ݙ56yub4Qw3rDؙNj`n~೜ʚ 57tfSdX}Ä'F/{"_ c_# U$݃࿪b>Ƀ*j)?M/K KʞXP=S+:/XWW &j!*5n&63/<ݧbYxXmX,``Ic8u^NR?lumBzUcEZ·|7܄B+kp"O"NBBXH.\Třjy99! g]k׋M_:c'U8A}Q^Q_lY=]Ԟo[w,6|lϡڦ G `pGS.{ƔCshd)Pޫ0ސst8fx82AEӅ$Trn~2ټrǗG{ jJ(ku&ş7`kz5Y{-6DFL*[A+)85S#P ؝͉\Qq)ʕU0YiO"PmWϚ3b=nY3<BMSkq^۠V 6GÏȠF:yW<+{ٲόΖ>ioԦZ, ܂x`nbN1,U65'8c5ݧK^_}1/'}uC6݉[=]KCww[8X]2?U+թ- Wnaԭ!jzʤ(V=D&RɀV1l'r8>9|t=vt[r'vOkcY 's)jo쇪Fk<_Wy/qbAJt;psa~z~*AyJ"t˫t*rbTTa]r(x›=&*eСWkׂWf\3iol֘lVrvN hOOo&~mMJ^~3;wH#WgTZ[l,:y{Sw{ϒ#_ޟJUܷ oS{_[S矍o-Zg >=y*=eK.]7*Sw_:}*Tgo:[[C|ݷS񥧢o}T<6_}l>w~f+MN2@ڑ+eDpyNC '<~;4@~¨m@a<2-\0Jΰ3< Dg`3n2v2,g[AmxZyacn OK02e@d Тv IWg2Q̴i,A)&xl\by >.,zrl_{X֦zhK!Vf]S5@W'Ӑg 4$s$A}$h }֑%  sDl&>B$dE>xMIeV3~sVmb ,R? hx[]QrO"[S}'HV} ( / ) +4)_IaDvR0k͏ M]gFܙLgP&|)vbAn 0DCC4() NʾV>r՟ 2A0I€iձمˇMXwB,8; 2mjdDDb{P^ W]n&#KYj')dSIf}MnlO)Oc$I$-C)(ߖVg2Q!˻vzãXFt"ul6`ڱrڳ`Vlmg3-9е 0HgnTmmD7 aa~';.t&/abPX 1aYOدiKm32"z`_  4DI'e$ ,rdžA~0Ųձ|?@fjZw~/ -bڦ"%|i)d{3J(̤<i {m ipVߎ=@ ?Ҫ{M4f{JӤ_?Zl8)wIgJ?MިD<<ŝ#-?HJYGÛu0$ҒA\tx;,/~͚ D3AMh?-#MZcLYv`%v:Ե*|)ḣ1^p۔{F ܽz \_kO٧g N`}@p}83=+%}tRozZLa.}쯐@IbOMrڗvܫ8>jPE1qg ?¯(mlCZgYש[<;,%׮k"awDNPKI9du-hCEguSwٽ*|O8:!۰z7rCI뻳:C"󷳞֮kw[ln~P9fCL7vRIoۭH \׹acXFV4{.܍7pb$M ^#fY{2E#铔~闖ѻ$2-aW+i ˜/| )^gw+\|ʘ"P8Xvk"|\pb- ;ώMz#ٿODf[VT 9~]֓ݹz%@YCU_Rg1t`XgŎۗ> !@'}ҮU*|K)@cUxbJ鷔{Upb6{²rl쮿({`8{psW6ie=wL@$}`vn #dLB&kܞגoȽoKA^rv:l/sbw"c`H%HKQ{}Y>:Νu6Ɓ;sUw&W*IRj <-R$K0f_G]#cH,CVtW\b˽T+ݽ**RڎNꎲbgܙNg:\[[?Ze=&cS!%Z=)8xôwJi4@=D-zx,zV;ꆀ { /G0vFG}j]l>#f+4i?xg^Чn7`\fsPߠ.^gxSx!Lx r6YL<[ե)kP*qw2kD()lC'ѵwˬ cT~9{# φKj~=BȏF<ޛ5pT}AdFH%.އuFiXtV_@T}3$>͆%zq-Ɵ(/{[?d"oSZ -wbsU ~G M?zѵ3tӊw(%m^G7\e7ЅnxW;?e:~9|[]v7{ R 7YK宱]ZܹWWiQyϯ[ړbz3;~}iS 3v޶`Hd8SY6[U 59_yzP,Fl8V-%zdžs׹,-܅zd&HlL;wѴ%6s1εpH GS -n<^Ln?;eWKt1kj⮠NbwWdwWMgwo-~]J Cٶ_e^*-td*nx!.ţ`ԏVG3Rg$-DȆT.K(R#S6g6d 묏.y(aӈW#~7֋I^dgxML=[eYEo@6n7th t%]{Rl}BB]' (jQfoq&+ϧBs߇Rlw,Wh>CA@`1-d(l8!*`REy7$-">㙺gp9 er32C+LQ6^;Ѝ(+F\REf9*SW4+^W; 8ՁZ&*Pװ <(ð彋6E 4+̇-ؔD_R/Em4|ʦ Zh\#*LP׿@S$#ڨϨS.|aAIxФK*EhYUZ=E#ri[吓^;J^痶}J R7%R@bӫUʜ{Ip$@n¼bKsiĐ+ Կ#S8HqAdp2rlKSY\@r?TS2i{)i7&nGmA`5Om5To8h$qQ%{qƎJ[ʵm{%ᑣ2mZ6ĐPCCt/vp5 ҏxGSuE1f_\O'~۝m)|KsF >hBwWeSYWJ5UrF {O'vם]wEOl9zp[Wf-u,Q*5ZAs=yvv ua=I6XAgX$*/t 6ҨyR G}|8Ѽu Sx+n[BG{ChQg(,WpemY+D+Ӈhq(Eȃ(Cf2hW˱b9~K+lY*(dyޓL8 <8]89^N@o*i@*J0<%UQ+hωڝ;[l'Q617P *7-3F[ G]㗸1Sfs7Un?V!V8hZ;,缑1CtAG.A6rzJwĻЕԲ61fH^Њ<7h0SÚHw0/UacdTB#Y7`8݊fhn'^ sh|#ޛE$,9PhwƧk_Q/ }7ggYul['zZ~Ɠ䯣2o @#U)_臤0(0Yq׮;˛:*u<wgd. LCD(I9eK/\b蝎kl3otq#btuRImX]E{VB' {[{&- 't*21@pB!=hF&<¬re7ht\nJ{o?4l̀0pvt[rTl:+69c&B&ۚvAmy=v6o(#B=%w$^9F!49N'y U j޸9p\!*ڄWP ?DU][P7am|FB')ȩnl!&[< Qsހ>JӳB'=ruW[Yar?TW({fje UYЀxhvz*P n"Fk33! Ɉ7z6T)>Aوl}FrGe_Q{˹ -S+c>^B%tϟ޳ G u'G5,S;VU@(\ y}s-g9$Ʌu/{ n2cw+h۰M".gP^,Yf u&^Qb¯`hɹwMI'7K,{,l3=oΕ}jJ^$4"u4:³E wj=o}t :q6@yI<~a&&`1@*0Jr{K8r@ov.OTp4ALll>UЙ<{d-dӉ=ҹ* l 3eI$Rqw 9&hG}}~h]:^x!nf iIn];PpupXMc6Ȳm5WG\9id0=*uځ<Hއn4FZaSl0Hc!hEDxvY=`}U. ;EΔ)XOU܊׿\5SL>vNg4\@v02>9eOh85k2u=|w٣ѵkqÝTh3#grxgn87:MPl 'Eį.ouJCo y3_OySAOMFME&@ lv"J %?.lM8$9gQnpsX7WM\VЇKOq@ɖ(ٌP(+ [Q V.N-"fsxl³s2 fV'ӫŔ) *5% gɉ`9S<. ̄9ҵb'PZh՜x b_$lxiXkuq {V@E^hx\ű^̕|,VpБ,:Qt3G͋V0(dͤ`Ƨelr!y\t/$h!!GȔh'=wrTFie .SMc܀n1R Q@)A:M$M4P}i7A5Q2å^m'c.NjPuDi *rǛ?)c}D]2 SR\t- . lSr@C(q"u :$H) _WWI+2gJYF l &ZeLƕY4"7 (\P@ebg<{KLnnH^mPB7C?;/k<ЅMb*dS6Ss'հT1xJʜ?Ks-S*F%Fod0uwN>=z_ԿGUʦՃhIE7 $YROUu7=!x~nTc?^R':< RC!$Qy0˪Ou# PX" $(Vh#xhv,z5BȌ{ߚ8_1 7e=Bq1־Ww&aClY zsEg+wVְC7ZӍn.Rdj!g6T݇P@F]zYHO q1 RC z peDxYڄ"X+ }9?_9;Eѐ<~VWCzUCuu)Ee]!bw{C!?V熷uKrNnQUnUYݪ ·|7,:*Tܢ4HBXkG 8Y7qNlν~UgUTЎ*nݥ-gTU_uSdv WrZ#\4-Vηs@*b29z\M]=#XJ{G=D ۦ Uz6l3c0_dz @~xߤ@#! ;F2'SX WVY0 i,Les\X)냩\ΌCP1 hokWYZ}m JR7\VWbWU1<Wh!uLcI<9f`K '(4?v;'m2s535 KP^GM'4dlȪ('KN5잘lXh+b ڙ-8ҟe*dTVʋC㦹Wt[ه'FAmR{d^Z⓫ Xub$'+4 Pdj.;@M߃>6,Wqd+2O~P;?@V!pyRFsR{Zo?)AAbgmw3lLw&͢lb9Qtמp'Xǚ`TTjxWhC5 |lќ8u5C'ӽ|O!]ҞꞴxy5+ohEH˜g7=QjL^T0O;3;eSjtޓՠ6)A~YuF<E`ڹۺ{H¶#-Tj#T S4u)捞6ɍ4:jvC)DPpSl)Fbӈ9MYemSk*u[Vq4nWӒ-m+fJ;Xf}x~#Pa3:̓% :e ?Pfgu+f xh$kP|Pj{ud=FzҪkLTR67=y*=eK.]7*Sw_:}*Tgo:[[C|ݷS񥧢o}T<6_}l>w~f+MN2@ڑ+eDpyNC '<~;4@~¨m@a<2-\0Jΰ3< Dg`3n2v2,g[AmxZyacn OK02e@d Тv IWg2Q̴i,A)&xl\by >.,zrl_{X֦zhK!Vf]S5@W'Ӑg 4$s$A}$h }֑%  sDl&>B$dE>xMIeV3@NC4C?f; Yƥ~hy@qB;̣El (MOZߥ ,PX_+ SW=iRKx]݉xH{񥀩a֚Ga4(>3?Ϡ[MR:ڃ? aliQRl}5Vg}嚫?K?Te>aӪc ӛԍ5vYqvtedpȈ @U 8}0HLGRNRB ٔ R*NǔI !HZRP-? ,d=CwFGvD4)0# u1fmc刵gdچ{+fZrlkI,a֑ځ> n „NOkw|[]αM$;_&ŠAbhϱ? eQ>%0 䟰_NMɗ@f>`eD$>a%7ʬOZ_WU~?gK[y- lXSIg+n%n|}-[>4MyEB'wyK fS7#<$fZ~goQI;M&x8P!j$ +6 ۏ{*ZU #ZiIh6q|SB9ؽQؽyxw; !G[ 70`H%탸H-kwX[^* 5fރ6~ 2b[F؛rv;KurkUS>cv|ٷ){)"֖O-rA3X?\qkf(`{VK }#@I1@)7"04b=\_!+֙ŞucG/ W%q|Ԡx1b Z[a~_Qia؆(ϲ} Syt}w/0 X&J>c]E>ps>Zц?pV++$7{U7(qtBa(co~݇>7wguD'og=!#x /,snC Z-.cS|N])ֈQj؆ D s̆o&K= A[ב /:l=,srǰ :ij\$eoČI /:G̲% e܋G'))d[ÒVf1{_@Sr]V.1Eq̃`D]Z=wrY #"Gֳ];̶B[yAr'sa.K ^&a;%L¿$rcӁ/}B.4bO%]Tn$S#̱yvݗ{I/ю'SA<ڵ#|:?o)-Fmem'r=O,2]Q ˋD3p '̯Xm@9DW{H3~+(;I(` 6nGUɘL%xd[ƥHa̾0d,hG XI_ĭ餯ұڗ{V&{U2NU!e/۾3uq]H=fܫ]gxSk0aͽLγ5}sYzq7j0w2X5dtEC_6ɩYǖ+hx6g_WB~1Lͭ}>}Pdog12~$o?#+c9ZycQYpxi6/)כo7C?NO{?)26=ŤlڟzGux=㹪KV84׿~A5nZq E?aZH d>+G@]o1:[t#q$]~X;?e:B1~9,WoeJ[KLU?K dɹ*KeAFߥw&Wi=UI-)yxu;ޏ?< ~bz3?I;x|ht(-h`0rI fX޹W׽l0@@㯺-&u\־նۍnbWPRvڟfЂyݛG/M8vv fnÿ}AixU4Iș. 3T"^@/ςOxG?./"хw0jJ@tx06\Dz}Sک*NSEA[VNC/_ td)kN48K|pnq<#mfԣY,!\cfW*bpJ%^9>>:<=ye}xO߃lR\}d<:5a雰wKyW*#GI{܍+[ Wz]=lE#BH7I\ӌ}+N_a}ް>㣾ycg,mOw5||ז6Yިcܲ % PҼ񨜒UJsj2~1ZgS 5lhT@UTWLy;HmǃTY0\}0 ez}Y=vd2ʦxtݷ:9T;Dyʍ{nj(Z37B|tn "Pu7sh%bObGJ e"; Mc $y>$RN/q;EL\V{U(!a} D(@GAb$!@4*,ΖbH{oy<0G6rOZWWz_:wlu:ޔ 0a(ή2DE0 CɾރvzU綦EG;QuKʹtPo,ke,tŠBӳ8iK4bWԨl%_mzGf%l1S/t܁V+,ۭ% QuPtsӗɒfh rKNqUb 啈.%(r\|Cw6`*WB5Q p0ΡեA6||oPUϺ G!>ZXքFq3YzgMiA(Z`2H"('x*RR2lk#a3k搴5![x[mtΆkG ԢA{YPp3L%t5J Lҩr9_ܪ-P&,Jfɚ=I[t@ãmIy8UH4(γe0u)!zKS@eh#w'BTEqB 9\~K\_TkeusF[80$NM!9r` nt//]&=;lޔ-^ynT)JŗɹwMQ%AE Z{lw,%Xg!JNUَ}<1q*5>O 1\DsG֯jH{GT_\H@FQjF̨Rnh6^oXv@YpjٗAv3/r$_g6G{nR{37A 3˝aCi9Ɣ5gJYVbiu;g}LQt @eB}B_;JRa!iLJ_m K$Ji?x0XL[,F˫LD]. vaGـø`0dd%D}5h%D͆A›xlAӓs0RD hԶ0|ŧScipd)i*ι˶@Qcp{/3; l6:&O+ : 7ϳ`;u L~V/}HCrM~@E<Kϔ/vn.v>,v"oI*) u/jy'JJؚo[7"HށR:xMG3m6hvkϘk:$uLj. ok18 e5ȅk~I \ǰ̏Q]6|׽e^I<&gHRJ|4[Sv)'dls,Յ؏|@7>S_o8c:î#bY?uцփ߃&o m 5nVz[R;_99}p y2v8P2}TphfL'-KξKC+" ܈ y:it9jARZmŐ^3+}΍U}dm|F#%}-~C:V UM<,0kF77pbhCيCE1*@^ƖI5~_^1oXPh+曀fvȵ֊ /-{]O.mN }Hrxdʽ> })C~8"Wo[/i]))k);D}3ٗs%Uަu{Ck' (!N9%2(op/VȖb ͼ}lzf2`ʔRp@7rEΔ=[j5.HoM=$ f11V5sqfo{J{4 (`{] , 7 ~ v1C4hfQH5ϊ7"5O fz(SG!ktds)"ջq@#D4@˔44, =N6)fB[9;W:kDSd\5R(~12Ur \y[/aZ&۵FxgS4@ZWq c A\&`ɐšMckQR<KHRu5 g*u@x W&qN[Y:[8zTT@ DQ%6tBW{ТLuVU‹ V #XR![t9#P E_xG^+qɚWJpYyz.khHљ7Uo޻lzπAzMʾ~*4|+dCp*L sʾ R:[?~0n e7<94 o{eӛE6\L;ۉ cbHG[o6w_/rp!9x7S{1/7{]\7= dg`t{NQ5ewa{{Wc{ƸBmtl)YColst8 e2{\-ӜPcRtuG"t,iZPk!& AT7{Mk5՟АqFVEq-=ibtfĴ} +ѵb)gͮmv&BsnA? rb>SyV[|5/O@*z>}xb&WA+> U(FrrYLI EvV"*[I=M Uaj6[~?xɵ@,BSJ]SzimO( WϚbgnY3i[fIBڹ^2xS C,eFN7^qF7X ZY}A_;WQ6x[wVt/l9~ mNUa(^k3E_4'Ki;Y=`w2bN1E/uujW-qm\J;XfM~#_H)e&r(5 |#E^J%G zI>Ҹ7]gpAÁ+ &X>%%KNm&ﶋknffSI&+яf0p.}6{m_6͚:<::H֫O' y𾾦5Y N׮, UxNZM1/^XG U1kUY[^V(q*FNEe4W5ލSNU_;YUl8uUCׂWf\W?*roD5EdY+^g;3Lr{Ivѿ$*EPW K|w7R70Oo&~mʝvhԿCe(4mdG;}葿y}-Xx~h6z*yϷ^G_KOjkTXT|kp_>{[S׷jx~*}j~Wk>6o?q~c4aeV$M;9HȔҠ8sv@?mʴmi>bӎI[ E~V'~~f;u laF9M`nd4LBq3J7oGgmb'[N+ B'oA㊓ӊ[WmFˑ h3/!6;˂Kahʷ#my)m~p ԕ2Ӊc~N`Us <cJ?a6 P`FEN g؎I3S΁wL;@mepb6k'm62XdڇC;4.9~Nh ` ',Nk B;,sY틨ws ^i8|4 n^,W0ځ!ӆU5Lma 4>HVEtx}~9 Ua L"u<&2+B~SsVmb ,R? hx[]QrO"[S}'HV} ( / ) +4)_IaDvR0k͏ M]gFܙLgP&|)vbAn 0DCC4() NʾV>r՟ 2A0I€iձمˇMXwB,8; 2mjdDDb{P^ W]n&#KYj')dSIf}MnlO)Oc$I$-C)(ߖVg2Q!˻vzãXFt"ul6`ڱrڳ`Vlmg3-9е 0HgnTmmD7 aa~';.t&/abPX 1aYOدiKm32"z`_  4DI'e$ ,rdžA~0Ųձ|?@fjZw~/ -bڦ"%|i)d{3J(̤<i {m ipVߎ=@ ?Ҫ{M4f{JӤ_?Zl8)wIgJ?MިD<<ŝ#-?HJYGÛu0$ҒA\tx;,/~͚ D3AMh?-#MZcLYv`%v:Ե*|)ḣ1^p۔{F ܽz \_kO٧g N`}@p}83=+%}tRozZLa.}쯐@IbOMrڗvܫ8>jPE1qg ?¯(mlCZgYש[<;,%׮k"awDNPKI9du-hCEguSwٽ*|O8:!۰z7rCI뻳:C"󷳞֮kw[ln~P9fCL7vRIoۭH \׹acXFV4{.܍7pb$M ^#fY{2E#铔~闖ѻ$2-aW+i ˜/| )^gw+\|ʘ"P8Xvk"|\pb- ;ώMz#ٿODf[VT 9~]֓ݹz%@YCU_Rg1t`XgŎۗ> !@'}ҮU*|K)@cUxbJ鷔{Upb6{²rl쮿({`8{psW6ie=wL@$}`vn #dLB&kܞגoȽoKA^rv:l/sbw"c`H%HKQ{}Y>:Νu6Ɓ;sUw&W*IRj <-R$K0f_G]#cH,CVtW\b˽T+ݽ**RڎN뎲b7ߙN\[[[;a1=FܢP m~E!7)`|jPՃ!)[I…T>W-CobX\K"*x"uiCKJ1W8Sz/ vR(jN\6=Tʏ[jDhN:_`o~Z ivc.jޟ?ߦٟ+hl+?eӥl6ν7uj#0WOx)`rWt_wN Bh;F}V{5a0lygyy5!G|1#ܓ߇_N?O f}2y=%WsUR=;.I] ڣu'}ɠltcTAfDup`+D0#L)Fwgn *W+(1W-!S1r0.ʺ㟯V75X3LDaH As%*z\P>VԒab8+k:;.$4F}Qhjr]>Q=ܴc9*)ʆ2;{vAU'ѭWOƛ-}A9Nژ{v龺 @\-mo (}ONJ򕇳 <BZ\qA)7>DKY6 [X-QЅWb;fA x!Rj> 'k9*di`-1ξHʸ;0CƤ32ڟβqa0e}0îf0͚Fd*ĀᅥumLb.9O8zN B` diKD9ytƫ3kM {j%i2mW>,FHKTů`xFf9ذϑBgYu`z]75kb}/H:Nb Ca0h 4)>7ϔwz.'UH zӫhҼV`ԢO L5̖T"jͩy7jϺ{!3yA|PʅZ)=NȩV 9's8hA`~6ĥr=e(GKPA㿯5w[5ݬ$A95u :1+?7.b/~t=JOYLATT!7  /j^#"YUC9\R6dnv\(HFb67ܜܚc%&|) xsb=`5&^9Z\ 8<,ס˧haW`(z e 'f L32$_&q4[UsP΀ ^L5y*;ŖrS^滞.zOQ]}=4  > AAj}TBOڜ{E~x~hRƩQӰ &5 r(vCu9TcN*Z5:攣Bqɐz]mhoQ0jZT֫#{};yi(DǤ`SGJי̆9j"Q8)>#׶bbLg"^@灰/8FcY҄CoѿZ>zfҢɮ]rKJp;MBp$.zk@kU2FZ>Ḏ6Q 3tT`T͑^yޑ+<Xa15~$תc*OP& :k8c~YUGyg[] J;qභZrX$6*Fd Z_jw3T?jtA䮐2׆V6FY;iepZZ9WUΛ-ʁh#i Xs-'gI/j' W?DMkOiRnU{Gr5f-+u1԰+K-Vzsj_ ,Ѻ+&eUCe_wvثPMr =d *NN$L_KFc3] x,zZi;mj=Jpҧ !R'2"Ya,+tCS`~\R,А=sµTPu]55Y$"@֮$)fk}!Ɠpn ar29@]A/nXޝ;dS22*fs݂vޞZaMx`:UgCUx}lx dOKmvҁH̀A Ri#4(C[+pm)@-D#^Q&1pVhy"Z{Pt T7jK>Jt'2#9T6창h]8i5ie<7 -/4yThhY>nA7G -K4TT sgrKbD0Z>dETz†AaWC(as֮3o#C%~fƆWbyz?PJa̞p֘sPM#ӏl\~dGBG܋m7sb6;Jꃎ!O&ZCñyv<%F(FߤTkrKT^ ئv(4oM! ׅ>_ WK> ($ Ӭmsb:/k"$ "TzOBUgE9Sh/nU/e-eQMwޚlb) L ."wS zԸ4@a?9]>yQH8F.V ȇE B{دTsqCdƊGD?ef]f9Ӄk7 :$U̅ S(ĞXApL\( ~eӫ~vMw9(Oo~ul0p;{MT|եE2k٦j @A%;VϦ3ϧQK҆ws oxA1ù o hv6^|8ƝU9;+ V5N$I;Dj0Q`\ <8tO\u A~0D ?|j{ڬo- TὛLAo h iيiE )@m'2d2cZXvH@ Uw&g$Av%&6Έc4 lv"97 HܣWH*%5;P0c2`|*R/(%xxq "Ҝܸ|d94!.Cw; 4>{'yϯ&7IFO.`e/Qbtp2 !`MoYY:~MemnAEDwT F PGb07MQ]?Gs"HbL ȼiuL[f -B.`1pM!-+TkQAjT8c5m Խw1(=f7Hq{?#wN ެ̯AM< NĘ(*ɥ.X t ʓ+Xd UQ+wKSz]{҅0 #-QЫ)I(Hv`y Y_odR`NC^W Sˈ(דlpH+mCnfѫV._3"„!˴#< }H{ ̳<ϕf[٩q$2w`)9bbr%>f;[i2=V Yn2o%i\8~O>:Y_/ GGާa<  ft >(ljQ0>KLrU3eoW:KVw8Kc~?PCz5G-~?PC~?PPbϝ]-Fg `ܩ Bq`[iKH[ٵy.Qpk]ZJCY<ţUxcmz>GC,Q (qB2mxgESvOsd2;ǵRwL#ZSZ˪SH9[ڃ* oEX+2E %.Q_j[QZuӠlx)P eb߈>&ԡXs^DށKA9{0Lpp53ڽ^@k c.ZN2A0]i7h02<ˢ;_~Y\\d0 #$Ff J[nN:lQ;i0Tbz}ihb U{r]-|7l[fZ2&ݕ) I.=~QIsD(9+\s6IPy0?xn sJGZ 0$V't^[ pI@w|1 jz@7{oP"DۙOhmċTOȗWDA+ʡ49b[Bw==,Uw-_n/5nlFIltWAӸ%mЌzB%VM:Y2@gzFSY_?g+(FjCww5W7>p>MG"8e\yf5joYa3χE `2X; h )q~N> B} H!$9)B幹5Է,ŇH^_rUcm>Ҵ/ տ駠q'%_Zo<fo!)ԦOjx; o[P瑊ôñ uֺ'u!e&e,N~f>d4Ɠ!4D?A|fjx#?;tOGbTeya(;fQUS݅vyorDFY˟fKOc&藏ZQ?v\To{xlhSnƴQ+Ck4z|~[Cxn*ePS;5BIwV3Kfax5Jw]Nmx6q9wduWvd/Wione&V2y a'%dB ᕴYBKj sSl."0Me1%_hFQqXsiESv_1묏ʭrYu\67H\Kc=]$h:h;.3rM$36Aڄ.ʪT: rF {O'vם]w)Ol9zp[W$"3]^A08".3E*y9X=޺]:-_χQ^eSݭΩ\yl3ۅm>P2N2EأNCH 39ǫOx 靂EYXjjE fUY̱؝ >|Ӷk/[{Lr7]ty$t=O}gsJۇh8S 3k6r\[]ލ[ڟY8Q.3^ܱ :| i;t&yxv`rjJ{d6/6 wOq§ejX~Fr5^e8 4IvS5lDAQov<  x{TVOF[7i mMu͏qp!?msW7dgr~?zZ6TFb׻f5w蟗A[ˉGG4l}=mW+ :MJl4H G511p6r;L%:HaZ|K|Sʑ1I7~DcwfP_%9 Oյj[= ͞6q[YlyӃZLJ7aruW-,0+l=3tre#x^{{$a?kURKl}}?$fLYՙ uꮞ ŪԮϨ I4oBTEc~Y&le3_.!6,ȪtHᷚJD(TgAF؀L`jBЯͯLd =e/ ͘]|:s@KӟDLe&7;v $ҷbm3?8;9+[ZuQ: ~Dv$ʤ%2IQ´qm)p3}+- s'0o> Rpi2t*bk^clQjsԜ>O*YSc!b8BJT1Ub:XS)T|χa:ƪcȺe-4JM>l]0g 1#f.ЮsȷaO>O^P:}T2t2|L|oeـU n>pb0ʽ*yƛMMuh}N"y6{lA٨pkUvı%|/@(&2PIڍ*r\Ag* Ӣ0ޅHKqOS}`i X cU ( dnׂ$KivϛE 6HYpWlG+ǽ yG&lMUؐM4$0cyϋË*0x$3ӡUok@'Rmva7@סG'0,~ [ocOB/jgݺ dRP򨹽B[諌l:8K!Ұ^}o\^諭l?kqdBkBkC!ch35-E95`͚%ui2 0yf&[2frŬlnsh.׃q5Ǫ15"x; Œ4̲d8V8,Ǡ亄T\W ={jvYޛ(%~1JwUc҆sR|U7-smsƯv8إRsiʓ~=,ϗHe3z]k4px53J7PLMli XT>`E~KQwNo鲜dVM=<+W`F|F)R6V9M\.=!z[,3>qec(:θhm [3 ZgrM ,dp[Kpb箸}qŪX1mRI&' nF=" mU,a[VA*Uq#N`]`f7Q,.z׽SnIoRzR2m]vPb&7K6hz]&8OJr1,ä PZp)%9it6SVMyo|m?AVprTQ ^t7uD(&#tꋐc57f1Ua`U$p;V:0Xgq#'&aklqR WK\5PZi)5U:`֒Ϊb[sPת0< *^݈8X%{K..B #K@XfW1"7 }ܰ,t{Jp>BIjϳaJ닸Pm5k%(fUw~Y[e-a1|BBFd̝b̩5܋y>`XgI 4Sg+n!oήWf8v j -Xrg͉o9}{}PԶQ^P2{u]/X km(/n<2h L_r*߈KHܒ䯸 Nӣp*'o'Zz"PrTF8 46146}V>;£9U]/ [ 67mZ ;N&(={6\ROuoȢgXW.Y! 5Dܷ\7HQQJ/e:5D^"Yj`Z99rU' g8uXp3PlzO[F9QvE rg2<ԉ(PR/IdHA#^eRP(s]<#bR6$w(^\_RѲ]!TgpƆ{^*}AbzY{ {o)0 xտn^ewr:hv1RbDJ.crUDY ,}Lz\٪'$F%9.bҋ#qUNGn 65>pIdEo9g: j$d%sN:gJKL5Λ!XN*o⯺-3Jͯsl5vv+2!fMIFM*=YPOuot}dO"h»TXCi]o5ƢNZ\KdTvʭSeT8uh^Q}&Q܂7Ja>U!'&q.,[vpRƯ<:g'ܧ54WA\4p¢ՋQɢpEރV j0>u#(V\8gh$ ^9 Н;9 #8Z 'sq:hV4sK&mр hñsY*CIrHݳ`ŸKr:R+ KzH-߮}|%~y%Mᓄۺ$6 Um+lmYQ>Q"Vp([xő:l20vI8l^ +pX Q(ѭ*(N\ZXU5_jWox95YTSV0էxo\r>9/n)o-[ry_\̨D [Brxb_Ţu &1d*, # źbPlݍe^jan1u{qSϲrsږvKVY%T-(ӵz9i5#[>B 9\~FEB_TkxfM@ SSpxe | v7LݷU/rL$?NWXҕKI.uW|I^e.v5;.ȸ(*][s+fh?v@;)ѧ?4Nœ08|LPٕJ=*c2̓yrIf*aV=?˴QkNór@>fuN]zѕq[trZփ[U4rrbA~ڑHqɘR: P2q`L&"y\"xs(PFMX}?B# 5惯C&™χ$j?<]>ꕅ[ϵ9V@JZ6~ oXƅ&<E uһuz؆/ۺ _lraӅ&ﹱWnwL0u]A}L9/kԍ.-{u?K.ڰ;~{ބu Fm܊^o+޼}ݗB_|`m<3U *tk%/,[ p=)F^wSA\!.K50uX/?XHN3Bo&: ]IrcftC+yƔHT>Hz(FK~?/+ğe-(o+* oص /_r9,nfPTyPTX<ԾDu~MqPU@ _ߍ-—Z/5gUEԊL?J<8ɩ8"Kne3")2n[A7-)4C3/_^oBLՖs f )cݦp?# 7]uBk16F.1@#J`{jfiQRL kӄL!̢+"74 &DhkŸr)P(CDjLgB!&ZmU"eʖJM*n: Jx/Auv>Ű]>E>U u1]%HdF *k֙\wkdH0-?{Ǖg>'Jy[@ij=1%ƈb(8<ϻVz* V궀\~[,< a7~t_S/., *K`qy=D!zے,wvfцFQqllz]iyit>~ `/~;w`?84OAKYN0v-~<).Ipʤ0:LA{ˋ77ooO!=8 )K:>z`#E+=B l (]_F{oDtN߿ԧcNdu9u]߰'WvMw&٠OBM?;0dln;"`SrENbza7-MbN:Rh$Mw|/ߝW}IX?{S~9>?}=kħ_2}陾%4Ufc{xdt`&ދߑ{y)m>Z2w5ȵ#KG'w#/527dn(PzoIN&k-C%qs%qoٍXzxn,/iwMs>f6w=6iׯ2[ RT/)Kߡ/9C{|kr^ܽ%w?%w`_,;5|<պ)ebJYɒK1!B*AH8`VK'C] _j'/u6cJߴ1;\?4E$ݖQ҅,/eeH75/ wOdHᬌ65- wh>b7 Tɢ1^ڼEt~/_r#q7dFCL͡U="ė~rm4A"QZfz|R0,- r Eƒ?Y gm~/|{Ho";bW辳7.d~'kS[L,wv%$>S F'KkfM+h=c77Z9ۏ + a0^'DZ&X/1wY/A_l3xY0ݭ.2)atVXuR&XKʓWAJBB++ÐnQctR"A‘?It>&W\4\PJz9mu dҍ'n OϦ>hC[+lɴkʶĢC d$I ƕ-¯\u_ܷ# &l}j߶l/765OB,[eb\p]@Y~֤v<8ߝ󽨍`| Mgxn)kFRsQEWE;E+{jKhՉov9ejރG\4xN|O;΁k!@N;fџ''׳y5"|N Qi?68'*aSR։6݃ch1{ߎF>X<xpC+i8=8W7s|/0t){WJݢVZ dKK@Зݼ.ɖ5q[$a?~SWYĢF:z l~wZ, ܎X .#7N sh#xSZ7g18>z-t qBw==y6%va Stk5 6K0cZIsL8#g8έZZ5VH$b@i A\A j7:>wǻvfl4W]0z J|1E$-~&n g6!!]~K^D3oe& L7ڬP)mNp 'WwNv)DϯsBٲv CEgRc%5nrTґizczZWz+|Ԯ~98 i#GУ^`y-[>s ~O_fAϏf)ib8胫~2DjGK6A ߲gf۞B;(݊+\ҁwd6#i/M>wWYU aIDyϐo(Qv"Qzt"I_Z|x64~Q>9a ]*7+-G7^Ց9l}ajl#+8궉j> nYZoCmWkgeYDu4='PXd%X2vq9;7ލGgЁǕ Vˣ12Sas69dx^Op`E̺r<nO'o$Ci] s3\_^-sfp܈.hWJr_+L⛑F"=gë7mgkS[.n3v{#'ߓBOߺ-ib]f3lY/r#%#U#%ߌ6kZB&D<~1lk7}t{w--|5|a/488ػnZh^e7ntgR;]nfKIM@p#mgc9Nr &y"1QmFq򗧃:WLߴ-byok֭>XOkME^ ;LunuhztE`q jH'q1KLp{hx?pLC@%Eg:e{ShU5=dvonJi6 voWnR~Nty0tx܎xc inLukٿ3RIW0fOz'8@Oz|rpEi߂G}H? fXf~cC;tb,|1ߊj9]r3Ӊ{g&6h£I&?fz%[a]b"1۔w10؁>E)u4^?kHCb} c48j{?e_6m.w:m$HalT=(ܸ_M6Śz|%kkһn vƵ "OήO[ΐוݸ'/l yL~{77:\D+)Ż+B.\s픺 7g+ݔiinJS/ٔ{-\h ӹ/|wzר)pw+f}r9{ |Wuc(p}ZdC}:Sf #`J,zv9ֈ~[(kҋIucxcp)v4dByI넗!fULҥln^j1Yv9&IyTV-]~YmMC>7_2Nw -7 y͞΀nDo`޵VnY x~A}g B$ߒnz=\n Q~~:}]:lLwg_X82!&? ;y1Pfў1v]k~ȣ!y$xQbb8u;OF׆I1Y&{t[nqkue9qu 6bf#ڎgan/?1=t[􀋿rL~ufqSk[ֲ<:-4eNe9B}#C{,WiK^-_.݄coy"5*^JYkcKomoIʙܗb&ƹ鵻dc,3[m"ϒ8==o@u^=wQfR-~:'m[`-7{ksCq:7PT־2#.NMۯk'ڂ_ǛF[*Wٲg&.C lt:dq cNOG+nyI׀h}+/75pZh=W \vbh=!iYW–7Z1\-{q;:h{sêjr~Y\QxĸyuqCM 3ZЕ}6#O#c";ܮH[h'Շ KVn[-յQcc,ڳ1?d9~e&#n@?X/ɕ+%>1x+Sv1?]}#=\)E \M+}7ڰ?m%q#/ď;gO<'\i.Ip٠'0`owۯ+k=`jqTיK_nnN *7f?r7 +;KY}a-ok xp]޵nAaLdahRRW+3a3'go}FE+$ãUgx7.,|cg !aQsgqRC?ٴcYsιXeNyWmyF/S)l~c@=dZ2Uog^(yWm?2 Zs }1{k6wϵ=Wq+GN\"vCE[`:iKʝV߷Sp#Pٞ%l:gXL| Y29=g_p1d\4{Vo:vϟ Я%nA80š907i&#xG syX9mdߧ<]K2`"F]pҘ!lm'.:!j7 y;diAEr>0>0B+?µ5%=~24C &37U'C 榱?;]Vq *pӍ.I2rNjk.9ϲ2&1tἸ/X',~զV8et~hϽ겼-̱&a&K^jNV@'ˮX]K#5gj]Cåh/\`Tp]ciU/-n[jM:cEiҁG#'OC:v/]ދŒg4sW\xI㞜}j [L*Q#B8O-RsJBYɓ <ܾ8#)ܟ`!MGŻ$x1oZǦ`dƬld/}g!uFǓ3tN?U;쥋(]"dʲmHPp*ТvͦtDws}9|{&?vYm_e(5>>~vJTa\޾6N64i w`82_%=Y-skup^^vGl=Z5Ϗo{B={+Ş))|cӯ@=]?ZvDk75,G}[of1IߗݼAkECz|tRء#k|S9>(|': ,7lnzc;zGB<֍[Ge>}8~}<h!ԢqB1no.n9G-X+xYb/Tvy"?d"u (ШvG0߬s`Qvg`Jۀj mmAKAJ_!(4u0?6$w3`!Ar8ޟU 3H~*!{M,g{qk>Pz0Vc[êoMoTȊ#4Ekq}yBuqQ#--2弛r4_t`]!'V#OkI?T> Rnɴ { poO[zW~GT)-ZwGm~ܿO]v|?r^l^oZJ}߽wk}}kq(>M N:8AKNx׫%uo8潣+l~]W;uhˈdhn(oPn^n=~8<|OtOG?.=>clovv:wW_uկ{4{tD2͓k/ czS^8Zy_8XyMhn.ci3I㽝q{<w;RbiRk;{G;ޓP7tO^x?OLƽG-{`=!Afbv^Fnw,\M/s6 xxl69? {owl#>zw)Nbl-$2ڮFoq҆k@o#\ovnz7ojN`j[{w.l|$W_U˜,%(bh}J'2ʤ{>Õ-֡XG!ؑeV G!? TsAr0_ް*?C3j4$;3+z~uw[Gàwcl6e`6v}}Ńd(P ۭ&廊sdW-I7ߒ/6^9{~W؇[nH5`0 RC6B!@QYZšNQWd;OɇY&V/f4ǏQY4 -yDj+,uCYwD탧zGŋ'wb;7E>x3%Bjw`{u)aϞoG_ i:9zw|a4"2]}} 4nT]_EϬL š=MqZ`(kNjz] \(ޥ.Ia},Jjv"7Wg8t_,!];A&67s/lcWS,\T[ HzcYmdh׎zvukQEkIMo7wz >>޾ǰy~_ƼWd|'g=FqYR ٸӪ+<iSu EViA8ͳ$)I2:MڿIUGyK|yo4yj[@줚P MUz颕rkUh`c2,Gnc8}ҀQ9pYqeDF}S$B=OcJA@1tDM 'ǽt-$!3X GA1XV0aҠ!E B=8N4'My/~ u2Lie@Z[P֢@නv *DMLNg AӺ-@L^DP]BV 8j 䤆*spUxSju,a.=U;<-"-p,sYc%XlYQU4" 99.$V[ 'VBnظ\xP5Մa3d8:r\ fUoꀺhRlOY£ $]pfjyCu?٠nj B:7xRnj6X5CK:[8TUw |%z2e- E&!#dK R9Jdy!P5~ HϪ,T[$k1 l kNDH0 P?qBA@ޠ,EķDJicQ"/D+v ])AZRIyCmdM)#!3 Yє@8삦,HB@(T`ӀBd):D]i(yL2 -KLjTƍ7&mpBt*)٥l@Mub)TgB#)Eヒ-UP(|B'g^kU*$L01ḧ́MAjXY @/sY* Y삄 % ;VS=B\ϾN:p4K`F<W :a u&ZD}M lkHز4r .ǹTQuGـb3S6zrJi!HMaS:^T̀iq%=͓iDXFv*4(YjvIgvCfh0m\⠪"dYR4ͨbv1x\-4$v`T ?8pYi]E8hMe*SKPVr~AV}S8N9PBzQ `%NZ@4-ŨY D.D uzu`cEAOie)Dʚr v6zA4lVV7H.TNr` L;n"Uu #nmA\-2 _k^6A9΂kaBҁ}}5I%H9rZVY&{JMŚDf.8@aqjCUA+>!raA/ 8+zICHdBPゼnb7t9e˞AQC"zTUr3L@Š2:-@tZ۸!r1TS]CqQ@ZRRgu $@HX^tB1;i.!;Kj%rB o=@edH 1cCvjѴJZ~*`(yndq9@<5PC&Vz(ge^ HYɸ-Z0s@:)Zbw .5tJ+RԷ{,TK58=Hv-(@ $!%6V4UaD8o 4v"[V2kq  O?D).RXY7偌" Qg-p;9y&GA`+y@SETT@kuaTKd8*@q`$,R{;Jq *HA:  i7@Јj 1p FBJ|J)ynY ހ#gH Hթ\i$`XfQ$gc$ 1nrBfq,MBȴC6z1 bрQ/)9lyPAMՄEd(tөرAٔ"05 Ѷ{yi ˴)}vd+36Oդf% HF}YLBq3-x%rp cbצ͠56qNf bF 1$JBx5sbPFuJdYީ~Yb&Rhu4ݔS *3N]1Q#HMU vGAҎbsU~ZZ[0:)^@VP%__$΄\DʸP`ƱU5E7!zЂb[9=6zjR$1\4!=,5/ބl µgv6%ki18Le ζy|YT"\.GIoDB,Iut3uBU,BBqRa-<\M_ I2̰T>eN^bi/ipq$iYؿɅ$q{f4Ńg4- 2Aomaaf) r ,I S($bG Q l@K7jK5,\r5B̕$Yt] M ңXU3~!e8zcQ(yZXP%)% ! 4<X&,>Mk k1kZhME{ **!J9 AX&W"}B n/c:h`|L0dJдMkmK؞VG;ƌ Lti*$`#$ c{IiJ%%&QbX8̃ CӨ yg9F>3L00S:\pr&嘦JpBI0:$\yIǨbC /HdhQ;?i_jô EjN4Md@Q" hAIqTϨ6I_& hgPz b VI |E;1i<0e𺺗`Kp8hka $`ަ"561紜KBS%/bǒ_=hJ,h)jdBWmPb0K:AFM4h|)ȣ-H4&=cV +(iHD#HADbbv%lLRd5)H5BK`J1j +l1z9gvZj9[*R4f֙R)2P8\R2tq b" Y$TI΂2A,< JB/%#!CFb 0*'#0| !"; H;ƠZpO.mjMY\MڋXT)ศl@aq9VC%$^N0:d0Ա j"9͌Tw%rkf.9kh.S URȅ{L1TOS `^& u{MEȮi4rQ]h9*)s ^d0XP4 =i,$e acZndDtA)RIߠZ)褴be9c6sQ4Ap &x43:¨RCR1v1.'I9!XJB%ꗁ ~Dzzl53Y4ljCPZEx꿅U3g0K(9ih5D%;e-cbVˊ2U"R2bhql)7L1sc4Ue6!܃BB쌅: *(h*TCľF"ǽ`AZ~5w͍^Q 6B#c∉?('L{*uqJKJRa6h.]@e*K_rj&u-"FUбhEP:KsU6L^cJ]R)k)e X d|Mij,~@brq/Ҟu°VXzҵ1@ 1ejAŬ\uEzIyA{)TcFc!">_b 1{J{%ӔB|ʹ>^v]ȃ]gX}9El䤧p^MȲSe"XnY%T|hJ&v=.b΂!Ak&&B"]N$-% ܙ(yI$M 4VW$DZUs9l{|ECXc+%JwB"Tt#EXV&d˕ ӂ^(c8XKy@Q033 yp\ɤ4![W99AhV@ϵHF*#˟Hxv秩;5KUY!׬نk W bIZױI,||X@I)4i,:lY-2'9ǺRrᰘfu0dQ*7Aƭ 9#`VS jInzR THXdE3SECLb0G`:zЎ* m,?gou %Mx@\ -"bJY+~i%|?^lT)1<z 4E)8ׂdZs3?],DJu=%R2dpO6(T.u`ʐDz‹,SwB'"A!ݸG9dVqRO ͪ9Z1+YH^]2?RQ7-Pgh!oB3dBN1$4}Ejek`b/AXJ jTM,EʨfƝ! UL,ۺLQ#BH2.K:P3%>l^DqX[7/-C1\Fݔ1EeK3ITӢHH/!fA*1gfu~J}0  r!-5LKThXG=#o/jȠj~YBOt~@&pJX9wd,6ׄK ;G>y(J+2D26`1i֊Sjh̠pF^*`!ʕfMw1JAhbɕ\!48Q!Ke]hNQcI3hPbFWdN疊iiβQMxd"V![Y1h?R᦬,i0J{ىDB K bx76%#s:(N}Md0E+D5X$wC_Iv4 3%јV ce=*x<覬>GI0VNR2u 2Rn&RPe/Li fnV[Y[~K QC7k4 >$0%)fްPJ)A]R| DFB՜H%,Yk_)LͶ IiK .Dnb-/WE,E+O/hMշ]Uv0FJeD+v7[3 8t<\B T$/zYUp/[, QOhCI4Z}LcʲX++ΘMt7oC)b=8Y n+ߋn47%ìɀAJbPX M29)\&@Ll`^tA]zs2~Q&X,=X#$1߃T$DڛdYgIH2 ](5ͰϢ‚ ayyl?ۯ{ߴZ#>nAxkF{W1"oЛ$,b~/XGEiVIU,m]&OE>OF^"&h\w ^1 hF7&iϫ~SrxL?ԻboEXZ|,,tlXlw(@Yl̒en:Rƫrյ5)vnXҍe H*.`Wfi i^QEjc2}gOW/vϿ=ޏw^ݻw/z6;Eh&z7.l=p1Shxz?%ߝ]M/'W"?ʈֆFk?ONgDI\t[0:{ϩ-g6l`1`8Rckq 6;/s_Xna=aheX_kKi`Sܙ@R; Wbxshul3{q'`C}ōf{ ~75`=)ݪA[݂MX KYW $ő5S;D2%^AjTnxЋ_C7N~4]N<G{O?\<}!CrM/IJ?=|]ͣӫh~YLO]lFhM Wb~}y§{-pӑ1u.bOa Gzx=Q XןwqEg׳wW89l"ODӇ}s~gp-_=Dm?[o@POy<$a9ZQx/ߢSNbz ϧc>'<ng7:=ƁA r^_N.?Dޣ z%LXLOuߵ_|ofzfvbG b$=xg9\/gWs&YRѣ??Gӓ??[Fۗom נsջ{> w|̠kG~ܛ"D :qtםGח"BHt<7x : zP)"z3뎨wbvg4]f{K/˟\wF&'>Ag- ` U\a$:fW]A@S:dqI n\O6!lo~xoGV>oG7|uM/dSMFQ:(:8$̷Fh&cIKUt,Nt֝(<=©ܣ;u٣h#L7ަqI9 S'KltA滵zqΫm6 Keqt4].4=5|s})3;%H_£yvҟڔރG\4xN|ߧ#1l/8{%́a~Dкmޟ]v90]A~,Ϟtρ|t29;>?%iNZvtn{|.ӑBM<=؉+؈vvwv_%g:r}~rs:"ﵿ|+_EBQrdʅw[/fdhA$ַ}y906- -}e~ܰmm_o x} tݷG}ыgwT[ɽ0%@_H{ѻSҥPəC ǣ諽@«t0my.v9~+!$mGv!9 6T:+l7йl/M]:Ib',Zo]i'W u~wZ7܎`!~b 5n">N:?LwcNV%VX~a qBI 8ov>wm >_lIvwƣg󓟰_a _ b칮kY૆g ܑ⪕wy^1L6v>9z*Ż)I x)G DoQX;mMisIqn߹[s3xԂW&^{ǽo6=zsvFAd>lp2|8A`ٛNFҭ{P lP6 @ao{aMt~y t t3\Dkto| >|y 2A_wڅ:-Im*ִiܧҁF`xzqA'O~:[pQ&89]N LNNWgN〕+ &au b^e}#+8)𶉼sh2Cf5{fi*mWkgeYDu4='P,L ]\΍w1@t1_HqǓ K~Ap}-!RNofnӟ`nqytݞNpI3ChGfDVDGtr ,RDU;ˈ\nU~p+gbi͇SOUH7Ԃ=$޺iŸ-\eJԸҳ1x?9ؾL:fs H Frd^x7&Gʼ$z#-ˑ_F2J6G1?G<7Mߌ6}9^{҄˱kp h1ٵ߲wTMoۻ߶wKZ^6ǰyuݼ{ oۼǮm^tw|m'qpw?"^e7ntm7r9In|ۄZel 芖@H)y$G}Z=PNΤlM.~zu8NꥭWLߴ4BߏoVV`Sk - oVztE`q?NOMK2:7EWmUAHy_Ǎ uHNg"fo4נ{+!Tlf6ѶNUҞ^M7R!{wnrggx;1e!b2YvnyU;t'Y3S$z:].I9Ǎ¹sUe krn n2{_V!νu!:3lKpGϽ g'Fb2lyNޛIϛ ڃS_^B>} e\CZ~Sc{x'=`'֑bpl,h ,"XqZ;\k\}e'>]Eui  X /-C&Z.MYM$%iJdKu~?莮5c#ygZ`GvL܂}kO[HV'_VO%`(VqjYXa$Ͷѐ d ;q].e"(y';Nj-j;a(iHO8Χdoq+6ҁ{Zo=__UӐ }ɨϊ^ߺy^ڼsda/ڌ6WJ,%~?&l{CWf!n-Cյ! \H,oǖhq'!ဇ (=r1lܖ/,iľQэcJdR!SޏJ@L>rIa7~& GC] ksƮ)n,Nex@8_<v;]Vխ`5 k8p#dδMj|D|rw'-ن*uӹLsjeed62w+i8҆<"On8{,%͘@~V܋W@{D K,(̝hkk{(;NMyc{yнɦr&&繎[5U>`7\5, nˎݘ>ўIg0)F p*CdV{:lJy$qL1[=])r.紦f6QNo~ 05WxsT-3? 300tb665]8 ,~BZ69D ,/-^k2'Ѥ_.ouVh}-vY6@?S~i#|13u۳i6;/;i~|Asд|҉ya=L']IFn/iI:hhQ{…׺<]<~_#_G>lϣ˕HX`AnjV#3< vy~l8僝qp.+WBit:{;r4c,4{@Z1'qv Jgv7om.mbiF/8X5$_כƐbSbeTr7Gb8ќ5fh?2f>!+ys}fFOVy@"z.MN-l&rve Gu ^#'xiGsyNp]UvVKVݧ<]et>~r|sl;!oaɲ=9u a8bX&gGǰfarq}>9'0U3Szb=Ņg2Cdܚynz?il%.h6|fM{H͓p"K/F`Q?K?k׼K];ajY𰇎 ՝:˹u&S!o vH}mإGO.#3ϧ_8%`a^ӟ'W6OK[`hJ6g0BK^"2|@1֦0vQ(C){_i@vz=$? {Qg9[8.u(jۇm-|탷+'ct 8}WXᶅ%`E˩ Q.!0܋G D`ML1oeދŒgI[rm7ȁO>` Dњ6 ia^. /ZF:D?-gy(vr񑣌AB[\]ߏ;-){^~巩u틋3ջqtI#V;~m"C& Zṫ˖ahjE}T(J%tS%7cM*a=EvDft8פbhoGϺA)[ 2H$ˍOX$ھ~˴QM/0*UZV>iL.ptNiG@^Wt>rSm2{M݈_St#!*/}@,ar1|;G;c[( 53tΔ$:ɳ F.wva$=6i3FXms:&c?-hE\r11SZINF+;P4Nˑ]j u 6WoyyFҺf ծrrGRCxh[]*;O.go]E',P>Hcgpv/{[XRP՜v6W;,{աw%~`rWk;b+X+IuD9u:;չ1wo*vDk75B+Ȳeaow?_ݼ[>{m}f#cdWL-Q6 Gg:cc`J.H`V!vphSO# J!Ik'Ĩ淑b7/Vޡ^X}y?✗鮧a}?-KK-ͷLDq0kl,XEz `}ij:G򾹐m-wޮ92^(AwpG@S88#y0>jttql` @Myj=(Iu->>/|-: ,`7lclzc[7Wo*D{X y;1hb` 7IBG-X+xYb/T0y"?d"u k7 gc7:u81}ݙ1_h265BJ9CYa#ErG^P;ӧ|  'xGc c>55n]}oc1G)fuhe@(2vgud+|nUTI{s#u[5>T}"ᣟ`ܭ!Q-`5~VZ} S0;k&kg3oAl{Ͽ}'~G\: -o2'‿+#֮6 j/o1b-It6uB8A\^-ߵJ|+:a0ţ$G̖%>i^ŐF]eH Z}6x"$o<9Z##Rމ߰|oxXBg Y|wc[qպÝ{G_&"0J#U\߷@A5x>}`ڛ}5{ʵ,PЇD26#@Gv1Tct [Ho$FϚqWwg0E#$&,dʊX "{-z-+V7.#no]ڭikQZkoS)ZM!fQO!sh^y}}9?$ 'a!"4v1/Ot&uAl"\6n⴪ (=(qu>qexA5N,ImNoARQ_'q>Mu;d\eYu;l2.ʴ4QeV'Ixeq Uդyǃzepo㸩"NdbEi-K9 4)RʸX5Β8ӢI4tyq&Im2&Y^$2lSgy"[`"֒a-uJ,60l^IܔN..[ l0 SVM..*a?8ͪ,My *dG=_رD6(exuF ge^֩Cnb[\5.,Dq6IQ`R`"|H2 0eؐU:h9f(˸2Vauu%e^7y,\bGgG-g@&n< ֲA"(,jlD6(%P:mZgB bX)=bJKjDR0 oTUeuNuoKۙ+`e 3f7EQ[H$L1bm p jODzA2AMt$GitR7p 8h7q&6Ҋ: d%_uF^ֹ T0lƐM1fBUX@a!l18v^ VlPtoPv1!1VY8*YG逃lr^,/wdi)Ҏ@@Zd?4g0,n 5i D9HP;.j$ @zw*աIT TI&I&&d<@PS %UWMRTS2j 0u %Vuֈ_%J';F5a%fqx'%`(oP) n'RobVJǠ1zrr9 $ɐRG CfN)pMYD+ Q *-RuRP:Ae]=@C[ |ը1o0qA1NM,J 8U4Ss 뎲 " glm*B~ ¦up, -$tbI$GKD^ J{A'ұT$iF51iQPdT@a@۸AUUE {#hQb:x5ZhIp?58$K2plҺpКFUNXibp`rYRSKXiZQt%N]A\VS.u"R85@Rm<$9di 0 o\ NvD( ,%} /F܂%nZe׼lrW @ Ij2c!Jr䴬LJ]5_]q (Ԇ.V|B‚^@ph5VɄJ1y$or0:=݃3Ef *ԙ-$euZ贶q3CxJcJS^g"S@T#7LVdV[U4 縡q**^_џ~gݠE4:T)81KvYF kZSR_Nx qL\~<):9J zu"2 qQN?VU=NE,EIc]RRAJ)\&jZe i#w T蒬31DddR(ԚT Niu{e3M!$p:JEGۇ +Vyo!0mx epEZNHey;Dp*ba|9yC'թvʈ -HCQ}bѩN+I jE@ , I( L.8˱bvJp#]&C&wRK81w2-z \L'db!KbƆ*բiɕ(% eQ>0;9a:h׍U2 P:x*+ rzyjX%*L,R!Pʼq[|auS,@]&jLŕVFS;,>o"=YYj.pR!zh[4=rQHCJp -mLhˆ pZtwbqs@{MV󀦊 ʩ4jŠDPCqTbH(YT L3vdKATЃuIorW{@b(@<"X(2ĕFSܲ@.h퉽G`Q*S+25RIpmA͢I.F+ I c"KAXt=Ni%jl!*RYbJŢ3_Rr`%[5٨󠂚 )t-jQVvҧSͱc%)Eakm!ӒAzy<$rr)ZഡqkQFbRJe)hIPF*, @wPL*(qe aXNlBHNlSĖK)qhM!QNZK $2 d(#W5nǀs@t*&\'YOI!fU,υ@[K婡3dfnx Wru<[ "AMpR\ՁҙALKiR',GE-l2#Cab^py)/S:-EY%1 {re=LpBA9.qB2T[V$aJ L. $yyrbI^3#M&}J03Hl NqS cDknBaŔd szl ?դFI*b 6hBzXjR_ %k Ϙ!"$m J"bq0~ m%4<%E\օXR(ngB6X&%ZFby87dDaT |4\^7S +IFe +H h i[+e&Ni bS<#AX(PHLŎVAb؀F*nԴj6XFkj+#}H M4\qG8g" Bp8q3ƢQ`'  @KRKCAi^=Ky.Lh!P[27X |*A^bإ״Ш,Z*QUTBr rMEj}_(`u=:N;(`Ȕiִۖ‘=qv'A(Ә UH82GIJkz$8JJLJİ`q$Qh!De08s,|flk``l-td xgM1M+˕(5`jUuH2Q)d y4^%!Aͽ_)P3"Дv~ҾFՆi"ICL%Ԝhf=ɀDЂFe]z)DQm,!sE',40&)pSMδWm<,vbx`juu/@q @H4k!4MEkmbi96J_4Ď%zєX:RȄ>.ږ`Iy,j飯X$8ꦦQX8IBLIݣC^" ( 35$e(Dtu4$hbpJwѧU&X L ֒C`Jiᦙ.CԢeUz *};*1CS͚Jʂd{]BQqxCuvXRkB E%HI/)Bs Y)ZAЮJ  jc$i/f92h=w>-J<\?"+\F .3JmiO = FvqGZ ~Y@&.U*ӄ)1 J Xh$#l_[ oi<O3GXΌCؒ\sa<6JsW,&8((Ba 3ЛkzF5@jFH eM-*w6fZj'B`HPP *e)z`'M WC4%BJ%M#u2pB̓XwʞaC4@;ɀߔ6" LkPCDB~b &o<HH0%IpI2ݰZ ZX$k-G눣j4׋eBbyvB'(0Rife-T dQ8.UP=fXx-,(dfNrU!ßy;PQW:BQP kڂ1DfZP#I(G8ϐCr7ƜGR_\̲\`SrIjWH0Ȥd?$Cݏ렜1|[2iL#{ Э2VP.>GJ,eq4J٘jR"@k,@, rcBCV ,cxC2 r쒵ԒsTkRi̬3R le( q"ɩ|̗e@D I/tL+eP1& ̃Yy|^JFC.e@FaTN1F`rC/Ev͑0CwAߵ4ؙ]B-$] A dW~SqQkـr4oJH0katȨaXcDr#?]9:K$ P2\sш]8 (b؟TxL)͋N{U=tŘT%?b(Ql(= d\B2@([u :iR Gu}JGE-?Qj!OUt `C 2ޙ(a6tW#UzY~B-K&[DbŘL VX) J~f)2'y٨Sby"h8Sp=ȴXI 6Pg4"5fC9~X',\%z K*Ky U VA93 Z7 B sb-9<`4iBn@Ī>*A $ lš-*SdPQ䬸%:0&If#J=vceYݛԨˠȁ$|ȿe I2lPl\n!]mapY6SſtNEB^%ʻqs0⤞W UscV"Epe~R=5nZΦBބ&f*.e":cHTi *X_<ֱ̃",ĩ sśYQ͌;CTjXuϙvF&z7Te\ufJ^}ټB' 5H< nH_Zrc^)cv-fEmC%TB ^B8b5dUbꔫ&Fa>BZj>ѰzF ^"Jo])A: 6+41#D -#d7M RM(sLXl @Zwy|BQdEWd6f?Pel`>c:ӄE6OyNP /$څ0M}o ,=,A:Q/1U*ZC+E śX:bxϝ(Ŭ3+M+c!BhqdCzD˺Мƒ:3gb%ČRɜ-!ҜeMd1<X$EBԷ,OLc aMYXӌ`$nAJolxKF&tPܕhC`A)VVk$EI# %u-^ hVvgJ15L.z0, U (UyMY}`x(6doef#'Mʦ_x2зP4壆n.(KYi- 1ίRxL,XFn ^QPd ]RAJ˰VQ05Xb *3KJ^͜j0nI#F\6iTRaT ӵ!eZzNH߻``^pg^[N.ޑP%*ėL)4W2D)8xTi`IpcGz2;H[UL:͔wVé:x塚x}>ӊ)(YRS MNR}E3M><JsbޗDy"ų(Zwc lkC%\/frU^Nn-vh&^pӸ-V&jR0&8n(iAWՑi-z( Q;#V`p1WTpeŅj.67ϥI,P_^D& 5DI"m􉔣|ЌnMh':5ҞWM9ɧ֙&~2wtEߊڱTᵼXjeY/VұQ3m硁>,~+e%ݓ&HO#u"&W,!kjTS(+[ݰ7LߙU)$Z],38I(-2Ҁf1 TCx~Err k)9V>.4.վq[4\Z+a/"^D84BaIL-\Hֻ7MPž#qĮZh> 7l[o,"wc 7`HgKf!]=Qj/ɰj/Ų,FDy ȖC<'M#R׍={2fֻ{\K BGmv.-:fOM'#d|O_|sOyq9{9yNgW?=|e8?v^mۉ^>p{?:9zw|t/}xϣ鯳}GNʳ,J/G7ջit9]N'g {-ju،-߿^rr5/##O͛6?OήWZ6uSk?ONgۤM-grqq9u~r5kpX*ɣ Z Yțd(rT+3|>kbf4f[4@4ATr_n6,v1#ۜnZ,t鞱. ̂82*rj{tC?\ ([PeׂQ~uf+a02ptF\ mK ?/ڭw 8NE0#)Tqno Xv8߂SM3mޟ;\|sOͣ!݇W:_M.o rJ,7y{ypx`Gxeos\k`cQ_='0 w1(:%o:v=\݌>8/oD&` :W__Gb&;$#%Q1˛η; ¸۳kH+HӷxB>ؗriFӳ V_2|&ӯm r|=xs` EK;3F.^Z.X XNئ6Mgn~}0?Hi/8NOjA)C;7KtE\8qbkpӋ邪/f'/x88g <N7v4zyKӳ/zOΛ^%Yi=_|#"<~u$ߤIC=IK#mx:c⩟ ٛ|:+/xNAΓ罍-#ApB}:cSmpa㐨KOSz~n7Q  7s$-vڭy}siϯϱh rVU; q}f{SP61 j CgT?QlFfY˅O9ɇ1ۋC!n}{hǴ4leXu|^C'W&WAnϯюgG[MU|89-ٞYp[ti6`2pU7tq:oYbo'c#qa*(*elL{%8jgi9ha&YEXYء@ǓS n~2Ñ6sxONp:tNL?wÏ+h1y|/ts+R\,)oCj{.4G_ƱOO4p/_L:8ی>L;Ovv8 l`_7 EVcB8x_gW#hzy9$\_^jNYg/˗ѣ(v12lǯc/N #4_qxNv>)#m&+'Zf|B$cRq<2:;pTN =G 6| Iv Jl9&W{NA]Nhq_oHcONc(RC MG+۳SA MH ]/axFAoB7( '^N$t:ROlX Azv7iʦ9ޝ;mt:~}8Z_mx_:ě Rhf?[VKIW=[\^\LN=@>JQ~8GEol>{:8a裰*b&~{sÝ'< e f'VѫuJYG1;J7{uKMQ(a'hb3V}[:oūz40V>=6}X>oͿ| 5hw{tAb2j|q|{Ws$~>y=ٓGwZb ą܌[_ǡ߽Ӻ8M.~nX1pn+rk(J8Nl:kxsl9Q[Fxzd L듳)N^K.6-76 =\Dȳ7[69'϶wzxAF!l2pK ^lBWYf ,0rs9WG˸A[f?MD\hbjy?=߸3/w+cc~1{_lF l76z?1f޲G̈~h@yl2 Ęi;±)a#2 nrv_v~+/mgIgpa zz2:i9<|~s:_:pu~EN ck.I o/px9`ygxcw+kf]]HHG:Wޏv>vAJ=+NSi֠^?pOzQjOgTv:=93eڈNg^Rt5KbM<\J3N[ `k#CƤwDx4$ʯ~}n}'_;rcF! a !IybHzjC7[8ڎ^_Φo̞\.De貸bFnlGm/g#;'CmxIH:P.ll fZw=-БOh+⫍;϶_hSVK,j4pzv&ZGN5bh9s<%cbg)Ójv|=<֐gskɪ ķ`5s -֖Sm["y< ^>0`P3^ 7] ɤhxp :3uBUKhJ>l:>nGɕϦ ϝcb5ɴ'HwF/ \ ƚ!3~=2~FA-dl%)"N&W+ZﲝWaMh0k!3Ī q12d0qޑ;*jq>0DHځNT?NlՎ qԼB+QDw?}s;zՅ8^NŁ/Z YS|5}21U/:1ni (#ʾP~m`>$[( 8}7T^Tġrj %|pN!Phq})P3ݺhX Ayf!fvzWo3װv{ vÀe~#gF_V5},-ʋT_ y)Th;bf-~)ʲ]dx uc7lFwlGqB"G_uq}SOGitusfZcEKA3[L9e'D09ɤɅGџNf@`u[\fK-cf7?Dlb$*b>j'fZm\:vA3vh@uN|9}?y`0+g&o'3X#:q ̎tiKκ~ޗ|79:T6owNS5!}6nm#IWPT;UBvnW .!pfq{7zX> FQ@zm"Vg?^c-F!lR33:ou7oZOWZq`ذ$Y@7SQ 7|3p)^JLp4؃ө׏L1Xd 4+?lT+j?6BR}N7XB/.tГpS*׸6͑< 3?<!Їڹ<6ӪG@kJi0hH]g~ۡ_zDtc|K\d2͸82BLDO "#dp*٥ߖ5G}B}[ܱuAr'wfXӖG;;+ZD?ofe3vҌ:%w,%/tS,kv:=ί#ᾡH 0bpj..!=MLjiG"돴*mO5wp#C&INw|.uJi]xd1S'<$Ef\uC̪ZM]zu:)ٙۚٴMmami/9^󴧿:39>چ`@Ƴl)[1OU_1~ )+"xyю>qKZ6NdBm!S;o,QqG}ĵfؔ\ˁa?>?5v93gh kOHi왺 ˊX]e ̯OqF9O/Qb ՛e,c ymܢ.պtr⽥quk'"eo]ʸe9 vЙ3^H7i$NiW}X 7/+3n$ vBz`I0|Ql,6erJ=]U^L}*!Zt4VY f\6ƦK Z-fÐnso~|\{Y?%f52 .jXz{ Dsww2>Z/J\<ӟ]5!N']9u鞽bBj?Ski1*ߨ-mlˮ˖;h޻.1~%5ڄ gtH]Y迯WT\!AK,[nٙE.KI(^ggI9U0w|}I^rilݲw\yks'?vx~+K |A\FI[_dQ>y2c'l\ВSҚ2TA~ tw}"#&i+`f$~p ,fP_k9lrRtC7<^Z\s}jrf-y2|q8>Ď;(V3fPoO+_xfg`We8Lg_R^ 7'K2ĝDB'ER3@L{ؓ>{P~Ej"#|~ ag;'] :-89~0 v3*Z޾E[¿QWbᥓ3 v/_m7ZJvˈ;ٳgO-ѸWYzjtƖxKXO*\ȅa_E9l/Q;gmk9ɟuhrm:Yt}!s v. O&A\Go赶Ygmossb5L͡ˬYutezU ŲɇĨ'uIgH1 _oNlA'X]O[_8yտiWW_m%xj5 ҎYW"[\:GBKsښ7@d~9SViobE]9]=.km}vIn6$`rpnb*:eKw)n^O[trqչ+mKbiyճr)#'>b/d5wzF+}j Z r!5|_ln`8V6Cl1hp<BwQ1ʙ=*\>GkcZ=GMb㝄vČs_|Ԧpw{m>}'õOTQ[M4NS4=b/`we(D(](brïGݯO-ߣePv]ٯCX p+V-@،cvQn%vQܝ3!E^E3GQbjYiX99?qɬMm魜[;ۡ+Eo\})fROCH3d\V6J)eJi>պ+oW?O/76=pzr ycj@bEzC|,+_tru*-;˷RwC}0҄.xW5۬ӗWk߷VẛZ.ϟ77h~}/w?מ]e@Yt䫮&@ 'CJٹ9z2~?\E`Xp97.&s&[8 rXii?'SѶY(=&Q( 7x(ɋ" vw=Uڗ/$\Z/[7tǗ\{<@S(wyoޥ~⧿<,sUh8~8˖,3tOz?ISϦF .PCe~,sW{lbYӫɗ>?]ނat?m;t0n4pJH vU!鮇b~Ə,`l|:8F+?'y9f]Kz`|7~/rNaww~Jl'@SI<.&̫N>gr˦]:'ٽOf.hC{ReZ24bY7'iiы'3>~E~SzWBg|f+T|!_IVUB/z/G7*VXzk(rL/?@u׻W)z"뤄xm}QGkQx2nj{Zfy1uzwhcksHCp %֓2]z:`Q]AOBr~STAMt49RsIq1.xxcw%{^1K}P<پeWvyUmo\Xصfɝ{#Qn:*djPR@CÓhvkk t.km_ ;~:w{n! <]aXp=ty߽R$3q).Qudۮ<_TY<y9>'^'wa}knqvyvѧ L;]5%/§UF}-zjw/'m\/LʽW_nB>8.Y=6@=0`ŘLZ$cw+n>0ypiv!#j>Эq{vk0*Olc7L_ނNWXн*#(!i?l?ߑw+X^#}?18,|[U䤇:a4 ax fu|ZݭҦHDwjR/c2m5^≽ʳ>~%=g-,V?Oɓj5"??IW]v+]y_DO$jPi&tF'emc*?9)ob(:0S'='*ǵR1`_u nOn>'HqX_[Zʟ/+,]u4*d^b~E_/B_<{{xoM='2[L09Xv/ĭp}%\1jvKGuy2?~>A%.f^xp@!p9\JWB/r'rf.g5ba:hO: ]Б=\/l:1:T+KښOHF=cR\Wݽ!_'gE*U<溊/Qs}VSnY/N?IWYky]5 OOݜhFCq]1V@`XWa̫s%R#P`m1'up>0!LYoZAVy6ykv|NMJGOwoVa-:W_>{2h ::MW")&T8Vjiw-K88wjg֌cbk:y aGjg7Tٝ;H 7|\Ԥ TD?'3$fTY/Y]_ w҇ávtfVbn3f6FVozOtV7JjgUdY+/gzﯟD6dGL~QgU<j+)_/u7M_/E"Y ?U^9>Ot%J ,zMeE_c2_7gUm=㴦Ĵ))F%%M~)V~dVjMB&c2ā/>7;2c\9X9~ٺ:,$kco\F^GN'^oRYV9_͚g27VږV_t^vӳ):Lίf Vm6ln`'g lz ]k=ngDNx'nkP.k;؀&#t"r%_QZ?'2"Zxϓe_|?׫'+/0Q(_/""?*W:駷?+OyQjIcx9D xties -'*nxkne&tI'>/2^|VEi[g勽R/~O-YO_ Th+9a{݁Սs6rW_^}]VfW3]+& LЪߠ%1yg׉+qZ|] xDމf1˯{c$,$dsL87ufڬS/8;wo&ᷴZ:ht [|%ևYu-3Vgr6TN>nC4aC[ߔ#[(ﺙql)Yy5ax" [͇hz zMW=ZGpG;3v fo 4xH$EI:R79ٹp_.Gm޺oz8w_/ŗ'v>gV>ggvgg;YLmjdս@գA_l 7]ְo2?ܪajvo4Y1THjٟ߼:s:Mia__ԊC?+/'e*|>ϖ>-9]_d@\|53vbVEq~d./DV[wFp㨽C}nD[ѯ i~e5@4!eo&6k:,_SLSZV|n^lnZП#3(Q ~bw<{~7cUKО֪!*ȻVƉ.Uo7P:^Z!Kk`V+ak &tچGڿQ5JK . 4kP3;߾b|mnn7MiG"\jKǡn"}~v,||~z[/,?1ݸyynrǗB<Ga~zInW媿:S5=?J|vŒ{$x _eYSVi׋)<.g?xq"z ~J1t(n&gN?DP ܕd'w{`].wܹ4 wA0X/ՕکH[ɕ$qˍL'$nf!wS ?N9[RWN[]L(ώ"<{d ME"9)9ޖ.jbFDj;ۍV7umAN(gOګ<ŽC~d<)p'*O{nyu 'Ke#z,rHc#V蒩F-  \}I%oV仝ü _֚ CC\~H)Z@,1vj|RzH ;RƸwiۂ$f\Zb2+̩,*06;,P"nq +oeA0-oIzg?Jޢ᳀<]FUгmp&sM9 glx Gw-w߱\r2CoѼ ɝH86}Ի gm+ӹ@443+Ӧ^ջ7aM& 'w ~ ?i.Q❿rT`~:Og9W gW]Hfjaml9$^H̞(͆1voF }f? 8|/:"!m[珧Gdw S| E+1l=xѧyo,"@[( GǁƦ٫4\] 0gFaGčҺş#Pv wcl>? Bvp ߗ3"D R}:8+=WT MqhLxAS9؟n496Zϐp3Ihox&]"uYT Yi!ca+C[hty5@[VrVL-{D?4^ZhՄ9L­ǫesf.i+w˼ w%X`&7ĵb$_Z6jC%, B;zr=-żṔ{_ZKKaK㦋O1 j.KyClSARqD?#r l_/O}/vKwO7h;#]fp`YzՇC3sbR58%φ[̓J{hx&wbFq׍wRi$~^+cBW[_O@ri>XWy-\f-Lxm!2? FqM5>r>agBO1$FvNPJyTBߌE05$+l`e/C3mСFP1MxL'_w{ˢd`ħ-D*N.{c08#(q^^?O h#vaN 8r|`*Tɝjٛ]`"C4 Xt~-%p)9 y]*6"+݅ƽKm :{ }wjx,B:mRGIKӼ' Ʉ.zk,\w-0JSז~Deneް_6pS$o\yxBv]2i &38>Ov+ګӦZHC֭4 BJz&^gP|ʑĕK3/_GkΨ,bh  " Yk\kqZSW Cq%SD:QUܰ4뷭;/IAIm+HxKep ;JS.(3 ?YxR{ٷP2"?u6HMk / :8|OaOPƵOȞ)JQw8HB灾*QF0B5p;19ݱ y+no3ۣ0r@ :MaIVZxs҅7/'K$iedhX'W0 Vq; F`Ʌ5ʸKSle6&H-e .x-]\6˨ Z0".ӆcN,y$(\lEߋ)&>>L?# on\o5N|L_h4ZAKGoxH%/CCÝnʹXgk5jEgMl;ӧUv1X̹ d%KIĞaޘ1Ŭ&y}1VriYn!1.եl-B PkIbԙo#ʻ&] =2muKCKpЄ>D3UPh,sTLBwg* A ?a, Vt͢g;5`5>Sv1͡W=`i$rq /2"좰i{`ػ3lفI;K>\ep(9`y'㯃; hP ?o+lx_a{_T6ўv\*E7u<>ke 4" ~пb_L85m!g ('"BΩ_)6WgBPԳtMǣ[ߎ`.s"i0XwLĚ]/zTbQ&?蹚 =:\mUXZoU $?/@6Vlx 2; Zs"iX'J̢CPzFهs*n{L&ES,\.]AD/a v^c#5TD9(V਌jw,g0û V +h^Dې"#dw ]"|g2ωA~h7Uo~Bv( Ϸ07W Uh6+k ~~ҦM r jZA2O/)zC/"n>W1l@Z?m4?a/ڨf~Ռ 4#?VV/Kh!.Oqy?pNq`#FAO#Bogqo,lI Tt4U6G}n r耏hIz_QSoR*dLvq(9LZOd&<(v# o,i/sn0J(9k"YrL rHmAYNY!È?dXc^չҲ=ݻs4Mc*9o2U`{v"ItDŽa ߟ:Q ?cN[Hyپ`y|ee%sxyya A;؍1:a~ );@R@N!U cx ջ`ˀ.POMNt|hEfRƋFB(a";[TCw+R;Twy"ŒC_g :A~O^qӟ41^52䲵qu>h3Y1zftӺ 3yU9%XvB0,giMF(cN26y'U"W/(7 U+JU hd bCǽ{KxOD&*n ZYMBެWD_FM54B0L%Jy }^ԷFLb[~X:hm0 U*[{@sHBKG>:R"h4t .GIR:[K "=tcծЙ 8Ibg$#%*^,9|)Ζz/4r_jX7mguω#$gz^*L w1u1)d=0L-z_yܶt˄.wCq^]4"6bL &Gk^ Rin7)n5S# mOv҇ᘟM;mhc3Ɔq{ךS.a|:3}цa nIB9i\2O+=S'kUc"e i?<2kh#'㛇uxQs<}&f]AYl۝՛gӸQO8I\W5X ^}YYG*:hʱCǦcl4/?LgWH؊u,kZչ>AҠ4Q֨YѬc⨀Nu20d2z*?!# h1Еkw+M TοƼVW}1r8eH|B}qTƀD~V#SZ\9-#/c)[{9?'ln99rt6y;XXDžxB -W>PmC!WwycqXyCȚ7~:gsg3 g'g ظl\?r0zG4 $8(| 6`7L<(~Fr#8al{Ul{1Kx-kl pv |!tC’tsYbŧl.F><~Iʚa2Ht;-'KIN\_ZkxJ&*΅L:l?avkOǚRU6u<^!,g3~͏76S"L9Q R> KD8޽$K}A$EL P|66`{spԄ=^Zִ K٪`H}WBx9~.;ׅ&TejF ,dݒ]Q {49XǕ٣ ?l G,E޲DFT)=]ۣzD"y -]ChcOL+mch'cĈft-1Hv altݦ"H Қd&֬s؟;$p JGVz%=2d昋@罵~i r'Q{ m- ZXC+fAwj ci }_1P.?1er ELdVճUʄJOd(l~'\wX-D?gWszϥ\z%*7xn:6Zj6{6d0-^ Sex=g֓.fѪKjsi2A$H׼P S(V _#}$o)12拥i|{.5}?etRWǿsv&- 5XV%1| |n"Xmq|+Ǚ=}U.ۯ^̧PC@.1 >1E oL#rD!rn=0q_ą_] O#Z/Ts++m;[%б:7WhcNXq('i1;F1N?#Hu"56@ 7PCD,Nll#XxۥUkaU)H N1V߫51L`KuCkrbZFubסki_0-{ܻGGn0FdIm-QuQ8nNj[/ ݰJ\ԯ1ZaQiDJI]!LHPV׿:lR:wcb?]DE;vUcY.fBK=VI>&y)/пH|L!*+q |KՁ$B6) p+{ 2R .ⷠ70>?îƔ1Onri7RxVo}'Vj=r'43Vj>ZiX<,Gde"숤CǸ{Dv@3ݣθguF5;16B -nʏɬM7pv\䫫3JLGjLGOd+QWL/+b%m}G[ַ4#Aa! {L&JDGd>,Zܭ?G*UfJEsB~mW"֤H p{z0梯G`C熐:Zn\1Kڀϰg 1F"CfaA}̘VFD+mfusƌD,n\[Рc֥ۗx@Ƭ̬tcV:ژ6fZ#&Z`Җ{^HpO`34$&]01uVdqk)RiiL:S"(O=6j:8?H#!:ΟzLK,!YM3:3dDc;vt><\DlH=6!Nj1T64yXϽFY3v9 ,kwN 1*ËnިT];Phl(ͦ۟Șmp,=rH!m1nlV⺒H30yE$g=X92}Y"$`ݜ_|VHi^[ euJͫNt/{<3AP(mA|ov~m>/ 1D6,zi pv_O;AKU!BRO@J4~"x8NE9"?qhb2 {fl)39!FA*NXB֮0Ťk{WQ_;ZSK/޿{: uĬG{ӝ ^pQcsipOGqf7ڀ/@2[I[̖ ntU7,t5?b_?aX]uSsaJ^k#X~LRW>+7b._Y=@l&adÂ4|u}#hY̨*l]LV=P١ $jb\`=n_h:l@Swߜ0g|iպAz˷w/e&Εd|'oK\`W+:etn;R!]̽W2SU| C@ā~_SLhOj]JR?yW?w2YEܦ﷋p ,,RUsğתA̭͢ߗc)W"(Hm 'uaW|(o}MDp,-^.$!6tG|>Td%;nö,%x{G/ZbZ<'?o/כVa>MzFi W,#3P"DMkgT)&t*arS2 |yS9q4k"܇ppEVEg9MDvWnx|/b?0=#o*hSCuLEf*lS@ \SZ \M8HCA [@|e f@j炴:`WVgV^kz hp kZؐvC{~&i1'Q;; $\h N,hrcGߴΖ?ښ-֭OF% ,Ϗ bpxoLk=-`\p`F 2n%D&24T@"e8>(ZŴ~Jd[\۟Unn{ۃ!t;fUY3aU?d~ȋj.6Z>QK&wz?VCXe@ԇl?- 䨗 3帰Z?U\md'F[n@X| ڛh7g L%hj$:||-FyxBSj 9YaX5ey5r\' ubT4a{[V#CV >xf)3 i%Q:n[X7akY\؎ln/1N]+*7IûQp%601O=ȵ 7Y_[EtzQMSϛ 6Mĉ^=Sn?x^ ߮nQYkks%]~;e򷵿]KniWNowK_PEj9V~Mp75GZyS?P+O.v_4k791ҾIdp'{ g{RDJqr)VA2xwJD*}y>i՚g: ͼjC{+ZIw2+m#=ȅyh)Uj76;23Eվ,}3f;g%%vQ%)h# F;B *‹2,te ]x)nmc(D#?N#my2=^nmePN8GjOF[0Mʧywjg돣t̐3 8fc"@Ab_8=p)CGAWfM`*Dqm0HxuƲ-ml& ؆_メP%Bߠ3wSAFz<ĎØvǣ߂=o)=! (Il*aw|P߮sA}0 3t.ol=OAʅhgyoEv 'GyxpsVdԐDU"BR04LP55LkxgLb߈Xqpk\G5ЦTE6MQss%±Z^@mk֛>܄F57 $jy{&p%u |0 w]q0yƎn<Μ/%.kVԸ?Fa4d`a]UP/`^Ə>U&7XcXcXXH|*O sÂImoW:5n6{AfvM%2ē4hD|=ہhGF+9F)_2PçK{N  #*rR9`5xǷ놂FCEm-TkDUӈ$1{25Vyj"zw 2ْ9?]9oW4p$c':Mr}I'Mr}4YbjY&J=`nNn1CT#n-QPbښ\Ca-0ea?b.l eV- ̄lkv}Aj"&bK`,0YaLRZbUؙ%F^g>s%>t>er[ _X}nH*%[9SԴU H;3N y@Qk#nϜCvE:#ig@|~Zwx7op>$%>+RNI柌>|E8DZ:9\iHpn~O t}+Kqotz6 q|w$l LRU@684Qqpmn<9FO)t2%|y~'cN!(7u<>!7!Go3>u>S?M$s =1<]OT> {0oI‡S:%}eE:9[œ1#I[̱!!qU{H[WR&":'VofQ BY1.7䱌kZF> _#z:V-zxuj Mlmu j`lA'.91p! n:s6+1tXwC[:U7t-d`Ԏ Flp\GVGXzL'|7l?EAQ^mJ`-O>Ws1HsBH~"ب* KH-i)ؗ|m3ƶkuN%V nCQG;ΝFa SX' ӻ GSp,ۅvacr7JY_AbƔ;|F΢.l\"dg^OV!=yi[n,~:ޮˈ [+$*O`+H9X-P(!UtNh:Ԗ2˚](3cI-N5m#$~{^S,HI׳7ώYYOɻw -H$}vZ j]x>}wh֎PVIlS.)a5a>0%HN4rΉ`00~7of0 'Aa&6 &;G -߀J**(}  |wC6ň1g!ǔv8gnSૻw1\6 ^x?6Y@Dv(gc[]w)^/ <ܚJJ|B^nqDvud6J'-,Yı!*(3ع@V L]+ʧyQ>)עjg}78i' rʧ,I?AoR54E k4]Iڵcϊ^R` 8A ;ս5C9seM[ߵDUitO֖[KӭU-_|sNh0y55:14"ڋy\Lh;漡rtsuAd<#k8zIEf8$z->W#%36kƉ WV|N" q8F_{Q%Fɱy[gg\*gWnwB?hhVzm4@ Fm4@ hJdžQ4k2Q\%bjb7wGCᢎ,ز7bˏ'l~aʺNr?kh L|/KR "K,qpӿ%n7 V^z3*T{1b7afkz"&9ID+ATXNԛs[8c?mTóMc3(B.hM~[s-՘W xNUPA^(kDB_und3$fYO ϪގhNjhA5=zx4s( Mcъ_r|w Ht g| OĂ-uy #ltSv𷓜αGGق4~ AxozX2ί{B30uP ۤ+ =à }ʘRi%T4LJ{7|9!bO1 :,HF*I)#+i _lj-^žbObZ^]ALX]XlBbΙo\g/f~5mO;͛ZEdfqcIKMZ7MwèEPmK&\LKBχ1< >gE=r!G#Hn0" IfrS{B0[09`zo;hFQ1pSe7،𮰶JVE}m|_Z-:ߵ<> {?4a#h?ɟvnÓkc|r`!|6@ |Rٴ @A 6ݱ7R=MibS'1Uaqm?RA˱m}z]t(ZA*ȖC(vGnnlO"{ZҚoO\ΒxZȒMsm$$^`=N,;C֜ >|:Y,2J/k;,Y]Tmzх'A0hȹjITA/E@AXڴ|UV>VF–T,rYR7kO[Lmv)7!Dσ*j\4f33.HI3bEZe _D ۅ`+H+a},1b?]2'玕0t&1ING;nĞ\N{F!ui$:'h,H &舓hxzuH{Lb}oF;6;r!]꓏r`Q)n~.T{׎ !cymh Qm;b.c;ܑܖ/߼hE#I[P->Dn(nbJ񌢥 r{i^/GCM@jd$o\ȨUXDv6zj]5f"69+x1 -`3=E 2V:m6A[D]::Gx;T],幰vc^ܸ k ;ˮ}Ю}vm4o,b xB6EM^h9tb12iԣնU5i/Qm Q#gg!M Kn[jhNTaPŶ]da=J`.`>ڶqƿm豶]l\mƶoBM`~Cȃ5| ߂~ћ9xa o .v7]ly2ʡ͉~D eivEm: s?i2Wfv@@Y0'+}>]Q(Fqźmkw2|}1Š 9-ma~].0Z.:MWzh.ǽ.v:((/h0-%r10@pyh4,kО)4|QlkRSF,?U=rJGyDKC 瞠b0F|7}I2؍cu؜FFEG}qT>f Um.2ERwp͝b-w i*QёMs|E[CO/>bE7:'ʫɳo0XRQ]J0!p+啹R^_2>zbxELΥD5u'(Qv@vEL-يX.D_冮pmySsLsɢy͗Jgώ[ܣY3D1}0fL1KSr)/, 9irB3|9 828pC+g#ֵ1p\]Pv .n Ɍre< ,b}20hrHE<H.*x߁spG!6F&HKP vF%7;nԃ@/|O~:-SSMމф^CimM7d\' B>G2[F~"!hd;,wT,v!"m|, ,hek;N`{9TM`{{P{ z.&5]%N41N=?ӇB#Tw@ߧ NQc0ܔe1ʅ1vLRs Gtֿ !Ծ;}biFHiT(K91mwAԂ7@#;b=8. iҤ߇ rPH |(ݏØ.x3^?O汔1^)]o^u!]Fc| qiT(60BnY|*+^5dmaGJOkPfLӯ @e o.~B .O"xwG/G?9VU5x/$; &cQNqTA1WSڧ347ǸV"tdsL08bLV5dtZШ)5Ih!)Kp07~ESˇ5oj,o^7j͐NG ~&2Ձ")}Ь'z>ڿ~/+,!2\sbO{c89 #w;^ƒV:6svl $C7-\?Y_|0_o:y5 GT2*Gy~@'}C/k{0q5k0s-p);(T\g+i;6ccx/PYHZh~µ_6:1=ٵE^`pEsVI\1C$t&_Rn׺ q+/a=RMHWo23 `ϋgTkKo0J`s(J(x,5U898G+?λoNCN [>ɺsx~oA',Dژ7d|';.q]@w)iP޲w]ʍwLkի Wuw"%yL e^zmxC?cEa\8q8Q%Ԥwxf֭ O?z*O|>BJ/PъVEљ?$ yϻrl M߆UjRT.7J[Ž]SbERi_)NY|C%>i|yOTRj eAz,FM*&bQ#%zZ_u<JQ`1=Q~W>%fg ߕ;ڟJ2̢Rnd0AbhHKEk. bQploG1_0rE0j,sf+Tc!;UVWvܨϣ[ۗWξ?i10;ajQŚ_2m.V UG˭\B1Ci?⒥_g}t,dw l5I}G0n(CΩ?C[5t}Vb:52)N!89SSI(yЋ7ޮu&+Ҝ悳\ІpH Z>uPQpuڨ:}e5WMs0nO/ÿDKU}t6<>{:%!NVJSs=O1;F,1VR a"֒3p,F. )N!]5JSQ'Ra[˚PՊ"prB7 q(m+ ڿC;*)l*pgkUvHtbKw&nҏܙ 'MHHMR((J-15&_B5èф 19Ln5;X1ɂs6g;7!(! [aqy)Μ7\_{f")cΪ LQRB1rz󂂉`❈Iw"fJ R9DHcowJ\v=Z]rSQֵ0 X|ngيO%څ F2xmʷyH2NI F`ng i>Xc܊@`kF" ˞17Fi7^%A#B阃Nv0R򠇫v0vUںoc&P7cڟqӷ]g!hwwDT   iה*,6"#u;R@L8±;rJi0ʅQX 13 5Ҧ]`+Y,D.e^?A"#N֝pG6,<&}t 6E(`Fj`:vcfGv?@G 1 Fl@)g6`G&کmM1?";|oh78&# RW{ҟ9Xl$gp˜uE.Ӈdp;_p;|KFHl)M-F8f\I ~M>[{i 5O_S0;"/);i ٜF/veqح5F=9E#%_(oԨLa5WX&Fn3`~(Ə -Ӫ[{ny5g^!faaU:-HY^.h 4Ω(ᬌ O'[lbm؆`2{y^sie*nh{쒌e؎}/Ū=O߮\o:at)HZy,Įئ5+]Qފs7^nniVRԚlD:؎w/,-/#jr$qFfFd`a71u?seBEi^c9[X\^|# Vf^:DOE$ %3|PՖ`;Fҡi,m,/L.\p3 /m\eU{#eWOI lAeN#i:#ݗ-"ۛ*^t^*~눽2.: lXYZBXaM5 Pk^*bD s"xG4Ѡqo9 ҋe$\-poIj*iJA;xH&ۮg~:z8}ٓ[ O]sn"]BG T\GMvY`G/[,W &Z/jn\}|k.m)άJ>AΆz}/ٷ+]aя\kCa)xXW LF]u`yfR4Q }wyEQOK>i{ufg s&\bopJ߇PxW:N-7sTUd)~ &5*ZؙtagJcugјj|--X0j`T.Pk 4~16nácKWuOT5ˇ8Ewh7<Mw칧qaFy 3=RQZV!CAlc131E#s T$A9jqػ^8ku>.\N>_s\@=;di$[Y>Z*7I,h'ބӐ(u!鄊|ݺA5?JS arw]>Jbˍ.nG2صMr<E+ yD?kT rSݭl?x|#H[c6O?}Ÿȣ@ψP9]ecY^ᲧEIZsu/_ϳ9?:@!=o\vݘ)Up?c16\ӕ `5l`&|?RR;[}Y:9Uf?ҵ-] Öj:8Hsbu Zd]Jgz :"7+?N$0zh'7+;<8@K"-N-@Ffۂ:ilP\҂n[vтm^m ۜC@y1xFI|u҃XQb`]Ri`.R}1+Qv2zh5$̱:;9 %MGV`jwhl>Jbq|MvLQow0w0Lx49%)RAAw\`+ROmc; ׀xS2cfz%??M7qzvF -(eq ~+<5{ï#цa#j(!%M#99Z6CXQ_Z$G['}++/OzE(ee"Xϊ^};k.&{}ئ"SP#A%ⷐݓ0G.̖*Sϟp#x<։OϘ7HM1UY7T.DEf1,N ˈevRti 92/bw^XU̙dD7[cf,;HW{[_[f^X~"I6c-ne>0__6[>&vß}mIC[|̡D=}CRD zWQdؒ4K&˞ZÕ@SqO :LmN )o F9 ۣix9}q06xREyi.AO5Ǘ v)G'z8 spէR*&X I?-;Z>_]'aNڹV&TK`ڇa9{?Bm]t*Ng"Z؅qSAqMu+8P?gry{ -(G (L10]V+h{=NKId)d @mk :% ͫeWcE^:K]* A:QOef>۹B*OkPW0 ` p#?( J~]|lˏ*b;5fw7:q}1?tXPgBe {`ن UQND2!4ǸK?X焗k͕\q|Ƭjr*U < kϓ1[ih( +ǀ(k %$ܡܨsꭔvN2L#{G9'3.<\\/ľn b P8_aOBgЗk>"5߼:nԚ!9N[>H")}Ь5N唍w`}=ڿ~c*8d,?:C a_/[~tipϗWq!l'V/y\$9+Io3[j=G΂Ж0yNR7 ϯy{tOgZ9ð?ш {IYZZZb*څ[ˑduw* @OeޙJkXQʝNǓ Ֆ1i+Z8hb%E\ۺW?܂ ֱY/&ʷ%[oX<D[&&-8ۃhc,RẐ># /\֙Yu-cZZuv?Xf+#We7zpʺTp3́kT )T}*/'-!oK3VX0dHB'ԧB5+ W)eRh+!T $ zS)""I~\Tww+bZmO'A1_KER؁2TدŴBU_WxTK\޾Yqg_ֿQqOsh(Je1Rȃ#](.rJoT4%1ݝjwWj=QI*E6#һn$5$(`w귇tJ8=R)a1=Q~W>%z&d ߕ;ڟJ2H%|9\;j rKyPT/w%яǮNEyo_-GQ^rm,[e?vd? 1R69~Hv*~'Gq|~ُ]kƜ >\.ݺ }e,y(.'R*&Z()d1*E9vBpTg̞\%evE}yXU[}?rX$~*(X뙏՝YI>,y%$ZKH/z.0 Ⱦbnuxh+HpwݸQ-%y(uGh?RZ~XQH'?o/8?yyNq%epYo7+~OD~(2%3g$+t0oo);ZއV;ENuDY#F;g Ym<\}CЎy>>@}n < + J I( L+t<_8aegLb+b|΍I9c0Xz[$'ٚ#a:SaHN;<:oMvK>ѡPcF-};4SEJ6XD'%$`$HG5˒ǜu4Sj1ؚTf%~*_=es*t"CFR؝Ā%qWᯊP._ٯ\AS{-UpWܭʂPߓsv VjGx#=7|"/Y.Qݍ:/mn̩ߤ~_v8&}hdRn@`qGϜ6,;8lg #+ f9 1''FSx,P׽*~{77& &wIJM&-ls1&LҧEQt}H Wþ'L8 i}oFT3'Z}b_*\`d'V/zªX㱶ʸg}7\4iNEyC[MJ-]d¾^-Ln#lӜAix2+]שV#@LTCwpTo):8rI:jeۧu'N|-ܝOቫ`a;a| UXm]'G\E_ Zէ\ϩ̺Iq!i~%{pIdKd2{s>1fesYި-粤O'|hPytb"O&ӓIx]]5UʭVjv^N%v1[|eVr4G\ 1,l.m/ ŢmhY-L^/mlt} ƣ<$HqM~}"MG%zA*񎺸@"TNy0x\j2b>7i_PyH{0%c4!{l%fN$\9I`с6- R+hId a[4$6d zmcEyt{>?fK{}c/ oA]Q.S }2zFg;]b]DqȬ|[(Rzc7"+YdyۖsVYE9 ԝC.FЙס[Ww|䓡5C58Fq^^JE~#* s]iJT;p頾mxWjQ~S[BwrPoyTߔ{,!s;\.S(oJ%KHWr_U*u<> ߤYbȷՉ؍́!s6uL2jN-4u5m_v-H Ns!}/%Zz+ϣ}rDf3rC?Y/@4dePlIOWyKw?"AԎgFx^pCs_pfFQz(Z7 yF#mEud fte?:Hw&zZM^(o]xKU`!=}*ͥ]j&wUǼ^{#M b8ng8%7z'olCm>zrSL|}'vQՈnds-h~EE1)ΑY0ػ;tfQ0PV1p҄dҫ>㷔XRtyRFv+>$mWU.西Ɨ.}տӾ-]P=<@>!"jQMtkAI 'VƎ5TyZV-ZZi+̀~Z3{Lg%G28t4-ޢhm( A.Q TN^8lU o;fEoҾHR>YP?B ,<.2Y5 /R`D. n2wH=E>YdT=4sԒ88}|[΍P%gE@(of|~\Halr ˻a})<ԐvrBtЂ#Z.ptB8uSU+nXxMč+ƕgr6o\N )c N2äw-RAn_kcUOIxI5+5nzƿa$3TdsM6u.)>¯[Mo/ -KK%ܻls^0sZg½T*f+%AhxgTE" ;ܐǤzLm<ŝTPROtr/o;  }a1 ,~<-׮t1Fhv. ^pfjj$e}!uqXoi-$Z4T+BRofZߊq pD/\hd"1 +KkWf<מaZF? :xc9?ჴ؏?'v {(3a֗f<;i$"AwO{n\𚻶F ǻ;<[=t'^pL4grV.k4Vt_g賱Iթ{ncҷ$I#6ĩRp]y&iv=5A+x&vC""D^{nf_l ~y]_,zd/k8P8RPp.>A`u"<6V~ K+rve3 /Y2ɀf@ p_/l~4zݣ})FF4|Eɂ2}(DN6/٫-}8HO?©b uO&=丌#轿kj,XSmTE+$p6Y@XEPXEƏkG/$ʽFFAalP?, hlc< qt7{5AMi8!{3:d{ bL/SoQo Կq!4ѩ_xFk2>̋Ka% 8C4ZGa3/e(L ͤiT{: +Iy&&d%H3̈́5.tMj^J ťɹ& @2q%6bf6f6lh , i-7$DG%$(K@wW6"m2GMn¹!39$Osy4ToCeҶ`24V: d-& nTg䵘8^ ޲R${{+)-72cfK*ݾ[[KDrvҊWB'8D ө\74VTN3D4~W+B=t((?<$= ]""x(>T &m(lR,: )>"X(Ƚ*?%TB+L<. @,h"& >8e@ L_f6]C&1"`*(}$)F*pw5*I\ÔXiDHS gx6^ď[ W_ߡBRq&8a)N;3ˮ ۺ|v=󥼶b.,˥n\×ј;q;쪕v2nTB.v/y9r7V"3k4沵}״SedSAɩLb9)Fib+]#Jd zeDV ݹE.PpA [#1Ɓ,Xmri\X<,=NHӻI,1;;SDZىۨMڦZէPCFFpR9BEx=\0 JNPcm5XJ~z芢EY- d^8&Lc;60/F%ƜX7,pDŽu  ZJl`i7E,6}Nw@'ȸI8 /QY,b h }y`e+lѥS@PImeۙZ>Q90SCɁgr\GpM HehCUO(e%>DHPf7oxsoMȪelIx-9ڋWgA|dho0"O Kՠ_I%*Xe> !qnj+KHLtTyo;^v2DÁ>>kEI`B: 2qd]ȏpȟˠ^! gNοDZ_MV2{\I{GO{rOf;lz}׽?:*W|Wyv_Zn󑺋~O_/2)F%v;S .K"|[fB=$=&]-sjIP}XJd* ?+.[(1rʍ-erYτ*{X?*ɷCqW4Z"CZ`BB„vu E%>XQ-sJQ٫-1c*}(*2S/Y-*.1$F[ޑŕPs66dwWH)VE=&T>_iR4Yì]+RD?`#w*Rq)JS-GLU%_-T%](j>V GߩVZuŊV2"fO!),S*pP'E\lAzO$Bq2*_TхRIT+f_]Pw/9-PgKH@JvRT`Ef ܐݢ<ꅢ*3Z>zZ<\S!\x?\ ϥi6"kpp| ` 0 0O |.'Lt@T*]zǃ0ʈ|ߟ=0! Ux[j@8p:P< No2x6ri)S R?ؿs+l@jǣ$yp-SX.'~;]3tPTTקo9;d+/d;h^zTQFDao0pz| cV}e&D/ћ$3I1qAk,@Vzu?vj0RX`Uy.WqB>„,,g*A=rrƢ G}<ٰʂ`bб'Aac5WC@(εveQPݜǓ&*"|--ɱ`IIs8dO&Hmڦ)3}Xdt,(.b+,b3$A=)-#zmBhfkU~pe_H$J:b/XGNJф"kpޝ q{>^X`\, ZQ@r;B4n6{ŝj)v ťo/TQp h6[X,ܔJU-Gv׿dHJ%y.4KC\pFոz㛴 }Ęr1E2%.oP32@wye.D'U)"Be[>׉ubb}%ngMz`|pςɠݠׄdI5YY1YY9Yنč}zD:ϞR dlD]6,KX:֠zّb:w?<  wrzeQ-M;;+<m],\\]4o \ϞRzۅ7M \4|/O\b\tzN.\1n7HyM˨XTD>w^z}m ]]14/){@'EIǃCbnaxyqKQaRr"]jkK=1X x|In4DBUi8ѕ],G+/>ϙF!.On4c5 BĜ@%uŏm=щP>/JP;m83n(C~A>H~oߌ&kmZ"֥&t8kRKǬSj2\Qu; tԛ" +jn@'R `)0Xz*檯Gt|S ,]N\\7V96-tVXE i4WNi1ycy&6yD]VxLF5Fߔj0+K7R!vp=!FR ~N,\ԀK8šFAv sr`܎`B|8 HJ~BCX ҚVSN_iȸFpÛ|\- :[ nGb1uO7BLOsބF<ᚦc7z&,Ñ{9~ td5"2$I`Wqc4ɣ4bHp"ܭ+)`P>BnH{A0M&T7& , xgV7kiUydG#AENn Ӹ H%<%Ah9-DbhrRd SLj6/Ú.ay}m?/IkwM wol!/4xF? -׼鏩iiۆHa>bL=6+HZ٥Ͷx)㎳ ėQ ;Ww?_T"/2\PQ*]ww䧪Rԧj^IUU^e_~)_ws_?٤J@aaɴ}5O>Tbr0]_?Ll>*p*eh([m?V؄9<7h#0g0LzB$O+-1e8T: OA/D~)ʵ3[W\3acS1.շLjjڧjMoo9BF Qǭȸlv+?Zp,yoECzVS!3i.&E;tp5 Qhi .Ϡ' ^} Ma e eToݶ9q);ë>V}lOWH6s=]6(8:`oQ޷;ip*1 a7 r Jz.z@U@dO82SoF:@&0@,Q}0 >rBΜ c>xN7L(ѦHKb{߱:M_QbxͭX֗N;t<;4OoK(7^OWƖ>e Q{i/7e][}ԴGs9 l2zf&:5WHo{#23GF/ﷵ7ǂ>I|AI+{|DQVovVU|Y}BĪүJ֊9(^82υuhgɲjQ1@ŚH9uew PI$ > ?.>‚l yz/΍hާ>aOϥJ >Ĺ]D@CyKoNkᕒAjnVxn \G eo~}4m=,#pkkHGFE &70ʟFJuD9tZ(`_؜c0䬇?LvdE@u#2.¬˼\m lo'.?ANdh%Q@$xj,=U+΃'H,PXH4ΪTvLK/r 2XG3 =&.@wE5qѾT@m.vhHZ<1 $tM7T1PdS;ethm s1fM+/߿5$]Ip5SO'-HP6iH pĹ,v};sTr7T *p\]CI]jݢy? ?ܞ wxAE@Ajɨ~I Êp;jrFBtq9c?IfCbTK4MO 5N[h]_dv•-q)~3Ӏf+ Kb&1uA72}u~i{[C`Ժ%J8pS^2Cvxi$[X[LoK<³mDcm݅v0ɨީod0Ѣ^.˅O8Rq')ѹYF<=?cEKtIJܤ\uYRw|qk>F Oϊޏ0r ^`D7GJ{3< )>j+pZ=I L3 GOn*h1]/srslೃkIE+K JGV2aYD%8Ls5rDi*I\' dOhmS \]w][?=I\N`Q\+%`5oӁRjO,į&O[`o_!{|%^ s㿩q[ Y U5 1pGKp t6p-~_C;aW>~Yk`z J6~m<0vgwX/erp{¥?J88r@/\LZ%]C[k@f0bwqqп+?Tx8.8}>"s1`X43&w0pr+v%hf Pg6@;ܵcN0 `,]G))˻<+{jFw'7+p]'dUP?p&YMx AO`_b돡C9u!3ᔳzןP/ Ei=y'vG 33:cلnB֐[r iuOPw_ż7 AAlҊ~&xƅbPYLi6/YqUMxTBX1ߒ"GxɿnS8nVkޑưû6?v"41^ ; h&qx՛D fV >`ACDn0ww<&V@Ћ֕>3e $eGD~ؾyvdN?&EGG n}}μujTȧXC}-QyDKE71q"靥A_%:%ҥ$ɢuQ"}- ML{F]A7aT3Fx ɎG S ٰGFyG 3tP۩)HQ]MMEBDTA]^ɍ{|!Y"2jP~14m"z=y#| +p͵D9nkQ#k&b,ܲ|krF{ H;Dg1$H'!@?\f1oDhHqNY\Y0QpaNjU(u<N+81!F[B݁t{KJ10iH F0 *1vu,R@}> ᦏ c7Я.fC3rTpţBr̬l9Zz0걷TۚQ"rdH.^ HVg%UI@ 8=p2o&My4v8vuxOlǨQ.* V7h8CD`E8D6e|AtVZJ.` B BD*cZayV, t0!eň-}T-lG#s@V EM6 yAݘ>4B*8CSȓ"pp R!dԂ"TE SDh]j]]bwͣu_)jΐ?pӃ";K©_8ۄ\I\zD36Fyii(V.k& 5Fmh\jFl ܪpk-]48*iҰZEU1>?2upX0Jļ⣞B}2AshD%Ũ͝F]z˞Iq3?@#V z݌']_PG^~M?D_͈J5ftgFM3ъ1 tz-4N" K,iż!cBc.Ƨۄ,u?]&ΫA_6a} kwmh9JE9=*,/BC1,8 9ꃣ(Is$+_9 8Ӱ;UBiSZ#0Htx/y[Q8h-irk>Ll#|Cਾ^ 궄LsM>Tk~)u@ ÀƲMNM|Fsg,VXºYޢz@80}ÉØ8M!տ$ܮKipҴe;'^ nj SCvh=q& @+CE3Pp\0'N=HF+~CsP+!T#lc[(( |0 qh`PJ%{e%t^AG-EA+S~Q5Ս0?=Yv=鎶Mn6Z. Lˊ8͌cI;F3ފVcзL4)q#RG-DfG KJ t;Qu%/GzM?XFoZ@4c1 (tJ7g2ȱ 9%)7sMuԣ0i &Vhkh.W)82Za].rZC Gd`w5͘5Բ&QQll=VZ*,d%A51Ƽb0r 89Wdįe)^"ZcG^Jܻ'sѤ uvZ(J5--ΒAQ338~|{8nf_.*]8.J.O]>b1ɴPL;^ dhFD݈q9 S Q习a*OT $GT;]ȝM+P>y}%JpuٝhOAT+Zx?c PBLuwEYbGtEx Kӕ yn(8&HQ3YO5#Ê9_b w=l:fnWȕs&B CY#(,1 z&֋eH?/%Jqx$&AagG]eJ)*9-bnl #Gm)Ic{hysJxfj{gcŕyFq@bBpAF(Mh -ôVuaZVVC]6]G$]݂"- Q#!}~+0R=66$*Ѯ,K-b E,š4-Qd>Ҙ>&4ݪXlTELW<\G+nU{|PN8DT>>vLeD3:l >KL" h(PBPUƘXpgU$DԐ]A^YڱS#mf&6RR5i%21 Ln(fɊK^+ѐ\j?w m+R%' /rW&lS2cgyypaTf=\*.z/dN37JT6q X# t)sO kiD0G a譇w2r|t&1dRWgNۈ=7>6 t ׈h!C5"q" dŵUF v?261'w*D֥u+íH"Sȍ1m {_p Rʕ70L{JY}Q1o*xEquoKo,@ƄF٥didQZ -V UZUpt;ni~۩RTrbi/%Sł`,NPI|(*J,`a%_TIEFŝ}GtooBo5=X"˛ky߭>;Gsb56Wg0Г=W?O"}NsX#G84gg;TAsaڜ/:=ny`s/14u4D3$S/c3"XJ?v LrqA8zCC(~A_O.d.Nztʐd< *᏷1[OL=l4)F: Gi$ަcB/9]E -h&}L? _ԭJ!cFa9 'F/koJ}aƾ~caTCߐ=k&U<ƒ;Lt6z]t&\lk oaxt8}ѷ0ljrL^AK@) 5V4sZqx+(Un~vc[~7<}jZװ?3Ht{)ve:}Cىg}rG&;F!޼ čR>AD ;BS8IFFHɈq g8#x<yM(maoř<&Fr  6Yķ16(og&Y;腳@QV΋`@TJ4s2c4p{JY|d8w S3lZV/p\f/*/dJGvk@rm\hgA ASch3^b Q!A'^0P 34ˎaGm"]#Q> 5Jͧy!)iM[=M!( lp 2kOe|ǗE{;Ih P}8呮MbU D3h06) B*SW#%DX45Oz]#̡0QW4EFbŮ-qZo9B(~ \%\b CwYxZ+#1܍)WC ~DKBbi8_V?>Ipp*1ha접3<|қ=2)Ŵ?ٚaMxqC,z!OeJ@(hV{b,JƓB}ο~בȓ:b}jK:SF{013AMWA̚R&o2l4a6n>1iLV\wO ̊_hp<yJL7pIw _ӻ,GVh FATh{+#lvYm׾"ImUv _ThRb,XQ_"72'3`Rٓsi!bOC-ۉ4N2Zw݄/#4a[,< t7\ ߄"`YNT, GUؒliQF]Xf 8Ѝzڬn/9kYC>ZzׁtXlcd7)u_IM[͉Qfr>u"RrӬ~&2rIR#izSΖɀh?Ec&R'3|`l ؆1&\.lXyԢfl;s$`#`XmN&M3mFɞ̲4Y=}VTf3L j6["v&)Vlu 괱#R-ʰr'KSVޑXĨoV,w7Yucr_sas9']b?[${Mcj2=>OrP5 HS"MX9bhg%~nmy^B8j؈RqpGc'(>{Hyxw| 98(*D652B"*OI5s[l6ԕ$6hRrSOsh_tZXw u׎pQ_C!IF,$^5s>>ЂL|߫&)-pіX*Hc+}? AYjt;筧96DŽO)bW)CO i 7/D쿧˕j[쿧 _Tl9VZI"#釧Jfwu[.޷;GsHD.f=yfleQ(4zS/3.yz^]eà0`hd;^%}?O@gC7yRF6 Ό)ukE4,hyG4qV>{멥}~eZ4YOsqqEu ''OAL`si?ř4:lu=|ѿQF;vjjЇ /c;9mLxaF91Z`%ZBg%"JM+[/I3C/5[y%ǴdG>FLDK \TS#QbPNWrZ'`WopiJcC/C8}Tȑs4ynu.i&#t֧gF2:t{1aXՃ 5ChfS6&@MʡlZ-2<Ϻïbp7tu5Gm1cV;Vj]o0Akաl7qۍͺfXfYa]?f:$q ia v7Sj2.W^)eINա\jp+/i@H} +,WK^o]sUo*bS =pDGg,:OH#/`Dz}^S-|陧B1̢ef7[Zq`f^[SXtq"BzHOO&ɞk+nI_0luFr:A)w6g;y \rΩA !kiصhR:9U:=kPBlt18táKF$+#~^B?q!QItQk.32-\Pg_;|n+7zPcǽ3nnYs6%SmfFΟjSA磓wMmXb^o` r32+ ߬h=݈giZJþkSyCzJ7sO6csY>|UF^V8cttvGWWd4*:}=sYqK%P D?e Eǡ5($t4݆r|6s#!x9-kQu,QPA!Aӡ-c:b_:3Bvh 4t`kD.1GHI;”m̾^bt0fK7U$BWcIgA5_FH&aGaB>)[ JV@:ͭQ]h  h!9֦HDj wcC^0e{yejE򶠌>mT/Ix.,af,Ow8$F`8 7]2KWOp#'_ayW^cȢb<#u7QJs ?p<+JIz׼=нj]?`4o~ |น4b K)OBe뾖1',ߣ̽2»N@MFd-CdQJ! U s ZF% }8?A{hW$:p{!pd)#SgtpLէr([Ax> xyܕ%ZG=-N]!ԅ(黑x3żm2~ҧ9L;eR!}TunHEG-+Nֺ*D,"&ɐߌuu=TkXD>"GDQ4qw+[)j-b1NNW"pB6y~C~}P 3M|.MӜAn$NzAqBM!m6dK AaGq2RǧfaʎaB̩et|Gq|?3y3uMXIPB帪,WldljnTKLC;BGӑa bp|yYH?[&bcGpگJ3Ta B>bVag#VYN1Pxǐ'Ѩ~LgPg~z?M*lMEnq߂>`Ov@1Mzj8`teh- .CEL>ЈmݏNE R(kݰeRnҀqwBdK5 x"ϳ?Kb)]y&gqϞ l G 2UzvFH]u@WzO 98o2g>RareOdClwp: #`6p SFMa9S[2s1>mcXQH?BGipEǍe_*P!qvؤoT0OPRv+r%!4{PjճtMǧ<„p٪]* +rM%VHo@>Br8c^@R򛹱uE̮CM$bţTMKaOe|]^;dF7x6Tz2j}bC61 |=,Wܗ6:=[tbҌ@&*^)ʐoS4WĂTR3dS~1JWZ>ISǖU3CђzpZNe6;dNT/"Z0QWXA:Ѫ,453on?nw*3, .BGA=ѳԾyK>j8Za=z6(B-N)m(U^4𚜌h^F"MJnDh0e , Hž:bqu/z=4SPf /,tKYMDE!M#BK?P:@*] iTH7@*poC4rBiFahE)>$hX r7R2N%uMxLM<SR"W8MzWp#e^ 呇f#v5T k۔p$~Rn,pܲ }1[BJ yFw+|f/O:U|d@0|\ "W!2"O \퍂^Jf?9t9Hi|r)jdR(2G2XEt@,dϊ[ٺ]y覡^.ܙu ;]5cާW]Y {OͭElGhr\FеG|aD~ 8ttuOȔִNi U~u2kϪZ딄7:V=7oL_gRP. @ox9׬1ctBxs/֠C!pT5(5hџx.cȲեT#~]4hv-2q5)IA3W5E2vΘe|JY1X5Mo6t8'T^{=R4?I$t{ZE>)qFꝯٜ^yy' E\r;)+m= Z|j9̿a?F ?\X5?F΍kW`(;*MkW߿~886!=Xɹe >>? (D5qsAjvfOލZ6sX;BJg2q|/7<|~ͷx9w5SG0,A6o/ڛf^뒋=R[L%0Ls;i_-}{ 5ˑ>*u b@.LmO:ߥQúGn\p_Z*ڶԂQˁ."qdK8E't0&Cu(A v d]Ŵ1dvLس D$s(Yg7pu'bxĵq" m*+?λoNax/ӪuO_4[E8yNB4" ,_߷r%~W{cs-^ us @f8=˽|%õXz)-~/,Rs&@6 FЈqKmwQd@~pb%Ss݃ZbT2W JvqH̎,+c 77]Tc/GI@)Y3 Ͽ0dRFvv4;; _,WCP)wˏD؝mv牟(ݚre7xV{',_ ^w䫇D?YĨl~wiR8\F9f(?B^*Ph7H-+3.̅i'|E-}{ p@^kD@F[w\,TOESbCO~ZCTd;.[ې7LGQ9j1Pd Eӽe-B.89҇GspmCQA"1#ST vXPhW ЈM 'tڴ {\^CBC9)]̧{0asq[ ϯчFLJNC"[ 2&gŘ}{TO7w@>4#zp=-S̥vD? F \ x9E7F$剫jh'1Skᱺ d<FjQ5Bc h  )t(o="JwEx!<"ܣ:[ .tNEuUݛ4A8"$ޟn\K;NQ(MwDHMoҔW=6@Ϧ绲)aahQ@}"MTSRASdt hr-R̺[o#$@dtnj3)md>eG$ɻ)298܃@".3%L?{򘔲#`hS+$ Al9b Ӈ)l*FsHo*b;#SgY}ǎ؉+0KGh]' lcYCGdxBmDHIr\ ̑fi^l]nA9_Ms隵 f-2/HU̷E͢)˙\(yŰuב0)BC#\ct{$n z^l/6ƣ{@dE+u) ;c$:(Q.Z`"͇;q=T'몽{Ah噀#)A'Ɂ)(gzm[R O&0 nAb2{( C$댤p$$:HOZTD1B~!]QdmI@JN#ļ%tA4$AeG8hDÕ|+c'If&~*՟vBY:'cFkd?Bޯ^^?Jf=ЏJ Z?_v/jA@eVhԻ jVmBnƅGgS_:hꟍj*ިv~LՎ6*'Wߨx6ϯD?)VK&Z|?i^8瑍g uxf`D[EkR=ۃvU?s~Fmy ZZP˲~.RYfƼJy_,}Q\4[ʖPc0s:K/J+ }qAHpÉ~uyK$] $̈7X8[zet~.PAC0нHrJblB;qL#$mcJ†p9  7Ϝ[i2([H茚uHMϢ0~k{85aԛ3l}f׻:,"Ҋ_y%K=;2#5J8ALH##sÆ-OCE#yE=^!_[u3uCh"Pqw.x^eWz)u(Q'ȸWCNj6-R=@ki@/f(skk׊)ڇgy5qĩ`ZyӁ;/gF̚U,N!L%rLx1W]$wwCPv 4N.]W{Ny)Sv雝rA+i*{eRqBhr ]re.hZ9.i}> 6D0Q&cjyXaAN-mg~6}*AQ(w0*SNm3#c0ـx!x7;BFjcT*gWz6A `5T݉tn!mz@v'A1q4E xl"FG%mPnC-a{Q JF/q6n9gODsnR٥)n.Vs!.l'$,GTK 2Ow2A7C:{[;4R ]Y ngtoG+xp~Txp8e84Y YL>I2kbDJ0=s9O lMIi^ f08:p=PQD@KK $-oM)΍5n*eϳ6Ӈ;z3n20[ 59up.^՚G5+ߠ 1 ?εSt?Ws~]+7Hs&AUzs`%PE p턟"Icw;ij4}N:upЍ阣넠?71 :3p^Sig^N#hZY1xF.ց431z{!tQsbjoSaxսt:܋9=1ژ#Y 3nBh0z̑t" *ޭUF%>e-ˆXޮltFw_X܇$|jp3D;6.SZxM򩿓R/6is) ^XK{@h,#)@35 [zdKyG椖iA1 t(߅O9Z(s30ݼh}(_S;UѿKoj#IOQq aIn~Fl3s64c!͜}KUuUwu낐iw.]YUY_fJ:\iCh lhu RŞ|X:mi T& I1;wedA}jI/2{ v+y% Jp,VLMceFq׼A"sGe OL i壑CsXe.̫)''"2wȨ{E,mAl8.6g˟r 9)sa ~\xyNk S"i%Q $N#c\XXқs'm4%8ss| ht A}sYg}9[絛F$sY1g&vYF1 sn5&j)e9vrvs$" IU#@9ޤ̈́zF U/@,@=i` /o1N/<__}%כuRKy 5@fXYeؖp%J1P%A99/5=%JwimRVhY>n颸QAр;)XxBH=X.SDd`7'WB)z} |C{;m/ɞif'{ަWs[SL|y=+?#fԓߡ36-ݼ&uk^i H.@jckj**:%5@Mr޲Th&Ypnȭ7Y(F- |@ceYuh%g # 4Q(Ӓ* &9;ݧ'֘?~=n "i5{5 Xewyݓ0 !@U,!ґmޱ(Q hvNUn}\Yi&kR(r_zx QR__=%˱]yZN7i5gS0YZ5u3opOIEZ"[܊_d]Rpi*ƾ>SML]=bcT͓W1 '<#KysQ|6٦\`kG'm˖34[̜J*@iĤqpa4_o[$1JqNpO2!k ДOjg pTfNs0Y E*lҿX"pUY:u݀UxҦgVi:v=> ҇Sl5[:ZKBaRl3N9>($ i4HD#9@H sX,/ eQK /ivdR4b\&p5؅h  UQ-;^`AnD fEk@HFP<o 3 ^$P["@a@U'IDVu/;&u2 @\ ZB>PeQU#oژQ*az_aI;DAcsL6dp!At|kي|+f-y譱n%%)|`\X{2Ay.6C)!H C="'Zcs j:C08 BXҔ*yw[g{%MDIi0T:1%g łLytQ9|ph.Ԕ}.J.7fi[ "Ҽw@ڇJ~COa*q L®> S}}65LxqE6݄a0 'eI62:׬'C clФ<ϷEwn"q* nn \ϙX%#|GԾJD%,^e\݀2ѷ䒄 nu׋/I(wH wYqwS^yD 8A+)#Bmcy4/|vBhMf2cT}gBw7o¸(ak8 ^ ;3'Vرw8K^P{t<P$5 ]`Nm^g3{Ǧw1?+^YMo+y?.?Gc<-F>Cpn DWzP /jP"En%]RUqeU9~n⒆Lp-GW"o]n ȈlGM."@$<* ࢏{y[`FJ s:z:i~-Ju mȗZ+%/W RRژƢZ \ap-4գZ*,bź'L] '7~ql2nu!.%".4spй]Qಷ ͓2,>m恈8\y>,,Q}% I5!딎*!U FEJA!A$kJ"r]:r,.I] pJ:9Im0'݂ p3'(cu+FxFWDny#ڤfpMDXU<3S*iaF+G/0V+!}(n+̅{x'kPֽ-ƌ7͌gBm O-L #qL>;6Y~W]wDPXmtv@ΗyoHy|:]]C jGps7>T ?Ho)*i?䯉=lAno"YvQ^1ɻm_Sbhm !5xo|8 J“,\†.;(ilF(poK9s+Jyc1{zW/=QFG?3\uӺʇg(8-geMqvozT'cy_+.C4;x1lQyjܑѸ#lܑqaǣ'&fr'Gz[̈Q:<\@5i!n/`CLj!r;l2p*/<NۃzDk'rևهc`!/7NZg"vLwϺ_sY]HЌhªڂE)՘ MDo}۠U\%EQ _^tJ&5~"G9iJ]z7UyBͨ|^f=ړ2r]UEoW7u~h4@ROFsݨ ?5fYmCZmHJ2<7_|h!~o['{%" z47 z䐮<>9^a&F[EרOB#ѐ bLkj(2/YiiFߤYr)TgAN/fͳ;͎x![;#uBJa]@cfdeNˏ 2}5ؑd**X'9Ubf<,! K%GqRLQ\&6!7,-*X]lo6UYs6;oV 668Gu/6- +Jo/`sa_"|jUόϴCʸTQQAlB/Z·/4qjLXrԗTDrs#Ϗ9odx[>(~; { o$.Io+dYŻ-(iBLfN1bןwp/RRݠS!\`6R>Y"Y0"\jC˵pP581OvR ZREEhC`yD+ݜO<6$%OGb WJ]k2x}+G6F[1\`[02!]b6ZT/{,cJW5FzDEhew U7=&9~ 93.S[ JExZ;E,lЦhugrS<ZSl:7|~3C44`HaHw'Sqt? 1ӽӔ>#y3:$/~t϶t\^ÓM.w]Lv/lT1٭< 9-ב =KFp #1ap9u-͎ZG-ZJ?]{O镆|'ސw^Pa}]%0e F*vM=f(* 9FCA= %#d,cR' }8-fʎ 8E*WLC` C>mx݈[-D54 |G`%1"شR)vWw #%37ꍮrS$q,T4]=m9&D1FX: O stVb8 ^o.w5 ?i;0)Z>evoSJp.p$f KfX`5B3 L]p޼ݞu!:L" (>-L[Yb,vX;Ka-`R8ƳVQZk>2I |WŗExc,T]ÒfmAG)v!3frfY=KB V6T2/e틲ҭK EHaWA3)!!kλưe| &_I߻ Zߕ7^@߉;ގ`p-xлG1LZ8hIUڹ!>$k6mأnn?? (uJWB.W2M,Z:H|FgBJQ.h9j?t-xaN: '7:BQ"H D>@4M ْS ] ?1[O^T gH|.:){dw { <05x%߿7́.va^ z kW![EjM2lXCZ=TE|@<1c:IߡB'\a?*%06GPs0cO)s$U:\Q1}C nCN6O'"'pԁ駲q@ݩ7r`n*P*FHY Nl4?D#Su8BI!Fll^`9'5\*=p#ǫdͩͿXLͽc"~+X5B9Z4'0'q%k)OVhXĄ7R-ՃE!wOz 5[}VP?$aFhu76BKȲ&Dt)켌#OC,7BA?]`6TRu/!E̹B2XwN1Mo n?l꼧 98ۅ0Mt ˢÍTwٻ<#>EIȤXt{{x@Y|MEt%X^ٶa4 7_ex]ul(U=%Sj\y_zCx jH;VS m1r $fbu*[c~Gm~.Diuqjњ/39wb̌/ ]':Yz}O4IfhiUAq?vs V8uYprL-,"`Y'6A)MFfI8,TR`W529״Gm\E=9QZ`1[yr7+F]^v1B;Mnb/BT L8|ػpj>VF$ڭDsXڪ54moUٴW[N0Ǣi$`WcJuhRlgVhw ‰Fצ%uĞCcCzŮW3>^q&0Jc-[]DYlMϞ ߢg7 xhׇ+=[>=GlU،Ծ^Ɯ Q9 {: E_4Ge`k e9K?^)\y3Xy=xsR0YZG"^G̣~F#tօ`b,h1ÆMpSZTE ΐdf(|WVF8<+3҄L\aP5_b1R#sKrJ=˖1!2NYP(G$Ue"-&tx={g'[a9(F&d_Khv%HȽj/_o?Y=o=bҨ=Txp:d[M!^G@4aK8<`t ЬƪԢNҌ~=RHлjGQ :@7hQd(O:y{35z$stޡg$[w=9R2tgy0Ri]4U ф)Zl-9di( B'Z~hەg|8 /PJU;<*X]qt~x'xIT3HrOSXڃ`:6)y8B_PEIwn8wNī]F@9bٕ'8Y~'XI:b ^$-Ё8' '=8Y_F֗+)۬7 Z_+UY#,>*9}Q+]痰Mnlő|I3h)fꨡ?׸R;~Ql)ts&)M]@cut#3mf5[<咶Y}R.dxʣI, * ~4S!B1*=3>@ kӥ\K&g1jOĈj=:^#¼a E{:,IWjʊ|㉗/rWyx1 !˕F9|Uxۥ0DYO7>a4_7,W\[?ɈV0L$}_ m0cMwt)d$Zn>CM)5G]J%1TM>PG FƝƷ}~`,ZD+]略ۯCdҩc[$043ƨ~[ORo>=pݜFڄw-Knp `t~t`d'/6>l+I,rH!˟ˣ5]B f_|]VK}Ny7u(&(vHʳGe.ߴ@ t Ly9U7p_qOJuKto373_!(~{7pļ}S73-i^bjӇɤ7M^(d!ooQO'R/ MI_ke㏣l\~WR/Z:wT/;/odp4d`IWKcTψeK7_ce ,i)[#X75 N mFh~ޒŊ2YOpTDzLPwqG^Fwѵ;a#-xJqX,_)RfS/u y.H*:Ex<꜠èmް{ ZFl {t|[!sBsNnVHy8QjwR}u%$&҄G-Ե >,[JpFc}KcA;3 D=-T¡0e^H&4DLZsc) {yNQ9,r(R3T&ڇA zmߜǓ$p9hn'_;J:S#+T ӲقffJ:Y,J71w!e ;ApXޖ<:XT0ffĢ2xp9%tׅAl_C8MCvU7 t|`}x;XFv$/׮\,f[uzP2Ϡ~` 2sRJ{1ѡ&{9]+$nOIۈ 6:>Ϣs<2f.r`a@@,^VhnL#(XC5114'2ޔB0|oR.s~s`^m"vOEZ-:a/k:.u(/4C5Zw Sٻf0n0W9尯"^G 9eAu}^%i 8FYR∊֮ vxc44w2EqR!؊ k=HI$"O!%~W&NeVJ~M1!É)R3s$=>FR#U#~Jq25:;w pEjU͞a|R}RPU! m:GHVi5MTRųP,YZџd7VA$oP5o`Map'ᇷmyS SY it>\{AwD#U%Dv5(JZ\>p.1oJś#Pӑ|+5Rp՛u8]cfaט4^ .+ ߞy~}#rJAaw?*lYG'_/.EajL6C, wl:ƫ4eaA='6p6ScCPާR/ppBi@/qTb &$Md.l5{WzR{<'(HQa;\'E80C cSs:ٴ~[`'gZʾ*g L*HJxs>KMjjlO%ޡqWt_RZW%X!;saT+KC{9=ip[bSKQ+i _n73:ufLKBK+kudRN#JsH ,#)'4Ǜ阷H=ږ,[M'Gp {[*pz:ˋ~ ax޾Xօ:Y~ /7A?]eQ:lbCKD#*qAZ$T!G<8Uۍ҉R~Km{ϵ+Dh 䌴.b)^6ژ;SCg xx"?W{A(}W r wݰ<8N,;vgG=Q^?W~Ÿ5W_VJ.?7qm7ӢUqj&EO^X 7p |ʲ5PGh (qNGڼhyyk{m>yʪk@cCla*XNjG`Վ3e33˟T7@b>'q#=(<' YDБ9o{`l/xm;3-IE Hްoq 棇3\z<~Va_Q9$Bm_=Ny5}4sARS}OφxoΆ=g[B~{u$¾E?TɕjAvQ\4҃ 0dEϕ.~@IbSsSU&MmSmX:7kJbfG҅ϠIBKs3b7`Bv'B4G?/{M⤚|@*Y26Qv `h057ΡCd1+5@,jk&O i\<ĝucu*qiҙΘz ǭALc~4daARHS8kf+B|j0HH ӋxT,}&x2CBWȋOOW&'쇭{}Ks( Et0fNavЎOW9C[KgO(]I W>5S(4' IG )A7EP`4J J ]D}PR[WۉZTa xvR3™fΡ=N΋^ ʼn戈wb>HiInfV6-gGY3/9"-J%65-`Ku!T-hvTJ,)\Y^^G$<^6Ɔz&C8C袴H)ci'yeE^cv«l‡W*X#Ypc9q^fā$Xi{a?H_oi/arxyz֏)dr"m4jimz$,8!0(;%H)M8{M:V_=q8*d8#Fޛy+%q`WҗÇ%_I!i_JȰ}g%N$Z NI!ZzwiizSL<[`@qE B?r$OEq("3 fLWqpA/Ɵ%Yw'즎/m@G8q~1PFmWDIpRz 0}I,52GG] .o@*">n8y Uolڣ;/e^s5|g 3YLfy%{+4jZX?VJ-'{++{ 7b={H|J-#fOħ;;0>a:<㐰m8\8(bɂ0El1?~pD@ ?.Іڐ*τ؛!Y8=qHs)2X'>qA|'$qe0 t\|4I9 lCo? ? 'o1z|ngN\&̗aFgh$fZM34R)F 9n]'wSўZȍ KP;>y})>6 3צm1iۂZEK>YgŭnCꥉT䢄%r ? ؚnڸq=N8F%JxQh>[^xq^$spESozF=U٣;ZY6~m_WJWn6_WJ//qipp)e|0{IX*hK8PlnΨ8+bܰHh-L?^\ c)X8ōHl0:T-d4*gEGWu&xlH10# @Œf#\ ,ăĪ[`!| rBVIH 5AaWS?yt^T#M Լ..=`EH qoM+ mh Qt[B3%vR+υN=`8@W/!l1|\IY|ۑ| I1eH!<+{A_EXx+ ˀ=f29} F+P{y 렀&>m8/eD`IG~WqS,0D>S8U4pE{p=Vo] ᡙhCPEX99 94D*VUZ|?S#+ sV} n&j}68~iWQ(yCSj?^'!@ w7+OjƵfLVkԚ[Px;fQ  #hZݷ$u^BpB~LM^N1.FB;YNK%gEAy .Q5W^gxR6vA|}'~' EJ |`NoDm/ڵ?v$06G!&xё8 .`_gpxTgG/9˃7LŋǙIDj{xq,a7᤿<׈( 4hj"ǰ]ܓ^Fu;TnBITІSEߌ; "9kѦkspK}ԔQ u 1Jܮ] 41܃<5,S0+T"hw|(o (/ʼn+vo+]fjqv56Md8bw}j6,bxs7&wÛd\$>M:#ø¢h@hhyZ>[+")^*!l~zӪ[ >qPfiԋ` itq1NPAB&On ϼ19(K0{2r*2s/c?6aoY捰\O"Y(n Z ,SD3lj?ӟ'D(Y%\0n{ }X7_W4npCQO4G_w_.~]:g{5 M!-D cCA/o"'{w#Oݖe#rj)y̓nx r$)/{=dtA+ ^H$("| ԹDѼmLm;)Dml^6Y(ߩ `Hcxb9:’#*h|RRA3^(^xӭ7$m_dʈBE>e1%uO%b)>o+>j\ڲ-+yGP]jx«3A\Ň|GԮu0Swx/#6;wyjkTM?x[;Y;m},4GYj\gh.~w&˦e1ˇ;߶|ӕN/E+a$jhB`{"t"@pهb5P$fr1PI2z+*O1ytH(W`hˈu vec0dq;^=`!x:FocIʹ =1lkXH ͇أnZ>OV1 L#iQaNNXt,ޔߴeS|OFC&OzaU/`<ۓ|vz %`&+A}\g,zމ =veT (Mm;&JɿDzWcr;vΰ2œWZ@ŃxA3n}&8Ȩ%ݔ}II^(Fak <Δ[6K=% cbHqD]rcq޲b<4b kKx%8}g!;/nT!ha܀d #⚫p d$vULj}'хuZ72E¬x g5NG%2jE-2Xh]ZV,|]#BlJGޙ,S0Ot1%;ޥ0qWx4+ݘ{c2M4ԯ$GR*N'HyyNJwIȮK$ñNXKchYDq!NXRqcc+>`K2{̾XOlF=Ʀ0aW fD\Ub{՜U_U kaJ\ļ-R H?nvN{t9?"W /vETCn |@xIZ:gA^c@{|ȂLxəyL Lz_͊-yPL=&Cxt. Wr~컼E=CؠwSZ<+*F%?8a븵\ޱ{݃Obd=bC}K$@ '^9a9ld}N$J鉶ȀV.E,2'Ѳ$<tMBqFy`k3^5޺3ජrzIwCQ- l!{uIA3^m/{V_7&`J=xZu\Ϯ-aJ=q"2i$H 1n@kl!KŇܨfAώNM#l٩ie}4Ǽ'hWxOAP^XYFl~=׊t}Uk\-vDgqo<~UR{peIAH"\STO\( oolhMC cʒ~{ӝֲ[@_{|־_á֛p phjn"B"HAfCߝrtBB}C] 14 s?B)At ]g>C:: qv ݡ"䏝r]8Υ; -T.#Is'JKΞϊIpc?d 6w BmWjoQ5wT;vHFoi xHv 覒$e^zš;@{a'A{ ΋]wAzkhڻkhڻڋfW<pn`H>j Ӭ)uRǗ:35 j4BU GJd Km:PJwx\KW5t/]K5Ԙk|_BZ2kttk4gN#g0&D4K!"ԖdC9-"F2`dvhB";ޏB^Bba.*1?jl =mS)z*Ij8%? ȧKt `g2>=BɊ;Tᒹv =̟/sgjiC94Z oAM8 6殈;iS=m{㑴|\Y2-e-E Ĭ>v yUN̈5{Csпŗa,j͢h66l+[2W2>(CڬJ= دT@jbWi6jgg}\+|🧈…S1[R`pnLV[>D]4(VLUJ"F}_ePlXZ:z Dd&0)HkvJ@$ޜWY]^>E l1 &-*_*h8`E(dU$ƒ^m#|7w#y]_^˗R&0i8';#_&'pc+>%P ̌9iYGp$d}~?4 "Ee-`T[u"xx=?tt)/ բf -,' ~:; 8 yY6uHeGt ctQ|g `I0@/k -Z2Ty%Znp.% ?%J(ZDp̈2g:ӓo3u.}|3"l*max&$lJ܅ `?l&[?|ڏ^: > 쒅+IF2d7|:Dيg" כa*Swi r1 FaP1š Pa(ZFh'[@3WMv^x'}b\2fޕHZg,sYRqZmd4"љ3C;nDZRz@e ,u\s27B. '=;)yl"[$V"v[ 0^_V8otn e'vԡUǗpn8oQ!RҞ01oZ3J)D?G=4Sb\m?rYŤooZ5?[+U|ߞ%`v0NĒސO~k5OE z##l73pJvx R?=KٕxWSOUD ߆P=mrKB?K1~Ss3 G H^Bn:SG+zF=N3I{,RXVU%λg:oک yȳΏ<{/\u+]_3|!32?wN̰/~ L"P6괌 Oq~o:#@ PθɎ(HJD9>p鈒'S,>i?K>c]c4EfMLη[M!56=@q9anf&n@IF$ ##̝dl[_RyOIvv-wI.g IB%R F=?+~&YA%sE O>lv0>`,j=%5VF' !=UB}r\r&@:;LɫYۯ%@ՄU    1)^1`a%ܱRԘVsxH>Qky͡;7,` Ww?tDPXmʇeÌi#jùJy܂z-tJ5T]# vNxfħ?+YDZ('~9lۛB~j2>_ B@@ۨ/5nmҷY b$IT3S1oLV+wYħpO-W|~vChL!.zFBsX>LBE?%6k;20(;ШD "52c24%@!3HjT *BP)7CqR'mbBct{+TU:<>hUZS?kE$K^82ȜA=Ӣ7}%67F<7Kɚ)]X@gO;|b>t py=HG^Q%&6ȁ!\.]MI{tۻEݬ\TM ܔt~=m(7GxLl Gt?$mJU_&=Xɢ#E5tӊG@@O~b+4Zb R><+WDi޿=+gj' aw?*ڢ״mF9[5٦-Eaj6{X8 ӎJCGq, H=i@/qTb &$Md.l5<霵;܇üFZDɁU%׶P1݂9[4tj]PnayE8 "H:F>p N<U"2y',xHMِ)IS1N094F[+*[. J I?PIB ޚ%2¸A(r| g7Mo)$Gz#9h*)$ P&b䄈=%qo Ư>~ZYȋ7_$Xtceb=RJ=TN5i)ltNd3)̀ z) ͐Z%zSx =wvQک=3)U˭]lq<`c<8VQ:ˈ+P&ApCúPV}9nmbTyTԭRFl8R cTC]O{z#}tzd=|ێcNSrTEѻF+H8JJ3\XJܝ|/zpJB \VVt+sčNS+q-dY+f^PBݔgNbhE[Sc?-[MC׿́6Ҵ嚷p*),p3Nќ iv%^WdhO+MuÛqk뒟V;ԄԉbYQoyZ"2[LFO ~鋍8bzWCͳ6 x+OѪXgs9VpzԂ t#x=?< ՌfS8Lex"ԴorVZ|Y  /ăRzgQ-}盿F$JPjR8U{TlQ:T&k|g_:Ѭ7++Hplzfj9zW6_lajp~))5]ᇪ5tfW=DAo~!w E--#kIo&2`Xck3J]G`|6\N[ b{mFANwї YyxAa|ļ'Ss`ʧRéd!Mvی|;]ol͈ H׊cp-x)bŀ!oZK!˼3F=@|5;תZdP eUQ:dN>mhkq!ӎ=C .Y5(BPZ\ }ng:V+HF>CU>d:F#c'^(CpL -5ʩ&w&c6yW(賑:o plGիZӼ0* ȒEj ,: ˽tL3aWj7{lص0O0ŸqʍNݙ& 'p9>rC,@ueV%KnWETK}LZF߳c2(5+ܨ>3|/:|Lc؎*DžP>§꽔}>0ݣ0iX^a~kfn;QQVwڌ4zʩ2c ]r6*O/Yxp [WN{_2~0%L6},NS7WN~/G3[a|,t$*R'jK&ԔxKtwcɍKdQR>T# ֝}0C"-zԇiԍ$ғSCqSp(i$p1`cj8x<|;ꁼ[x^n0]Ul{x ? h&h*6:5M:;b}&"s8o ~9./~YԚElTKm~\;h=CÕU՚M#W]VJ.?סus 3 zwa2Ye_d 43~Ѧ_J4,R@H0.dx%-I'DA_FHH䋵WYY1A. غE֡6`j'y! ^,J'hG(9X:"-3Nd&b ʾwBB[0pzv~2]>;y~(O<λ( *L%o¾N37uK6%fb9v" bzSϤ(YRybEN|36xlKd7s=yT?YާѠΖTbdbxrO4%Ue f!N1*+ZRJU(/ے& Hej;a' T\{݆}:ٙL['Ȋm<1cbl2$VaV"UIWS)lvd\^:?GRGMepaF|KH++)0o!E3ߩhycqG3pH=SO=&[T_u76}/`ř2Ҹ%knpE/~#2EC$i+-#DN5?TC8/xF]P<ܣ{&g$au2z;" G›k|`y"iAWi&hǏpA}?fFɬI\GXb>.bDލ̘{@?aT;Կq6!9oiVsZvE7;2ZS5SEW <ȷc Fl~T _+q&bkj${⁊G)2مaڗxXh_۷mx@ʽEـ%mQ;+:?vV{~z)3q)3y CooAaγC͈w#ރ7MR:=N$vʏ)B[{R))6+YV`);4Gzix㙋F J<5zռۙԓO0;gcmjG0=O+3|s3TGei0v2Wr* 7ؙu9;'ǒcjyZ^CNC@ =q!8q-l?]&ffō)ʹfTYPĻ`?16A,>5;vtt,cH_cVWhV__gRb3kKE柅~!&S^B q2&qgEu:Bwwq9`Ee '$'P49dp!qhI0By"0 @+LpKZB33w$03#),،1Y+d3. . e;'BT}:~8g{&NDGCV7i0bXoE૰*h q4y\ ls9@i$=n+΍ɦmv5C&O27 ;_Bx;W82oqKW{jinYA3q6[v=O| OmAѸń5,l88 jG_2.ひT>܍*O[ӥAjۍX>? -~+d[yD,1{&E`0Y, +/ 63 1Iַ$Std3OQHUzg}]z3f̖R$ÝR$|n̟19T: ;E{`٣qkzʕz/5j[qjYx3sXZT-UڢoJP-׷<;ENu<f*{~{P4=W1S}?Z "p;E_)>x%Tkzˤ Z7zS-զzS֩1P\ Vd)^moJ< =[[-rYRvwߪW˵*^4OOW5jvLѓpu <6hl5;m4̋fl)^oȡV_iP`\T̫R ̾gISsP۪3 6Z͚rͫ7i||J* ׫*0)僇YVS&pnv:y<+qqꈭZܫRf&\^fRT^TyuVݚ4 ϴfFm{3چWPԘ6oprz3ؖ|!۪s rvl,C/h߶j[hERL0>.Qp\7藣"Mz_h @z7oa Bmҧ\#_9o`M[QϸI;͈;ES3e\GQW9"]Z_Vo:QsWZ: dsA0sX!#L]Yɭ#|-7Wo O<g(MPQb8P20F19>Ey$W.}߼T6C z9 Wpˍ}w @DbSYx lE3}P \E׽>gԝth Uh_zt:\BsZYuǙh%έ%)`KMcbSw3$}C ζ8]NCvi g̠#(Ϳ.ɚCdhLq$szwI;ބL\ 9q7Σ}DU3':@]!_FR}]0#:(i-8M%  N'9-3@y''3L'j@j,/96/y(CuY?=MQ#>sjEKJ!b W`t*E\pOcQ]2&t번4I]Uľt<Ƌ.1Dr> Xa.&SLx׎ſ+xT[~"WWl}.L 3AAI]JyBM{:xK,b_NEe.% 8V"7b+/KmF`'RW>ZM$!]6$-C1hPJ k/|p?ͅjxPo=*b7]\QpGSUoG!ſ1Z_I" b^ǨGLpf܊Ξ K+[$t ӽX_҄I$,е$ kDE @&FW3pl&x3?T*ّM]#ǽ7Q7CSj> ڥ%1J%CS*Uݛ}gOb\% 4;-qb9l/ND{.7 d_h%x8Us㣪 <|+8F5o} } }ҋ@i)H􋢫r|Ec}`φzE3+ - +V3,J{[. Ly_jTyԤOױ3&O {|hwCWR3ʟøb99~@7|s=C/̼&_1E/υ kD'd\r*]C@{H(SDЌ5v]#iF$? rHa[MA"/Ȣ?$DmbHؘbQ6q_ $n ,j;={$$L 3(?9'K"׻ -*c(,?M;# _ʑBYf5b{1ЙWR= )эfa?He'` &%V ?`}i]3ĩR [A2Qrt3vyl"hв1Y׊}rXG|w_v{ZiRW!Ț<wglav9 Tٮ=?Xq!A2NP|(S gcvQxWt wܗ@&*ïc,FSq9y!H/Gw8d _YgQ02j}{{,}l7-4Ж4Mmk{Zrۆ&F뇣(]Wc3OUve:]+B&529?E]ZDV+Cgw]@Ϙp&^YTm$i3K#4@2I xp5Fa_# NEB̌O]( haXp2Y΀L2*f>1[S}LFqԤ9#O?av0CL> @^W0FGjX1qh㽖\ήS`[h[,*QoDY[݅a_jHV-F`Q$cgWFD oLeL8T3 pWZ(݊h2Р۪#lգA$ş2S*i%Tne=yS͊02SpI|yGZph(@>,F%X1<07K\QĨK7hD5!ͱ dej30Hs8ԉf6leIb"{MӐZrfj';B*9f4Ny @,t^ 摄vX&ɺ$/2$&Ys|!@Zܲ9숔l!h"+0ߒxhY1%A2W&'364zY $,ek sFU9-ʄz8.e `V-*Rs3bs4}[1W٨zHyJLL#ǩx,M<WǁEGC}&"5IÀnÕԄ8Ίۿ( ?8LzE7$\.C!Ґ {0L @qJ+OQ{0&E +Z,ʣ}qL}x1G~rQ1.*(lvvdRb.: "b& ݴ-H5inzƎKoy$֓ >Tr)~<tow~jOwpiʹ{O}oD ~ď\3cΟɄo|&_&;eLhxٱ>ޣ-$'5oZ|>(kd@~c#|Tr8!|Ӿ[>bbK_%^DET3ɮddlJ]%g+ތާRM.n^F#wW.'谼WJ!?A˿Dߗ/}g^Fl_zW)egIO']M!6:g=5 uMg ~)jU?SS{%5xA? [4m$ZO(d<^  l:8'πsNe^^L̈́׳Ah*-Q009a0ƨPs( 0: 92j~ *Bf)B18#Cyh/bnLs6h+Gd'p{X#xEZEbLu! YjCs=4HQp;'xi*tD B nqNM8g +d}@[ ekD]QFԭu# ]Y^ִ2!rKdB-q*'( d'Y5J'pS֪Kg k~fZN+?5l}*dmVCdXrkdx?f1W{W{jyau=Snb{ ʌx'0x X?$LR7X0G]q>D;VnTLI E o#Y`T&‡{i59F(62› ߽^<gӻſÂıieBq~“AWkR3r7،0'Ok/?VHZsp7Sp"\vBUV޲6< 'ۘtP\s!@pHCm~%'RJ4JN}CXFeni+y@\=[rSx:@_u:: bQ87J zkot%(CT#kA~W_z=ݯxX:^j/ j14ll7;$U ?k){``!r?D}z<F;= ?X/XѿN_c%c}_'y)aюfnEל2y97-P-Civ3PZc8~}3%ÿ́AjZD32qgΡʌ~@Ef}&?<~`hӰIg:w|%gƲg7it5 "1D53/I4wwy5 rϻz\EnBqJJ,g2c^GrFP8^~8^;лOՏER&峀R9}_dӠB&'?#*rB#@wD1zrh'u]CP5<^tR[rhGO x upHX3Y?ExcF tD <~JSvBBOBw@焁P4" ZM2yĠ렁>_╊_~c%4*Y`?O82^`.|. i' 0mUcGF8%8c,9: ֱF$dHASRѲ#Gxπ70T|VT@sL JQ ѩ?48O]G\#qkv*_kة|a;/3ˋ=4{d$~vϏA>:<>he{eDq}i&g Pmzf`Nqk|.J!,YdrHr}oīj2 >øPY]gLll|oւ[Ɏ|fvNرM~\YigR*X)$HM[ͨ }.Y "iƍt[YrV;'; NuԲIJÈԕr>yHÉhK?!^Qۯs1ֿDZR{H>wEm,gmKヴIGg 5M81>2q[n$H=N 5HS+zI~Wp Ѣ^^jWs"7{ҽ~OYU/W(R&肷ȩ_^d%Yj@,6rJ\JHHDIq<(g/ٞx &p\]dO;wi:97zgm+ŽUN|P)aϔGhqhP`EN"".QhZ[aHZna{Sp B€ݯS5Nm׼,n2߹P1mC5v)ؔ?/sas.b"٪}*^3 0yK^L_3  Q1uFoqaN@ 5ku0HRsOgUS[ c?qiFs'Ekx HBgetR!FQ2{! 䗹H/RB lj WdA+ުDq~|z" #F%H$i4曏wCѻfеq(k^/8M.Q/~-zS ->c(lA+{L 8~eJ~c)YŏP]fILwu+'Dg@˘>rSZӝ_A+_^xprZ{pKiqv`t!<(AzDU$9uF[V˘0!{`O7r^vهnQEq_~^*Em7 oW5}a _m쀮*ƐlRϥ [",Hv!1: LgOk֓¥I,)5~x5¢"I戍?=[80}x A֜뤍[M'G\N@, Mkd:H߾$RP\3ռ?oF. cA+ēWпDnGV~i?X~]jz{7;$E}iұVr0RtS5pZB g} fK5:|%V<o5T?I?:t_#ϥ2 IgE}o|B3ƻ"XaM8nn´fbbI,e(Pn*BPMOL W (6̒QQaAz7r|ažVZi ?}b~-镔WWe-*/?}}fC$:>Q {EhT \!JTWQ4l(WB"sJL )hQ7$ UNa;E{ѝ-: ۇ(; 9kIo^~ka1a?7.˩6v=͇b5D#FT~1edظA{P%7~>9a4TKNO?ZQى w8}d =pرK,ؒů e?4ϱ]hH X7q4K}yN5_\X5Q㭝nZF6 CO8Fr[ eso[cOzl66[湧cD<C8](l2:I{,rcNxUR!|`hl{7{y{~Br!ƝME&9gLj^pgU6^%VJ.?ߩwNvv$ > KZ8k]޲RApF(`۔0D',*\m BCPSȅ=!"JTr:ҧrd@6؇@҈7d9Tre6$=ƍ7Ы{Z/SrZs`c)CJgHN@s9Dp3Z}b>57M(M\(w"i]Ld 5M]q(@)Q`-*/r23w`d\Ҋp9}r ;'#ΛGslA8:)AZ7,KxKi"1u Bpyg=S/쾎6d76 酝bݝEy@/:0Ш[8.F>`ou&8 dF@S7:J)byPaGםb̰ )Us\̯T&$(#"'sa42C>ҦW64bFQL(lK9]ČW6~Ydxxކ-K]T9;,&9,6I2*a=tD+}? 1m\`{8X42Y^?KƮJŴQ7e;àz~鑠,Q.J Bv LWr:}Ĥ@ۜP]HG?:2QrɽhHloQ R0 3(?ZN7/K規13)-9b} Ei.E,~ӒӘ`XFY~Q#\)WWQ xDf{ bq#5t*VXpg`x=86q*H%'tA| X0QBeLϞyȥQ`Ux\&}6Ǎr(2Һ|"(LD_=a@xcAZ&LZ֔:R is­պ\.Я3|< l ^ڸ!{YI";<1&9.Ykq*_ x:3|,#]X`#fʟF?V!%k}duSKbHR 5؛K/Ød ,ehB8,&H 8a3Y%8~Z.5< IUBWb*dWX:\q%߁{N^\_xi _I3&~՜h} S7>L YIU+lf̤vbjڜi$!{Ҝd nhkpnzМI1Z8i-0`0̒z$a X4")FsyR1jR i \}\-]D՟~k (4kBKbyRd4Tc̈ՉnIOjgE1ƺ cݝZ_0.ǒL Fk>}Ycf ;D&ܧdp@"|A?O\loqg\l(اv\H.fZi/*z/_ɷESu8gkWm/FmJvsW%H#=-q,(POo/?SKRz_JYuՍRv2OF?YmY}Zi(k9eN^ Õz6 Vśs t*3~=(oU_R2?vmAiN׉VJ:W;?WJ_~S442i:(tΊ@~O!CDPaF`ia)`T9nhYzHs?,d}hVfK<6C?E30ИbڶY4%#OWD|'RߗdӌI+"aC`W~~=B< %!PGtndͶyrɠNpr]1Ha?fAahR ay!QF͹|'ߟ\%ݓ/S"c+fᥝ17 ʽT G!͙(T5'Ið@V2C lXg>=%pܜސYel:P~CIWx} jq nz%1}?ksTw͕٪NqWH*s?G>Vp QBc(7юCw\ve:eN[K:rf[晐8ӓڽg~z hGc6W'{ZrL'6) ,~9,=cK|cd{k|w1#ȉ!BS< +]/WR|p~Bi"*},ov{rw>?(;8N&#}vABNCFS yC ͹'Ah9C{rk9 I MңD2u V9f݃_AaKPXNZDE췴_,*Y;@]"ĂvهnQ EfCc[~&{\;(~7vxB [.bw4x;)pWͫ(zww&(.|>| #*O%P~ZC; j=>m!>WK w+zk׋Uп {3csq9$.XBR;Ef|ukL !&c#zE:xz:<[l$?WgNex79G>`VVd>+vazrN_>~UeTO hkВl@Iδj8`<›}%/J$<|0p&}҂0Fcl )KJx3b,؝dٌ~Y;e.ЭZO; &tNeFd+uhx,30zEҏls0h\XV4[TWGbJ7%eL(N6@2IbuK:ac= յKMzC2 pXiI]l얹pb3z}0z/Edua>e MOy4tg@#gyZ(L1<}C5zӂܛ%FZl|whxwğ YsE_/.Cyб|Kh= 2zKWoK*gcj-_' v嚣xs]f:KΛ6O, ֻ:}›lv73&o2+7u Ĵk!$'<=1hPeZ(V6}ά1<buzvG}65K܌ʣ7kzu"%&/#5ަ\:G:?5ȣ[>V?3h|³R6b 'q޷a [渶)MȦk}46j6j;9`>6',N,4'Sev/P{k`7>ܠlr G2t{z "De#q@E#xx8/IFP u`+HyyP}ޯR)Y6e?,/X7 +mG<Gu7LSY"ґu|}&9H:ʏz_"`+lxZ-uu"c0"R:э,j6FydZ; /^@bRo˂5jt|hN`lÉp+oE7xC';+g1VX[Z- ^ٴ"vT'MzK]_Ocj١ozp=C#y jۥfT*A6|ZlnV !o`^<#z(G;!.'S  \)?*%$܏ %(%g1WG7!lc0~Ld!pHId >`%GoBmU=%X J$=B*V*SbRH{#c0L-MT ~rM"hR449yNiwΥ%5A2ּLn$s6R9FIJڙ۞$dT!^0cf[xM'ܚBy,^1sygT˸ftkNR+V jDmpnƔ=<xbc|臵Wfeze?x~lsNZڤn{yN|X IS> jH i +|~m#-vđ{y*SaLh pm^vX/WB)Vw0dFۓHI,3;=;Ok#"GFfy\،)kg.o+]8 \6qnďMwj[lՌiW ` 6f%TLQ:P/J+vBr,K$=mAFrgC;Eߤ[(x ǩԒuc(kbc(!-dLf]XApz:'=[G63ϑ8!o3Ip5ҦCD ]`~EqvmĬbRUx=ZВ?UlJ*{^()ƫL!~eM[;2Q!ufkSJI8Lj[>5Eq4q&af{ }S8"(ogq_ܾ>r7"E}T\phvVtK:+lʲi3ѰP475&)f\ȥidg2jjD(ϦTצ b5Eqz'k-(%'Yr>W-5Ç< M'8ra8=rl4Nn g׵i.ZV̜7Q[LiB~풇blmf.uͯ/MOou|v ,4o3tרyVْ|ߗwr'4Umה Ղm\J׽.쥿e|U5T?Wn{ϼn+W+M-ūz*k/|Q5*rV<_Q.4sAGG#GzY8$GP,,g !GGP,o޺:Z[[ FN;mngê+oIJQeG|ݜo})qU[`#uxM碲4ԮFV톬 \+jlֶr'Jz%,W}P/CzU s?-2:2J8WzDjWj?ten,sOm8K1IIcja|.ᡳ/Ld>Hw@?;%JJ\)ǖR ʭ];eEԍ@a@Pzﰵ_;NݼhwZGEksvfLH(ޡkvߺպ4wTx%~N>ٷCc]cVRHPc;KKK] ed2qfOs羦{G Nw_nY)7>%Bl꥝D-̢P~A[9*) 0ANs~|҄bfA'{}i=OhR5<j iIr> Oh`|9 ) ?+@ZnMZ"ha Q6:"?g=?s޳K祿yIrh;ksKHZw`|Gï2#Ÿ{EF_BwnIq&BL~;eD猑&Y%Mn-I)jT mA{|' 13-8SA[ad:(_F"6%:u +pb)ƩlqOhݠ1 _XU4X#ߐ`a-BA{X)n B2@Z YYh'RsDL70u_ʇf{Ww~ _f;_~s<ݰxdPx E*|?H[L#z>Tyr"sy*-ygK$Gcھ' <9 $InG)>()/⋬1:i{Š)s9?rIJA%3R y]b=,5r*tb>zcX.o8r´AuBUknT歹ZAQUSn0SDBeV)&-N /P+ٝsRJ^vl'֢Z8SRjDVZs19+I6KBS`<fku5)1U\z,4>oea#\' \8\eFQ63G`h*3 F~?ް{~RhzӪ;Bkw2fX: {;Dxb)'73U)էN1}M=Rq*m0 Abޡ+ Up&n^=P ;^FD*ɽVmߜjq1 qJ՜E|:Hm8Qh6ؽJ<+qrd?{F ߯b[!w3l .I8'xl o?$4?0$c=jZVՏ N&LaϜH5|9\ygaUQVZ$e蘅s<KqG 0l.yo= yr$ύeg'YyŢ*CL! y}<#dM.2٤*Mn')< J2 Kw|сC~6<_G]{h}!b;VsX8["I0#L,AB_-rܸoћȭQI$@$ù 0O8p ZIJoRea'JH}"IDNF &(xJ5"aRf ~SШCLl@q$Gty<$H8DÍ8''a(eq}@ qq<ٖe:-/ Ćϧޠ7ll6 en<wu_=1W7]ZhÞѹ{:Z9aVXuv]? Gu<֍'|~§'z/f@\f잚yE]7kh C[+- =m[UfrfF8`ߌtkQ8p霮-uGY=@Nbqvm^e%PŽi#unvre\_ o_q\qS]Ze-O0oADwf`wl*&e|et6['K?ٛԭEjj@2*rfDj%44QJ?4ZgԜ+tcX>1֊""UD"ؑo_9e.qw!˖Xydj+R_MIa#FbvqbarR sECS 4u?`h-$sfh~;A7zc,\SƁܗ^d 6 nLC>w!c,ݳȀvMc7"YTۻ?{rMgwga'Co]D&r"RjOԡu@.6)v*<5l.bAb!.a[(4=NjX7f)-? 1i 7?!}3чVД!s˟ KF67X|6K3yX>ɦ88葟#kI{'o"!T 8 KJ`-~ &BxJ !|Fz2&9-A\B =ދXOok)Nu=Ul [g˿.y'(ah%೿JD6Z"$GW'+S5״`{?W}{WhUˁ4pyΜ2Pd ڿ1L>G~e1ʨ0a̼2pk:LG*xu{37dkI?cd?S-v*{Lx{kxV#9ƃ>~_ k"6qC w.8YZO_i^9?[Ti|}%?J坐)sjo녝7a؉V+uJxÿZCҋ}ӣ^Do5%.NNJw[_o'nrMp/v>)|V636}lx4i l+*v5?}q~lօ? {0k *@C8duϳW@=jղC[A|?̞.ֵvH.Xg&(u#aloWeT$PM};ZwwDlY} ͫ{gA[>mkP|Z|]dBET< g ^vx sW:WGr6ZLf`:H HH9/~J?'ϯv-(pf6y\%(z(ӠX-EUo'FTj\ © n/#㭬+fbCQLTbq&նTBMn8vQ&ͮ 8ƑīrUy~P% W ;&c^7R}=,F;dCǸt'4nW^#x iς}vA.i8mPCK+AA\!8h/ɲ+Kz|#sP2CO4F{ڝΩ<:Pk /{㸸#O=d I Ɔr{>TzYvi Y $*ϙ![_IfXkzhۊ&G8AzsV*z{Hb;Z90k&tr`ɜR`+^3r oC@#AQ;00uHa9>BH Z~&nsXe,pa ?b,p]<"EIY Ä 0 ԃ5V.VObdB8oiмf+#.w4e.[;j%Q0)Ҿ Lʡ&+M0VvC؜aD/aFgD>I FSJӀ bn6S&w04]"* !F 8p ~\J$|LȉVf{jd2۾^2%^A}i<#)ci$2o1a e[eŽИ|⍎uϹYƗ!0juZq (9KvoNj,V'g6=W.s2 ۗC!LQwԃ]m.243e` \yE 4`qrZiKSkTbkX$3ғ%g. "CmhRS1I~V(M%]IE:i 4{X|XT{D/h! Ij `P{"; /2j cnk.gn;^ʫ7c3솓!e2X,c&^Q\W ߼E^ewߵ2°9?@RS)Zy`8M*fŘ}sl=oqi;̸bM{d:]Q7+fGv1.fمed3̈.3̰%ؼrUA ͛aa/V~:'I9{LV̳h21Xip$НI"sҩsiR9Q04'GUs(6 ) 逦!cat3~uϝYo@/[Ta=Z%DSˁ4fSP #yk}fqԫ|Җ'-{D_,}.`o>/>M3E}.g&/g }.rW[P68~RRx/^LLz/< P!Gk|{$l,l \S\ӊ-%eaBEVvx+4YõC#%{'2KccɋصIE|v݃r;~5yg;|8}Gz, i?TYO:f04H49ٙhytAO.vtǾuj==ڃs:Oo?.G]jOtpcq TDի;>L{ݻ.>|mTwR^+j^tڰD:KSt[1cdkd:%V &J>V:Y}6<wD?>|5o5Z{h\w>%dy{W~'^īgމ?,!$= bos˫]]iEg&H1(xFI_a1:%Ǧ szi . C.4ЩYKPi * t:Ei . C.4)U\x댘kGNze5i)53s<3\Ǐ,QAn؈)~սH=^D&UѓCr@s..s]þof35xli84+H\)/ꅀxwAoNe 4t?/wowB]gPy{(Uh]^Bh@&!y.4;QV*RˀgnGeְŀUT^iSߦ΋W^+[Q0v}YVͨ3[Y._FUnϮd<ۦE" _X$ [|V5ˁu6Sx<+*x 9l۟ w$s=jwfxnvdJ5fG4P: ;>Z\B@BS\R꾲tѫÆÅ?ڡiq/Pۿeˍ43}P$pk YBÇmi`]8\hA hrU-EqgDSd@ظYu-q 9R<. Ħ`KmG]}J =L;X X@e #nL39)r_8C. ޢj¡ wx?>9 L桊yTB3$j XFX!N|˞(ٻeQd"^v?O}U& U^ .tw0C@&< Ǘ:_͌.ǵr/[,W.*;p04K(h,Vs;_NVљPY .~i&FUL̯EyɲڲZuU$[I$ꅤOM U _gSū=U mf,LsVXq4U),gjXNe'ۧę4 Kk,9[U6lP[=S] Ae}k ÜI*a7S|(^6ڷyGo%Lϳ  L+xp nuJt$vvRu ~z3T2`fhM& rΥ1M UP,L *JV?D^5"Dedc5^(jO~QBd t/CD$TfcBH~R4l#E) H΢Ӌ՝2h٘ib!PRtr.՘E Y{rZ(mI5_J~W9E,[i^В_3VP~*\U0^3"nQpfXQ83/tV43՟e/Kq}թknڲ传9ti9-'U|ͬXDkaJcQeNL$!t+n?6ݖxMaM[qhxRQ yT3HjuOu#[XzI\X2@5},i+>AZo}@֌\Q,GHa(n}ףڦ~k7$'|D/zǧ1=>u)#„-iBOno!xˁ-U}x!&G-15Ә&@(eX{sY>xqi>WG-L$b&>R,  (2nYdUQd.ȫ4x/ؚ5Gf)_x]%nfP9!T+\–e3VtHS-mʌy 0FG,sl҅|3^4tEEԯ*g/PDWi:!\Vaԗᗼ1vD@J?la֤5-8>54WU$!I1,&)(G A-\x9(|'.)|Y#k9::pdAy,/NBS##' /1x%^e^|쵞>vwۇx,O}/q+ҽRjUMLPowp#ש/6+ţ^5xO*рnR! Az~tӣr?)Gޚ ÊQav.^k16j`\!832J`│ugcűa>&d|5_xFmN3yߝ-2U¤rƱx4#>͆odFNI-Te$4".W~BF}.LҊC D=ixZBsB]>K8s.uZm'iM1ҸPڸG͵&gѧ(+`~XAͼ0Qިw۽<j("Vؔ3E x%A;ǿ^봰+ ~7(vME+ $Tw?(n g>;rU$t5=hmΕle)'yUraGQn] % װ a<Hv8G!l;|)mKUg{F[2HrV$ kmmmFZgP<6"JW cRVSRd)~fy\KB=f=u{nyܒY5˼*EyʙO2ig(G={tLx:7%5\B`vb;YHQKq3p=wb}7ľfZ%s07VE(_#+H_:؞ 4!_naH}MNt&)pZ(+WNHhw0A1 Ž^~'̢&~dFT&,p<ϼJ;Qi,=_dִD[(c߳ t<Y Z0eو!v$bMNlj>/O"}^E99m}e=ϫ9{AĞ=?g3gpub"%egp9(>ppSY &H rvpP & 87R]bFS #QW1$& 9JRV@\d"sBr@A`$1\feE{ebO0190yGY33̎;Vy.uoЮы ] {ʹT] /qdȵ2jyxS߅蝁J6YX ͼə&֥5ōdpvSwYj K1$<mɭ˼c Dzkwg1<#ʏJ婢dy %%Hald0FSQe8Q!Ky.sdӐÛ` ?Үf>(lV9C|erqaEan )hf*?pa>% GFfvwQn&>`"da}k/&rf!;A9?ֳ"mKܺ"p_J+"J/&jBOQ7E$ab2AR@lc}+ڛ.ʫ@Ⱥ* K^adv*kRy5 *zu/i/N{ϜowZ[znux-cr\~;>_e٨594?כOD$-\~uCXRI:^:?iEϨe|z8_^N_\QTB]B_W낹10(O{RWz&ґE"'YHoJV~K[wB_#ڮxzQDpš5o!Էċf F2ؒΞq׎JO2eiiԴfzmTxRiiʛW(ý]bw:61i# ys+qLo\fA=5ӓȗf ktsΐVJhYf+AIN)VçxZ1GK1 uS†DC6h1nL1f`Sc@!h={: S fr"vs2\'޹A؞L7d:B̿TyU[#V*{a3>> g聠{(Ķ#[6Vc*rjԜ$ֺ.}3P^ rl Po> 5(|V st7O5k}+Y$Ciխi& 6T<"{6یoo/70g4\LLA[EǬS&_R)9ȿ:;dF#%W9S飆)(IdO݊JdGp՜V)y''fi<V9/L:5ϴ3E|VWZOhNy睙 [& o)a⛄ݵ3Ӥ_f-3$imyO \B)U@Z Qk5fR6a=x_Ǭ%#s)r#gS gV@T sKnY\?OL4ԋ 45\s;w V%00S_D0MO?z"nIIi,$M0ShF>~80Zn%a*\Ћ [3IAGI+nzL]/H0 $re! 1sKb$hIi0PQC[%a+N+ZJ0ăQGAc/ؓfmc?J(cu7^nD}=7z # )t|cA>II!Ln$&( ԇ)N!,0pf/4Aʼn޽& pƋZ(NPQ QzV M$ICE!nMQ|-d)$FjA+t%߂yILc9hGQK#`M0W Z 0~<0@/<`O``wy3ʷM[0a$HhXJ% DP=X hRyXmG {@DюGbm0FF!:53PiЌ R ['<H;Hq[2.FfJQuӈ Du>h\ |\!tqpHEHREb` |Th c)c jc caMe]h ]\jO`DZQJ`><X u mAEmaǩRQl[ /4HLH)j [\؟+IP0`v 4`gYpȂ|\ݤE oY  jXv0-1` yYr5ph)K8x f]` Qt>>ꯠ2! pgC@q 6XP0)>G p,PNYxb #L 7,e+>Plz,#p@v  Qb|+M+e ҜΫ,(j$wYaQ&Òty`5ĽɄ>l.Z`vqg 5O\ Heh*i7ED^"j )#&ʣSn.i(H ]>ƻlDR&EeZt<98o!=N4pq0 b@=  Z$07;0Z^<_0u`@V`fԤia(3@MQεb4e92P0䲨a d"L("X.~+T&ͅ v?4&sNVG{c3FhޅE.3#  $9&,7 hجu4g@`18x[{hGv޻aTߡ-36+&h4`S@ Z-M <4pkQT ,kh"Cp]5b0mhAcU1ƅ 4D!mDm 0 \(X+L xRhv&p,)b)dxX0q3j?yfBt, ѱ,DDzB| "f$XbòŅg$ذ,Će!:ŅEVn!:XcYNq!@ %W06V"]_SIPgY^_P:,k&C U(R$d]϶өsƷH 2tp}"Be1g(&5q"YjҰn{}BB`lc=٤e:&˘{SL_L^pUg[qN(M~ԁX4+TR^YӍG낢8nxߝP# ;~w7leh91#ڪIEDꗎ̞X@u&EM=WYiWt$ؽp-ߡ'֟nH 5uz"!9R,S^{#-OQu (KPb?baGA|q7ʗfXEqL-28u("廖 ,8bzb9[7:Us"s1\L3?;?"7?/S 6(*n$:}1kNlԋ-&Z(57OZ ΙB1uWV@j8zBI{CbE8}-'a5hlw  ~՚b%vۓnd"^[%&$gNX(9=m蘕hԊ^tG yCv&3dJҨ L@ : #"o'=ˮއJ k v(!ڵ?^yԜ6A/o~qYk9Q+~EFZJQ 0n2ZM: kH_j嫩3a u_C&'5,*|VbPنgLĺ0b$ _Wʡz#_f-~xq¸A@{{P[JȂZiE꨾Rh3X\! Ieh٪Q4لFOދ { {{1 ^H{/LBrE)^ϽMPνq/ۯ69 ˼U@Ne^$.W~鎮ELߨ..ɼuI)d"Յ.oG$ɪ?/)*XKz੮GД;Du zIŷ)kηIFIU mIǐ+<%}atؽpT#zqX$gGsT 9%pq.%Xբ^Tbq-|TMH,<.Չtq+R4.49.*RO[)d'VN),PS Q_W$J3+L()S+Gd&ԌR.ȗQ=3* wдz۠CA8iXUI9Pj/ s=Ӝ_TEwL؝cy<><|BZت u`ڕg]3x~DòE\Yq.p.T휫%svg I5wG0H{7|__Xs]Njkmm_":Z?MKu֏YR9kܽ\,"nM)Tl%.~0-Kp4 ;J%SwA %^H_4(̈O )֝&K#~繾Dl  "%l3H\s>e5 T(9p3 7%ABYFew.$hd ?@/s@L :I' , ~aK'pw%yrȔ*Е%AE-OLJKz- &|QD c{_^UlD\wg`,T싒%|0Cגι||_ F _\2_Xk?}OG^7q/4A#J$2ghh^n_?7RE>PfU2BXI H,ȴѽ~t 0}#!N{#6_6VBsSe8;uCu6;;8۬j?"dޖBtDY{u}{|Omd pD{:+ĩwcbSİ}G(3`8&3j1w7):Wn)2=S {z}qަx' ށwdq9mMbo{ow74GfGx73۶rHTGΣhO3W,S c3\)^5#[o+[G$3{G*s}@8|@8s!ḥ 8E#?ŅvJyR/N̠<=>'GV9XuVl:Scӡ:U؈GV_,_DLt>~PnJѦ%lw{w}c_>ɩX9YS-C moiP<]FiAA M^Ue:+z+AL󿽢?2Pͼ@5`9c%,وh OB[k)YO@w,"CPIw}D%Y>5 zt& u2}K3TT(O18K{> Y,+PzR"0b혋3iqwLaЙjqwˬdح*Rl7Vw=%}gZܝYO'f,|b1mvw\ tŽ-W9"ǟ,kf2t9'dab矩&xoѳt5PB(+ ͕f{Β͉ΥAǚ(Q gȬm1rqԟﭹ?w{g+q=;ri2dlE"$n2;"Kp޺?̵?L<0 :Z\Or)[?̵? WWZJVVX0+uo^v]qs2sZW-^'-S!qOxP{ٵof!󨒼mqBz{ g9^~WF8HYH/uļd"\:jNV/ߥ?p}!Ɔht9M-46g]BKn<+/0k=)y>ޥglxt?ҵC_\:nŖ {Ȓ|ݺsYwa eWe @oʰ6xa\,&7,:]2Vfב$&z=V^Jrc#c綔La1:6Brfx-rt))?ߠpH/\Y8=S],.aBgoP7O$k被gk:L `T G =|/%h0ل''۔%ATܽgCCz4䐞GߠQbyPڏVBmM]^uFZ]n!RU^g(['Ǵ>||ǰH{ Av7k2 姃a!u}osas,l[QVe.]/Ks ./ȫs3OU"?vB.tl0ߡ!ʣ~4 ? .#ߜ\]']Jіը./ˇGR>N]So9ily+_/o嗷[Vp-^* p!}kT;5]ykiYׂr%k."p K>W8+1h8C8$2>(pqD>/j #ōgLɝͥ5>D|Nmk5k5hJW/o~qYT܉axJa$hMdJ)^s/˲*,&8r1i0 *[L i\tX:W,+7+ ]3eY[ z+Ƴ6IC5iZM@Ox5_-֝_G.lHZEOt-pQwǢm#<~n[0_a8bǽG8| ߰aMc;ִ<`ܽn!IYs3\HФ+l9uV]" :df*U-p%ྐVۿ-f$('"5X XbυYWAq(WFۯ60^V="b@\/o{M7D9Kk 9% zwqׂ)GHsK,q}#~s PTX<[jkIi6H03}\Tb;261c>՜ZY`E ҃h1D)~ZqlEn(&WY\Dc=XMed:@<9༙J1Ƒ(P# 8TcnB_h%t=k*BIߍ/ |ﲭゾOrP[_Q&/1?@`_KƗ0Ju/T?ey+N<`ä4'q/EQ64K i,a{7Q>E?3f,M/hBSe\r R;rs/N.I@S]गx蛖ED'I?pp#hOn\ut&CV'}ok~_ .vL? jjj1f&ʟk.ϵu ryg;,Οxu_KS1Ptg5r3e4pJz(\4(\`6AXN1P;>5{#.rI\s_8I'Xȫs"E>q 1Y8ȣ+̧+m(,M@0yM T<)`@a"x٨fdoGxL4rN8[))ޖL\u u-J>u[%m1횳vpN9zWwnԝS,M:~y~{sNw nٗU f܀S{T M$KM?!IJ@C؟.W[03ި!F0e)g^O5 ?sܯ4oC1z ؤya3VV_; f>v=$Q7fCggԣ5^(L{Vw>z | ԣS=+{W"0ߕFaGs!9 xӇF|$e/m6= 9oxz[5.GB R3y֍N9BbV\(N1wz?X;5́My™7^ϊ90 oT^cA?; <A~bI1ߙ~fcE\lv5+5N+!sN i7;qd$v,v8vNvHsYVsƤ8ܳoe9˴vni%aN{L;$Ӟ'ӾNi,KdڹEUq;g~N{W+Y, %Y1gU=ļcۢ3ҍfHaP<6G)*!w5Sq]rR/Ө'1z'nP8ȏs;sHF9Gŝ,~āvlT<:]9(NxV/zoZ}G t(IY L{qZ' q'}ʫ5vk"jE|r5;p5tI^o=[VߎAhnnZvK3*i1een6ПzB`ny\}K? Ap_'hE3xdãmP$~D0L8ɇW ,| ^#YV.o8y;=Qzٻ>{!/>Cv8wW 9 )#1 @\*2mY BѝZм7v=O Uz(?Ӭʯ ݿ|)z8~cfwu3.tPB :>: 4 4it!?h&_?XIivi0ճ86HNL'+R删ئ82BO8ᜆ_@͓?Fjs֩L :~]y簓1t8+Aw1;>~m_u{wp:|m3y+)3ZQ,ɇF8])7TPQ(\N5Κd*Wkog-5n#쮽kԏ ;,8yx UIM(Ijnrtzlr݀=RdiyXwv2Nlbr ]y@QE$Svwۇצofph4€,ciL@DI?/*_| Q"_e&Pn=JXK0W5au:2:` "f>h -uFO*e g.|Yk,F[b}klԝǧv:}Qdo~oC|QOͿ^w[II$Mep$tA:sSm^ݖagEJv J`k8ZzT}ZCw;;t>;*ƅ;x)ws=1\5KHQΉm&$9gCn?s+,/k{9oVqeR'#3O"qf#e.4h(C"Zc#)*W]@f3ʓsou^7#R>ԑLnBs4uުquUTE@wCsu8YNQEDX-Y{hZ`ofnr{:ؙ湌 SV+ԝ>R[p+g&x }Q 2ӘqY mGҹ-#^+d#0b,-cc"7 /JP5`pEd(8 Fqoe?X EݣnDl51(1\ںкSٚ "d>^t"(.^ϡEAր=9{SD`nzG+xgsܿBUځ <!zyk6_n52f_r5l+%?Q J(}[V샂xC׍-㜲fEDɬyA^{au[B{>4sz~ 'uNXQ/"iW,a(Bc9;˗QA=שwF~y=^ڎ:Ƚ1/0ubE)0,P?qlԕga~+JxmB)N%^l Q<)KQɃW,*֛@4n1dc9JȻ jZ֚ᎩF eoԙzǵnDy\O-.LjOyq|]LN ,h9Z@;}>O&w ݮEbdҥSfYx矧&n3ƿ=yPd|la%IBY`i<1_O]\dAsv{>u dR)=HyywN..Ơe,=)r좯ϡa%f/1qV3d\Hx hp\/ J^wW@Lk eY” qp=أ;X9+@7[q!.vp';Yy2еɿ:9U CR;;ˎ#tvQP𸟾QqpeYnh#ͷQĦVQotUoq?lxy•8,x$;n2d8\"N-Z%ӨܐB?zԺK!\o[O7Nj G7|sݍ[Ny\Y7ڥvEeuڋL^Gp{m.=;:`p*<p"~ @'V#|ُN*]u}H/ס#D~We<gfggƟ40}[`'4߬e\7OV) 1 u=JW>$ 8 _MDĩHF8s!PF{D8AeHh"$< _ FD'("Rpە;V'y\2|[ڜmlo+j+WK'#Zh9'i=5 ayw{ \y /\Nӆ}#L>OTwV{Z[[U:'1QWr A ͽ47isr+OǶNYO3|*LM.]`]ܓf(kj_ѯьOjoךͦ'ӎ"eԮb0O%3Ԑ̚yf@r=mj@= S18@c~|d)SFBf%p ̢KT@C?n\ܤ5&3MD`P*1y}1nvV|7k!s2ei~ʫH xpA68`\@~f}#pj9P%wӰl.eo%qz߯9]۫ާ+֘|QGw|B=o>j[p'w뻔Nma.tϖMS>U&؛7?%*&Y !nl?q8ZId}zjЭ8Ke0;:$vBlܹi$(%B( R*_Rj'-FJORT;H)mztpT yT>D߼=o:2c+rwzZ{dֈ!Ag if]\@?z\0RWf $a#aT$!1M8n%I)PqӐԍZQDOri (bb? &)tpT:' 7Nch鷠l$~qp`z0]^iP2eH`Y݄!p[QHPFBي\`'O|²a^Y{>M[a0q @̆0wAOְa8"?bX&֏bP߇% "FGCˋ[B蚦>lq |4JӠEl[>s<P$x#&+qMnQLISc@ М8`FKAyITp GQ0t )6dFaFDwRVF~tM ^7"I]-50/XA+N/`f߇aL 2 4N1@c$fs8p9C];(@İBRHð`(s"x>-(XEVBü\ ŏ&[nNpbZ0H!PBTVC!4pYvvc+@#q&`9zE$Z& G TNRVsKS@&9Ha5D N%pM#6du`t[hn1]--BX W(y }5FAxNRh@Lu0."cB! 6?/je 3ֻ@z;!$)0 (0nyN:n@K!s&Huv[܀ `bN@ڠガwy7 qFwHx=: ?j-$$J,]L&# ՞Nيdf 2 %YObP|fkr@VWg.hRhJ( m ; .,qG RXNb >bHa s $пAC-! *PTkzQ.1X); IQB Oh~@D=d7WL8 E`+9=Dp ʥ]mXY)[!/Z ֡lKj]I @|& 5\O,#]reˆ!l5Ra3ʙh$,alERHRC>(. hrOڇ|K ԬFZ_H Qbe.`|mI.IBxғے`EfvR4H+[j ?aSRL@ʸP~lOù_RK=ɵ_}A>D ^UR`sv07h?\ }H9D[VtxRH0="GaVh"1Q]T7.w֣|`vqչXu~]u.P֊IgϷtإ^I%¾g5 V d <G>(gx|b sLA )ڸNAwy@A AMk m٪ } Sw (̇YC;; s((1S{߱ ّـujGWǾ-3UHنVYr#{hR~`ĬnP=1LӪ4+HcfE'sL;FGOՔؖafl}ϰsx[|`ri`/9ˉ~]L':\T;yT#ƟgpȮPa_ĭ (Z{; nl7+S*L)~Ev H2T0')T ؞EFiؐ/Cr8#MӁ8j 5;1^M &9ԟ禾lzQc#^ !4UB,8߰Jm?oo_ V_kXe)hwX &v]?bIР m;xJ\F)v!Ox.$H=F>xqO1(X;WOtր}\ӄE1<$}Fn.`pt5 DGUvE >*`#Z ƙvST% -UH 2(^kXhhsg&ПsL ,AkHHgy6jC8%zSͫv,ftjb'[sU|rlc]5 YL{6 Yp O.LCV ]ԝg€;[\PI9WEY9I9=ʿ\q׻p5p\5Q 9z5E+_yì`dFhW;P(Q7?*9]A+AkW!21̕|HVy>VdqjheixYv|4յb㝙xglL3?{4=T͋]8+PqFә~ D_X! G2LD?,Qn*~"O2Y]I AףsjU$^vq7Q@IGV'_ e0zzx%1n"(y3 .,}Lȉ&TXC kh0),ŭU 9} f5k^hOUVBn k)_]=! ܡAЂ0¡D'%^ \W%eV&(1&I _jl?q <nq d^m1wj^"6ݪ$%n {YlXj8"lp q[l{Qc zeLU+A|)a/%U}-.yY~PPzPbaTN ~ -+BNzJ ip0wBe* [(!fO?F"*Ox;s"1lnivwsnɺ%$a]=b^d׳c8b]@ '9 s.8z*v$1P1~̗~uk/ WEmIEmfi4ixزX/]Fw{ S)/e<#~1T\^ӦY(SuZ.@!s 5CwkVή{R#ܵ6P-#|\{kdE&02ᇼJe\p[|Y7ݵC7%*;==@mP@`!oa\QA`п8.SZNt*6"z4~/o58CO*@{߳q*/ޟ!MD."Չk%t1q)J% o1'X5qݏ 7r}ڻi{xp4F'ݠ🺳CԾ{0J'3W~r + RT~؇lkoS ޏO}bmT*Dzi9(s{WY۷rzdydFw52amZ+P=GF,L+oF]'eX1m)oņ2wOe)l,aA3y h& 8.ML0Jt2'#_Όl=h1%h緫JjWӦkMgw~\e?Wڏ qr? (%f&U𠤗:FOXP'1@ku[YKh%t꘵Lj xk'+mTR/UbBA G8XZ>ٟg\󙂗tTnZ۴ek{U5NgXG:Mfh=AX%nԒ؇_7IEya([k@3Ӂs/Ħ^x3} #~4>-椲֧tif;C6HBH4X ]߅-f0tK?OEU@LRAQʁa3Z-)DwE 3 j\-`~z<>\N SN pa% Pb,m&z^3#WqFb/Z\)XR[`Q hUp} .Cnw]A{?f2\2(Lu[L<_c1+GFBb.ǓAA@ ,QǶA 'ż51N6[:B+4\2(!\<.8QsP0!^W<׭LWLY~#\3*S ڣap ]1&mD͖GC|Hra,K+D@ z&1i[1vPX2q"n8obt-t$>BW0hPяw &Q36_s,ąs&@(Ҙg-F~Da9Z+e*2X  `$5+[4!Ճ cդDiCa2Ib;3Be[>M0{1#t؊y=^N ^ +}W&!,)L> zcJ,? qZ N ż+&E&KsfNKDLlB*?( c%r!!DB*X2Ӆh+o c, aVE,Úi*ѣ2,L]&_EGx\Ƙ$vy#cUL (@BD9{/xo`T& ,?V pT@˓PE,lOyQDtﳢf,&%'3=1FRчϻl;?YCA?*BGHObj>ⓔEL_Մ C%+ B8iIzbJAAgyl5;fI=/ ,puEg)L1*g#1G/ :i ̢wN  @J@b?ddzc~kSmd,m!luqيs7o$(ZS㯰1.3Qt5\z+T.xTJbLIӎj1?gc*U-)GSAj!oPdž,U4[bAR!%Wbc8qۅiT ZiD+4b w~B#+SZ:G֢b0N|΍ø}xrQ@s y 8_?^=8GfRI9,08}j[H0- ( k_uq0]W,)+ em\<ml4p^̴_׏]] ai[q$6^3/Isp ʟ3`0}7ݱxTՇxTC"ĒҒҙ(ml4 'w/ؐ JWf{+f I2930jl&vRa5 %cp GkMU'I /RrE:|Q7a`);7Vܧ6 eH0֙M#wY@K}uO]YZL!B;qʍP\cBBaCժNGnaH s14LdH5 S9]F阫J`؅b>[3]‘HHQvsI-3U1 Y@cQi7Pax햬Oooȥ.߰d!^-UW:2ޛrܲm+/ egQ D[[)/FPmT|Œ_$Od7~7S-4^s-wBPv4L.-mkɸ8[RkL'L}>Y0M3cxAMJf9+’.dI8-ěo^'jw1L`g/P7j`c!, L93Goã2YvyxSY3Lfd-\2:zl}G4Y,'Cg1r֢)NՆ~Q]9N~f>7u9No0 fRiY_.hTVl,:Gu**V)Qmfrk5*46VBVSU&]JRMx?B40u!F3˗p46kGpG_^b޵\3SA1c[QP|6-{ZeïR7[MSeWZ ZV@STf.˲˲8"&bYE ``ozbc(0TFdYUQ6+彊cpsfZ8GǺQog+h [Xk=UO')z=r* `9Jd*S4΂V-*r?{UȗzXPXԥq!=Pa9, ړ}B)UOp;eKʃe4 [ٱu2u f\l[ͧGn~%Z)RȦ_O, ̆X~k̆[hյT,bTF 7e /hbT3 13K̂Y Iu jJKIs`V(l6B-l\xL%q$< \ LP ,ŌZ4 M"񧔶ڒ77 `o-e~1Is+X1@Q*zaY%Uk%b 2'Ҕ"{B*L<'HQ ,L$wU@dHXȁKUPI_ddn rI(N"v+DRwL.W{#gHMH(q$sC"x*KUr/$3P/&݌LG"v(_; xD2+J x&wi 6KQ?! ]N# ArɖT,ei +1dbh03JńܖL/Aa˝Yn<B2L1y*v!KK(*XFFQ\-Q!r[Xk^{F2X~$SP }?E(z-뤂"@,tK̑LzTs^3W2AB͗9>CGI_U}s7E|N;'(D2b2_{售Sm;wשSFƖ%1$B]fm^K%c1= <9oV}Wsǹ aqo#tlE5wh8^mxu>li˜+15WU"2~a,s t_?hW>s'vråyuw1>n/o{M3|q{/{Sph>Gu?audU~ԇ{&t}MlF= fQIwlYUCǠڌ5]qmbPL!mUm*s+LyO?WAV"cʼnk~*|>k*H ?{5ee$aiEU^[A> TƍlqP&24F LvFT[ĞsbepJ kUE~JkBJԄԨ9oFޠ8^-d{x`YE!?ۃWgQ4" J!m=:P=/!78P^Nml?Wn?yMildwd]tQ;Ctvj?ߪ/|潯ff:K${7}LxF4`|^ sd:Rkh4}-N6僧+oW,>yMl"M@}iz$~:m<'6r3GC7q?kyo]?oPFSOr++IMyZLAh4o0垆lಕkylWvYf2q&[ !KSY0f%I^' +vC_/&bzR ݜW[zʐ /ruf9`澥s; RWK̷%T,LB݅iw'uG. oL5;G|i~g N>Z`9ԮlԅE0BJK j(yU'Hef{QJ勜h8KI(c {FpcwrѨwmsbNX,uY4^P(vW[IU AǖyZSs+_UR{y)~bAܹChqicB~d2]JOg^Iч=h:|5xG*.Z(<D:M@lX]uTCfSFtS u@O ?7ߖQ9%|z6]KM 9Fs¡G$ Wu.3φ2ט%A YzcvT~1UŴ}i^EaKKJ?'ɤ|إ]Y]/KO t4. xOрܼU x\FN Lf* 4!K y9zG9R[.CuxkDŀ8edLHS1~f 8laO3/I -ѶThĀFm֕ h,QvƓeXaZEw4laY5.G kmE^R&"*m\RXFeFYփ@Rrq}zL oE9?t́&؊b/`SΊA^,y]SkMJ 1uX?C\cʂ>BQ9 a'C&]ڲ(֝X;`E$XlU;|E|rcmu'VT=Kmc Kแ #G3Ve°A)%ˀd\M,6fckt-C]Srɀsz_[&_^+^zWׇ}_r_ X`<ElGX}(k)ç~Ռhp8oouޣK"Uч-2\ ĸVq\c͕+ yfC_ FC)cM;UoQ_+ qPH`g\V?tإn\43AdrtaS9C!}IRJ-PiD}co5ip S?&Z#xcs& Nߏh7Po@v=|]>]l 'kj|nuuիXΤ}6VLU or%`2r>X6FX;ӝevȯ8DN6:DZ_`W&OǏw|e}?dc {{,ΉĢ!acl蚸IxtU|iEKvrӿQa 0k1,XrS4b8P^%5dCC {kV 4zgBmUEN-Ow[y#|ѣ?[[yJ+kYVavӮo{kH+@EBp4Z+J>KI`BQ j &UwFǃ]YfO4]}:ZN.sG?}RQ<[ao5(&&EȔ82'm/Ojn tiZs%ey%`2Aq} I֧9BI;lU&MoXC5\dU,H_@A49B[5YG3<ي-8pjM#AWcׁGǚf;aj!Y!t6ȧ/Li?ݫ&Xt 7Xbլy Uv@NY{59q} eHM:=yrA^üAh\}i a@FQceH2N9V֋ۯzR@B;i+P`pq z᭭y~]/LKaXh$p-u ȃ-AS!r^Vfo ~1Pע뻺 aML7㺐GhHH=I"(;3tBp^xų)v+:ݽiA@ `|V2 U A)q/~7)tLʴF)2X ;]^w:_{5ZN%%W$*أ\rݖauFWȻiN\8bEwNq 6 LJ/|:nI]W: ]1E_IVxrvc]_hZʮ!ĘtG,d@jUfһ-kIJdBAם^R~A (zkƘW hVX)lؽ l&ٰMjwehkNQ-9˕;rhL`FUKWuuOҢHXXsjp ]vE:;DD27Xg_9oA7!,yB6-1zAo%r*B>>XC>B>Ja\#G!Ydf /A~q#2l&ߐM/~Z2] -;/ ae A"Y0ͽ#E'D ,k}Cݯ AH4 %`w=NYXt q)=.e]kzNfMEW%#e@*/a0&e79] "'}wkƟ,aq# wӝKU `m('ٓ]Qfi=%4Ld m}JWp@syr=cI-_fl=PoA'\qT?6eEs{w |oE O`cTWc|Y6Wus[}nÛmw{|V+z~崁zٽ zmfs]] Qu,,-ʁYqŽw`r- ~vYU p 5ė ]wgw^Γ1ԧ̎ݤoO@" :%)W~@xdwCB)/{ǧ'~=<׀#} no?w#/~f qܮL=>* Qu3?ef݀0^Ŋ)#manQ[̓<-9٢zH빖e2<wxkW*bm+يxy]eϡ!t8ZLe*/%a߂^-ǞX] Pg?+n-<"7PkpH[0nP߯tn[2mE2[dz QkooZ(NQL2$k{~3}𲟠9 =㨟~rې>I']~r[ҟߔsD4]|)uJG27O4Л4czl _M،X8516K՛Q a +oߌ}ļ+?o׹>leOO?w2W>tGO5Lt*hkk^.fViq~z[QAJ 2ИT' ~Wuqe܄1g0%][.vUy?O|/#7%^e;;Fb|KvUuZ+u\oYeaNnGl]:,yeRSEgvyUt8ȧ;aN)F=yԒ 4qc-fM|@M6qVm`w05.w}gǗHhM=X T 9dUmg%ޭ;^y]DNڔcߏq @ӮҏU#iQ| ;٬IkHM}<*Na_{0XSJRf̥ 눱 6MħX)D8LeņFIn-q&FGmbSL kDL-+f@**QU^AtqKEOi9Cyb3Zkpxg<2gS Q1/ rV@DFmzfhd |FO| 쎹rj$2Q˒o"O*' ZݪZE2o+EʟW|?'_3?_7W|,_Q&$loĂ&K} L_ `@ ˌNL9΢1@&L.˞ĕQM|^\YW ʘVtQ)>tϣATrb;<~sז͙?&7LyS("ȚY>x,E&FABܙʣyԣT=2Ȍb#'2G^.#YTY켹@љ)^ 'RO\ 3.[,Ro|RgX K-|)֥/?|&95wS4 X 䓵kWi>Fs=)O<4cv/@hYuGP~he_uoo21=u@|yψ}YOk0DU]o[Q־hz,jbo푇gzBtz < lhq6M}FzS6р=eYնWY*Lf`A ϛ;[Gv\J[3n߽aNsk'ցvԚ]d\ȷZսJg;]|`U42Rkԕ +ԛaS?< CbX˜s*!ppa?@=OL:#]GK,6||qՖA r5j8C?@0`8_hTՓEfi8 %Yn|7pBNjj㕚FnNVQ#+J0mf"*vUv.Z+`Yth峝gjG3:0NhB-D" ,LVEh%J[m+Na`ZIS˗VLnkP$rM>>] hwF>iltXCȺL-:ʫs+dmY\ "KerWE8q5)qB^kLXրI5E|lC=TJn<51KEB_evfhsr$ER42k"\tPw>^ gX?BcmvasEq.EȠ:8ղ >ctg$1@XQ^-^hxfeCLn2v/|o8B~0+MǺ#'<>>1 W8њҗSJ_xڻi{sXMnO!j_\8~nbdBE}3;?9vp_M?n1l+ЕuλNKpZ0N*8oMgOփ#pj[30?B> 1R`GW7piwݭsrl b%ۦ%˹f)8l8; "^ƿ+QَWH5r9ݭ-b0DFۺ54<#?𙣏iWb ]nAɅ1׻crgt<(9.(yǎ{6;p){},*x?? Bww"2 ݼq.CZ= 1(乑[/8/c34dʃtLǛg渧}n͜,iQM+7G3wxeE뤳U{Nt2qO ѭ5ZNx5dK:YONL`b_5#)_)1G0 -FW Tmg]vz1@{(6:xQuuEi$o[8z`|Uɬ3Nx໛56t>p+8PZ> ~9wȧϬK^/bOJif5eyVJ3TpJZl"B$f,\Xp/+5yR+kM0AS5sUʟrnGAtdysa<*QHL$cvl "g@G:|?|FIDp*$uԘ>uK3$IgVBay˝7؛oq=릃^̛ta)fl^ڳy5d=@>nysʵ}Lĸ|x 6Ofo=ǻj粉.e[ү,3ir0ne21li{yw47-$ klL_q:;Cfx{qF'FZR"Tq*>:tuYkKLE݆ZH> ,( /zkIbuXrΝ+q|šH|Oeۊ.Q Y.}Ëb؋x?,A?m͡E'f3 + :0/ `7gO `5/ oqUg٨;tY9BݫHꈼ6}dws V?Wt/?kLWjV{|\U. Mǀ e%ht'#zoPnwǫ/kWP<uadN cªnZQ 7ee(Z3hÙo٨q/U+:5qS+qZc\JLE -5`:pb.u&9[H>.N!F7)J ڄ1 ڵڧOT= ?&ޛl<ӽF/7@)%{Y$獝2Y7R1J[ N}'<} 6 $ 54=j faŕwEy%]i|h3xA}иoxXJ8hC'P8T/-U#K _:Q5|R1uƬc` _,xfxepC~{3k\9]s_d ~˚ O&C0Y⇽(#œFEa5ZL:#TהAU ?7hA'X5Ul Gn\E9#Gn & OahA:G+xVoUMB%L}ANf8~׿|M*/^? ]_UjXB/ߩm/;-pZ,bp q!q`^,8@ k?q2`^2 svjFb~1"_T_Ou۸_,b&_]//nի`xn%?/*??Mq<4^?psSbCx.{dX?K_=f7sd?jȏ]eG1[?w/aWzcQ$`hXgL4{l/ZFeOsOO4X/ ` }Jk5~ Mܽs=ܿ.,_?«`qGKK-6]YI%El8. 2KW̵/٢٠+ |͹׌  xr=FJ/݆6R]&vCOdhAXMmSZuj1m\ -xf+uU" 3*Tz'Y4z$/ +f9;{[,h ?.'&拹Rn8.\A }xk³ !  wcOM3;eI3喦9L:Z۪&W&CcŋUZg@J93*>F߼86fm=LyqPH z4BsycO ЖQ&(CBfBfӯ־`|{.J8 "Zn!kerV쪤 F16Vjus3򭉻bGv3mx"W*ZES=Yn4nƩzɍ;RWN@U 4/+ǚXNĽٚ 99eY';(9F]%nb`\,l~X9oB=H՝;K^F\T͖+ߖ+ z{%E2{ tK h)SY\7 /$6__׏VwTKīl{D=n6I6 ?M oL{WC&پj&!uoo\)T4fڛ_iОl-47gxM0Of򯼔9)kɍn/1V-V9M{&3c61,Vj3c*%U&x"ӘwL/d4h/+pi_؟?7__Li4]M{KSs ~/ѫx3W0So4KKB-y>^k @%a[\~N̋6ARBX5},#E*V?0V`]OQ1D(RE t[,=aCk}V #:a\gh^[VWg}3MtKwF)! J`f .ouNqu.V^م7 (iZ&bؘGEb(Ĝ8[dR0.z^@]B9 >CؚH3PjIE1]4%$}4mBov202,3Z&ݏr Jvc;(AxUeP "Lats$tEa.Q_>$! 4|26i)<'c04JDD×^o0 i ̇Y+D9?b1ރҿuI:)?D8%8lZ!;@2-LeL`'5ZOe3Xv$Y&-k xZfA !$Kj A 6s"gMEia-6> nV2`ms 64:-FmߤYRwy#PazC췫v/+ i1F8V-iyf_N1u ,鏯n-Ob/<:LNh4=޿7ҷhg~I|2=kSPBƀؿvN8v "?zF/MZG z}k9|}wNޟ6#ԮuzsgSԙd]@xw{49;oqZR:OFlBŒml^%z[Mf zf5~Ӝ7L47ig9e $VŽB kv¬Jv[AGq=7u=kHƏ8 +ƙ:k0{mEY3|G옽W@xasߕt{p6Z!䕱kLA6ăM ي叓ӷ@Xf7oۧNmLdo흞`29F4MCV9<]A58-Ш?zwk8څk]iUhذS@IS mcB1ZH4K 6ۧ$hCQ|5]C.ψ~ƮϷ_~NwT=LS#FU48D5DÞ Q|1[ç]/Ȗ9_ $.yy,@?Km*JVfUYɥzJwPGh,:Ha[5^u\K;XZZײ9)o<9̦4G_fZfzZfZ}9VuƏ2>6^yq/c2`×]9T>ibkxIx뮉XT_C?qB Ο2Fuvs^,쳬A(o*f\r3aIx$i1I|)p2t\q*+)m>5*)F=ЧvEn*MFSH;94QuG@hI|>Ȳz>G[%[ =*PM^WHj6E 7C7گ:5 ~ͣr] uŬU;;܉gRǚ kIxYy}c)e'?⤊FHVf8VS5'b [@8NU~lޔFoޒSyЧZfK*/d6`I-ަgӴD7Ⱦh"[ pBqVahOb qŚZίB@25+ ]B~[?A)ۗ}7p(Ix.|NN?-OJytf_r؎V S] _jZ5؍7(.7t je& "B+7KoХ7*uV_jyuE&}#3 ,OvA)<__ :z]z>GRϟT y.] tMw"bsSꬺsXk_&g]9{Iy'n=r:TRdpWBv n jrn1 Tv)㘴@ϖY Gێ2bU M؄${zZ]Ц@_9oW,t݃ PoFL}EqF5|gOQ/Z/aI/?Y諔*qPJӿc@ٟ2(z*:~m^-\n&#{u䦡}}gs(]XΑ~0I'aLW,'+Bɐ>;*IWjh L@I%A*⑥jdg&NTH1XiZb|j0 LXl9 yZ[-<šy-s ~ҜM~r[}'!g!3TODDEwMQ3H#"C#niD˪6Yr†LS?oݸUxBk&I+~qxA?v^E'/x{{VJ7$n3cthELZI(zbded{޽xG/ E^Nl`(xڸ@k mhm۴Ο'u8UAWxpOj_ОߺzȟQǁFi.uW7_m_RG^UڠDP"찧\ʷ+蓈zX 18tW~ZGB: UMUmcnT+q{3=OϽїQ7}|nZa v%ӓ:LK=patF6I$OBЈzdd:ε`iPv5D\QΓ{_z^c)|Yw203o"$+ OyGW:b 66e;ӧLNr;d rt/_rxR xi",i-p&,';%~mS*j,VBe0*Je\nXAXHӧrӜ$ 'kt)Q N&O4gt=4>g0l鼳y~Mmxp)`5kz1=@"T5 8"9,*z@Hԫ7^pNT۸º?rA𦀧sw_%#RMp$|rB]3<#X:P&y2y3/]gކR3\Wѓrۘ>7OKisc*0`ܘw>7ɰܨӔ{Bmxȼ%dwm{*ўO+ǩ瘎 MOIԅuÐiщ^Lq#RA: 10B7WN͗0SN6=V}GPu:=r).}~҈Ҏ#Lʎ[#-x:\[s^ghC .MNIJp#Niؤ)Ft υo_Tl\&X^%AR KJ/罸y?o}ϱkU\%w3|2N@yW*.WJoRЮPVi.Q_2=%c4c_1 x; ?v;sr#a9!^a/wwۇ᠏]ys) \ ~C?*+Ddv1Y%?u~wcqmlNmq,da~D7W !f⸔ 1"L`PJ&rbhdT:&/g@3U 0?Pw0U]|) '}3aw1<mqRU@S}vPmC< 8a5ْ/"~N巅ow|@]x}fRŔm_CTN^ ׀@kt$uoo:lt5 p>-͟!*_p7kr$Q#c/; n3}C.}$2g=C/9}J(`B)෺TӽĦe*a$l`X$ /s$0RWm7va(Sjֲ%[z.Oll=%?ّ.( ?#P9fIgMfXh) A ?yjZ#4[1Q|;})Yπ!++FNA˹7 K-7`xb3w5찶aD] =[{14]=kx[# @IAyK^P/;>zHP|e-ߴ @\bqǻrŢcb-sq[XnAmFÑ4HC.w;Wpl|q2f,+E{m1 Aɽ 9@c%/!q-W.-THMS/|_/pe#Y#_oc#,|5J` m~#җoėo[ݫh_+O_ɟjvڳ] nK>׼k}t gziI`#ײ sF|ToQ pP_6A٘9/ژLS;7^@gqMnt@F<G藡BdDə\!2?3}{ *mޟwk ?Eg{ U7ZxH&ЫrLp=H*J*cs:*ikKڒ.¼wv=&Xy1|KSopOȷHǯ]!G^NkejE5 z>Gy84M% JQ;;?Z( Ǹw_0,5o5DF ۓމDzMCdlW \5M7Rc  R uMȲ"A?&yxElTNf{ȀÜ iۙ) Dއ(_éiX.d}72wSt׎?$,)߹9f"r?W锓J(Jpx`) &ϘyËfWؐ q; ]g#,*й9EWKT[`HRTftSe}wxv9HOGz{ĝ1^pg=;cU0/[^I*P83T,H@ xrf$>Ϳ 'Yb0c`,`P&ßA!/J 7* ׏={~|6#'ʩc"0_7pKgK9Le)PъƌP./[@bqvHKqL-P`DGԶl!KbNl(i@r' *|`ޙrMn%kƳ);DĊEiqs:KvȂ4\La4 ަsԦm!5(/vM!O],9v6줖ILA 8~^ߐfct0[xmQ;!Ql=\λ$Z|<{IJ}072,_R9PvBg 34c61e8[WצZpK}X1Ov'7`ڂշrX]i̾pIn׍Ocփ@LX j%4o /Aa]IILFYr Z-Hm+9h 0/HBWxdT'2j*2Mq&\.ϵ5= ym}hKh/{ʚ0QhRs)ߩ&߱o?x盛skߗTU,Ƨ8ƽn*煓TOVT?KA 2"}jRުU|֨[ݯU[Rk7%/ Vko aM< kRԛ_iUš%_Wq/\?Bx9ccc$cCQnk7M7jy衧 ]3:-Nky3_i%;ó}n: 9V3 rv~_;kx:kw >(kwg>kw߽q~?_;iRX;c?h+umήr |UcvA"Dw^{KK>vy٧]a\}K^HcK:W+yߝl'w~}9 &rHGJOyA)kԚ Z: tH$ZjUhaI:ôtO| F&}Qk 9~EJ )g_/C1zMšO$ _o(m)p#4zj=5%I%=\<%5Fq~RI5"SXiTRi44x'9:9]n&U_EUJAR]'(7|*\W>Ս؛;h&s)_T}_PB"wUq,0iA[gp~O{j ֖ԓ ږ ҬQ}V _. roB3jI5N <38+WbJ^qDŽ7Zk~'3Ё7=٬1$+;+#tK2߬l5I;A=×ɓ{SCK . lٽY>9OW6 ῇ">@|b`Xg 9@wI6mQ zw ğ=wW1Pv! :Žiz;n׭Ιn۴G77pPڈBN ~gӲz<-$2nX)se0\f,B&HB|Imohlp\q3躈[5KaAyr'K|./I]0^욤r`1z7%c .op8) v {WUC]ybg6UrN_ӱlȭ$rHDx{^k_[Wq~?ynsBǵ2._4E=Ihx~gBùgh(n=<Li͸NƉoxɫHiT?= pvjy>r<Gp6n|?j5, , B[c'PW#'PԄb&h!ta0o #ohXvq;={wK1D UE{rYDwIҥEI-}t @a@pQ$rۡ;.Ma8{:9KG'eKNh4=Db Y-h8Czv%^o&$E'|Lwgtua*^;1NLe, >(^14~/I̗EpJsZz0n}@j ZYܡk2,p6h_Žyc{~IYuQa}ZnJH }:=t;DHǚҤC\mD2:l*z(zi)τ4ۆNԂ1ұK &4o&^$)_(R`G4B2E/Ig*/ėCu|Iu|? Mht|s&/NM|6|M.{j#qG\I]%͒gx-V?wtPD0YjK{;&gfh^f8S#@D4r⥵c.^%hd!vuvuk;:]:^g&mp03~Zg34XpuƔ:5ٮsٮs <T0X.:޺ghgPW1ҥZ;#AM񛃟+~"zR¬mhT9Iclclc`UC/WsFVjl JVJ 9?iΪзgIF0V(U)KꧣLS8+t6=S8)ҷXJ>pJq"iaC9V|ҏ] ǀg;I2p=O$X6Izsޙ?Sl Ǚ>NÁ~P5l7Bꆡ0d͑OO1KXVXHI? ۏuJRE$M@Ñ*hJ0 mvrk[g[ L 0f?iL8`3h)i pƿۏH@!jl*C޶$u$-Xئ NC1 >-f9bPq`(|ULvB] ).39Tbnpzwh܃s&Jۛ{`aEqT%$4o~{L -28hk|0^0ݦ]NL{vaz (zEOKĹ6p4p?bAC,em߯M=̷kSzLk%10rjG0]aw棑kێeEfq>_݇n T!S9_XҪ3%tMM " SIe _-z- hN^"G0c"gPFP0;6F|IO/HeOin/CK^PG~ L juR %xe(OnϬ&~=t{zM3"(s3k-iD#X{oޛ ѩFY6YfP/~~>kj >M2fC5 sMV{iXrk!ZHWΫKhg? ?KmSsTkk~Jk*>N?Bs^apaF+ίuE]Gu\gպ8*xR +-sFF_GF_L.QQ:*8}^?M{1f +qwh\ k+ ?D#zR%._*Ii|(8>= 98s!m_aεOTු/|rQI'l^;Zp?4AJ-oH3c̋Kv<"Xr#YiZJƍ=NHhׇsÆ#/`4YOsB5RPwKűS;ۥփN?RKm3\?y%1.U3{_6nc\wsԽ V_^=>+m)]`\HU{Zz9^;*zE}E ۚe/AvÓQ#UWԐ^Í0\Drlq=/ 5֘P_WP?HpK߄}T8(?NHh@X8H ȁԄ'ue&|(JO?!'t'b}`Wȯ s|""$aI{nFEz.7 aϠ /3h]|'V7|{xCl{Cp ډ7>0*R. ,uy Xƭ77t&M8I5̓_NSgϧѱWc{Nױ= ~]VMLGL﫧W˟^d1We`G Sk*au$eLʓ4F957I=rë́YDZXNLt,k/0k LRcg|Kȼ3j$Yv5,2I3'swOfMezPr~4*|,^Cx{BuGAE@S0$}Wmn ˆڲl ;Bg8iᰡ,c s2q8g},kzjM 6y8 @BPu -:q:ԇ}^/UJXzҡtDOdPw%FR׸*R,83L8Γ6I #lNc~8NpdyŠ#ixUG-Gk!%b,IH$4@g6!cgY@@Nu :{kdSZK) hѫ'5TNӶ'$m3"ǘĎᦵ:iM({IpYH$N\G \ݬ%K!<*[[ {Usx&ئC;8-Rℽyn8ʒmbatuʌӇZX-?FGpxaX06ZD]g(Qs4OhVXᗀp]efLSegM/0aU kMj*״2*PYGJf7O# {u:>;tryTy;rQeMӓOwA}Qi*AZV(Sc)h{]Pq1Vπ (fB%k5@ٓ=pwӿJjTxH}3 A+jc*#@Gҙ ]_rq ë`;+m:L[]/oP]R$|wxDř tjtR_|6TT{u/e09Jgltӭ䘂AtZ'jY-ֽoHg ) {:hkbvZW{E{8lU740ý+Y@JiNUD 4W{t#=݃95}C.hN %l8ޟ!FW^"Z={ڴo]wxP@z,vJЛb{VKP|Wxw'p (:+b{gR%eӽ/{J}5t &$mM#\FG+pB%fG6/DEHc,F t!@v` ;x&`K Ƈ6y3"T1.lL*N~B5} ;"3#x5l.y( L1PFsqW'9.u%u|>9al&UVQSD:<y1`VQ+!GZ̛M<p"($goO>)NO_ԇ~64zX=5xnR+lY)X`*ٕyqЧG>-)@?BS!F'!.p9\ FnpOl,)yZ4[=@VlG>\Pje@'K˙rݨIna9?jD=uO:Z$Iݞj]r{~|㡲y9Yg[Y.ѿe*v=7NF7v. gh~2;dsĒPkmkE3˸0P]{OL[݈h[Ge=dn MDl %wR4]ڨoS,6-m$%uҰh  X& r48tF+U3:]1Mi45I:Tf#I_j <-}%;`ڔvS Ɇy{^dJnlf>9YXAN i3t,'Esf4}6ޭ;Q7WӨ/D&:Bux$θ_L|4gEOSڞENBn h`=*Ug7t׀޸:Vj'Hݹ,ZAḣcj[sTt 6tyR~R(Ng 3JgdGe=|L}q _NЛ|jy?g&هKQTDCO^:PpblC:n֮:k)22t JZ-jެg oz77dfSj4ijƖx[ÚҨÊlooo _TƱU %ųf%`RE+0ܒdeh.PիX_R*)dK ސiJ%իB8*b@KjJ%ի#!!n b@KjJ%Dዂ8ʖ$l4~֨[`*׬65.zC<Z]NtHB ^bælmVeAlUV CIct 1.(Юq+ͺ@, ~#ȆTÆYګWŷz* AwlEB -ٞ%Fךf1ĸ bJENeU6C o6gKml̸_( c[\ïx`kK aXWr&굪xAC6H  "AZ rYTj10խ0 277UHP |*$%ުg T+^ЬKN(o5%cr*/Xj1KT H^]mIZķJUUHl[.jUQڔhZV]zC@%FOMcIMiT$i,i4zjyۚTdOFOMcIMcq~RQ"FXLcIMcIMcq~RQ&7xi,ix'` ^ɯ f! Ӱ\XzUHu?#-ITV>l7[(wje@tYc; o4Z Ɨۉh  9rժrkjE7њ.wtZM6T%ǯV.1oO@PrC|耤&BNV39\SH.JCQz]2J V< 9߂r= hF(gUcFmlm$ VT 9oTWF$"(F%7)2k@-M5BI -ؔ6ܭ,1wIyʛr!/." -1ՠL4By*C NH&oA=R 5*l8ʺbh۲4"w9`A5sT#uI5U?jdF)2@g/>UӍT+ UguA2z"SXRXiT=i,i4->I*F'S4O*F4x'!g􈙘9wc߻o׻E/+;|~eIwTF~/M.yyt>w0|?9ʉHW ~<|]ӫhC?g(bmw"zpw12.C Н~2Xr8NWTVq8]~St)C2cn~ ڑLm愠BFf)!CwNי!֙!~XfSB.-DvV)I!9!9!9!9!9!9!9!9!fG焰N:'}9![sBi_1VNu҆u҆u҆u҆u҆u҆uIk uIaS:\fv񧕬9Xǟ:E1 efyPmAr.Yf`m?gO5yY{˚OF6&фβ'dWWDt+OC=\K4p 8- KO7C?äHzJt3 %xbl0(zſtIy9;EShI UCv6G0kХ8ujm"E] L)Jhd j"h ѝ\q*aS*nc3~;:*mk4GY۞.7MN~c2Gw:jUBw?=h?I{װgxQ/N3F&آ.uߪ( \"`wc<<-r%ߓl? >ÝGj"SwgxdQs{hFۦۻKL! T$;"Iz"y 15u($uʵ7ʫÁ<5Mƿ/wnۼ\.Bcw{3h`9g7-½_S0Tl#~EO>aP9v>;Rs` En*ۘ!,h)y%p@(D xJGcW`9VJ<]Ji_qRIrͧ7dׁXz4gl0a8i%,8 CK&`Bp|{r>u'NsHed=8oԴ= 7{cݭqˁHDfZUɓ3rnF$v8[>tw.;ie*M`1c:{:QΒNظz'CG2‹`'ݥ-Qp>QԵYfdl/ F=|p&3by2̄V鞌|Ykg˾7SXf<s1HپGQokBI|sWH+ rn[Q1xҼ,arB:4^e@|D֨>;h-W6wZgB"K|zmٵ8.T*<Eqc 2.CcWNwA.wkܟgz#*>.;,E ꧻB0bv{ :Mx˓Lj&\Ԁ5&ig'k!o,w$o֍ b3NVCeozz  S˛Tߗc\16R*/][{~\ *]d?p)zQǜ-?euKb5B|F "~#Zf:]vǑ!b4xTuQ9=JfXh4I5q\lNM`'כqhۥ7d4#-_I)ڥä3n_t, SB6ep8H"RJ|'!L! d_N̄VEY&rp Q)<0Of)(3y%8I"hjg.ZKXZ$ vV_b(  d/I.l~8(Ƀ4WOa&E5b+h1-M!L5ʛS4;oO_ԃ>˅*I{o_HEqV^TSdWDלy"4r9AomHoNptgssiۈs{.) "6=X\Q.& U;hS=6Qr6:!mwQ[,0~5NKgX^0dnj*Ob+{<$w3q5:i+r%ԎsPG,ץ0nƂHgp,[Uq^Sgq95|B_CernhsNK‡F,(_l '-"a6VȻ{Աorlcoz_}4bRvWAPtI)RKHH뎽v&NkHSlkɝ#k{9~RHh.}a`fA[#! Sq8>E(Ѳlkf0ĕnnPeS]W\[GƑaҫѫWtJͪKj/ e\ COo0&BEzn[E%Y GTg=]Q~ȤK@]"q6b$uƚMR657AyEE1>OnxBrt<y"U ri)JkA0.1mtjt Z?Тrcn+v@b~1f8KN!5a+“.(eX2 2x`/Ȣ)qx9BҌCde! w\E{rTg,}<`fj4a nfב C/ 8 %!# ?2þ^ٿb pon]J 37iF¶<^WMwl ^Ђ{Q?q7ؑ=tf$̉Mݙ]kȉ=ypJ5(wo+ <3.3ܪ{^ xzap\& w4P]u !?'yYKCJ㷔1BLl%=B%uβAtQxhq@g3N0DGLDt/G /_$g _a0|-oۓ0qQAd͌5u%l6g'P߼-ܷ9x򤮐#J"8tޫ(Bsa]íftx l+/]yqEcQ{3qI!uGHÉ8 j! Თ{ y7;pctWQ%OC(?%Hb<0&e_x3D[)ާwE֍veBE'ᒰ5>NEvA;c":ek,'sc՚F#3R?x1x/^hbS 2J_R DS\> i'44ß>,;%,/&sK'5|q5#:9%d!7.W.цuk)XpFdYE1NN'96 Z[d 85O8v1 .c2ġR6O#pDR啬A+~wV}^.s Ps/9/!zXߌ Pg ,,sa(PUUB1:Ӡeqܣ8{3 ̙C5e/5SPz"UmBy'|AeLdLTx030Rۖz[~Ro+cs1R %ېZknÜ% bF֜&0LSP$MyKDOk6&K S̏ih6~̰*DgBLDȈGzArl@t ) 8ؙǜ_ᙯ6T<̑;6X;ԓ|{kT>E/#%'jq@>x5kj˄EA*jdC0zAC$2  T.m318 y*ڑbUX991nX2^2܌oXZJlcCu@2JP}\:a'a#S:*>h>A#w@;Fی` ^hx߻DFCftp~K H,<1| 2T ;u44eb }[,!*wjXV09j9jCs+@3[*ix(3;*1l1;i@8 [ nUDуmmڸЪʦ6olRۑ[lsK.b3| VǾ MZbagD32ߌhgt舷s8kG#m:hpf L, upVsٝt5 @v?ghlkE5)ebÛ>`@Q1^r]U>/@,@_A$p fYϸ_?pb:91c>u]wK1L] [zN?GBs4Gc>fBNːaJ+L̹U@9ܪԡivZGT J)wt;(6;E/K:t5@˺6$->^P[.HmwzCN Ti;t0/- #Ȟ羸kd\'$ej{Zmi2.tpֻw| ͏KoO]?z]i[@ ?3Xg1dS*-??ݲdw"^K@%ݟdߺߨU-])=YDO #4Sr!U'V\˅,2ah)"ŦΔH\Ȅ_az">' :%TpZ"|ԁ:С*#wN܇ɵWKզ/;t'Mun@u˸9wG >}`a,QHc"зm+R#ZKwqk%%p|Sfog];j bǂӢ[P/!Fj61|WuK CdÓ@O*ICw4˫%U s]<Igu7Yx~E3);Q/2̃U?eY9m-qCQ d0K,s%eQF7h1(z2P^^F*(3ahDb-e3SGf#ųD GewXv}%RXk~k~Y'?_yZ`WU|υ|ŒB_11pJuh?luhuhuhuhuhuhuh?ۢ\[[[[[{ on= Q\&jٰLmx|Rn#Sʬ,:^3dVuhk}Z뵦RT J:_uYǥODOۤA׏'G7<|~-^)zH% ΅tähpxNڏZ]\Xb])S{6W^CTĹfr>yH1Y vt?,.C1*;dj7D$D[=k&x,:91T}UW;TQiń#a-z!+sHs0͏/^_jM~c,p2ĄN*ay㚗Ҟ8g4FBP&RKd- eO\{8@Nb0BPci{ޒTW&LS7TB4h0j@S^hWm8OЕ1JbGQwBŰk7d(,'ӪnOz“4shG9q,;+]hh VRk@hT eVIRE]`v}]&fj(=^4Xz:MF=taƽ0 Ძw4d\DR]jSca C Zᆁy>("8]bvgH)>U\q̺ޠ7u`u.-#tlr-;kv1h~'Dhˊ.%IrUrsӖ ڥ_ps S$uzYzϐH3 n.[Bmc9fpjXcb`*o48փ1<ƁRG8!rGoU=4*eE5rxXްs]:K3!7k> If}%XffH0^̇vVs7 "]y9 &)ˮt'D`4wwlz썣v 3 @>[rL+܍YbA}M-y sV5}HfnGuldgs;kw,Cmg'?k/gY0 pZ'u:0| #htN1Z`hm:CZ:C;oahAAR5aӃG.©siM|ecq5Y+nn."Xx({J38%yb!]tz|86Q,=P6-9Dw>nqQ#,/pHc4[ ӳ䆝VI!0Z$@X{hb 0! 30 a]OIΥ#K:2qb)Ro$9\5W/5Oi EGFرIEj0Bճa?uلEcK w: 3{ŋJ&%c'w,$?Q!xjک $.2=K˛[~2ncQdgto`П&P.` S=(_HE\40 v{}9 t`k//׽ÊDyy5t_{W54,F: @T> m}}>.QL)c? H%% Daفp]  -͕9!'>zWz%򤤜džQbAfu,#{UIPi:̜1c9ʬ?zw+!ƮOi96F@a"mNFq4_3+14'W: ѩ< @{yS4=! e3;hvަzu:S(m#c D <⩂%яp$ǼL*ig͗.zB 'pwtE ST3aj8f*UU_f^wqQIztM˛Aoh?? 囮cw!UKN`3AX:1兂ji>.{њ\7p3Q=^^I\aCatXcbld.!|±/E]TÙ WՆhRfK8 7ѕ< $X_"/9A+;/LO\Ph*r9>я$N"^%/hO)pѤ3AS5YY[D|1}yˇQ1|bAIjxxqx=(R=ccrV,T?9-XYҘ+)3`l S{L?$,z܁IP   CFeNXp{gZ$5Ƿpd5W(pGU?H^Y>^ ('M(c\ŀkJ ,1s.(PFswtBK(6:MxG\*嵮=3$EƱ/wa}I(@RI\czn\-VUQZ[W$]#y#\{ k\jʻfJ"qeOTr4.!>e3sP2)""IG?n1CG-xS@,]")fR5EMFq&Y'H"@q OQ3yQ >ڲ H0._F2M4ǽbo`ɳ Apq"JqlŞ;{yX܍{f;[pB6MІ=yxx5-ƨc1 6Su5&ERxX]9w Zhw!vܓx7ۓalײ É ?Q`9P;i [hz `8 bs.ٯ٫<"JuxDwNZ@{DwV5TRP+^{]{̋ʝFAx; i.p9zK9*1G937 (pj\ źnhPu2%pAhx湁= <(evH> hc)#@h V'{W8d]FEYC&!ԣVrlgѦxPjeECCg'+NNM7uݻ#l1λ++H/XWLi~t i<"Hv~jNrȃ4k/gK U ]G2{$WOڍV˽ojapPw4Ӈ MUNfWG#^9oH)gg8E*ނdl#pŢY~iVVҌ;z=!KX"xe+Aoj_`Y\ WKdl僳r+;NYY@ mخ=`f{糝" j pe[fx@+\k٧)ko`ս!CQp,z\&x.|3%nAW V@pncKr%5qjzy6gOG3h`Xy uXHI:sltOEZK=x"%n>]4UVcuNSRhb'2'$U# uTL$UMH u&Ir-P$m[X}VC$< "] p597Sבis/4DpL4/H'z:= rU r X5&'\cPVXUWۖ<X /'T99՝y:yH=՝TwSlZa_2\sa#$m8=Ucw'3/钗읞np -:D[@V& Wh]Ե:gmyދꅲ^UOB`z(Wej^\~8m:MJZ  7'|s@YZUށ5!K]UAڏ|ib*t L8)99<͘aBqZt/ձT,}Z;5u cөYDj\#k5F (4UzZ 4yѐkk;sbp:nuUK,+^X%I/uIT@ _sq`yX 5TXR=V$/YªU* 3~]/B4l% U-ji17{^(JQc  u^ЄÓP4-W솠0I ,:=5qrijpU[\YIPkp!7Lac ͪTRkrZX[R jKK60l2a(ZԫMnVncRv5ߨsGꍪ舿Ceّ62:YLi Ψx" *}0:h mT#VIJG"ʷKY:`+2> .(%&s'a\ WqE珉-i: yas!G峾"T`~b'U8Kݝɨ//=sʹ7PFJ8_P[􀈋mx19Kæe;۰L%f@QGnxi)#69ݱHY^.nהhS)DyD̥2f3[I'Cs~Jر ({y;;;Q>T'%հk*>.(?~LtE ʔ)ZJ$) ZÁ]# $̀*5)'˿qv1˧|Q HxSnCԈ8M6plT rŠ]+ _]苮 9F|M˨p-Z\]RcJ%}agK7IBbd P)$UB&x$Czq/#$1>'#g_uDfeKC?2^8 ɻKDoLU,g;,vyf9ɡY8fYN!ne(ۧcJs?ZYe7KO8 |oZQIOobF< dQ䄇ՅqQ[7A a|i0`t8eǰ}]c} Gf$cH(ȥiM􎗽MS,e}6N%Hw_sKr.QӾCVLH}r`}drdߓdR9 Ŀ[ۧ91~{J'S&Nd8/}~I\ljZ^uvuvfXfJTWyJ|tDwciO2l1l\q2c)BA3ccGzY26(儱{ʎ_:a#p>5VSzQ, W'E+w2W9-y5Ofts\KXm陟ޙMꄶ%hRxDQi*_AjR' 50K(3&})'RBHQR,.BD8raKIw3*f7n6c֏F(._=`p#j/? !+iE ĸnB!?p'JZ)ؐpW7 NKg!-nW* wuPh,E3$d/ يzRǧ+AhyɁE2$2DV(2Sp!aSο\r.0|\<Ͽ" jőǝb IO3+&JfG-)HArnѝp+3/ȗK&U1 990IO.BCܚ)N xkjbk`i\d,HђOFrztbm,U֙X$,K4*|EVM W_*IT8g(l2SFTF9LR78(\=O(̧ ͑OhLXr܊U~wV6]{Osg`OвPY8S3ϸ:{wv ;5Umydcy'.Iuo|#P}x99rPJ27өrfK*qN&y m8rl5sфԌ?$f*r* +Ndd#7f2mB'@Ll3S7oX-58~,!o8Z3}Es6HRg}aGbi>>!Sjʆg}:s 7Q/w=J\Tk2JD@[)PLMh)P(JR+36,4B(ReMy6,YUtPuT?~ދOX)\PGx8x6[ufDg7mO1**<M JOY+6#^P@|Tm2”= }+BKfVXӶ֏{/t2!_jiD`8Dی\T<6|{Fo7w/5EeNr@|&8!>=w arf()S/Kԇ&z D7J d[9`Yu9>a9Xpg_%<(zoPdnqk,d%)g b eCʥD8Vh)R:3C*K0ʛE=<urJW Sfmulr$^S,d&҄fd9" W<îQ]ޠCs$R: = g\ ']"UC TW h] :iyQq3ƒ~p+gr?[*Sǭt65יy:\g?"GʒX%b"Y.uodI|{ i(ވNw 4l2:c,LphfO}'NlgnV vuM/,1[i>phWё:{SXۻf>;008y^⊪jZä5ryB9" ީ'oDG3#K"o7OXőE>ra#SZ'M$qdɤ48KSMI Hh0yqmIO?SXy d4/Nj.hBg4$@*2'_2=<`Q[]>TJ}6q04Q2D&aIdoYȜnG)w"?Xd tF.c1!9 L9_|>(2A@ IUe;v0]Lb ԪKon7ܖ9J)z y%X3K'7$gH'\rT`7x],R??c8ˆ00S%.ޫk^t0Nd564C;!dq|?/Lvv L r co_!Le,Iqz#dTxJ>+[a)zт؍J_9hWaR&אt>?%v0o`RH~8N7(7FXVpI~OJi Qi?Ki>OT~h{O8s(߰D%)K\ޏL0`+O32~ 78yxF§)d.7;+@p40܌Q \OB? }K{ 3 { i\]7\?F>ygҭ'&'G 8%M_og: SvdK88?FPx  HB5C)ⅧPI9{9`7PWuzl{2#k]DtZ~Ʒ8^6.IE9Gg-@<h 0$ ^Mݜ,ZGWvI53[Q$'"YB&RPFUZ3UTOK]4`edHRi?lgoVlŤml+!vZ$9OKPxq/JqLBŞNB*F9O2s:k;{L:ǘyz}:YLQ4`—޽L"|8F^iqJ2Χ]ibz&ɨm[D`h]W/oM)ZOON͊sHT3C"I82X8B*V9̫fUC7"=*3k{rz_Sv B,d8΢AJSkE۫;"jإPk iL:b,ZV%2G7eo0p4ӱ@۟t/EP'[i4ap,5e=%p@40!;zxTƛF}z"A]Yܡ=ɥ_JŻ%/|K+x_yC*$\φԪ@"!^E|Q#Ut Jؕ}-n'a~\[nztlIp%V&l(R ޱH W…Z˶y0ܮ>C{ h ]t<.w!@k(Uj:a&9|< V`$\L s"80~EiaP}{U\Z>߈xVw(n<&fJ"˦J(" hܠ`jOwVHy-ry8qvb,7(7ra.8_^aFC+hZdksnB4ME1;&8#tGN{7Y%hnjbV((H,ՂM?-w.51*"]jiOS(VfA3dYۓ2dඏ1[LpLsɶZxkK韶?lvitrmƦWyޅct@%:R*3 g0ž RFpS#wFIl/_мpZ6KlcRc>~M!c}I6٤yk3U"Jzm"Bkd7Ayjf_O~c)̽C%;JRCQ›y.̱*?2qURj3l#^ٳ\{Y5|DDk;wb-5+Jd0Ɵ̸d q_OEk͠ahf_hj 9Ƒ"̆1X,FŠ˕m[ :X*S="l0Hڤxͷ~yYR+kˍZPAއjԁV F[r[@;&7=? ec>vcLCwQRA* k? }Un^h:[Y9FTĪFR+R9\}36~C5(2;SNE jǾʨFJn?GVhNwQ"Z_Sx#Q+&C@I /|*>V GkpI;B'{ DB;8` =~b[:hwHhwp d؏N2$59,J&bY bi/FХ<2:q;,u2K‹ p + SN|9/>1G{ctao*i5 xnX!h fL713^ꔊ&hMJ!1t$?VaPQR-=L~׽_:g0 %ht,ie^PY|tIW<^l]Pl|яJx>ڝJA c5v{e|'O6g'F 8gh@cv¬=ixGM;:w4-m WYr8@A@J `|EJ:>f1)LJ5>}7R8ih}h '#*3,~ *C1Nos'&) XݭYfIVt',gd>CA'D)U>=O!Gn O𗗻k|Q_EI@\ u.:AD.-K.u%5 2 0ړ.G==w'Acs3WcHbb @[$ѻ9nQ92g3*~E4q1Xʶ N0/<>6N iˌU'8o㈘3 /:5~†-5#ߣsZa4l\'LrD=k}$\qߘ˳IXgRE^!j)LvJ^2ivŁ8Ђ䥱<ԵGʽVL:9.<,h CĊ1sg_Í*lyU m%y8H!pFtDu8[̼Q (T.+^M`Rwՙ8l3OPr{Xܐ"wLIk(M[@SVܓS(w/8Lw2] a~]E2Hp8UAL1C!;-".JT#WއxFvAHqxϯRF! DȔ >(o7(9vBcjxaWqsiF7(Fĕ4#lv]#dv_uL ]{Ǟ\ni1OK4 ;+lѐK>e)p=hz0l6yp%\<,N]ݱp$W;# /b^C_$8T]DŽJ0􁁉]'#sꏪI)hMpHwAۀ9Eoc'"&̠&$ҋ \K͐b75Td]`ŸKo|y3F̊Zc>|ƽ~I탷3 ݇"hnp`)Fu|魨/\. pvdbzJ1 zw!{{L^ G^b!מ2O 1+9g&Եڜ|H teh?.ϓ ]۹(u'`=}yzP SG6߹?'IU$V}\ݢkDJ+ 9k$ sI#IYeOH|[-،0V:hZwUo!F`qǢݱh7u|au/cp2x\Bv:U\F(Zmhh3ڂ6,[pe7-uS32_^3ˎ ƒ ZflY*NfV<46l6a;պM]  ^ -sMH/im\ԂrH ^r̙=kopE.מَ=:zYd9,7-@x\|U4Ԭ6 A6Dz^ί? [F47LUOSV@L*4VH_h _P;YoLgn~w/\MsXpe97Z [LpU I@YfZB;F9d.H`"4l hh[՚xMZ>Y?j-eV߫8?.RYl D9 ȥ= a.g6&/&#kZ6r-΋l?vE ,mOqL&qaLS8IJqa}!Bw~!>f L *aICVOeD6X[-`l(C*g=&p'm g^w"&:οWo4*uqˏ3`0<2/n93[ER{Lx罫l4S8rjBqK\!qv rfz:-F{7g1Z#Ccw\;~;CqAj,$Vh-.އhNh3$Ig$Ij\QH ds3C; S{0%z\ZD8OȌ$y0syCYԶu@a=]_'^PdSWa}_{w`eO &ӆd'U: @6X$DqZ}OHFv}$w`.G ם!OOr{GULkƑqNSw^"('4Ğ$ $M> ;])ǪqzRRB=\ 1VO6?XIJO{ueڨӗVkxiֶA@)*jʀ_j .]Ar}+uVkKW*=ku4ƭYr_aՠ՚Ͱ&,YaU Y2x/|9 z6KC> {;(ַ䗦(MQ_z Jך|-#=7D( *(eBjH|QYot]xOH)xXenǻ?I,Cڢ,kS *iYl6; u5*$1>E0L=*ꗤ >iBam{W85K_;3XV{w*u:݇[do֋#hMrF>Vy6Oc+#Y[D[`+Z0.;R<3!U148O^NxUM5~eBU>Rj01\vt/^ 9soO*`S/bn=8؏0z}H "R >I24-/"Yl շ*a fKΓxjϝ_jRٟG7ަS0PXܐD+h h V3?LugpݾdxuGtu&nQ61 ¤mFd"VZt1J =P$GydcrxSp; nmN€}cu~G{{9y D$_pH 6\znQ#NGb~,bJ+q$=,6bJ'y`[ bsջ$6p!`9c1!mD m]:3wOO@B ̶=BmDR)aE֘zaB9T=tކg3c@^1#YyOVvA66`O\M'-+B._h .,ܡmyNf@r4ƋP= \ZƐD &\̶%K1^ w֦2+4yΙr׏mb20d.6ZBNaXPjyIR-Ro*)z NdXbXc Wy$,I;wU6 Г8gz3a\KEh,["v4泣ٓ'mig2 * p 5ûk&Pp@L 6%k:9h*d!i*(6" ֬sTdhCWfBac#, ʵ-4\ҀrӯLP-W+h4 4rTQGl;fhBro4EmApLą inmٲ,퓶YuJQS?g%3g2,!K=rXB#"hIA#(9)Ic]|GIi;L†ԡF5jN޼ۦp:µnqV6%2/ j ?&I]e䧛PB;1Wp5N:̘ᬟp: jY{!]'9r.=i/ -><,0VNmzXXXfhE=Pd>qE_hӱZ+co_̱:]Icψ .omɹ7M,2b d .E&.L~ۘd헩=RYGikIC/`&&oMհ)ET*Fc6˱tɦp}Sa"Bwx ܊w26mi_j5yod?g[ubF [eop9898? Hk}Dh;9I.h-*XP&4D;&H #2@CíK!U$x uDZ*^ƬΦ8ٟ}j2z\vDC\"ٟ?߇Oy(aw O?T?3*P-`CgMq#,ɣs*BVFT!X6nB>. ';ڻeAwj-x h&bax6@|Z0RVuv+7"Dwl;nXRfl5rL; 1Ӷ.F~&F؆&& ߝaG)+0: إ1 @j.2X!&fk&CQZbhP%'ǁ{eNj^CU;O * Ƕ"~`2N_nI G(Y/%_[}~ Tx EvHl1l;Os |h[x{ØqYoh1'97:ÍP g//yew3Mr6D=>C[7沴q :i{BPʽ+ްF~<*0/T뗦R؊ʽ6Mg/{suj=);^NSIkHkhd};t)EۭC!fa1 bд<&^kQ,G!vIJrI5Mx$BxO *I0(s0O@tԭ 1W xD^d udb[g6V{kB㴷ᑳ'Q)a]f̦Y$bh5aiVmO!VXd^.Jg:fnx4aȻ!78P2%!!ӓC䀰Tn;vpAGq߅w< LDw yX,Ue6(Q4q㋃Q"ے0ɯqzL{Un=uO@8 eFw#8%WeWzmjQxJ2JdF_oJ~^9aߞ~ 2}KSzJX^^ {z%GJue _FoËy_?2MZyp&/ܢO?NnlptcA&Jb 'C!0(L{c#/%i/0(s >&2B evNK[~ao*0. /pq ssOOi<ؘ*TC?I7j-_$G+Wu@.zkkZ嗳HQ@'e pj pl ?Q׷lxK"ÌИ F Q̱CMk̦GkSŵ)`:?J j@X&a-I@ڢISK{B.J+:}dvl0(@o5faP9{wn^ vf 0M8mڤ>k〵qq@KlV3@O5)`8 XĤ`?ȴ@eֆ^;m`p8JPTh<0-ݴ@/c[p8mڶ`mSe1,HɭbX',`W{3(^ӌ 05ej' ;f#n{3 Jr`CaxSZ&ӒlDl;,RAkC!am!ߩ重Fc,WO GNukE]%7k)qEe>ݎ߭R\/pn(-/J] y;NUug}ʨ> o%PAuMQ5FIitݟ_#(q\c4r:;%\pu|-EU`V/Wo2ӉL8m"%<1ic,>,_B_TP`6ɦpNy;} R!eܚo3o$Z戟i"^absFײ]<$lu{Pl}}E+)r2w낷bR%~ԑN<e0G$`~N(Vꋭ+> ]SAmc+g'w&i 6~czJ1c1L!XoV_@bꆐL$AvYDfU2c+P$&Ms(?tTq@ D`gN!>??9yik0ay* rZ:%}S5NQ8Jh~.{V3))K믝n(3+iL㼳"MW9ЎrFcxr3q/~]Cf|Nl^yVgMmV#rfmvWp IBTJwU!fIZƫ X= T>a`r4\I,m$` ƕ/y?`SH fKIPל5z6Tbڇ~ß[%=JĥxZ!ij*i?jOdZT9{V¹IH5'j01qV*t$YDy֯%"^m+Q*"TO@jR{H[jrSpYǥi/_vRӑnJН(~V,W3%,ytlxx`V9&mqtrt&N6m~8YXsә|81Zt& $]so }ƦrT0E"Yj.O/Zd5ZsiFyCJO hHUU c`%F Ii*>L /#kv0:@u@䟒 bIdO"eŲ ʪl5NCsZm,jH ZzkQo1"qqd>J۞E+d??w8囷/^&ܝ~LUz}ƴ؞ ϧ p,, )urЮqS d-C(,,-*Y,[H"78؆\` Q䕪e? P6dl>Rp\?KV/W}\w˗wINBvDRO4''X` T8MJ{y UH3{W,"ah؈/(~"yi~n7H|u" p^p!ޚ`> w}GF}p == >Ix/"|.8s=IO5)3DBSDD~cA s#M8a@zVFo,f%w9ZD92Fxd'# E#:=rcOςDLRp%t Zn >Rȍ0 Ʉu8Yr_?2um>ۋX] BŠhһ\'}ifi߲֟EJ{[>gBl o.0;"UőD~mQa|pV-o+f 싉Ÿo]ֽN8WUJ;'*yXou6Q/Z8"wnA3 &)\:ēWPg@?x_);܀pl[t㾵 .,22V$WVrAϚJk#Kݓak7{P馸AQݒA?TV9n/7j[^V(["Tʕ@M%if^T_Q4/W+q\-tkFJ\̫,JZؽOJ{~k*>.GB{4]0Z jC%G%eQZл$Յѷ~¾*-pg4}dŰxݎc`(vQbܴwDY`kQiI\Z NHmJ{K>Ͽy:yre 3ZD|JrfL%oeO B !B叒!E4PQ 1(vEȖ ظdn7UM1aF:FPc8Z z~\Rkje-])|G!87\Eoe(kO,Notg3Ng:ůPq-a^KN yx-ĉdE1J EL `(## |+% L[tO9B̂t2["aK>Kiw[<[k.a&I$N\|-u5ÅG6GrCPor;~ģDS.k\M6N9")IQ0wLEÀ.F.ڨAeew xcL驩(!Iw=>^`\5.t5%Ȫ5WRVʺ W ^NL'z7 +k˘!YE\i _{LS}N ӄejN2GVIZ%^s  OeM0 8U2;L Ws;PQtp GXnBzX̕JŌ/41Xh#V’ M_W|j-Dt',-]OBƈce )ݖqrnFcvE3Tf,7tlB쒢!>Vʇ$[i]zb86ohJǶ\oߴ oc󡲻-30#FbDbڇet*I^]X͊IR% B _Ĵp2It?M\+rݼҌ#X'?/NԺȓs7?%YuBv$y<-qq^*b^"Qz+bL,xȚ_Wv?xpoh'fg#OE/ˈiQn.ՙuuR|0aw<^L`ܽJo5m,p-Ͱ=miw[Hy[ҨV]VwpX^BC'@OmKN32=V/et{kʣۢۢy,o}l-=hoN#smɶ~xzmIFg*R.m]6{%)KRƲѬ$E6V0N7'EmPT+FV3-ac^שlI2̎%{L 8b80O= R>,zUZ)-ڻe=PE|En?ۗrwο"M&-5PP] ap:qCc[X-Y~Q|4Nߴ-HHWR jD lm.#f8ڇYO' ݲ-, 20Fx#xKvv^اB*$9-!t<?~n536J2K d(Yqx*,ɷx[@?jkU|\'˷8'IxU鍤ݑu7](Dڵӛi3SHMgGrEQ yad S*1&I C7є0 ܮΞJ-B'3|l}$>{!'цG|X4g/V Qp 7H 5  Pk#SRw}9'K>^;v9#޸2?(. ٻfu7}}iɅV5OQZIo|ݾ$aUBzZ.Ϋ?`y<<3Cy曇`y4>簽qB[r@op={skg%SdtҘF#4lj Knc쬽ia&BfbAI,b(%ɸVļ+} Tc\@D/bKiuNR ^.JVY[l q@V[1W '-=z[N|M~Y|so_I O+A VzzZ{>͉(-$oaE8۾zxDS>Ͱ/dQؘb䗷8d()}x*fh`} v1tstۺ{kI}{F9@=R }}ɉfdy ӻ^> .9 Nd'Uh@k׳O9,Zd IyylT3KFji&3 ."LF?0%LB2YG`#+QJ&4{roBGo2:Xڰ nnY,@찘rYq#e3Gd$(B>u4 H #0/VJK+8q[{)fnr)msKCSHGԲLftߕ<7BVV.laciA{ ) aQA_<_p)(sI .Ӊ:*H9߭i{(q5k0RNR+A5mt4i_&Ӄ  G_!6YA*tG~kG嫷aw=10d(7!/`JͫpW.dBfCtE6a`a"EHV$4|0DsVwL[yc 3+Er:ֱ#?qr[Dus~r;_w/Ѡ~ӽBTl)u(O^Γn+ e^A먵6w^ 715gKhW;n̐'P#]3Koʉ;-J龈R:m ~1pG3|Hsl~t&@p]m֡\20E}+F+UѨ>MiOƃ7컺7(p]<C\+*. o//Fr}iTR Bδ1g|pG+cKyB_xdcb{labF @S 3N-jxO+UC1Ř"ˏJRA4o )гyDTrqjNð0#oLSj[Y%`K svwmΘDiU:&ԅ>OT["Sݡ>>r)d}Ăg8I r8*wشz_l5PP~ͼ:SHR{/S[XtsrjzGA.V^ͮgwSPgRLblRX3BddQ痃]yo굺EyuuibgسW\vLNuHZX?)٪Afk*>.gBDh{&Ya V/Iͯ(%ApDrJ~|؂1.֊^#HJ1:y>K] \Ɨ#h5 wDZA] P6H<^kTRK.SPQ*QSP]0ǽ+J= |]m΅Ogp0XEu;k}?*MuѤԄxyveD33Dڟ lN1N10gNh0zX?B(X3k0vEfƉ,^3 ͎p{Pml1pXn7Dq&Kf0a (GPE6ʀb^gXD1R7pSyxHwÑ`/>Ep9̻8Ȩo_yv|LY̵? XL3h㰍Il,4w}c5#38?TW)B,Rvf{ D]Dn<y]ޠ\x_J)ݦx5 {aK`sw'r#d9jbr'A $Gȃx\`urE$ Gͱ F;+M>@b[q1Ild(h;g7E.t7u3[۹z?=؍b+\GPn245b>+hѨ,*8|U#;8NFhE G!}>¹Nj[4=HYoau^G]z0"hG'SY.Е}Eop[ j:ְvbX;" 7Z|lq?ѰUX$%]|7b"6{L"_9xxu8B&UXUC {B{)ʒ{6cKo˾Ap:o"i~"(7) 5pͯlmlN,)!G hL5a Ђ'0,k0PRݜiĶ<iw RRM!DhIDS~P%FL2v vOm̜͗d%fȤlfM,\. ꔴiAe1+ə DV7YKfIJPCv+e0 qSʚHQd^8m=lm~R?guqto?p(~н0$$evbHf@Oe4DlZt^>w'd?NLmqϘCIJ(W p{-Yt,!gpWp*8%q̡4nEs4mp éŭHLSQ U2\HƆ+-:cuEm_"AHvo53oo$;Ik4 ;J1+:FW fiLZŭ!=*C<)Pmg~qT $7P@1_; ~Jc 'x.k\L^SrS$(Pʾ+ؠCN4fΘcQ 3I_.0=NFl2 Հ^<`h=᝻Rm{!HB@_2%xWmPNOrXW/¹4z\Dfx'F:f3>ӈ:1]2FJ&ʆY%Eq v {W^<7W2?*ҥv:m,`y؁`S'V0,.M>nuj `m P^ʚy.ErThfTИ Bhnjf}EtL-;-Qǿԗr|(_Ӣ@Bh S[FIX%/]"k!ne(vZ/7/zSRo'e"}roX)oK~B>)=~NHtEJL^J^Efo bܭ"'6sZm |_Lq2@œ4póοwb}O؋osRcB~"g}z)( S ?▉)O9Jl7[$FtPȅysx9A2qng X.īH4+ Ɵo ѐy5ZLr/WxJ=怕2bfبǼ19@I,'οϸ 𣦀}H3O>Or0JN [`P H5Duy|6y+,7YI0#h&YFiAִfYbMt,:<>wf'<\'ZJS?8?@  ʼnǿG.f<_}`gϔE1 xMǮoQDlR#M亗7IjZb#Iy'GpA<} ^u g:su 5'> k8Fޏ!9A d`%0`N% cC9Fq,00FQIb_|'u~N"ou*27 *#ZH=Aw];'$!H L޸-fٲttTu%HiӉ)u'N\1Ԋa0P<gڡ7E-+-G J0bl`*F2+&G-TIh /gp1"X,V۬Ʊ5n@1`0`v`v0o@x8f=Ҳ bli[qI)w^⽥#yQ&oQ꽳c9\7ŷfgV3mj]h1 1 x = [n6m0X]ϔ! C#nX t,c& yxCfpޒ#: h:ZLlgs$W*I{6fjwBK"Ҭ_a f0fb,V>353 Rq#AWDImCD 7SfXo𫩅krK>YLw]p@0Yne` { NH@\(Y *MK`$)c1̢:ŗrxW">pB8!ڰ㪵Ws&?uh7k9MU1kZN6N,tcQgbIq/,G@=(SyUwKAeWUǏ:=z7E{M/+2 y_XJ~ݙQ2r:cz!-Lp5Zj!S B#_/lzL.%F@k\*j!jz[FSQmjp6-. %U+ D)_"jj آt#PiQPz]Z֟R?+j::J>.9ug/DZf'U/gH+^@Ou|vߊ oscT~o9Xj~}KOH&||x F`b- 1GQ# 0Os왜kR(` 8|^ed^۵ՀZ`ɑ+PVlЋ3O<-۷S,ae4l6S{wIYim~R6O >Mg=NDʪpxg XVOCUg~4Ҽӽc O\HD]"@teD>$=`fƚe74@/!;NJj!\x䦫 SO"݃AKWG<.Lm K|oVR:-gzRKW(v&@ًy @޽'= 84g wȧ5I9>KnWmg نɼX7eh-f3hR6d@ |= žWYxx|^q7M1f!% d]u__EUzWE L[6_9V>7K :;z<}XD UmC{-,ŋp 9%eb|{~/O- D2d+Zp?D Hb(O[c%2{V6Ž<=#{`s&r~4MQu'~hDƧhu238&7< MĬu~OmQB1d! 5ДdŒ\ q N Qi;t^9^H0ĐbaEבe {C))2s#.No%I7Y%",m Ui%jZ W,#Ō1RC|5s!Ma$|$6=@ RVu">Hi]O7[PG*#Lrڿz,˃DM .2SMTȯj5;@Q>I#)x;K["m@_]*NLv#jnI rQJϦq X8.-g^UPhdv}؞aB$ABDV@5G-FFqo0.Jfvjg0T0G>J <DžShkx W%l҃K>d}j+~kFbH5B#-!e);+KYqW:6miVxVU- 6'%Md$e|>J8H8PO 3[(BaqDœOt/Ƕx9Ne' spFw b<:S8ݷ< ꡯDFESTOk*)Ί’L\Xo.e>0ߦE'fx Bٔe'x{c]hD}H!d[ދwG fJ0$Rڽ>oyTW|[~ӥe!w×~* $LZo;:im4)=ktEPO Gt$/@7 c^1m$F^TßbfGy7myRIwJRs_ zjjì@mfn@w(Kp}2]ݥt}*W),tw|W Vstoן_bJQ SU? QZW yI\9|wG/)WklsuoZRWbQӶ>->h*z$v7ֽSL{?J?qY {ef]o.k- l&Bl$eB݄E {ީS?(4l<?tG@"-۹EŪп>cV$XjW|(k(,): )2zaÝ6c/](A'w @L4xM?=cLMZx?HHWC~]EbRt e˘`7IT D8TlIb'>@+ͮI@-y &J3U P+.O.:6ډBSx,1_ =ʋ<9ʸ39.<"!~o#0C4/it; d(^|{&w(Oxx&2ΤPD0 5c6|ۇʆ>98\_j]K/ HDCXʮ[&?$&{/up8{[`#h쀾>ȵ/lc<f!1]pAەr=ݞTQx?tx/$)LIL(z7(d;1Z_q,2:ݢ^I D&Oy<3rk',;ZǞȕg&:$bVpTOWʉ*&Ͷ̪m^:L[zXs,5ם-ྈ[HqKE(ʥ` =x+פmIJ*-K\;C_Vp;xx:ˊ-B(=vBе< MӖQP]0Q'y ȧL):PyQw LQ*gќ!=dt_,bf4u{$dÅ6UE|:6&`Ƹ^ΉUbi\$8mNI.k S> gsnx]S5ttZ|&y޷ywǖ <]?\ey!q/P\IQ7N&A!uQP}PZo:@YR)Qf}+try[yY2̤+ \yVSݼkf}L:[l=A)-6G2rTg/3 Re؉[BN:<'eB%2i:+]*:3aw*wN콣7C#b%l7(]ckcv+UwH^v- Uyت;j]J^}[۾*Hֵę"k}ZɮZKLuppfZ<  B?nJ2Ο}VrG0N활wA}H tfII@rLjg.6N&1Q4Y?]De(+:eghImj276=06g=VR66>nԔScf.3V%eYhL78rTi{$sX8;0p'*QL)6|^7%TyS<'I#r:)h<}Č #\}2V!+ɵusMu"|uTuաYIULX烐\'[|*9"];7BPw7~tt?qQUS,ִݴ{"LnLO.~,ս9/z_mځ -&MZFb+ƚғ6:?ǃTcK(R6'p0 \xG(0(H?es1"F308$$Df7<1S1Y{Nvy6wX!{3pf|0|,͸sۑ3( LvtF69nOڨ^VrX,Ghǁqnҡk IT #dG y($DuX{Abl6i |UZ:Nn+7R~.6c%A8W9AayQ՟GcxrrT]VW(t)}~4%.G] {O{{k\Ml Idn$\Mo-r<@ȵ.EtK ![_QonT_#a3d,-"FP^> z"ō(թm}z*_Ljq\g2IP&vڭ\+jocէ n![għ%y<㨇 ͔&EYΝdJkW/lME!Yck7fJlr*Ytd*CtC0ݔX['bfEO=3?6ZWm0*.ە t'SsoǛq?d`~_␰@x#]:8+bE;wi`!xԲn$Kr<@Vpt(v՚?ʳGb5dbڽ%!z;R488h}lPI~s1#xi~(b:HHloQ5xNڪ^2/+!c`jx@1jpy(kj?!VeNDŹ$dĠؓ}kZI˨d:w-÷< ܳƺeM5:ҥAZ\&Zԇ2 kBKq^RJ /[2;2q ;1 M4k^Qnո&Lj 3@]8#-nmqc4 <{+]p"\F%$gYB0QX^L, y8S D`N&ۇ"o'N@S5U&%n>rIX@;ΜgfTyć3qbO{a~js9w>>%?UL1Dd΁ɔ[ q48hV5 Ri x'8:3#T(t՚< e8PM2Yx3h~hwO\3\QZfxRo5>0 C2t;Go!PBv_ָ2j1 ysn$^Qr.UH! qxb}/-}uQVZS9xN\y>*u{'о7\.aګg fW䒋MRMUu7NV$e:cHbGvQH]pv@$dx&FSbtSJJTjaA6PyW@H .VI LT%%3ZVK(dɎ*˳=icťU]H|H%jF' :q] '"LڇbKq+_}I~Nˏ`GI63k/1kFt8[@,P8$圾|6;[P:[ Ը-IT]_p/-V%H-%\6ڬ/|r20 Vp@./E: 5V66V hEͬn# jǚ\FM^dWU?DW(1ط6eⶺ¿ %1)2=J%@<:4=wBSᎼ.4U!h,`i;pQ(P8@:<O@w aVXH*aPP+ F.½{ݻC7 ui:NR,DG3SDL\ّɑ`Lp,l¸k> H՚0NÎ:ס/'~.۷oiw0/V*aQqx{ 5mc-vD?Y;Eqػhua zzb85-JieF[Sâ%(\WN~W|f/V"Ɖ1`tm(`KoGfn<#j=)͵hh+`o)`e܉O ,K+&7O`iX f]C.֬.]4SV' <'DF\$4+#Zsq.=a?t)Aє22L|(U(]>^t1ȞX^ jڤWB$U nDoKbEf̌#"TO%_V%䏁}΄@FÐ'@ȵUBQ!'U8{Ax`zdqQbCCF_*o.==@g--WanaqsOG~uM˲.R ث!onl~ o_KWceN~[:"gU/ Kv^ck&yLQ0B$N= fţbIEZ]C5+k?GM uױWaIj:q jFpO-9 SK̯&Sdu ~tiYѼx;"y^jBz39 G`'bd5VΊT߁Ih@{e7pwj%F4҃v5PIl"3=iu1q)!pm[oFz*KYy $HΑ>'dQN}gJXeaTr\.Ц2`:DșW@nPY0Hc `H Vx7Jk-3di_ o+UANlQmg藮*%4IK6֌,qYHIa;-|m j4K;%zUᏇ>: Y<8IVdPY^n3KI+FAߌXOLpebG5p:wVPeS|CV-;\%d5.75.ѓo/kx~+2#֋ko+S2ֻ]@*uYP,+V(4md DWOk/%ϕ7,v::a%$զXI½CMˍbcYZ(cW£Q)EWJaz >5%/q֎%f2fc}{v^"yG3'ryn0`%_*,մJ3̚̚~f-Vu0ɯY@M˜` D8bs.)$+=Neb$ gzf[slf0JYq\-v"XЊ<3";#mAiXȩz;*yChKcLCv-uS䘨k05 =v¦KK IR%Gl"7 K6^m>aO6֊5xP#Լu\)ducvip |_);ogD@%}\.7VBߖ66m[*C%szn4KQ7ujyQ׉;a} gYoVk7~/4Q"_uf_mA`vR`؅ko fNŕžGzx7{R!gqc,wIcn4o#d0F˂wxHAq3$RPȺtMal2۟JcS5*?t. U 5 K9ci4 .9G^rp s>R[ ˪j[Ræ΅}$τ嘇$m~ݻc| ϷBqYަ(a^A(?;ीTz!eodT UE?^ uF! U6*a[EڅD{v#a_@V#BLnz]UKeR"r V/G?h(tfcGlU&z2)+!C N[^L vP=jлƠ%^!ft8v.^Ը߿$Nʹ{ _*3i!{'%DOH>/iY"c}k=n:3c;[3 /2 [ !CҫEEEuל/2|Qwy&}y}y=Zd^"""z5el1^H$a_@7H.Hc)%.:v8 D ^KAAf9i?8zMkz2'|~j8J`] ^x\SKVشf:e r2؋L֣3Y2cF[VX7 xiv ^Wh4N:K^05t2z*0Y V%;78 ǜؘKTF̸F2l k@ld'YwKB:kjU郵s3DX6qFDVUO,9< w G'iQpW mYkX$5|čr-> y:oI zT!6|ma@.*F05vcY}5-@c f^]뷃o՘5<}i|*Qيc׼mm#DH25;LfQ{4@IH"{<Ӻ:Zׂ$O T~G?Tr->5 a[{}>v5B6O.JfzB5 avQh2%^+#'vh#m 2*pD?&20odpU@df̥F~ .dz }_YD;XHJz?eG>#ڙGndx%RV[E9.0*HpM*⥇t&.v˫Wd ,)/ʼnt/VkI^Wl]6_3FJ䱌թPgR}bnZeG+yd`J \GҜL,S]|pA5QHb)Ņvƿꆃa54EӘoPQb 5Vt8[}ӛdi$Si.-7!;;7j@O^F%i!zx&tC ZgcjpBgC&u!qHɃIkGy2bMFN`2Y{4Q%@2wĐCAGOd6 Qm##wISA)z XŰ ÜjڧҊ|ZY9Yhc<RU]DoŨKD2Ԁ$I0jE+WBj.|4 ʚ^NT3!m6Xt.>B7cDrT\%I.L2+.(I]`ysS#u.^p$G !/&1b*ZU!^7[rR:bd:YKٓ4B=7aΛmOWK{2zb(^po̗Z?}@RN$BlVq(L4yq6܉fV2r*ikg VG /_4Dv[ugbXhCc49S@)cdAv'?qK2Zi,m_W:79 =7)ı{i-a?!VHh)%( k>9y A. cpz?LIA޻wȺiYw*G2^yUv#gҾtY-fMR.ey)vB;%ǶvK1C'<ÞoM)׭knq \`2+]Lh‘oZi;#zjX?ju`x p솅 V16מ2>y,kNbckQFӸf0;ɕ2vDQCdLͷ&<7*4N"D8o-5h s^ҳEND<(DA$Vh0Pt40Z/rd]UpXe[j@Qϭ!JhCAd&:h kEdg8C|9CN1=s\ݮBUkB~%'h2&ƃ+1ܹahb]Tʬ0'T[J&.ڨY> }rI0̼3sSv(lJnh/i-am :_҆z V~Ofgf} 0XARCNּĻ` YQHl 3f<5ۘjy‚iEfbG)L0:QF xx%ƜY1sBT9εf~$\I2tؙ11y C0"ͳbǐ`,`#: `E&_ԄR+2)`T(/?'h,&@PCRG2k^Ql6n &EG2TCd: M-ͺ[jc4 ?729t NۨNc7rh sB>H$_;L-;l6 hA4-;1nBTȫ(-y-3viqrY{~ь/j{MOwCAJ]m. :$#aeb7߻ 09Nx6]<*-0*Hj<Ùb JkGB(NRjgX̎7 r(  $<ѕj JQEOF*"tO34Zڅ(ʄ;(2pH@aSJ[4V4?4N'BJ*+dR-֪7 ? XhnwZQ^G YHN؋Vb;Kv\29+r 0zɨ>ui5'C{U=ѡ\e_w0С,%u h5W@wU6g. Z/hG(sL6kqg_2^IdIdM㘶6\8,Oe$3Mb&w784wnQl ̨a e^`&/5e-&;y)B?*uHW}p,' cdʵ<+MMݭIͪ_%|ܡ#|9m}BtШ@㺰HO&@/:d-}&qXٞjx4쵑kbQU~&L3U,tLt?GNyBõST B*="ojәP\FSPݸu +%%7vYtKSF)ë ˽Nl;*N[![Z- nU}m79:Ŝyqi\H*0Xq9޺Bj ?D7Z yg. F56LbH[kuR]@RxM襺/ QUcV}({u]~g."s &RknNL(b_]S X{gurLt{]Hι1GIv6d\ECQub7zPJD˸ ꊔSz7Im^]ޡT2 ahsR ]c73WFT߲}N vJ`DJ;I,g^]x(ӵ& lm\̬ZKl9HneHӔ'h&,V<4qV%̑U9^yb4iS dn4! '"2F[On40W^ӌ UE({kt>Ҡ 6#洸y($hy-*0hW伡UcUܬ$̤'cvĊaMܔ6:?(*MwB+C0KM;Z6)f9{RPe64}HaF19 h ='I*@8{ ӭۿSztJ" E8Һ; gb wAўSL%lGpi3;ڞVyyҕu&=OC7ҹ'*l0g!zj[^1I&b6a7Wmxp`z mCWk'?oTktT>ݻWoDTTJ咨wOEP[f LjL~|a]37{A?ZQȬFy>B|E?IGJI{Xj<]=F?܏e+>D7m節IQ/&:+hɚ <2'<y Yu_ T˞:'qɳҩ9<Ó1NoG\%NF?jגlu{ o8| őޘF˟i9xW_:G&F&l\BKi/tqEVIUK0Ѱ̓Z8FP9KQ!MEe]$@'`kH,KonkMp5f2_5v;LTK’&韗@TؼNnw=G]j 62;uGVUP+1HyiƤ]ܑ5k8B%q n]Ǻ뮺GT_'o,5%8y妪S뢐ـ8OԾlDS)^Jm KL6R5{#y:k=hڐ&]vvwGwF#] #p`Gԡxye(:n`ǎٛ(PY|DJ!2VMڃP@3LZfQ'-.&n`#uDw`Rr?'fL/eis[-k XZ}*\.$Ѡba+W7Y*O yTBߍur@ֽ뮔soMq?;TxWsE1E>feKTuwUlN]@a(ߢD"|50j{l(JGvvqˏ~RdLd.Ly`8dw~QR7)צEGTRIiX=&i|F{>%C0HG(ɴae-@-k ?!%.Z)K-!::٭I+Fq;6HZ%S_U?H`٩VUV>zg>h |_uzߠMzMoFԧ[z\2W[z\U8;+<R7oӚ,&Kq 55uq|[ܔ}Y[)aeG^5 Uػ)}jNkXVQiq_ɊM /%Ŵ7, 7<}%ӛb% w e7l5(Ugm$#_a0{"hEFXtׯ}^Sb] lٮPb+c:gw.9x4s"+R)fUgg3k*8 Xf(I.AGa>Q\|,".q"{b^낒 +i0!%ڀzkR5ח2Ж?mȟ'<8a5DOES3^6F4_QCca.S6&0$RwdgcVQ #}0:! fJ% Dwň % ُ vBO8MO~ HWVȹ(čxq 7nu9xЮy ;n$l4h&g \ 9>YGuݧK-RBFYrGTi*k$Tkkc0 ;a} g[*yU܁/^EZNDvA"f_mA 04eܦ rj6 =P{yy ϑ _Vo@f[zp7({ |֎~c[`os2lץ[~N{zemRZQe'^Ϫʈ,ҳD+TSPgv+h4'taQ˙ԞV+{JLɘHn,'}|%%4~>\ eOIT%՞X4̦Jҿޟ8+@wASљPtFIw&ZK11:ŵS]T-Zcʔvd)V?FI(9(L̘sees]fL$>sʘ;_Z(ehGa[(qt0Np4BmNP}x[M@ypv'&!t]bbDgj2b3z3d W6LJZکI{1lU|kAJ>"XV1kp0y583"GHDWMmfHP.Ԫ8q$#BUY@HQ_MGM{4~VC2Ëʉ:>b1t/hBc+Hs&qyOjDI-յ0J0Umuj(lշiߧ.U6BLߧ>IߧodT~; Njl?J(ƐHq**(3di/ *!-#B5T xXgj /tE&pE~йb^ӂL$xSRHD dm1|ƈf0ji\Mi~1B X+x88D# T6:C[MrOPMt)v5k^xi"L>W(n_wWOW_Q"_~wTY1`'P-͚4_2{qdRex,9v'bPx.Xg1Ṗsždӧr)}1EH;*rx2RZ)\|-p;";.slz>yB5O% Z;C38}?=k`lYcu|. Fe#tQgxՒ;^{FǗZVhڠБ^g1q,Qxf~/?_(H{s Gxϊ\ls՟M@ {_is3]=+S;?R_ɍA/O1=%'D9F_{+/-$*κWXYYI_EÛ]2W"EE4v%|ѱ.u_ِ8w*פB Ne1JX5#Ab"qnk iT\6 ߣ/+F/8M k_AAڑFSIq[#R DfSѼ9j]S@ZL]2q^Itt7yԻ? nA~cWRI wYJXa{-A;Ss^9?b~¶Rzȳa?A&kJ&jQ6Q?]{;~.#g,+ !fRۮVC.uBҸ!'C^,ׅYWBEYh]7/z_wg5㖥+zLm1W*1RS[M8&6[gR!ß- ~ bT\)qҌ:Aߧx㑚Oɿ[(Ӂ$hE0@ S\4lUF}vE LsVN-msKnO3޾_m?bi!aa2'?ť@瀭 %#|EYâ/0!!}Idx̓Nxb*-+QЊe1wq΢ At en(h4jk}A\6*q9ΒJ}+(7skDϲ:*:'3'K#Q!`Q8 t=D94 )\ 9ɩtϓ].!GEYeo I>̦yq%ńc±ǰvx)I%2@?vk'/OwIUqp@^P$zä+s{D}<ݵ݋3otOF8\ZbARpɍM XJ GtMv%6Dmv14w2*ҕ,"E:{S_mQ9yo T;AQ^ g4 G``Hutg) |%A,Cf.mu?owg.#"5# H TY'A ~/z*ĘO>C]˝rf?:$zd9:݅[z>In^mjni=ՠgԭ6xJƲ2KoLj=q6|t\\ɸ&7aOڵ/*]vrR?6q^OZGub9k/v5L_ Hnc?tMqF!T2ğeg u cl{^NPeuC@{QHӗO %m q(ZFF2_F:G\GֶM6ly]>"[([U2p]N91u &=|4&ܳ>#NCˑlq1|^lL1Ider؎R~nuF43C{>/{نÙ|Ù&<%3@2)2sƫ~[c@ _xfC߮8:=XagS?ѣ;DkCWd&[wk?]s?`>gHWL^xh&SvkO0rV+땶<:zWdi?:ex:p x_Dp3.8Lp6Y`< ة4yA'Sn#vNYNʔX;7;<33GaVCWp(&C.t | e9(hؤ?~ cYI:9s8㣖XT޳gx=z&%a"L)ozYyg<9 em  ƿXȫ?exAAW?W%(~_Qx|k}g_ꍻWG1_ǣ PU+sCqއ}*:aABVum>(˰f f`jI3DsF YuMQsN=d"1"aWi]׌w`VsF$.2D1aw'^兤f?'ge=#A< z9he%zPF>>n$]scU]* +y*٠wb0ʋLhQB$\_@gU=JDU>N1HnYߋ2܆4O]7y,61?&X?~|dkd99#^O0waM`yk} H+euc (`GOͩ[kɶd}:M#M [l2\O5i)ݪsi $T|hA:i}&EͣLZ}ԨV\F wu ]V~)1[H IFNiZLҬh`+YKCؙTo3~O En*GM!+w7oR2:JӪk 'V%;_25%h\8v u3\f?bmY>aoJҋLj΍bTBDN{ND]dM=LGvZNz}b# R~F:ﭟSپ ˣayA*Wd(bL *Jvfyve^Hd5I-i.2K-U.d9;7)vfd=\d7k+)!<~7f&kT?yv_uGfeרd} }ҵ_;"r<-{L32ob@8<+\(,e2aOt [0)$іxg?[w$X֫Ȟ0VxIQA|iKp<k_IḴ+sxΚ/JN@.%;7~ϗ;\I-3xp;š#q8MɃ./:J|xz q\^<+3?>d#'sRGCJAkEdw a74A8* y1T!dDqWaNdA R91mD2yi RNa?C 5`GCNL1*!' > ȉI PtDi|T JOR A`ō8ǧ. Yxذ|B_DB/x˅[bREٕ;ϒ6rh52ձ*j J d`vC8CN"#4˟c;l'"t͚XѤk uZܮeEP8Av(sE.;PYd*6@T%PW #' E"E,BPCʇمa',hFbH-`Ƈ$*TqxF\fyoB$ycey.Bb*~ȐEd"21Ed!ȐEdȐ8,C3:db? "Bbh١= eLjnyGz6%;vr>P97p" .H) 8(30*Y<. [ Y-[2(࿋(k0/?L=H9mqhP7R9~^:Ark:kkDȞ$&;/JiuN`|9YX@G;< !':}SG;d:d97_x?'Fi]si*ɜ^«Ðv_x/<ƿ+xnM9^ߍ7w#FLB|%G{F']]ݍرƒ{2Loly!Ύj))e j3mKT- ,95U[68ke#w'4~|q~$ʃ ܰ'.n9rW+M;',J!%ܑ^ )L2kysbG(^iq7A&['!%NNԳ6(vj4u|DH皔Wz>+J?F K]:֩t+Q{6W$=O__ik>J/ȭ4nIk͌FfZ9-g?bt&vT+5+܄An>m|FU1b+%a#n>'2ugK:$ l )JÈvߥD8b 0b՗ޱt@{F<\bҳJtӬ3\k/ܵ O*N;gS{sluFp8"Ȥ䁀+f,Y LO0go%./*fw!l1R8 ?k2*q%<9luLA6Ѵ'5D+Esn{ten+ʼn?zybV9{%N$|UmE9n3Fq5])W %#P-$BAtŘq9u 'p 3gN)R<\v⹑E:^/z)5E 3}$/@P#^BE(]bҋif.ZLfRb#Si{R6*^^eggE|BџϬhAmYvмzYWeﲄwQ^]dĆ].bFMMؔIhǎN!~8H4mX^H:[4OrX6]gΝ"Wr#M[+(i{2۞ N6VN?m) $v\ꦻ64DV!c[AMId lu Ѿϗ 4=k%!Ѓ<щ;UW?n<$G; }."f {8>ui&0-~4Yw}ϲ,G%kz^#Ӛ3"Ifd qwU cDQ3 p|[ݭYc7Jds;ی*:*\fyb?X)UO:ȩ6': a8ᶫӢ,PEmP;"V:_s ̤ EkA&$T6B 2,t| 3CdYY}~mcfW#!B@.9im>XNKѴn*mLѺ#)ӎ*V.FI9 /:0 +twc{mA yơlM>Xp[ծ|N^Y[Q yI{OS/F߈G J[vRRw_Γ:ACai נ URǥl9LdAJM`IڷFK{ [ݰ 49SM{ۯ {gPZ*&,z+4R!BAr"CX`F߳ennjPȬ}xPAٓtlNpK*^\SGDnZ٘-w9r5F,{1{.,|UF fYd Q% /v`hu }f60('kdv$UxPj}E?;Ňˈ(YϏ5+ǿߪ  sL.S{複px$"No U[@TyWƾL1)Yދ#+WjFUjwT+^ 9pv.tG59>f@0#JbLr1l=rh'X2N b8EZrIhrc\z4u/HA !>-'_w$?xF痳h7,^fG=ffO;(%#!rQ0!Y^a!J v8aTNlCi zHP&OjA$NAĄGBiAV1 Piw6xmbψO‹iŔ8$D; JC K"אy4PG|}m3#gb'!zBn!2 &Ҍ΍*1rq4ĩ|h&pqr,$q%+[**yx`4S +K%ĕ:1u+}'LiqT$+Z ۭAV{gB=qT B,)uu/NWпF艒md5uc/TM"섃{vJQrRSZ^Z^hBg 'gB`jv oqk BP!.T녨Сzc( h6 Ϯ{],镩8{GՈ$E_VVD>V7.\~W^YyuWX9\/܁L?zRDs|tx瞭}&}YJft z-A_ t ݝAϭh=_~GeF~v]6Y:KMAK.$n3lu MM'>+)u7jG?zW4}3 BL&X=YXT(X Af N W^.e×=LΟY?UJiBLRw>$ / ߌI$eXW e[JX)āBr%ie,:6,5t.xᅬwkfw"4Y B;Rm_DyR,tNˬwAm=Xhڃy?kmTgye>^I>9?nq[5S㖒xY_OV^oN S?Q9e"^mVDMwAxu8JHraUh S9? 9ЦGW|J0 tT͵l cf.4ɝM~ʋ]?Xyx쉣|ķ##?srZO)4:;9BIZdnZ_ ayq1'f=Eء9i&<37 *SnŇƨDGPhm U VE"M [+T;胴L=WUjg.9г"arTi%3UCF`S)neJ:iVrf"*DKT[?ċl~,"E1QI€ y/@0+T,7Oºdev=s0ӞRq]K´2Vp;))u^'JI4*M` ]2v1V&JNr +uVWϡ}_L?ћDsjqAɝ84J R N ]a4<9Doi;q Q /o$cmd.z.в]m>[ei*$%fi$"r='"5?nt2I觳|F#seBƐSZC$m^#ֹL3\ϼ~~ HFϢ *<ԩ=1?剉#dKI.w!5YRXiܕԗ\}%mYGP޻`N^vqqRf|=B.-{p +g\&v^go뾲\&6݇o'ߗaua_p7&쿎.;}0-Me3 + /suѝ hg\Y/'?k9^`ÒlZku=h*CٔVL+]=mδwQݩm̴֍wblP&Uz2J~@!NEF0MsѬ8p i}h+(?TwwfUbO͕Sx;Qs|5_ Hksn-bNľVb#w^AlŖ>[l・O[z[d疮~.6IgDҵQw-ʘR-s-NĤˣ#˖ #fxqe?tJ!90P09Y?2c.΢IASb třCŭ-KJ'U39h薎 ,Tk=GjcᲭ=َ>+x#[+%\/oeu=6Q[_hCPC\c~Uc;q_{+3~^DZ#1pos5ð_Yi ~9 K❸ 2_dxUzE _IP'F%{r ə}\}-edSb 9t %.;s9yS\qB ^w%↦@wz"*&0T/Z?z-עۜ0ɺ*H1hm :Omw3A ៟I8qh>{VYhZ[ڷ=ڑPb#fDz%aSS,q ڪ+lAps;4vۀhS֋;%P|gz֛ #iauP>\*F3-oJ٘lݠEhHK/X]4K\&~o) fue"߇h7y׏ӎ\Z$"ȇnF7|qt>f~k0$y/6>nؽ 糷پ?j94AØ^YqZ" zb b>~`Ϧ cJ+0<+3#9V).tH=8l}O7[=||/p#>;o|ž`_A'N)XXӶw-Xds;"#*.imS֚~oxK>^gxNvT!aoh:m|S^>~r-\ʋbVJFsGgpS8Ooӛy?1Haˇv?Cꅮh3jǬʕJ}öo{$THf|XY-D ,|K"ښvL+wYGqj42\+)g==kA;)@lj-NiH󦣏<;@>:_Xտ(8aɚh*}DaBdGuMbȁ9N|i\?bۛ1ÙYd7 w#f59h9F0_A"_%7 l`׫)`HBe<ѥ(3}"TuQtRȲ=j>]FDtuw"Q*caKZ DL4>=fʼn]\'ދ6ha.np¯;z<4]yo8ç=q:*$ZA w6swk*7 MЙ^Th͂.pfA `^vbUs1b$RnYQ&nID>k'҃`ђ\sahk4j/f.Q aMŬS$,b_a^sIJ54pQfX#AKE!E"?c?N룜_I̞xa е0LrKl !ZFvz >`\ܡ< Z&ǙI3im/IJ!f~a3s*I{ h+ä Kt0sn{ݠ L{ǿ¯۱|4>v2e3=Y)Z/-*=pc,NnG$?ȓ8c4%*a?ak.";/ٟmYy]_@sHy7{r}[ѷmIԦL ?4h<_І>79toX7QA[Q\h8%;gB̛_Iߝ.Cq<%^ OAm튓A?<2JRp40P ϴba}tL=9<`EyX3x{Rݗf+0k 2\< LLedߤёn֓tpӞݣ_Y&)%9DA$/y)%ܗe/lΤVyS,΂xސ)+fL7y͔- llCMق}~7P[p.MV{?V\L +gpviFk>w I 6~m4zx=uf_ (*ck_0GgEi&[$l/(E`,qy_`a2VaRxͣg%OCH4 $"'g:f$Uv~֓(5gek?27% "3OCdfU\Őtk9㙷!Y8A'AD׽Ns(L1)=mԴ݄]r"^,ϕSuAv 0.JYϟiJk릤ްl7n84Gyw9O*?ʯ`p/lh527x@zJŷ;.ޏ4*ӝ:0ʌ3oջ}XnL\~ =cKӬ[ҥno c.zp7u")xϻj j<,N|\*n씞$Mb r„AW|Y8Gg+m;7:VAy,a^ O*z;+Fwď֜[pO9Mm iNȦy0;g4/ k_ 7eﭪqa 55 b;х/.l^QUEYi^Kt뷂 Lb7݆U~BYmK"6 Gdc#^ѿo )Լ : ޟ`˛졷sdm1p9V8O\/L73; }PXvD\~6n"FU*S\ҏ= Lgy~}/KQwUV=?nZ=y&':Oҟd*6ddP!kI4jn^]lTkjSE ;6I:ln8O/Hh_HS[=P,}O{E&V8mFQ~ jG٨ӻ8︹@] Q* |r Y8 Z]Kn{J8?>A0M_n?"|8ԡqvHqpPA?߂s73dGC7"8 䳛}C441q΍p@2[(ǝY=w+W-lb6s~t3fx?/Aí\n(9! l} OICrgrp'BH8(nJ$y"(Љ#SĄCgB+?dTk7c&%)e^(o<<=q{;ѝ[X7?8ys22a^oqvȽI@k \AvLp7m595EC+А@ݳq&nx"h^q X2LpO/I/Ya5Ay&(#h'ʫsXy&t»;ػ-;b;X;dU UxhK8^(꽯tһqwtvAo>j|iVH䶷AD.Q'ħ=/ kţtQtX@4mGG f0`PnHn#dKבSTpVo7dPm{:'< AuUgwDF`u6/_{L oA |'[!w~N6aMpvCK(zW:<}3`FY jӣ؇?{gp«kq MÀb?xD8Rϛ1> N6`͜vW]>地ڲo]#[;i~g4 4KV+ecN?[dEz^LqidQnJ=ͅA]0q<)c8 ,`c_)YZQ=@9. z݋E6 BJSP@&ڽ" U 8cî ֵDCL<ĝQ zuH6& `RM2qoاDzV15yR`Cx[8o 4\[ ;TD@@{5e FДb¹(P2}RpNvGglwƄ_y$8 ׃˙݆=N(~Zbx9~hFy8}@[d+@D%Q{*D]V],gf yT\TmTaBwOi5#&ƢB濼ccID,"1S/{QVMދnNт9ދ 5[Skz]YT GiQjc{UnNUv7mfþ-h $7].ԹnE>6NwEq5<`oT7|ےx-BDizuOi`t %ystO^/]wn}`o+%]"AnCV=[cyvt48! G$q$V1&0 im5;>rBF[En=9kKJPhx4VuX%gi0Epbɿd +='jf]uֈAO\PI{&*$tMSӵ0x~Vii;h$/So m{gGG:`ko'Mfz~;[$wE$ޗ=@gN|[ tb:#Id zC^7吧e:]c&z9AFz󁣦ޗ'=_3HvpNgo-k2 } N5%qsP\{@a$3;1+!Dcԓ\s-#~{LgРS=f4?YH(Tlo[8M̄,CI a 𦝺uN[~A :5]Þbk t |>ɲ\;{33nu.8aO"!6OEʱg f|Hd߲/8h!%ܙX`KS{ͫns/]tw9S})͊bo//#wv›WxnRxb*n{p?k ߠ\W3$d~ˉ'z}쐗 !a_fI&{̉<# .GQB=1KkndHD]Q8~((:S̅`o!b.)&؄ӡ(q? 2ަА%G N# rJ jh\*aO_\mOh]zQ]{<1ióݞzG+ʧSo4dC/?nO!%=k ^noK;>g9S^8):x{nAB52R2GJåffVvBN*Ӝϥ)W )B:\^ Ν#vbҌHr}SL5,TOyC_h|h|&P,&S)V" mV.T? BhӅhJs?Qz ^";*dUڠAuy6t~ _6|wa?h+QE,dlo_dyrgL?C\´<~q;Cd)V޼X[__,^])w9kŵro*r洼6{rNrڛru5גr'jL~p'hWW~kUꯟ~EM-% _#DQBnegR1P$LyG{PvGV!+v5ԩv9'T? :DDE t‹7~* 4}F^~o*FzU~o0yK%zc]rtumsZQyOaUk#ٖ‹߿G VFr1("瘏/-:AtDR%h8 x1}ep'ᷰy8vqq!ֵµqu)0 1[h0JvdoVm(M@ s8 !cmCmu3]~vvxm{z!&i 8Up<hwP\jB:&L=PkB=T~ }^~Y`$םy<^0 rzQdGU oo{}k͍lAj )--7Ff; ~' Ղ0"A>,,P"N_6ypW~7 7u=^j>Z2#B(B}QsTڡY%M(+k f0@Vw~hWb%fǤr!ࡨ/[;/UQo?q?ɪYCkNzU@\_ebjEm(5?MI;?֯X_֯ؤYH볹p2\XCgG㿝?a8%<)r/{Ssǵ\H1$5mZC1t3N.F\Auer- Ѹ$Ol`ӻߋw8; rB?OLq~T4U&Ō;艰|5 9?cTh┣|a2ta~x?:^gxM+j{Q60Rch:=?QCud^ǵ3!7X_| 3%Jc>i7<Й[ aoB5S $QíG9*CFg}|$a'~Yo Ja.ӊ_ZhB)ZqagBV<3r^Y{nu*/W/Mêv( J&ǎ ̹n,2KƉm [>Dk)@b&e͟$?PӚw=et;zH9/:=`_hQA-iV=)}C尫`k+ɉ%V-gr[y=ތSO؛5 x\gqYG5d{Rg` ![t~rIRF6B+hîn* T-ra>Jy ۟ܲЄg˫6N}-Ș\M:&+ǻnc~<LIo(5H>xMxI>Mqk@K FgI ,ƒna TrZ4Nto8puP4x[nOE.C%=3N8v ZX= :2-g{D;7}پmrb(ΪcFC{c4RWl1ycNAQItF6Cq'vث=GBt3^x(Ϧ]j ,2Ϧl~ a(c,S=YpJOn1bm,3*FZ-3u&Ӥ6ΰ/Ap E۠*)<~j*W&|~~|~ΞYb _O3 s2lIޘQI5(^ T?0rO3y46\8ua2i}ٚ#j`Bn9Oe5 p|.gf`I ^ h eB14vA='`^<L.UDga/ \ 9(DE,ݓ&G$|ѿ[3W '4޺Fmd:ށH'&MwbZܝxɆ@*]~Cg^Kt[BZ$,Jcq5 Ck{ջaվ^;(`8y*eM~eocսrrMX[c6uj8^xhʊkeoO'/ #Řbvs @W` S| {DI~b1 r)-$ Hh./JrӬ*zOS{ؗ&JKMiH䘓c$DC2];̙3.[ ] W< ,RN;RzzlOq#YU)!Z\/(/0,yx6YWw~%[>&QpR5Gѐwz@@%fZ3j!Fk^NX?3ᶢفpU >YML!Yc= ]r%MYo;^Tid ^ü  5U> C.JX^ k1 Ę%H@]J zC~|-tх+)N{*գK} 耹~=[a3lIe V] 9>ÿxQb򟸁IgvUi!}EǤ(nH34B&\1Ɯ`Q?-]HGDU8eOK)s.}4hAg۔$aMNGۻMҭn˜^|l@^x kA0U2kK[7li %RKo= On lSn7y@YOA$%6݃]!5Ck &, 0y6Pn z[YZX t9S6i SeO%ۈ! @DM2" D} pް Ks& m^.`"E) !pI[G+([y >z7X)B,s&Ht_7T!Qp`b+"_n Aˢ{ ӌiK 2-QѧIprbp/}RkLv|v*8B[eOY[z~EH5|>g׌hԍ?#, FuTRLMn,S/* HJyq Xv1=*@/QE7 5N57'̘q<>kO&zYe+8WEtOv^Y˪fVǃԐa'Gjg+d\1ꑱYfUS "'\NuȬmVʶO>n>bzwa5Dҩ7UH2tYr-EEɾ$ʼn0תo4UROceL`fc2N%Q-7Tљ̋%'}JN珟}GҌU^QؙMEZ)߰Y26ed&1%U!#j*A\obiJgSxޔަ>z5#j ²$~XfɪAtt0z˛GImp'IL:٠ 2Ŕ@0O*T/|(ZVW8FG[plb4ͺlS%&Q =M7*+ 2~Gf T |2 R$JQ~ܨ?'@-3$X DsvUo)uJ u ׽%O} nt9e?:Fb)'+|Q\KNv@j" lp5D]fXmd4rb)eM55%]>򝴷Qi^7o9N*+lw鄦vYkkURx)Ey%|S7 a0Ylؙ%8TOamVW؆_W6oJ%@̧+kQ~Gzl}X|le~̥KctW6򛬧VJ Uyj%*n}^A8vI$&ТpOڧ͏4<қכl7<o^by\U`+ox*o؛rE5!y+kŵo=vQX[z%56:q7FicUfkRNB-IxRsE aW"!P]돂\@.&\C.I%y qu/ʸoJ?3Gis\J_/?㕉q>{sqFvEK=O9$zOa(HOZlBD?)B/@D~'D%zr eyvagg9uO2y;/MOLБ2`,c 5y~ C4L4g`n S{Q-<@=qtnV;2@}B4j F, Ԛvґla⸨PY2iEa۰#wQ*V7-׬Ɍ1YLf R{ek$Fy%Kܭ麥d]6%۝x8d=w2)O] I$5^U>PXn6Qv]nrj!hj(䙘UK#Jep[`KLG՚Z#0󥟐)i_0J%J e\RЬXU3 ߓ/d @q\X?} I #l<>zbٗڥ.MZ(վkP}7'Ǩ&b9:H`K^N5Ͻ< c'({$y2x ؐ>+9ϓ}|5j-!ai1ai]ƪ+G՛(8%VHd*lC&[!I(jv q#UP3T &Ю_dߜ c4;ƨp)(9ęlx,DIcAW|^ Y '51}vS&1(l;\Ŷkv~+0ymƭئvaZlE]XYsib#*3R' ą5GO+Z@MC}r\) *NEmcJ"׫o 8U)V"th,9,E@x3 ]^mJyUY%t\n (y+q cY n!qWY6J9,1L16ܓS&/8)^cvlVwC8ŏE#I/tw~8Nc~[۬eATmpnlY؆Κ}3ѹŧ^Ɖ7O҃759)|JY=*&ΪBBNY( <;IOTF1W 'jFz!puYb9Q)/[eSgQ4&A;֍fE贆|.w?Kj-۵moO0gU$fX$lߢH q?x,=5tq.Pd.@]ǨFGӆk$ȕf1BxHMd? A^y%NuV}SsE|Nv ? 4ʆmI>F|֛UUQ5ms։qXH }NPY[{+e͛ ^,U*47u*V~[U٤DY.^R{Ϗځ^Z<++co{c/qbѠ#m/k招dj|V !ԋHr$k#^tR#ɵK98n9Cc#TJ:E9% V!/ ˈf'؎ɾG31#{0Rs%|I㿿&Hrz= t< |[9u={kftT19:ܽ l7Vx` <Vzg>DTfV"h^!%:`q0FfxIk N5))4BQwN<,h"5㙡gܾu8? R>kQޱF@: lF cz(#]kҁcGWsm.(oɢ[Q{["ݬۥN!{Ζk?WCӫoT`>fs`#u:m'5N]/;<\ g-˜uT*>!kt+k7׸dS9R))O?J<+KS=GMԒM>tœ=/zTk{`ӯkwC)L`hpmTŲ@ߥ-Y=T5Ym*3Pa1d}3j-j]" + 6Ew#vjS<\zpaJc'iH &R8*/HmjhB::vX2PQD3naM5"ZzLg1*øM@G$1qO17 wSq՛Ȋ;kdVۭ6XCg۴h.I wJ7-/b%lx|;.أ1ז^XꬃEUE H">`[+f,VPEbH G붓u,`$b4gYJ~m}VOJS>HzW ' aD4}\ߔW+ TÈ^O7 j}fL,wִIO~Ӈ5hG&I&y30Q[! q*n'D=Tj{c8hlix&Ƒ!ũ5K"Gs}&7 i[4.Y| XY+GT4qѓ3 8&8g8Iha*PG" g,X~~ * 7}w˪t\͌34R]FLз tۄ6 Gbi$)֜ C8+gBjpLD' 76/ o(o.>MX,z˰vnH j R``H* 4Cr.Gʂ'Nssz [?6|9V84kx;FLD5mb.C4R~{rh4^v. [ҫ/oMA~lqY;3n[ lNdH|3݄Shy 8"R JRG 8T%.r,C wc(gt6A!MWˆGh{dıYcZ vO;)(tY]bAQRhWb42Ao/|YddC]A>]cyOFL̈ق)%f="4< ,N/"yx ruFyCSN\u'T^<" /Wֻ@lu1G nm.րc! ?f"XN@tn=Oe4z^p LHYXLaYhS;BO)EK?bn^ Ի0B$5*JMxM>"B*qb0d:=xAE ;gD1*G2Wu̞EJˢSqS ^ҝƕJ0-Fɛt:›|n^Iwˇd60ͤ]{=YSƐs @4uRq}x6crVF+ծNDZBO) k|+ǐOZgUd}s8*;0`sXY,N_T.+9i xWQI2h}z**/+:.2(;+:qyg$G@IleQnObtY$6Nh,a)92ͤ~)>N:L ~a4pG݊03Y_FrAhb|]AVJdq"JS< |3T{HI@T2(2egD%X39הeD[,ZI+nѠ -Dy `[)dm~8iiQ<z.8wNhոŜ`顉\e< 2`qz1?{dQxveo,2IOfWx H,AH0FJQNTk~KrIk Y `NΠB1qLwՕ=VF{lD@eTݥT;O|2a '8BH度,2Ņ*sWvP^aWPn)fj.F^GޗH&Ю0o|AwpFXOc''?#+b l3!#LꙦRUT0[D<2[_߶Ny/CmITU+dPfRܘMh8GN~ ;NݪQ!V>/PD%(CHzfiG?\|aeY9<1I!,6 aK waX k% cqGX?pԗke59EH$op5WlnlSk gye?T?&{&U5xdl]r EOcp5͊ii?t+Q'~Wđ!H#0< ){K$RQBYȉdh9Q]@.tVg\ISLvw1ls$*ht:: Gzyrw4 ֺqdFQki6 r4Iof7 k^uTn+-ῼAv3z' <Kw=NQqgG,f?86+_48gphg#r_Gk%yt2qE5- vB:|+F)0qsG9-f]%g<;ovC!Pox7D3 l_# {mH PlgBKzϖ\ޔ0%َ6Y 4$HݤgBxub%tFsT8Q*}t|\ G/lF |F!ᥱ9L*hP13մy\|MAopGAKV~GϦ9 N?2V*3FqǦ4ްz̦Mi![fkHQH/oـ `*"E 5*`|,?}x2 "x|8#zb:8A3q =՚ O1 ƘKW9_Y{j]0`_I$QƇ׆B)Y4\RHxR50<8sUc&m{^'MT+@+>&kN$kUO΀;'ǧY;Y)rRtHn S>͚kkJsa &)xNvMÃWw*jzZSګyj.#SN,QG93<3wL5 >9SȺ.K7v-o~dE.l^5)4rmG2i &Q,b -hw4 Yh.#:X3X#c&Kl}~y*Z˺*πK}HvuOuJꮶM ;=|[h#kS8B6Kj#?pO#d (eH(\˵=\ c0ba( ]>ufAT \D cѐ~8#0"_VoMƬ@'?I1W[!qi]*b p!ifQ4<Qy!p@0tљa$_[FШS&U4S=.!9XL-@盉=NeAJ(ҿivs$]!nhDGsDpin3_on??KlqK`J0|M YL\) &Z(๒}R@v!Lgm )r۱?~IoiTx1MIIeZ]~m҄~aGMpԳMnn/5m$g&U} v+n|$s1&}ٝeZ%a1ɓTY&a7Ju(IuLBE.RKdD n.;&B=IooW;!MY+j ꯠWa2*Iש܄ PWءN|`%7\ȪQ ?NĂKRukIy^Z-Ux-uWï?2&i#B{^iDЄ\8Zqӑqٖ|P-9mEK*̹LڡsRF\0Y.7pUv|)"E9|ّ$p! !a-d_HJ3~ڠ!`~H0bh@x9}[=FU%E_N8OHIWAQvx M7;Du( 'zvpJ^ ";}Έ9 VYuwWptZ)!c(N; /WW$4eFM`ѢqFk+9Lpo;Ur >"+Y螲\&5cM;D]|t<&Hz2K$UIJ -DȈj턤F&NwO۽>ZEURR)KP=AbnY>\,g#|~~|pNG`71ҵpJWKx>n2 VL-dVc`o.؄6toghg/Etz/G^;m|"?":z&K?hUm\8 eN]=w$!y,uqzs'Y'J N6bdM%d1Iǰ?pvdA88@)p7Wecv $h7dD<_T=iM|[%hsBIX,T*$d~9%pߑY=[WTjicS} aڮDa'[P{H/ 'rHW4LQ*I' SX<$| ^>ڞgkG(!i*hĪ 5gjܜ,N[\ŏ|6گqJjTNj_rreSc?\*{YkjG2XӵtԅsE $|WwPLxXTm)>JD[Jr:/:/ŵ+Vih *y,&]1%fv⓴6Oh-jѡ JBZf9mr/4K;JiyCUZaJ`n`OKbSEg_nZD;*Q.vs' Tk@y?X]JQS)Fܟ\PC;&0Ǖv9̊.+I/9 ;]}-)>_ΣD 7RJCT3eJ UЭpaLf lG%WURo^UU[HeKVJ|AP"[ F ̋&<}p޺U=C>EGm;KU:P-p<~9<ϱAINPaꦗ&?=o30vDl sqXwAI4O><[3CJ{tлmȃ$м>ވGPMD\M류e> ^j~ "Z>7!٧W}w՛"w&1VL$sh?Z^9&7X ,:7qB\kY+qt@AqvTM=)CXHOnR?eԕ+A1$h*c6ҢNCFϻ$OclЎH!fa$RCk{ZĴpEZ0 \$M kd/XqPlWfy9$AUѪ%Cx -'g 5}ie>2eRr3iRr5x ѳsEIzC\YG|cG0 !Gtsgi|oZFPQiHkuaElq7{Nu>@, {4'|e<}<UK?OC=`'AL=O%.'`,Lo}/{CRf6^qy홓Q#J>+6.Y¤qVช(uߒXBD~ļ1ѡs!"^t ;{ .1˵,Pq@h`+`LA-IIt3CA?OGM9GVCc6MZnRO=ČIbE]p]]> MS^S8fʯVϛExf撌D׉y}]G4#,&/2N.;rxJ{*-#1$E86\NQ b2{Kr팵9AZOx+('-5,I7+"3oVX*fef %!|~"y[xju؞!=Q ?[n=X2[F so02RY|qU|;I-a7^SRrj@)I Ud3A+d1}7ZOOw"n7n*C,K+DN2x4@#p~_ &-:Zp zNSTqvz zʩ5y;}/HJa#cO+7~d/碧s ~}[i2 nMM<}3b\舵< \^2pz:J{E~y /}5bR%iBpw**Qh/ޜ$b#`-S|  hDߕʼ7̃:>Б5-Xjqf;2m3S#s{\s2D۳'}%gAyQ튭21Ys:4cVg= 5>aU2GgtC.NAPh CR=8Ǿ?l|?*JYj?ˢyﮜgZSX#>j3 ;y1'l*XWs?5 ^3<&$CKtRMMkwŭߕ"`l O]I M0 T:ܝY4ljDs,䆋NK<9+Y,?z{5~h\[ع { p5jt7_B[b3nRVRg y CKby7NJȌ@VW V#_-u&࿾َfGi7"Z/y"]F"(!eةɰZJk֢^jv"\29Dyż[H:TԾ?& @,ݛ\C-b]xVWp:nL$TGt OO4j(9*rۤܦqUӨ?oJta72;|Z㇑HqP'~ԲZ ن=;o'y6btː&\0{"wM@z0e9n2 )W& qk=.99IR טu +b~rUKvtB!TwIer=^g~,2:{(F_)MPI(uP Ɨ{< 7$:{%42~}t2o ~g ^t#|gD+ _0Q'2/ˉ= ǢLH+ :"iZuq{) #[Ϗbm^ӟők?g]<Bc.uq6Oiҥ 2B0<&1$by|1bC<1A)S-n3Q{4+owlVy}waIJt ?[)P<j9) ò3~Ǣ"/FSL.5K%{gwW wx4Ml+c}fnW#CEP4 E49daw@'lWC~-[g#X`I#r9l`)RL 28,9v!$0L/oyȴo)lF.|\9xb)ިn-ިyF,OpTW.)6@"HgQ?$/ grm_O' 9>gb~lSs),FfJ_3CzPt(+!7 MT}[]ERirSBSKµ>Pnt(aƓ[$Ld|JF^eQJS_IT}_ o }q?!-`:O528J0_xGf`"2H9_aSnfw9~[b_2D^*;jO2y&jԢCliEF6f;{2ZCDjm=<%L׫ih<ú0LHS'RLj4^o Z[UP{ LcB3 Y=:x5(N-_SgO<8KC~26(`ɡI?KY1BuJ[=N;Wmvs/6 C#e"_|Q1Z7Rmo ]誾Ny'bDkJ K.3@Vg`Yvybf1S7p;B~̤2X(y|L"y4b}+|mH*M=:oR$EH]m"]Ʉ 7 X}R_Ƙ .mqXгGaU%ߢ"~^^/: A Q߯ 7(l <,4&9BR^^;@ՔtJ7vꯛn`^~0_)`- 7<"BNc0r0=tьLD])wunu=G7Hoq{ <=G˸4; Ux|X#ɲ1N8Ǝl-զ]Nا}_ Hm7;{k6ygX1%h0B 04\7d`e2! ip<~7܎v6GK5ǵkf_/ߜ=ÈH($.D_^ϿQv(R4&H<Ɉ*,]pG݄^7{3xˍo ԟ'WBmpNf,@v#],ae*t/㏀ {3on_uO/JY9~lqj֎~>  Gkm2Sʂ/J-4V^_?Nz_"IZ3:9,*|u]pgR!;\DΈ&SG!~oT_փ6@'x՗,eh !- <1[l#}"},͗}6e ϳ=?.eO'ko%} Rs>{pV) c%qs^]fS:b&QM/ue&#n2Pm#7kܐLVZ tES^bY "hraࠏ9?ElVhhc Ն-Q-n.aَi݋']1[ո{| a5)Vm%'2W4?t?{֑KzlU<?%5u=!z32QqB8e"QtR1v!si%`6'˕/ s!_<4u'wȊ$ J_Fg,'FÊKa,}^$;PTtYOG6D"B /ApʃBcqqZP 69p҇v; `#y.#0 mOَ5ͨoTreTN]Y<&|}Um6ә\ 'VīOr՞wEsn+~`6n ؏Gߤ|DTjFno@9Gg9-#$R qhú}EFBgdְ;H@˜G- IE1DEP7}b0,B]tδ3 <ΊUM3j,Ps #fc 8n696S]Kv q BQxv[E_&k ^^" n 5:r5:u_/%Yw K`)`ړuW#&Nđ'=^ \Uaw[ Zτzxë#*$ ]|-{f&Eį8! uNNQdQG,Q fo/[A&qWETP8,ǘᴡ7a0I^OyT_sR+@5ۇf@ԞY?YYK00eвx=p7 /Gl  U?.@Z!|dxn%5hYHV#($Bkų,09Rƨ,3ygP5I5zAs Q )Bnzy+uF cIpk1ԇ_~Ș;jTES#,2@ vطl# PZme" Vd;=xQÿAzl+nt~XE泮 ƿLJo%B?Q4 HI]4>\{қ& $FDf,-{9anEҨ"puL )g }xSv , i>H'>*ER(NۊL܋-D("87bיg~K onl:ߠiY׏Lc|\0=tM Z9JDc`t'2.t!yON}f˔xA`CudB(RaeNI'!5Kqᧂ/3ADqB=?DGKB!/D`(6rKH8kx> G(k8@D)?|@)8tZ]9OA?du!fJ9.$fP}8iH&~2 [P2R ^;o]ΏBe~X(6Z? .?EmF .?مJ<$J鈻a{ I%7}SY p ?tY% hLQqԏl+J~mI%wVhjlQ@-/=suQz}2ˏWeF*Ʒk`Q9Ώ"s,@k1o]6HGs(J /κA3{ > 0{q8ܒy(c'ի ~I RlTU k^m$Tm~pD-|\& 5f_ϭmN^]-*;jN-`'xFH͖ܞmqVlӜ9S^zbc|HMOFi~>4c}gD_e74vZEt`UgIpZaJnLnd_ʂA*Z1UunȋWXLD!_gM0rohɥiuXXXcRla0c@;-D> 5_*\҆kWs_MմZ~/0} דOʸ8#{z0O`5S&`ɐ<%q;lEaE zt5%{m/@<$a0m"P\!L8$Ť5wW^&50.ØQ^DEb-QUot)BsG|WoES3"~J1qяL"퍤E٧]zL_So8POn O51k-79BB7P[u1r9O\&BȦkg^|:Kzkx"w"MܨX COHe~X Ή," c8L(SHBkOD΋xKh~*w 66O<NȦ4)cojuT9Ϛm5T| 5q*KK5VVL>~UfX[tcͤc% 0Q`IG,,LSKHl#9 &GrʪU`xGlEn*D{R$,˃9òksPF˒K@nˊ<_l6j9PTik^}y@Pg.wq_$Zw۲LɅ+X-R`iWSPݺS'ğ<^bXr^o`Ne2YVYQY OnڷUf&I7YsuіO\7Ę 1|dh_sWEa/1bgخ#l02{zcDb.nKn31| 5MNQ6Fjolcx O6[l8 &M&lEij՞e[#Vr4PavR-ȹ3ڨΆ{.z#^N3ޏt){(싍`krr 7"+#6$~qUw|ʙZ/:Gv'G`&grk5!Kbfq`t=f!m:hX6c,p"{+8HZ]g<f-,Ϯ~ϡ9$,'Zbc@~Y5{)'_cy1< +΅i?g!QKbh5Iz̧*o$k* :cq@8"Wb/iG\Q>EnŘKe`qXrkجImje\J>!im餾J'5v-]Tl.9|%unIEjV I>M=ii#0Sp}xOvH[$]X( N'YhX-cf)psل_^vq65\ЍQ6D[hHvD J47}%- 4̃hw|7b. \N:8D++^ѡڙt1%.gdL^QOƟfw#wNIXؠqn)ot˪JǙ_~(.yB:0F> ѽZ@䏣I8𠵛@X#:; :ב[=FK*1Ď3& G.戳MHjW In=gZPUhs\?0T+ ;Zy1`ڈuH~BS ǍOus`oh_j^`a֖V.O7QmџR|{ppe+&I:|L=lp`>lV=eifPu3${Ӊ+EDz6lme:/ḏg@u86%QeC8vpr",7yjae!:]6@n-9Aꚦk~󲰫n/Zp69Dw:yjDgއ,K33a3t&/K&:uW!㝜u(* <`Zz墧=^rTG}p ' ; <('|>fiQiދN3lKeϽ|΁ҼrzOB8:a~/?Bb "S`D cmT+P:cPyZ N,6A8y{МHdX?x-ԛ|N=>O HDS+n[:^ paQ0OH4 Gw+RjL1`A?+ÿs} Ӥ3xDIcdw"'8nqx- 6Cu&C7?(ϔ*URTE)RV ̹ʸ@"BkAHT{!~ O@w'tƉ5m+ E1xf~BとWjpelc ]LOxƂLMFLI+ReL&1e錀7{Dlee;"XW<'1‰ G_G|N1"T‰CamMp5_ vh 2,af?cЫDD&F3A8jxϧ>/7fOTJX-PG,|@`I^Q^i%j+7YVh23-.c)eJrJ0T"Ru40oKI{ m;J#(ˮdFu)zrIWANs%@-H>M#h=Hi/D1 8\1\ E@Zz.CG(ܞY,]݄!1 kӻM2} q"JIꍎ~DTENr+[LVҌ[:N5u@1't֖")w'⓮l|کgge+WrQLo> QoyxBbrn/dU`UEz.NN=ϧ[Í&$|y0$5]iTo+HIq*I߶/\p|<]Dw}N,gYAD xAE. ?S8aF׼!'n< ;?~ݯ{o mӐh!Fp] /;lBɫiˢ_#GҡF):^RGaϴgj[v &k&ƶS:_ % Q=è FԨ #9`$W bGH1wZ vu_o?-j<%SAvpyO|E_Ay(dy%6O3MuZ0Z"IޒnPz .kiC>^>jGPB%C߀߇}=Ь5Z#6|rĘJ  rM_WVٍ`쳭h%2yz{q{Pi}=>h'GloeaG w(pɻ#XTV' ^vVM090 B.@B)b'M!"PK ѝ6,Qf\+jdဿgp,%!bNF1yH: 9 Qr>xZcF N2_hbpÉ\-qёK\ 7̳ }K bXN@݅,Ԁī 3 0Qa}K{,&P0K8Rps)?rv_qnY}ߎ۱}7M\'踍1Z&Rd-c<Ć* X۪\YƳ9<% z/xEګzyKQ#IWBg+'B2VPLTFɺ3Qi؁܎8oH$ E,HE=1R [4$#)Ia/Ȋ$"(0otOz36((ȎX /Q8xe"QRt5 =ߺ-N*{#}#m8 0u`AZ >S{| I`aD~; `w&وLo<ߴPQ &lHƭkNZBXl(Q6Z^4ͬzӅqeBpibxig"Pw0\aqk(uxkk,Bj ;Y{+[omY~[Ko{:^]J0#dϯ3^;b]u%`,1z̊4 `̬r,$GVzo?zVބ …Gem?Z(Z7'2qOqC\ ߈G_gɱ-jd'e]BhQ]St?8g! UO;ͻF2v{P^MFt(C/jtR8YN:gu>;BC [ZS, w&9)HwXyQBV6yNMb܃Gpö̘Ge2e;`]iÒ:+2+37zz;xQeT8{U`~Œ U<&IY5XgX?,9*X`z/Q0җ+􄡽^ł<1.!P~ / ,S⅁ωzhVJ?Հ^9Qq.9|p㉃s"l]&zu&‘B}03#% M!L`OGrqS% $Jz9[U>ǭ9^6^)*9 M.{2'V"XN ӃÞkG R$aiu8ny,VL؉QbH}Sq+Kk_Î{.ᇎ!+U1oLƛO1~KJh̦|l[S8q"M鷉G i< c"Pkep;%]>ӵˌ43m.L*bh)AvTg| GU(Nz;of8jsA93Ne'?FRD`rK,G768buY'CՁxvέJ XZ$Qb* 9UЎUd6?J*v4m"|[*hcT1u 8kv/pjIVc<#͖<aɾn;"=XS۸l̅ -`Az4NWp}KA;|BEta w%iI|`rITUYfJ+% 5^k4{\YbaOTa $p*4 OjY@^<ݻ'Jgm.'}g̳ӎO#&'%}3)~(qК1 N,LOÜ5f^VThMbrКc?^2;XN;q4;O Yx7wICKdHnSsnnI3,19yQۅޫ"_yRo|\؛sg|"AdN#s697g~ WzgliA='\5̆qE=E_2 m "@PUs?{^qq9G$VD-}99+тǂwpE!B&"<`?I`&,_|d+4L/ɥH&igKҙ El>$<~mcr;c#,5lf-/G7#~wwq{%Wq*f&9E ~BXIj(Muy'Iq,ک# [`Ox%.}~ H-xFɪ9BGFJ?:816eD Z>1*@*b[+;dEP.Q6G=[RnQ"HF'9"Ͷ'9T{,/@[%y9*Q_8GsbX=Ƞ>e"/יӆ&^iA:[]BB^:Ͱ Et kYts>#A[<'qt`W{ `jZzZ&Ah>.3SY"9]_ȳބJZ2=B>} f| -0M2"; 2-7F@.;U/g#;?W(]>ͻgk9~/p>D!C}܈h>H6s/>z ڒ c(JϗeV'ӈI"nc0*ҥ9*O[S+vpV+k1gћXg%  X儅żJVǒw>e k,`d)M^afc5Vԧu%{GIHaœIQ<..='hVw`,|IH sJ)|Ux]A;5 C/+t94^#B/jػ:R|w^=;,Dw-=|M܆;(m(((tJ&''qzي_7$\x eOb\ \{l+8Qߪ#|+d[VċjM}ւﮆ.1^4pK-<]¨<= ,0?\į%0B;xFW}% 0HVdS3YScOf<dL.>ؔZ<{~&j7c.@w vۀ:հVC8e /*=aDq9Y@JP#a"6mqw)v97~K<#%t8CK.O7/j2 t@D.j0Ē{4xbgdLS?!5;[GT,3u;[!8;VaV TsE x,^pMK_5"V%[x;w0=a_¾mr Tl\TsO)rϵ yK;קY]3h} g@ G/0&G Z.|/`9kOu*}2A)f*|ȉNM`ohz:$FOJ\Ӎm.O4Ǔ( h ~j4Qbd0:+nK-&<V2݂9 }.rxڛ3')ʞߠm6*^xiu<+9Y#^VPMQM\CTOq>Dz] pJgPLYW@ {% 6<تm7NӼ,|3+1<4@QD&;yPɏw Jj_0Z^nI9 bӿ/_^\ %գǫ)߭H '_xAANJ=Z#GLHU- 28cOGRR>mL{V (o3>խA$SLf`MId,~JxJU +߅%J@-GD)ܚ\??!(oO/dDMSn֭SV?ɳlgG +G% ypP>8r}k5MCY,^/QZVwqT{pͼF#$y, %d/)7.9֊)#bC;FRtL#NJ)agɽz<04=?3D XU92W팴M>)Ȱ@FYEiEY-!6N[E>نl:=!C-9#এkDI߇'Q‹rF O~='bh.wht>ONEP7Q7[aŮ5|hs 5 D& uaݫP؂{SI-9|dڮ{Mr;^ FߡzbY& _*xOrRuQҸ [s}7@f>TSBޮ\6O@8'H{/ !+JBĒAX#y2A X P@lXo>aU"\Aa4x/ 5O ?is{ξ}sO\zA'ť'̓2,2hmB1Vrc>ֺ <*,$.]iq=;g y).@x{(8kh&ff4yP%f*f *9O<\.! e8d+ )Z<)O&KJyAZR4o4$J %R)7 )AE-W]PAʕ] ?K~UܕY%FbXa;voRWeVov跔+*eIUʒbC\Κ?^(6x?:=ɭ/Ï}OSX{MEPs#X9,f 4'5JF4WK]ZH4#"5%ಇ}TTP@D%ءsIypL!Mv1(x7- l0jKS4p8ѿ@ۑDj)RǞB@>Hnp.̪eHw!I' X<kC- )6ԭ +{“aFJiZԁ>6Ӣ2ڮMY v =Rᗽsi(6txW1 (hl(Bofܷ9g4gUz ڠj{ 6ǎ> s7x?)M'x ʱѨϦ3>ļ "h4@t){WYAګD(m*r~7nÇA/' ?'V*eáAFCku;p# Zxa%)P4a=Q"[uGa7x2/[ tmSڃ7Dz߷k ]Mu5>oϢ}0JuM.jZr;F9+nZ0(oGuVnss~^mFQj]*ԳR1Gd^&6Me⇯_e1b0ZAqIS>Qc&6Z%V8]m|9r@G%~M-r_LEZem9Tli$ʔr&)9|&hMj ҜICFx/3+.աl~IǢo~6;_CFh/W?=b vʆBbNI\s;xz`eS肅B]'sT^wU+QRo%FIQR ߒ-ox^ eP;7Fjeh?TpˍxV Fo4 F` .&l<h7xhɗ][(oiw]+^_\T4;|FRE0=LJ4 H@pE=Qu~l4J(N x7F-J! G[<"FA*ybAKR "QlDG¹㸦8ܨ{/@0ْY'緮10hcPM@to* #8IFC:iU/SGxVq}1DD_2#H~Pب3#MT^s@7a  R.+v9# ~I*!rzJ@UQD@v> 3[+T[\10y1jEۡggd2mE9,?!KI,\v6B(- b1MAe6 BKaު,`6}Mp}n& Ux=%_8|W܂<}vRP4g˦ & S {63ԅ!Ű'd|ܹ"=aX̵,x~& WB!R}La`ݽhDRaI1WDE"XN.#C&b+)60!nYtI}Ny ^xh`=qVݓ#J0UTO;#5oNRwvp65>G+ф'\AKxfQ!h!֕; n`,|)Ok Aye+=ݍ?太m:8`GѻI}S1esDO#_X]`SowPBϿjy"<+jHc5$~cclp2-?46-5O :vi9_?⌂{A0 ;i]ZNtp.}.<8QѬe/RxwC Co01۰]M4C+">сũ{{|%\'8 GzCcqB9-+-Or bW/zO6u4OxîzS2"3Y+%a+E]u(o>,𢅴Cb8> }T&HC"քؔszgwN~bKF1M}"Bw|J)%'=Aߒ.iOhWK !SԂO/rƒx]*:*j @d}gPh`鋦v7[gӓ=gi#eti䌟WQ5]' ,*W[%&:8QB5!)6wlAQpg3Wּn`iTʾXC't#yѼ JC @عMiɕ ;/Dbdbw-Jr?1o9 mӾ)aSEr8:`swCkiK8.֋P|kѦV^0c1'I&!瑨F N3- S *Ezg̉9Fp(ŗS/4<ˉ$5@Ph:Juosd_>8@ Av\6O@ o2"C[a_aHt;qf"S ;?]J\^8ڢ!m?^m:5()S4Ridô Nya6F3EW"l$ k&!n='ԡ$3@'pspmУ05r<=9 I!Qo8K,.?= u S3t4 bPō#q8`34!:yѾ7܄ Ó<9R$ޝ>;X&%]0]c6٩wH^@ Z60ܣ9K8=79F`>x'.ʒ ,_ᴘe'H)Z@\dNFT(8 nցGX@0gЄ9Sgo@.;_бỳ=WNz"DEeDNI<3jQ,Vn~JݶxhxV*JۥBjox8נ1?3yXհiLqp?F6:pFc+ɭ^XɎ =o9:.]i}`_E]B},-Ǡe%д+£/; jTO%<*VxhPr‡3]&4ʰ*>q! lt)  v*Vʹ|WA?Du~5AiO[|Tď|U W͸x%)4_$Gb|F&UMZC/9d7!+lU(|qÜ{/%J\ ZLnzhN`Z99-Jgx?gy='"Xɯ<~Sc@!rN[(BiJ o*j͸&Fr(iQu0PY9. H^p]:J+1Sף';'ۛFՙ&u@@_Ac!:4|!8ZnrYw4|ʇ?>`L;C3G}|+u>sj=(aTktƸ1DݛN #i.L.ƃC- ˟Uެv w*|, y\?a?g|Y^iVN֬:Ve6iݍ>Q-Ǥ\D J3!>ETR!]N;iWr+@*Oɇ廣'n~}&&>텯Sԍ%=b)a[!J@J;ծ+Gxsn&v$Sl{{/~(vr~7-je6B ?)vT#ӑHlzXuvZ؞|hשzz_Vߑx48SG?=v7Ͽ'eee$լ7ɿR`$S8ՠ@s Kga@!7=e:~\÷7lq%uf\$ r2pP4 WHv!F'Askǿs6_ 5W_,Wc *l͔Gh9^dD6Qϯ6Da+" fEyP1RV(l0󵎚I_x`B͚IN5dͣ|рgH4Oc0TTGsX,Ld_\"6g%b"Y$V"J1aG)vE&8#2% m5T;5$39vjhZij9a 5 ,<_[i*ݑhԮ&Oy$K@k 9~9"wYA33Ock3W*\Z$ŏ"`EӐ[N*M+UDܭp2Ña^W @gECSKm1|U:3D_iyX b&L {%"G4hcB'i?y%ZyJaXY*(G+W 8g 2Q<9qXV%g$:82PN۴O꫓вS몭UUUC&я#kij;mFh3ϦR _"ͪ38u\,2@=<$XMa~wI=?e)Ɯ冴ߗj<;Ffϛsid3HaNV)l=kjWك! Eapu2MJ溆8-3η~|yXó"ヷd`- \j`M+3;#u'Њ8Spx6#ɪo @{|D a ?W`&\4P M1+p*%`RtxpxU{Lt0: ^KޞZy ; yv (\|YC-Xh~_4w]y\vصtύ\}a[= ^mXTz rŭPz:yV[|Bt:3*7C] }G91Iv:w5@4/KffQ'E0ÈV`DGCM^^t*b*P,5}P32] .M 8P^~!H@? RraS,Y=%ҍN ߸!s DwN1_|gwVM00ˉB_@n gv0Xf?,h|$?X*:a$/sG  Vy/[O%3:6N(i+s٧xӋcABy! 9 I1@_.߅)lxoW~+o-fky"n3F‘HB ,;Qzm^Y1P!>^ߡ@_ tG1vg4FMY&f~Ej{ 1$ti~9QHqIJU?K*'bO}`@<P`y{/FV+ *"\MZOsHq݃ꤲ0n }?$O22 + ԦF7p<dP{:bnC"zjn:V-LABֵQ+cw,6P6X>p#8b%07%M3B=^"@ [0K]Knj,BIKĬqY@\խ4́nd\P㙜NxrZu|iqxk|mw12>u4#96Pv!Y%{t_+fW<3$YaSLΪgVn(?[INYQ"sNY3nĻ;=woI!g9:-уrA,/GyuQEѰz3Ͷە q֮,ܟGEG)jpbG]EeL#iA~+MR3{zp0oS6|yc_˱W.8y-xD֮W Gvf[ # /W^b:c|^aH@!< # +-MQspNf^]/+plt%m } #>-$I'ot'i;ɕ|ᑔH;8ޡ HAu#=' kog9vR9j(I*n+m;'=ojUϏynf3.P34yu3 L:#7̅+ڦ57W{p&+Jԥ!J^6UI|邭Ӂ'D#\EtZ[@l烸UI$~:Ո;,ãf\8P~i B'|sV\W JzCچfrrZH 1bQ~ɀ+MJտF5hGX BQQ*#|QY^W,8#'U4x3b$+>nHي˥.aEdB7ʼe-p ZN.(Y|yt5A,6|ia]+g#k|EِwxdCm̻;W]K0Y#lq"WhO y{.αc0+CGX|/7BG:l?_XmrjL^J4c/@(DYHwvsF/ފ/N* )#JޏN\&k[~bU-*5 U"ޏD2oI mIjXW n9Zhh*["p:13& %"{{Np&fwj3?%ǪX 'G.Õ-rQ NIRu+$uTjt\yVyϐIu]@=ŨZyd[ Pe(w /9z3'lH 48:GP};#܈SBɂ|nV%D`W?Y- ۬lIq{J/ʥ ԍ<'Q/zF:4A. Sp xkxŪϓSp1s= !o|ƪJJ㭶At;mli"O<&(Db HkCb^ogj<ƒB5f:eA- U%G$kEx@} wzppOůKœM_^$I$h)t¿KN a 2 =>\3<5|{O q2:"xWGдD+>/v!˜ W̾ LX7_* Z^!_ua㿪Å =_sVEV3[x2ڛ0ޝ@I1F+3[&ŌJJ)e Gh /Zs~ @wN[絏6 ]d<:k(Z9KMk&u-p6n.K/z}8v) W7M^G6KDl250!,PS-_VQR-b/i m|vhy1O_M5ܓ$zH&(ef#;0)=\dW'3T}kp;n4t1ɱLJ<(<=mTIA-6g)߁yV{6cE32*yoxnlx!y ^tlCɭKE/,-VҊKH֦APY-tv~Sz;qCe yDžZ ͧhvݜuLH`؃#3'GFKFF_i1.?F- JPr_(<=HR 89Ng-is*q?F#ȜZP3Ժ/EdZ'CC:Xz?4} z8(4ӾGG7dNtÿ=;#;+-M" dzȎX7#_ӱT >|{o`Iohޒct5Hn`1* w2 XvvP3/q"L$N`~k.&\\XFɆʐwc#:תNsa:Gx%6*>5U=Lz| J(sp?@F1;$,lw9mH EFq@Ra.T_'aϞaEP,lExGp}Qn%g+XoÙ~lAdD&l)z.=xpp}݃+nS- 9l rn!mo̢Qqcr 9-)z߿f}iCwCm,0>{Qw|Í'B5zS (ZYNv+w^7+u֮v≣3T(Kb5j'mϿͧ|^3@5@۝uyZ lix.=)?dKp~[L`~st|O+1-e񜼎E^p=~9*͊1s^JaYqi CpvxJNNFPɸ E!bj,?-@jPQ&HL8'E`^GH$ZC"8mqS Ct!z3=RVЊ"Sm6_G7Drǧw9.RkPl k\8'ֺ(ڈG盵F&O0!5ۃfEf]Ň/^\,W4 F.% XOy#NF}-+۬Viɔem/sOFnZ ͟?k7UMj'URk߸=DnMcPlҢ!k?yITpGIq*$68n!\%yD&\L%u@[%JmRpxwJ TXOR5mk5t%'}zٖ\=f*>?А23\vQ:l@rl~|5:U#O]N'茯 z\ `2,8h6!]IpqVXeFH^IsUTdڄyBju^E7f>I-^HZ Y? z w96KF?YxN %6;#<0A !vNЍ>Q 0ہ me|h)Y Dz+tlV[vk+ϒTX5BNp(ڃد[Zߟ|[*`EGKt;9d-V&6۳N^.()jg;Aa)ɪRiEq5fb%PCi>0Ǖ61+rsjh i ?.|(.}%|*@^E9 5WoJ>`ҿؤݽWR)/yq0a- >PīށD@bHb4 ,/f.?7 ?tW0C/1CoC~ʇӥ.I+* 0<iU;(rAz-Wd#'OoЯvAڄY_=\ t}L(f( K뤘O9y-׌OÙ:A^?dZYx]yq'\C aM.9v՛ҏ:@<5A)F)ݏ_8)_")`{$b9hQ]ufwy~G}@ ;ԎAq qp@~_ALǴ@XvL MiiOLǙ5H8m:ucm/гM+jk}v[ 5HS>aXVA2uz W 6xϸ8c z}=]S(MR ,Śsv;uo:_>! ݗ;Ni~'pЫs`,oȔ 6i׽mIzрZcF*eSkkm?nm_IchH%~cȶ^Cm:썙xc&O /T,BzS]B%_GoaSIyj G7z&x5N'(uW6L$koߋq[' yV,v ,9]ݷ`_د7˱6TJMio-](iCnl+N.*򺜱%I;OȞ`E3gy&cdfw-dw?voz ǃ6Gr,fCnw , l8UGOh(pBQ/k{LڮcUk{]и022WDrPe_XcE&UѢ_9J7j!ov@a^L,mZ1n}1e[W5YkS`)3改LϾ|1F}lHmNEGr kPf@__q}Ca|q;XX{".R aWqW!9,ãfYC @3cȧ`Ƨ5l? Z+v`'[}E?sTt^WAgxfIkL@c& ,st^k1W&F'q$|4@m]7ZQnᑓ?<Z.>nDY9 ,^"} ڒ \(Jϗ)0a>7 ۀᘠz炎Dŷ9mQ RExY%t~`/gA䚱@/X,X Jk(YT9**a;ZND7uE4jdJ+IOs$ҲX1q"?EM"ve*o*FhЕ*`~G*IU\Dw٨GJ!pݚ?;9:o*x|` 3 䄖٧_T<(BIӃ+8`܎y`!)Yjx{Np>] aq<`pDX3&5c|MtK6J"* -T;XxuT>(!fѬO(ӰؘQś;ŴÄR# pF;,H,"I¼$R&P``iz(=2J$  o~*/)V է΢xsqF,jqA61kN-zi./Z% \p %/uD>fR!7iO"Ey20sV _F&|DžZ ͧ qۅaۓ#%r|#4n|yΈd$Z5 UXҋƹ1I1BP#nBy?!CÍ`#dY8]NP"n`KAӛrUSY0P +oB+Wc2jx9(}-`PP 6 6'-ؠn?.Gq`^H=k"s,5 \(X9e^ f&h1K/qUd7JK?JTq\2í1?pAPP5PN (N2EO88]9#E; (FfdƧG}x_L 9y5(y< 8$݇}xeլ7~׌zN}IlJT\o3Lh9IC:䒇+t'=DBfi2N$( p/" 5sCLjG_#ˊ $NރTD,6zJ)ĄQUYC$w ~Eȕ`B/f}%`j8k侩aDȱ8%oi"HӺDtCU20,:Uy/n,kgQ<2ڭsYvOP0}aB]* Q=Qm~m>8ը #ݜ+ԪmK#\Xv1nOaY:&#+O_*3b䯘3޷{Jv]>vx% ]Y)으u, ki)^[eD/DahYqa W CpvxJNGJM@YJ9[04>1r1L-V37q(I# ax#R$B6)IlKfUN pz7VjJ?&Xe>>q-|`뇅bdX9EF>}=߬5Z5i ׬8] 5ۃBfEf]Ň/^\,W4 nx%JY\5wmV+Ǵdʲ9r#7(-{O˟5v^,7UMj'URk߸3=nMcPlҢ! ys|AD+~(=BbӼΏ5Rž'Ldբt[2UMX׶[.qb*WB㥦34ǞJ%mgTCXb\meac(3ek$繉槷ZS5\n$pڀϫ*3mٜ$ 7 ?NoQhANEF$ )Y&*rKUQpoUhh UXyݘտz*&;aVh'hMdNjRQk,C͞|(2(i$Ns/N4OM v zHwyZs>>t99k ]1Vʽ,$%BPL!VV>2ӞoFRlL]h.vs' ~zpm?"bj:83?}9!OJ˘?5PCǵrŢR}UUi>voq>u_wv D<J ʋ/j&Uo of~K¤Lć|\(O \<(ILQ}Cky=?tP-w Z^A%&|m(MppQCA2-JK`x8Ҍܫ wP:cW0}d"'PgH(kK3n?;N t3ko_cn@qh7P㟏Ae`4U?T 8J˰IOzӦee7sZ2aIFJs>hk8먠װm:ܼ=h1ڀ7UGmؿj>OyX&vM3;k!TKuQLp Di1 0y vo.Dɟ ?yBsPM[K.˷`$A1˚Ͳf{VE|*k 0&fsbhS ? da*a gT0ܶVq-)Gw9$=Yzhe`x<[5yUoWWB?K? =9kMS̻E)zqS>M9ҹk!HѰ:ޛ5v ?P;+l $^DS zd:V'vL MiYk1 &Z -yE@6%xc_;Wnw.l7|fUh!\s+.WS4x?3j(Sʛ z|]sr|(9RlbM9QDսt|= ,d Of_ wo5[c fv+gZ~Cm:œ׮|'@%|7o=`p7v1^A#hqynX% $"A-FNQJzm޶ݻؽ7VU?aUVne##CDPeCU hgt=2b#T솉̮Lp1.,ojeռ2aӱ˰:Wը Y!SjoxnˢR>cUCEDƞ&{j 5顅uMU9ufD(?"?="8葿*lCl€{ ) %W[ &ƒ es^&?ncVk]Жy~YhPNmJE H15D^a H I` ~ U`X1M~$fm^ '4d! 11ށK$ r >Ihӈ 1?-"钉X% g5(}p " A~cWWŪ$|͹h9yz%uī%G{.XD/YCMWc_c.Wv5aǽ=dr0>A[0-3ӻL.3[s| #['P$Ez d| 3#bO 9o-:yĎGڒ fWYJϗ5+z߃=j9]rʥDi@rojdL;-)t]ug1w q *⢩5Ctr2'oW!"*Ӿk_>W~Wp]pZme~Tɢ(ߌyڄ5{}>|a'2 k ԷanXxpxTI[o -Ѡ3ʄnnoq1Fyܬ B9fខ!eLҺ̈+*=+p2 76]A lPFHq?nfO*d>YMM<Y~*8[聹f:Ղ!RL%>*.׽tg(Ym08;D]IH{ɣC+e)l,((JحOB\) 7\HF>Oauke_L1r1V*N|Db eM@̚{AV%s=>G:x7A}PBoRs2.G.7_dG?=}h@e^Dw.K;_9IM jB^dgOr ^E?ގkvߙrWMXr 7qK.ЖȦ?6nήG\Id]G/דΰRP.֨5mϿͧ|^8N4jr֑yZD]zS.nnr/Ib$կ3޷{Jwh }LPSRP69yXUPQ/ g!?ũD?ڨ;ꚐM-рѢ.yDVM'N<ɫ5S!\$tAH} uPEMH9J!}!>DU~s ,T'AgnՀӳ5ޝ0T6گqj"}UNjZ1_GS~/Tlh$J/8] |_n/v0_ arA$W~KW;aaM)vF}-+۬Viema Ӡ'{O˟5v&+kjFPw89,j3a.`P9-4_L] VQEI@*|:gQ. 3WIror ɷM8n%vnq%\Z'Qi1/jۧ-pG w.WvV9$uQ~ojW޾Wh]>GNœH`j$q5zHcܧ/.e@mT5uz:,r뗎J`gM7hUd.ʝ#u0l~5:դU,(s'Z~:JzNy jkJbE eyNaUR 3F[:5&ˠV]C}vg `NΚJBWf9mr/HeEp .E6nj%z~O{{)$`EGKt;9d-ր:D ~[hRnp [x3O@iOV}p8l3?}U!LJ9˘y5 G)aM)ʿ)~(W~_vCiw+P.SUqW~`lJD /TPAS={ŽN~_&zRO|agȋs o"^'J.FSDp\6SG?=v7Ͽ'"!EIYohu@+G}E2~!Àp /2'SuRE9AFZ"PxtD9q;@26>D`9R}yhk`Wg_\RΆkWg_ՉiٿVh}quu!ZxaڰmؿYlؿVoؿjoؿ6_ W\6_ ׆kaڰmؿ6_h6_/- ׆>/6_ ٿN{ycSHؿcr/5jCm6_m/ RZkZ W,9$ 9qk\ߒxkC(z|"[mҋuڲĉZIPm,/h7,\P WR.k6pA,\ k}9KׅӰ&v}W\`p[(40g!/MKd0I*,oc)V(RfÔPa *oVݜiHvՔMk!|$t^yHe$wU%|:zܿ3dvg6L-⼭qElu`^{|,+|NWw(m1 K(J##:N>,da/`O\} tA:\X%Kir$_f-{RJ0OObrdP+f"tw+>)^>M9 ufGxj-rGxrG;tψH=߭tf0pyMC(yE_V:I.;99h@pwvا5I[gh 7t\"<^y(" ^##T_"YPà $aܚrp[vmT^aK'.j9~C18 uw;cihv=Qȵ{hIVDZ C٪tU{>S_*'̥Wgk:CͲ ?zÐـC6ac'غ?{z^߼]kgv_*(WI^6g캚32ϲp~1( $,N:āyp&jp ң=:%< ,5͡ћXoq:6" (U!p;T~UxXFxT^eߒ {W`K,g uwR.;Xx&i"ɇ] t넟VX=LG4Xs606,5{/%XtgQj5鋃,5⛄OS@Nc!,r ORu'} e!& V@.c4Ų~Hf]9Q+ֵաru_bxz\ Шe=eBQ%)F:Ͻ/M2z~[#A1(\Ws^ig7_Mja j|)70'c ;Pycxu3v[%T,n錩ͼB0Ztw̹HfFϼ"QNֲ+ZE#ˍZ9E`X|zRC59+ Ǡ{ϟӒ*HHl4-$ (epvF&S'VkDSKKV?e lWR㛊nh!hYWVLh_:H9&ߘE-DZ%e)He»༽A4:e  w;3I{7DByBVQ"T*u/UDb?/EG6jh&\b7u.rn=*c̀`<ֆX9bQxE#)bXl ;o^?˽[;lxV'>cB=bKFH=7<#;@-6 cU6!9M8_7 zcވdv&m6 q$'gE<( &_}<(\,pPIL>1Cǻ|xlMYa~ʋ t~D+eˑa`?%Ư U*iL>: D/cȰ*θz,^?JOX" l#~v~{k6n=S4;Abhvf(<γt OYQ: XG >P.+e9-==+%TƿW'Bb޽JY:Wz{v*QW>[za{O++?P=L8^XD܃oRP}hY_  ZH6/y?!V( .wx22 'kY݋F*";Z&K+8j0͇-aMOS?NĢMIHbit,eE$ 9p)_0\H0rkPܾ=d7};H:-@&{j{$S{8&"sq osWEŵTv3#{c`9i76Jmw^A5Dm9(;K}|EYzu<: xe]Nea l~PM%lqujFAGʚ'h؛zt#A򺘠&eZeu.1"-OUlT,JMٺw&Z^!㿝ogqG3×`i8 ԍgۚ9Ճeym4F@݊Ǫb.rG;ɩRD͠K7s4OJC.<+ ?@"Z0";!퉃5pK}n0*Wrp1?@%}aJ0q"ȣ.3y+c a ퟘ._VUq5ǝjF+~;;<&/%&QCcU2rzkyl&9vZ< :d(l? 6( $W (7Yxl 9E! N< " v5mg^*RkOiM q[gML7פ08-h,7*,ʳX!mF7vXTA`<bueG\ Jh܍ᲞU2T¸Dyy"4k8n=;g 9޾1>a Vg t]D&I[S.#]oK D^4^-(G1:̆w$pvgz:PvSAC0ϔ=@a:j-#N@uiE:8K=VK礵TM䄮ajֻnȯz|֌'xW\=+j3}jz&ȹE6"h+~߅ {ه^(^ѓeKZ@7_=Ve֠3zт`Y,M},L㏊Wfl ="JWdj@TbBPMp|t O!Dt . ,RO^}Ϯ2"F7%g10ſ0?Ke@/;鞳iy誨v'}|9v<ὄQz5`9oT|s"t)Q f (_Ws{A Bۅ牨ô^=LX#*'Qׯ¯ FǬFc?f"uc4'}՗U Ȧ7uZ EةDf04w>FW&Z,M\'gZ_? |xol*_P _|xԿŏ #pŦ= f^8۱rBK9YQZ329F_V"p=?x%_m?wp+[cl r-kB1:b~%*+S >uSjW!S'~8[l(\A<9P|?PR'"Sw|P1ЯgJ%(dYsBު# B?@?"6Z4\ۖ*5~ ˱Gh6y.;GtpJexkM3/dnEK_;^q+'eSg\~X;+^ٱt:}u, ͯL-].Oc5|A~UiY;OZKϳ:ǭoF?pR~:tr/aة\U_;*:r W#_TP_)0iC)jj8硈ل/L{xȳb_d!wOrȽ[r)Z :i6t~ER>8N_R`/o<#Q:WGR >}cO>oo|Y==Sxcox6z;,u[ Ot?ժhl F7~:'fUKb^^m*aiv<;'&e܀)sm2NG^T,r|o5;ro-l Tq6IKWoxg]E6C*`&RShuM#~xr.ČA(N|/I:ɸđd0coJ7?Ҁ`=K+ձXlulYl߿Fo6vBn/F}8+j$>,bG{ A.?6@+;uNFg!~}YiWt|CdWhA04R=obĵLEHl$00W.Ay^VGo|+WR䔻GDO`%4rRTͮ .Y:D[nuRgj-8?|AKBKBiT(Xvt֨Y?6ʊy#%&(&O) / G $qmqi|v1n/[^pv ԫ@p s\tUPb|OīZ-"IF-}\_NŵT5g/rπ1L/0J>O;DT44>N뚗"}s.q!:]SG^!uZ򆢥Mǧ'vQ 9_ W͸x5(ytpo\hդ ^2Dd AV$lUX c'uX^KItЏt,6ެn5.8S4)F}=tP 8 {Ǖv)cV%K>D1nE*EN;l!KȡH?v1_R֎ҁx7Xʿg+E*=l=$jk'P*cPS˯k"b9J+^JjyU -^oL"S\`GW}[(LMJY.y o^ѨTЫVzCCt[tŽ]zUҽ:(ɢ ^>+ؑW.WW]:|yH/J݉>("nJ7[r{uG )Nt 3IKqgߢ~ppOM/eoru<גz֛lκ&`a 2 Q! qw:~\÷7'-Ԁv\su6В cJy"jrޜ )= Sߗk..ކ{ /e0C2 }++`={<&7{) 6DPAi%:hiQRDi8 8`cB@[L $IwNAR*fyX(XbաlqD,*I r#]Ío p7NEPe8-pM2pX! x D+IJۯ[J< \  BEt;Ͻz/AW7VZJڢ`rZt.Iղ"'?R`%ܕ2*)Pթ)ˡ$cm:wҜQW|Ǽȇe!~ "&[L%Fc#:i!pY=:)Wg u uQ'|,uƬ$r9-OekcEmaxMUDot4oo3l6@QנZXA5^MO~R{vGGFXwn%lvM.|YkvBS<2Oigxd#+;@ț-b<&p%(] c kp _G(c/i>HH9_ G3yev}wK>Z]n̶c25Ϸ٧ŬW'# wR_"|9Ku>7#dA)=Mt~xWRW"hQ5LP|pM6]̉`/nuab3-l?crBL;N˹2|߿J =#6_Ud34D>|u?fW?{oڝ6 z΋@}`'Bl'䬾m%L?RI* 88ծ]=́?vVr&`?`韉=ȑ#~1|Thw^H/Sor 5=o(Z$EHW|2z] b' {j4d u[%Y,mJ[ul9Y߽äxUOD_Znj-=”8ׁ;7YΗgޟ́[O Z2!#Wb-\;_'|ɫxJk[]5,d)ku@~pju'Ϲ%|.eMxe<׃X>ZWFⵖj,#9OX9È.h( ku7pIZPp[⿑un9Ru#V|dFml[xD\\pAwݯ˙$Z#P[&R/*֙};wSsK"OjrVu^GCW)SƉHOcӑ[HivJa#G,͉6sU"K)sG9?rKX/s&*m+XMߋ]@L !oƾz̼F7UqiFSHS #;8Ri?>eXŎ/Ed.PX+qTۗp{-bVўgJ#c)cˀ2k^TEgl1E۬֒;dShF*?%Ev wy՗=e}8Κ}N_FN} E_CBGgD iBo@?%"7zټ)!zV"nlk~| iFoŝ5[LGNZ=tLF`kNe `I%xLm'}G.s['GBֲ~^ 6l+tWYԓ6U'"Ai-Em5y] p:Vt 7u{gËr,HlZ{/)S)轰qY#;_Ɏ"^: Lgj6)33~3f4`7eV)[ԄIơO'rb/^R?&|9,H"2pPic1CG" Aϻw{ JLhxaT0|4D Zb8`pb;I#)X;/qיּw{  1_H/K}'n6Tk9ތ{*}WIsb6^g[eUecX.;e}9-,.R;T4*nhv"q+bX7e$AfCO3-FiaSXn=-TM3fҗ%=_mH9C} X!r\ccÑսOGG"+G*f|`U ;_ ૢ@_~s }ej@}"ԤjCM+Ε&H!*ZCԜ@;BiLGdJD9b K=H)qI2OR5(ƕ\]sΊWPE9X%Cgc K =7<{M<e|vjaiV.|k|\Jb~^ ];miH>Pa4V AfzX.n12-$@mG> ƈL<ʥߨKQ;AmW˳#:KUw'y%3…yU(zT*yjE~`4Ⱦ`d}lF Ub$gY) D.#'fmM"S4'K=6'K@6Iw.$;1I$G 9J0@h2nB WL4iD%i҈.K%i,!Gq ѿP Jaeà@cT{)W¿/_:|H#~xƤxUݬ髪rzqD撈 3jDE׈XL vy U5ʁHKY/.flz +wZ"|~gƉ/q"{=Wخ]|W,?ct!&4[TvuS?NuMdk832Nߎx1:?Ens,CWBG3_P0QmpEcˏ:ρ%!xJt o.IϋGֵ7-=~Y^ EL*ز /R)\?pd^j% B\)*=?*&"Nb𑋳Ge+w_M;ZϒW*iOc(HV {FՊ/B?~w f˂Νi 3K"iZDQ5Hכ260n]B^z?#έ + {#n%yw1C2xS*UKTGI71D{Rv=(v5R꣠;"jz +<x`\4-s/s~s?bkce+}o[ujg}bo}#ob#9u,n#pK`8u N]AOTy= wJ~`A^O]?V"R>ZhS압-G \ҧG/av3>;_{2:FTODTGTw3NR+w?kp>O 003 a>0\.n]W.mֶ w7k"pۇF~:zd9w֖sr-O'5bގBM($I2O돽Q܋ӃX"7*oƸRm(GoRf; v"%^8;tJ?MY2+RfEzž:vaG:g8ϋ}!H"ٯe,0 G:q6mNX ȟe܁U:%cA%d~X<&IO)b[%E:Qd}yV`o#APBw=&^r!FVωsQs["?ڪ` MFxD 9SPx36z8%m[XA\^/Fԣk;oPպ:t=W3̐1^UU2Ԝ&Y5%~kORZyC{N%J k9E15J%&.m! bUXsnpo%LRggI @ِ5 FzfB2ph+m(St`Klv)ov3섵vsVRD;E$!Im G*MЄSBTblFe)py8LrrA=޻? Lx$s/ӳޖ! ! V0MD S?~wgKNC @J8sLVd'0  $gG U7a=xvG%x{e=B#P6ϗH&-M0z*y,*iE^ 3J> ڪ]M9`%XAW-ea}>,f9OcL7Pp:uΓˋm;B[&7珀1~[zy\4e~AS"x1'PQa'f'%1-> Vhc*jG̯ՎZNW .wYN4ݒSe#S*lL-ed:lS2w=N-eh~M#:^aɸS߱q'_n_GDCs4wa1]"dYв+xe?jLs 8·ϣ04 K(llƦ'f+좏`xʌ-;uW~#y:'V-l h[&s 9l16DOK,H ;D!%@puYAIEb'|cQnVEk 0'*oP㰐׀NP#,&rIbHGbp_][AB6-G!*$uyMH )XL8Nf*c#[5Q6}{L #[Ru- J^%ٔлw]|kk.DA⻖Ṇ;'K߹ZWB5ۭCx TǷhrMM~i6j+yv:r|cjrN2<[麌[s*U\oni3toXF.~k9:U)+{BȠuEUh:۾י:C[&g]-'_fl}泅0Fݥ |Ŷ+sq嘐h5ŧЯG& 1Zy`5BEq҃lWiPT egIUljGaƶB"aEEiQi).ɞ@һchucZHpGz:u:.gbt&g1@`ҪTA^D)R5ܯd"Lu ]>$ȅR~^`i2B)j4TS"gHqTWph'H=:PT!>N!'$*;$xN%6O-Zn\Yv zO<\} J6Mi"}4(SXc?iP&;,,)EĞ1|;,lF{Kq¼Xhr@L!c*dg!ip=5UJ` NDBGp~wAanoE2VZŜc_x) '^TͣWLP&+VĂ}gm=ՎDAOmqscKyx_VWq$[`_#]qel[zb` /CFJ0R|1H&23CʨaĞaOMBYI:QЎWOWLaiFb<)8rfv0og KktMi?g* f{y";lyr` Tn jP^YcRy)k2eͶ5U2)b2EL1?_cIZA %dbP芒ؓN*T%J~WDswS8LWlg~ϴCgLAI(P#LaJ@GBpHZ98A>goNxfQk3~5:QC@ާ.鬗ڝӗEitX $R\s1 $-#5v4}TZ^yH@3m|1} S9ч9=alA 0Ln&!eVU֗a1k乩4 +Rؼu6pEh_eGzǣ% AZ%W5+BW7bf)hs! vzFmOP= ^ .gXuSG(0r(' 6Z%0̀OG ?LL\B4AH4QT7r3ңwj|ir/D4q/`_YzWGc*˟ '̪YC|khx}XQvOB*Z@T r AN;[`9a"R4{{+;JWa{2}^y>w%j"ʙ&/eZ捻4>HtyE?Up3ǽb?y-?"Z^%c)|޸^@\n'w )mYZ6|'Zq)5h,ljq͖z,8E&rɎu9]}TTrc*A{a@A΢-/4 Hoo:?hIG .Edxc, OR62ER(ƤN#Glh45ؚw#lu ǧЎATQ ԞQ>X~m.EKLi{Fe%F{@řuB+!{8{7"io"sO}RUP9Q+}N dUe*i<#J}T2 lV_>zkM#\)2S1^QVLWoD߳pߕ?qCL_\DwݽݵêxCѵ3]2]Ok7;P 4A -gux%: ){@޻C%\OKћ1ROpFI1 Bu;՘m/KЖ/;֔ԑ ::2.g7:2j;(V|XDR%?Se*[8]?x`l[$%H?} on,1y5А:n{mr>%_z%J2MNbnzSs /0Sa\ɗnGyof&BwKJ!5Cp,|(q$sp+s;y/g Eu::/7'%H9:Kh(޴<4 ͛Qb#r[_Or|^$ZV/ِ qO~ihP}\..~*:9KE%~?ljʡ..N L$Cs) RPF [3u |2l]X?"A&?]ʑd&ˆaZzƯ6]N^ML܅G^Y B}V#||_ (1?(Ǔ8ć_zߢI>@p =\:RS=l͋Hf>ՍY quQ@4h_EaU۶C9ϖDtۅ'4_R|ǩaXi{C>/ !xCXnP2kl ] 1я69`ol,WC0WR [UNS_IS"0I=:B ~|kJ)-5Jׯ&Zq[WQ`ܛ5T8Z!oDm'>ys4l29,9(Z2oifmVwoT$=J4\0syg9h h2g%+ҟƓ梕_IzWZc~ ybWIdwHg}j[*dRja)"gGgϋ x6<˗+ =Ü;LS6B>66vܰ2]g}*=9)R丫e@5=}䤫ǵNϡďc!B8]]VԀ\NGGhVWe巓~h ]L(vCµ d) nǟfE v57mT֖Bsu.>L:plNp6*'Fsfg[>v(rɭ\O\9#<ƶȫ̉m\rD" m*Ec\[qE82\Z+9ܖ S'GN"9rxz+jnћZ 'F 4lWZMبbպC40Q@ZUTk4܍sץ iy}VmQVシbalHKzx;x"f-toO }@̻w޽EG" JW{y\C-6ϣUkJ&xʿA0l!3;0ޣ߆]Ag\`H/ B7_:W.~ >Xuf,/Afw|BT[OG$AOBx:_%=ԗdxFEߞ B9Q0GuyH,NfwW"zQ 7Yk/p=ǁxZ{_naK/'_U̖o rW0r?og-7`1~_@f[aXDu5_MDޠ+ȻN4!||(%ډ+ EQM d]TB 'Ew|R \ wՃ AX L#@ P|JIeKPO~ ئ8ůqZt;s2\JАT)!ҹwrl sO,=e7t,;+~ ?- `(A į^xɩ @%'n~dʯO{d1 y 8F=;,\.N~Qq:M-fHk#Lh4"!{'g/2;IMj̙(^ģe1nz.r)Xꆛ/unM77zUK DO[\z D kS^ݞumN(1P/M}MAW;UEcS'X4v$@}]'0<,agVĜ;+(s~j44nw317O%=y {ҬOd&b̖9Qv%B*Y E- \FƲdn wڽ@_Xa \n_Mf{1vG0k n0!,Yja7cq18OE mBގ˂AQgaa ۡ'sZ8,䆇NX- >*dq"w7F 0\c5^Gr4#WL4+SY33jtoϬODı@³EAF,}4`TD+ҡ"|W&TjHOPsz R`u^'3QN#R+M)Fq]P#he1zRhe@WSn3WnmW<2[X5q ``䑁-Eߏ,- Ƒ,klB?F±vԒ+$a4vscܑNjY9бJ `rw`n/ 69L :qVwو$z;O@&4DaC."L/HбgO*qU6v7v͡( |)~"5+I `PV })`5v(\2Gpqb A+$aL ݸqL /#v Pi>#r[gm?RՏS:X"VŰaaSQ[!fholmֈD8-7״},5r5Y]lZ\cbW%۾41vRMñ)6y Ŧł9R#0- b|%_ v o^^UmlO/[Y7ʹZ+ʙϐZ0P"C1V5kIM]<zVYZMtɁV_~nxW7 =;dI?q%+!KGY#'/㦹/B/@/׸_^%8[t2 pD+\J0FV!8NWW+aETW8FjY$%i($R~&_p/\!0@$aӲ Ad$A$I6W !"d CЫ%>nHڒ ]Œ"A E"=2p \$IIg"}W0HV2 \$E~pp1RVO3c@og ݴ'Бd?ezБ^:t#ɑd#|:+:"q0`:C@ FVG*+@;Zvrʶ#lMPmnA?|^anikSJP !H.s$aPvPҕLr}5k`+J!"UC !pD^l~nԹZReD6u cC,c+pt@Ga^c@d d:bDCZ51[XmMVꢍ5ZIJ l0NV8H`TZБb)}MJ"zո/H@[Ae!k˯?F?q}#q8%v5_]{瞗| o="A?T_XN{Z3$~ ~YVz]aEUuF%;r\Ø' ZCH!$!jX[Έq`CԈ8 ƑJ{:|X6 Pl#F4C֠!6d*$` #%!6BpGq*L`*Z,QF1Gp'֜2nɮxn8Rhq!"Lqx6sMʃ79L[叉s0Kx v$@ /,wx `nj8BV,OR}*"Eї=ɴ1Cc ն_y7nD1 @}ʐ1! E]%M)QB9n,|<o) bQlp I7fyJow9U5B7nў cCA|caKZ%=aŻuNϑu# j;*F/)k9|1C.r0"N -B8Hr?1f΃t6|q71ђrZiV3x쓗&&%$`1"6dM Tn'Ik+0ulCaΙ露1Kh,# WK$6|tW硁txK7e<AH åa1\֡>p.\0qyp\>J8.Vvpeh'p?CgXCX}ў@Pa "[D`+g%4A;R{Wޱ_,nп.Mpb=V$^i6)[(n-vP2(d}As'_U2J%JO=W< B*CE'Š3aH+BO&HGadE§$S2i"([!) c%X"i8-:{0+}/!gV~VPTgkPD'W٬i8BJ,9'fPp7P(TU~:@HRǜd*7Z*[&*>5!'3q+Mjo8*pDU@jm48+M[›$> &ԪT^R U1jDӨ ۈbH@a\E!Xrݱk.aw0PU]V8$ZE]lGV'x:l*CNf*9q+6[ŖOUZ롪`s&] S(&e; ͆ %=Z2c"/q ׎؍r}cr9K`$ʯz"V}!ԗk '*# NQKD,s䱶_QV`2/oA_xw0q:>L4[CGQ.|dM/!S4&7()}V P+Z¢h8+6FA`/p0_+|y/n86 Ǔ euu7ҹ (a %=)?)zS@tW*覺S8)cS`#_$&0{}F19n2W/(1#ђR*)NA)E""IZ1PٸȈLU8#:̭MNF3]?+0?2HtVC|/NԈ0F:2ƈbD1fv ǡt2T_ U7'C;FDH@!|Jdp|`+>Hҗo#_ՂBLQgbuIG؃⃰=qzd8K豎+Vl0xc%=2@ Cc( 73IEp:h|p43vj|{{M{XM0ܢ78΀>2092 #Gִ cOtMCtC^%| vZBmJK'mGz8Fp U\tjP @8a9eZGri>p(SC['8\s$GJr fٶ[vGrk:I|cn+ʐdVq+.ߨ4{JM4nZ!B\A4H]`J$ی$} I&eMp@ܨ8!97l[ bF]HBb6 ._H[!H\Y4+zĮW[ڴ?J SzL+p$QkãQqTuRZan8C刾"O` ?|WÓ?<OG:ńgF"#U^U*΂/Ί.{1g3,OER[W~̲ ֋m/ I/YʬI26I+Rx,,W`x8{?^Hi">i Az0CzZtMӢc 6Ţn20LBx(*{OA`yb}҇y/BCF+n2ǑDzb"(bP?ҡۘ%$skov^̑9Q;IN$izb*:ljcSs8k2KMcH 2V, H\ ly2 G0Z9R8 ^{rtqvl&oюp\{0T(jy [*-x@ $W%nتȣ*mUr"z.{ &Ww2N`$&gS.Ms`0AWn!Xviڒg-A.Z x(sjrG hދ,d+1d q V}#ϓczE?OVg8 u? ͙2h_7Bv½G3u@d3Pwof d@)gf{&q խ@g뚁[bbBSbdƠ1(9uIfںQh3CfL@뙀VliqI6ۀv  (ňܽ h5lol@ !؀"&eB3%M:T .de{23efemqܪqW}O_"Giv6ʅ@] @[3ID"r7(o/%OA|lG(]ғʰD,|F+$bɇbc:1)ƄuQ}SBnZc_0-t"?$F9ijY}BtJ7pd 7YO*lGJ:lޖeצo ^`2.x|D/BKp){BH=Z>JĈ{gGE(wlTA땆- 5j6i(hܾ}RdrHC<l#AE:0xiŃ.C?6Ch~^UJډ+1_;2p*Gq7.V&z۱ڇvJɬOO_Vbe+X' \1@M(D5"pբՑoXwj`Lh|L,jţƳH= h\_j{Fhat %E qRƅ7lyyS_G⣼\{JtvmZQ✕Gr|cdac]~PMʒUE&=t'-*3;a'PՙZUڹ11="ҽ;OA,԰\Y\%sw)Ȧ{֚.N.\'{j(#iOF ~y 7p>!xR_&ib>K]M6X+^9jb_ΒFwhy_A SI ‚+YlrYpN#&nbT؆PiV,k_`Z*x@)CV`[  p?Z1|4jͽW]2+ Q|?z^;1el)S26IR6e_f#cȘa[i녆U'Cr0CrOHK$~ g:%63a'2Fcӣr,VEhڌ`.rK u]2#S]a*]iZÉ~[5 J;KK:STO$ODFQ\'{Xɟ0t;s1ENH)4z#&r_%iSZɠIj .))*qd@_%-Iȥb6ɥRih&.B/(%Bفk %yHRxR+^[*<=,5˶!+ \]O()'@Q2c1qmbڏR̠#Χws#Tie-ElX.`ݘ3M{ A8hyqo|`WIB4"zZXQѿk Rt'rU=QGLV1)E_v OL ,RgpC7wc|1*׼0y 5x7-w >RBri}}Xwξ8F:5|e sj =/E\Bً޿!obq:BYwcqߑg+jz4{R|:&o.ܱH:Kna>r>L9 EYdFTh.ڗ;YUZ8Ymh1 $Maw8th> Xd[$wxY[};}߽Pqﻺ x/=:.LizE#@l.)ZOm*ߧ%`QO?O{Mp(\35`8M7S;Gu'S'G{x$nj$%e;LJar)[0t#E(ze63NS;H;0ewt) <*ËFx!mgEG7LG\.&Đ\Llr,MHL'e\}DA?r /oIMXk'5yjE@ʪ.b?aGʇOެn`,qIN[}O=WoALp) [QHCrv"1Vp"i-iڢB:ڕ +^K m951s`{.P=/HhCX_/!61uYE ih+ w[`L;*ϻ;hܥu7C}tXyN <-HGAǢ m-\4"(/yl0bNh/F?Qsn:M!xTXL5a{@)9qsDF<&"١e2~ ЍWaر'Ziǣkxqw &wzZd'[40imT?D8Q@I>3>Hh)FQ!٣\}JVqp⊏^*'2O]aT` $ZMd_%KK|./f>n7)M3hZTccP>(Wf7unc_"hvtYd;Q]nvסk#ݮF/&ÁzRS Bɧ""RD܋|jCA*fũ寔>5J2u*X3Du6ݩzmّœ7 WbkxLNL!ޅtoqwS+9nFJ~]Y7TKiSMM07UcV[58  ˵-nz.%lVWMz!(g[^*ȞtA=Tw6vtjI){|]i˭57U?eae/$/A:4qUbъ9M&ܺ#Ġ#h'T>+Iou=Zȸh !pB4M-CMK PXZOXgO ^|q>͘[ͦEbun¼f:a9z#BȬmoskρ[-hk{C"pVE܌8`A+B ]xX?;Y7He 1897{uU쳩7Zͅ>*7~di|M12^ h6؁bd6BpKIp r'oA.@p[,—G 8.S9b6FŎ )갅Sl٤\JM&Z2 %<6$2N%P0-ʨѳJYXe(qW%7A ig?wHO܇CT.y6qn697\?ZXQZlfɑMc@F{Çu<;3Xw >^)_٥J2Nc(옭ψx?%tvꔑFi|:uD N N#Q`XY{k/:r"@=E]D:#)>~ϓ*g+DYjj28m,7p=ZD _B!pJvqJC>b=S۶pYepY]*0v nF_e]w;4S'6Yp^M~nvgfwL&&-FZ-3@Ç&-%t=8hoL3| LSVL&ͧ:'FmRķvdReat2n$nRz!ۏ4D* TZ,zƃ=Dx]m.^H28ɴezDb bJV\3voftRiwl/ |]!x*I8+Sp1l.NH8t7N7q!bଖMhQͅ >syHBU'(QZj1(Hy6W/$M֔WՈ},/EFA[ou +|P>xXJf]yU^G8f{Rg+j7ZQ4a#YKg+T+Hh]T&Rq'"01b)UWr*>x ( rǖ21VϠw;TkaVRDQL0prPFC+(,DLieA*-/ Z aЬ= Qpvgʋ*'"T?IRR- .NĪ"ݼ 5\D~hEB@05 J&\^f&nOHDO9sm/s*W1:|jΏN/ )` ?Bߡp: a ֍ 2c[cliUtJ*EFK5 RJEE}V>Z!%+L `c #WgZ:lɐ_J`̭198~aEۦmTum;QXNnpﻸ+lipdžԊcwh5Ezȏ̋n ` S!<;>pdѿ(Ā[`\8:BC g8-R=AH` 7|BZPU8F"9R)я=ZMl;!C ed-z:xk'*{"CHw/ *Zل2Uf5.-qTDh]w}3 +}?vΦO##^@t%R C*eiZ=pn. **! N(0{7 I9F F=xdN,ZpVhYVV (^K* By$1g<}1SJ|h-Ŀ|#YQq-ѷh}M*]o%j6UΈbk 55h GWG.5?EL2ssWjOG13tu ?]f h_dYl՘Eok-?>s-ŌXf<=>/epIChX $%:TOt&hL8͛4(2zT[͒]p⬣H| B[5N6B8eP]V}x:heweC[8:"D{koVoplH^q#+蛔V\U#GNbMX,45bMX,W5}mm"]$D[5p_QV-uaa720LE6*qx(ޖAD5u10̰ɪuמ2`T ;L U1z?>Ɋ)ͺ +V`zGiJ=+wy‹ =nsvOɐID[ ΙHQzn9 g37_8s!]+N|w Kj[mmR}5b:.=V*KJMƕr+1A0- z3H;615cWޣۭ"6OjW*]D7;0ӏ;žs Trӿё2%^ s}h 6W|<51 $G::gng*?k8GS~EjapEA~- j> gu\_]3U\lyMc4ZwZu@{C_{qXCp / /XT!րyTħm>NhF1%Q)à&X}CIspĹ^tf\޴1HEtq4&IVʴqPRlxNl?T==8nNPA5̐W#pя!,;{gS~.=,$8;.q>!"KOaR{};!(Z?uovg?~ GT5XV3{v>`c[`"swF]nbW,5w%a/Zʰ1~4YđPst9"-g_~]pl>H Zf¦ɸ E.^'^D};LfڮPMJ2VI]LUR.Vug:Qיx h Zq(:M>KSLVx *B$,o<&XE]x(՜80:Wɗ?5G-Йf_G5h6AXV?Bs0":T1sdȢåF?pIwGu.瘽\`ysf;GW6MN|bHA VӭFl#` qA)eE~#`}}aI$Pq[a ,D:v2xyz/gS:!;Vu^(6w#֪Q֪`+jDw1T7N@'U4R½'VrЃr`p~N{??/ܣ8ӋG6.Y#36s3AG 4A%u/=RR!WMT-TQ+VM(> Q$9]ٯr5?'?l\Ujڂ:h+Cp*ԨDK% aLg)\  $Kq!f4=^'R5/T)7, q|W?6^o|W?z¿} ?f$mU:xijD$;-JcmUR.~QUTUxn.WjUE#m8R}b2smˇZU  mV S* AwKl.;2ѯa$/Waxd7^ܠkۀA˕k: Us&>ܬ5]өV(ם*U&f(Vke׭VY°..VQna\(֛48Ĕ0 lE[vov;eaHQn* bT&0pӭIlh𯖝,d(yׁ rN!5ñ4j!^[5\:`oXMrʎ[vU;} H [vl׫McP+NrjeRS[&>;C.; T*UfRMnqͮlGԂVQz (Xڱpfj&*+NvzV1;4 :$<ۮ4IuFy7_1acw3.5V+8-bGFbF^Vh jS}hͺPw+Uh]6N a [h[U>8`;rO4^泽Wh?vv?F#+h?G(HGXf??k]#~v@! XQ("cU ~V`B9Vc$#XO(^RKz7fס*l5y2(uxDS3+;Aܚǟ)TkxR1ʈ 7l!>F-$N^3H ' qAh CZHMOOv|e (ĉV~5؉ؗ`'8Io]n ᭋ7;@Ɏ)t X"[C9ںNS:vLd;)ѴtњJ$fҡ@7p$d,ÏGgpJGB'aeV)0V\(rQL0)Zf@RTw/GS$#V )`:]fq6p` RXǎ,T` $I.AE DRgj=/Rvhjn!NY1#STEjoSNhLkE0)R=B,nd.CZ6O3 bY/V,=S$@{\{Jm;lfw5K~fX!=F89/s>j zr N*yc}BL9 NnơI8??4QEh"n2$58ȃF[\.#Q1cy#A1ᛢUC,;`wd1dpl0JM`~mv_K-e.K+Ộ]һǬHEtYtC!Cp\(.bnr .ix-d-Q&|f-wJFZ&8 bz]858F[Whfagj{ܪW$Iة7\Q[CaEZӠoj]b[kr1`-5QIîV%."hDh!$ʶ٪ Ŝz=_!F`1X` \Lު7Ңo5kZ3i2suX4!jCS½`1*Xm*uqRKڂ-QбuE+Ш6WU;bt*B•`̤[]ڂ5 4D[@7Z-[ Q[%jKӅ,DhPUl~o2=Z2vd/{xoXG_J)9|r 0b<-28=V\G h=&a A`_JfG Gxo}ORαa g"0#*B9VaǬF9c~{?JcѳjDbT}щ|a i"_r%tk;jvkv+lQq_4/x' bKb}/4yxMlAE:@W9k2? jZSݏ{-\k2t ]fg2L.+CL |7XdLTpDL Fq CyhDpLEBP78ݐ[Ρrd煡9|}0[$-x`FM&? ^ts7^Ƞt*ʋ>ǐa^0FB fk gEBmvX^@6ʍO9@,p=bDcK1ֳ =[D p<"~iA|L-yÆY+* 2K +/^P'azEbz cF G0a c:%=!Y 4_$K6̋t3C_%_&``[%l ?!LfDJIt~(C6bXhp1Ih1AU:ؕ:-g3kq]KZ8XlnܣˉZ>B\4bW1{VAox:b F{#/_Ko|f5e_ Bf&o!=8 "Jѷ%Kx)B"{l+y!! ^IEt1/>Z ܳ;^~U<0 UҩDm4-NoQNį e:#-zR3k7h GWGs~lFV~b:ܕb B᧋lr9"-?]W@vbQ&s&'h0NMj5KvucY~ o 8'FpjSa,?Ϣ8EK:]~hڥxEkâ<$O_s@>06<iuSK1n" XƓ. #`$z~s6$:=̀vLĘ<LT 0QmwD0D6QOv(ݥQehhd7XkЃG5"<G5|m`oFaܠMQk[F5rR?Pj2[xץlvkք^nKWo]u\+ sp  8&^DkO=9::YlQk ^/QH Y}brWE!EZll( UT:\KǠsEwd[?'Tu%{BjKٲkNqۜrRuj4 uIQgZufYmҰ9-1TJӨթ/k B*9n%BNˁb%hk#&OZu8 רZ$VQ4kṔwuĔjy@^v88BuD1s+zriʻ:w֠It6uҨKߚ]vq EW4 U `dmvM@U-eגXtEAgU~Vm 4z* F] 2 ajfj6$Qm2\ݰ]d;Jd>.xw:l HW}!Aam#KP=׭2-q\nm;U[B4h9&hwB(: ]-06]e-RiPwj:J: 5XOz% QO9ɵIB>. LwӪ9x C{gykׯ}UX"v5+ ? "~:Gm|:7>+-$ !d HU|jHd@{@r2 =|}ua ޼{:J/? ]knjevݏkep:\ep:\ep$: nCt8Ńo1Vf|T/BO&`E_b@@SClz1 -]pVעAad"1a4,LX_jwpIQ %.))$u?Xب ~G0eW9o?3&&+(#Ds6 {.qF>1 ӥ('u6&j? 2 d.Kӟ %h26P\+,=PT r4If"LN҄F\VCnlc%u Iψ hqc"–0f0;Xʭ`v Fc0 cX IƿHnx=8܋a/ۀ@<-^8և|mɱ`oD`/k[ră^Ƽk%7 y76 yF{}wS{$=e^p<̇ÁTAۭÛk00pHópku`]QM?I wcK.7 _ƄðVlriadoZ/;UJ8eǮ󷵲Ӣ0kj•-1֫8JUm}T;40vn XnTjlժKb(WdjV)76v0I\8rn|kb/E~MfM\u]f50L$jf ́FiTmZ l1fUZo˚h^R! Uh b%nؒJZMƀvRwECn6FYí[1^"rơOZ+P>jqc{ Nݕjs[ fZ.xlصsG[e,Z`$\5AG-q4:jiV%5M.'65b|@2;SW`5dLcn>8 r~9W$dc5[=~= %g,Y MpG 6} ~º{;Mah'zTo=1u<M1;6X(r6p|^POZјSπȳA5~Oƥ>KGeHMm&jHu~TZu~ԇb}e Lů _!SİNŠeLs߻ܻCT :p|x#݇_d 7ʗfWH8$ v8ݳm~|n#j5ۿO߇ݏ[5'\e?n%"< Ik\&Dž?vاqsHohn# h0zʈBKc?:f×6  $Ɂw];D%53K\-os`&8R05 X ] ٩In\r+1 %2Ws-wd\oZ*YB# ш5 Xŗb\ۗ:qol]S U.nYk[,doպCZOg<}7_Ar"`Lڎ8Ⱦl3蘲 {ݒ(+[uިJzK^$VdP2l"3 5V%F3* Yˡb/kUWV/j7ZT3rjJ)¿Q_F}ɜD}9:壾d~@/H+e&X,-jc ׻}z-9,4YS=Ov&cᰧwyrc̓ڳQI|,)ez4dqalO]~#E /%]ID^"K-,JsQUm-:5I[Q%\Bڅ/֡)ܩ+WKkEa9E용]݃:J4p7ȚE΄B02"fUD=zǚ(q3 ?\P>~Ԍg6[_ .D+DŽDx_ Ur^<JTp:&1Q1c|ټcLJUțzj$tKL 2`j_3{ Zkz&Lr\PLׄ6c4zzbGHG艣)B(GvD4,a:D;;*4x!ңEzTfe&^p} |(rO~U.^䐎P[p)}`ƭ`F`p]Q %{СaI(K%|1r!6pH/8ɩBqn5>"Wڪ$@h4T.^q?ۏ9?SpxVK*P8EM t:"|K9ڻ"Zg4hP5 &ЦgXѳЦrqxc0i@U7>GA}7oHET;->]e 5[fWh&:]L w`xHHC yuFGF*0'd0ip`b?,|NvaN^㑨)>DI{k/~wsa Tj^E~Iczq_h/ϵOl@-O?[D+<(r+ }Eo5dЂB}q5F)aV.9ص֢jTHqxpzqib`nb z  y5ZxKFq>툲uG+K GkwC8U zmty/Zzݠ's4&\&eczNGO d._Pm*;vv$/UBSsӷCvo!Ѿɉ-nb\vld: z2 4kȌN$W ;B6>v/R*H~wq#=绂N/Ǧn|KW)aѿ4n&t]Eފ".U6 ʂITk1fkM{J j<ˊ0ȡnƻco\ʺ{9 hVu?}Kc49&ƩJbfc,\ݧfQ>ֲ_+BUB^%ۘheN=iHuJ%x",$k zG-kQyFB,"Zy|Vh3- aJEbПAѰR @`DCnޡ&jZr%Thъ=^CM#፮>p jmWј1&,`zmlbpC=G<*KPP P05sO$8, 'V}~d=Ͽ_'V::8/z3[.Nٻ;f> D7ωEJ|/ Nۧ:Yڧ/H`%G 3ۤbA/4 hs-]]y4kߔ #饷yb=s^Smi1[b\% )h..[208sbuQ5gjtv>iS 7'; oyM'_Qk쥇}gDmdoH%klwd[m:mbFJ>7hQuw  )LaSx/9ZoBu/);A+VR8N߈;z'm1E !H>d5ToW{g?Ɏwn:zB/ƔY9T!Xٍ$ 2B*C|.@~JW|LQBX߀iPkӥPYJbqG' eCe iji u$T`,X̘Fm 'T SE돧fapiTjko3@9x6]DoV RڌVMgh`c2qBgQtZ„GIh"l[a j.ʂm'~QX3x~7^R F3`q]^$|$ĒIÎ t9kF0֯7J1%m 4́QaEnإڥews],ho&$+=%5E60W0ЉiQydFt7lʹVϖPҹPzWaXվf鈡$q2K|rbb#8t!п+̡ Km ›?ZXOמs")ҡ]^)֡ Xٰ!bs2} a2zEVeQ[{wW!俞q±CyDzh>M·/DC<۲:3K1c]Ald0> QNE:Hg88(xCjk0SXۓ?S?Bhq>`NqM?j^-;xozFf[u( kI֘UlL!4?(_U0~<>X/A<'%YNb鋗9!*s&'0z;g0z0zkpMDYӊ~1zUp,P~k{y}2_#~_YzG@K5S Y_JqbZ`:fKYL}H@g]]<(oX* P7Y(;r׍Kuad?E.}ᡙ xu\2/^1\z: mb3W]· w/ ٍd4] xh )H omC sE0Ha\o(@*86XXww߉x5ת1{^g+P҇#$ev:"WEN&|*r\KX9hKm3gBsؤ4YkP7wjno'_PF2g Y l>(fVW&g\OYҐZ#{77I)02w4{$a @Zr[{eV#?EƷ(pn |9|˝odd3yь=Bl eæ̿7;X+DFy@fXa5̧k^7KUkw}ϢHhh>.3gF~RK\qS F$1b=-y˟aި7Y n o" Ax]fQHo/7QQśEL m'Noe3)DѪTm{㶡ENOY`׃؁Ją>#@$؇0HR/\_+XvO-D?Um ~ua~O'jE! |n/Űwk@' ޞſAYlf-nP;䗼ckE *|ȭq6PXX%R{p=Kd9XǧrSX Coò1Gaox]"Qaņ,Y{m`,7y^Ek-?>sdx-żX@DZM~/k]FCj6㑰) R^ ! r|UUbg,U`ã/OjJ„C"r:&,Rgec71d>Vj ኱9ee jhgu}3usҎk Fc><> dc3Yb.>{00kpCz 7+G͡'tP='D=zнN?Ax $y>Eѫ<|2fg>σY9$5|ߏ: 'ט(u1UBWB3pʉ{x9kچ,w\֑FhIdB URu$jIrbۂ$w~&$^gu.x#yYYP07j{NkF2 :ˠ2eHݤ=@,ݼݐG^7$3FRóLosB%t8.pˑp³y\qӻQsWN)^Xgz`!#tW 8~Y Eϥ) iO;~3 ]"/ 4 cUYQhj+kD"AOע ;WǚnE!^PQT_p9ZiY9n_1}h]4/ _ 87=$y'v܃C\:xNQ0n}|hf>j0pcyW|_Nvj>^q_:_/Jrb(H]]`q5;S ̧k>]Q]:r|x`^ڴkTׁ+&bpdz@Oмxѫ"0Pe|s ñM&dE~Iܯ|'cŽzʀc<1͸䖿ˢHm(z%=>Xחe~}¯z>gD+H !ath9 uv=d~ {2и 4$MҨV#iTf60}0@ :1%һI49]|qUFd] n.zvqܹ K:=4bF+VwGN,k:7NZkn}Ry7pAqڟ& ή0V PdGesz#;?,2<&XV].1RVnLWic +Gq` [: so0>-Rib; aM&ϫm!KqF,Zul?-@:g9].}*bC̷R8/.mKP3#yy*̀MUa f]nS4]|QȽ8$kCg2Κ/AppP'4-*Ξ9|?4v.C=w`%ݴ=2d~~\?/{e<3OG&9^Iq^?O_` paCl={q,83󕐪fFrxX B:α\'| wp sdn![H,L,LGfȱlZ&fEˏEˏ7oq Wn;Ȁb?~ <\OL0Yb èx{Ocn]?#T"=T ooZC2?0VY.TRc t`ixffPh:ˬ}5cZ^ؖ'g^~v9}qwkǁ{06. [ϊ`Xz2i1>n5Kvh>w$s]}(S,܅ߦ7WY;YÇ8y5w.- e\dİ46>qQP@W^8pH5 OcFfN4|GV W߿[P:Fw J_7_-$|gގ'\~?aI?7Q`|f2|h&C@_Eje:VΡ[?mĺs=D[Xh{ULC?`Ӆ7v4lpSSowڛ crvrvl-g^:7Gwt#ޞ(?#ĽrAPXgxXg ~~,g7VypY|o^}JylF߄%MwswY~1oYװ{وq_L?7w7SߖmzDC2.6 |}9UnvCFZx&prV{|ZOOѠ׾{"}?zNF֬;[-j[܊Z Zj;6VZZ $ʲ]H2r}L~)>O^zh5K۟'ЛzA)So["`6#a%]: )|*wf}3mpyb^tve#U{5U0pa% h22̮&cdh¡OP7KBuեd)-K貂*ěV Op'm'D@Y0(?U0J֒1 Z}l)l@'۪NS<S= BA Cg~op{CP ,t6U`̦xgy2S#ܾaI0>R$ooӤasUU^zL U8135r` t8F0H{8E'鰞~z`XhMO}(ʧZyKoCtyTq^&,Zg XCQJ]所.HwR;2(ٖ'por-6C65c]IdɳU Sz1tF `HH0P#$1ii{;u5:JjB` *:Ep̫\3 &~O4X01G sIbXHe+FA)& --UW {xjhx{J ,Q 򻾻RgĵC /(r$[.}>Bi}y'L2_U|x':)6!e.)T'U64YsO}IiLB' ΌVt08D⏕j@QC.hxu$h-3p^qInD$e U|>\m=Roou-LeJsp !jצvrroіipB5`NCbheTy'~|oŰԻMdophyxJ%i ;\+5;bCyoLN渭ƂdS:**VRi]Mp]tF VQwDjZ!c)Ѯ-K,H7wEnOWu$iku6 x>-JT)5rGDづzT >3 .(,D*AQH4<70*wZGóAFRm 4y;x 'Wtͱ_8;,ac|b:5oNAǰźn9,7ܨlh{0+Qq%ox[X3 qpھdVN /tr||zO*v'mI~xw*a4d,%/ĊFXIV>z= H !2&Ǩ|#n:)1>b<ӽAI W0 8H' t6Ρ&:!N~뻹鰳;$ j܆xp`F=Á`~P%ARxt?ʛ,&aFĚxXQFL >ܲ?f->? dÅMPxmuED$$E?Hɮ hIЀ@craؓ ]ޡV&C%su>`BG TEW : xX['ES}? A6`g`Cɍn#Z o/Z6~Ԇ}cKl ѢgۿVz϶6O0tтi")!aܜM~4rKvoFќ{??d 'Sd /Tw|yTx]|V]RK-+>F5A.?2e,@D9x)ٵJ.cS {\mIoOcsMF!݈gRQ>NWA{{i,H }>( I/ whp_W S!_\,Sl*LRm/Gy{?$! 9ny)ix BEC,sK.:1-z4;Xtއ[]%lVT*] ldqb_/H65醨6BTFfR"#P"ui&%~#gW^(O0ļzIRG4Ol ii<}7rk6-JӒD0 Yg:&XJx2nG7bEZz/K峢T*AI̐CJZ˸7rIn1絾4^ף?L[^y2ϟ Dwvu>~ai8 S+GW~U>(eb` ]Ё9>wr~`w⓴.P"Y')K鋴I~.KU^'$N -:q pTk ֈ!K5$e)~Z[^rBJUn0'Vj2p %M)*$09R3[HP9/attezRfݨ͏DzDyYC<)a:۵jia9X7Cti?t9'3V<HX`P&豹G=c 7?qO8:Z4%VXÏ\yWֱ$ g'i]:GÁg(\2w:—RU=;t;ƣ~T_+£vIQ.H-5џ 0ޥGl1>R>(W2rQxziJRARاGL#4 9pMts'?a|Iat8oӔ.ߍ@/k`:]JҊiU U҇J_^+0pW\uĢ$8K"z9!p8ў ^ٔN/1bEscnW5WuSzfUW3y̦yc|1o !o؏EE!⪾m˯ 6Á]՗ (0 M#5Eq9"Xqw Z0w =Hh4kob5AP98Hl0k&R >CF"i x#b -X&*utAmr7T×4,c〴گ͘wp.8kCz<WL#*adS%U45 ŌB;bÂb䣊ǭ\| TZB>/2l17_p=4yc&C:@DkM$Q"o>?*䞕!J>\?qe")BX$z35^^Q ' Nσb2  -U1h?j8y=1~Q-z*,V*,T$3j*Lnp;)=)<['E(u& .e'EmZC6t9>@?;1ZA|ތ\)vgzq*"i$ BQh|Ӕ>ӥB<:yhxyrZΏN Z0,Z.HHB -b$^,~3dQ:G=|:/D=Kk&L_}K)!bֈ<i݌GFx$!\tx$s;ԣbK[7[F[J+u'Jkv&? W;$?K)wg⬩ZX up-8 aHzQ?*\o.1LYOzk@*hMgE:C-z#҇BRtz*lI;B܃byebgd't|徂MD:㫞Ek؂{"i|qQF{.|T,r|;|ϓ<>ꍏ_5| pо2$Ox_qo_YOX5Dsd+E{Erjr-4 㚳]0SLOgsbykon,@)d/"ͨb u Z#Pn3nnk* d(tXH$+[!ƫ*-cJ ;J@9!^\P&ˢhؼQ=ZkDEA*Ex |)dzM D||ѓFhwN{%m'p`9W}pOHbb ӱc?k-9'̚aIہwK;D&yT%d-ǩ>ɯmm4PX֔8 g6V*v>({>{}i/WZEtr^h$*%& kAӇt4X#BV$;&髥#@ԑyN̑ 7 !6Ix`f4RpQK>|>;}փP*n>k@}QR%.J`EEQw57G a[w;D Y< kf "?y-3\kEBCH?+MfWKZRHQg"}?7ty[q ܧWċ& n* Eܾ tAi}pE7`#7[{(S/hyjW-`.nqv yt41IiYGv#;ޣ#knoFx[/eW$})3|ݣ+{d):\#ןafn77x0D]mJ4ѥi~*36 {VM׻ވ-R4; L0TYBHʆ鑳ZE1S(ú"-0+Ξ2\P1(`]"}){8MѣJrXHeI >5ᘵ+$鶄^/ cqV"@\Xѓmň

~ǥ#:62#,1lL#1n_g?0.N驪1a <| e7ņ.Ƈ1c0_ >p5'ndTQ}Z9$aGhi| P(ZgG/gG=+ٴFQ8_BM갎)z؀CF!GiD^!vcq(4W dJk*;fy1DH*M0Ok}}piAN@gm+9}@ASc0 kDtl?Wk0]r!M|iNu_10xaO| vH-`sR-Ejs#ҰQ\Wcxi)ty_h2FkԢ// w7.tN#{Xr)؟x(4#w ӰǦN4A4ƜٛLJy B`ww0ݽ P27&_1 eP>8p7g}L|%'HSB2?)unmpǐCgPXy-R1`hs@/q't]qL$l)S/C|FҚL1G\6aNaj?]!EЦ+.u/Weoh\@1U+,P*ZWJjA\zz)܋̈Ѕy'B3%4`yyC5|SrI̍Az88$XTJq=lB)2úЖGC:,/b8>0i7P 0# ܃FöI#=ҟyf!4@I j8cT%e/. I8! [»|Y@~?y3TXSʰKF6O]:ֻ̾b )^R˂rIL]J ?"F/-ϵ Z7kԓH E'Rczb0G0E+(p(juE-8>~Cr.4eׁQ9 4C&at /HLEY) 0R "Zc_ pfdv^TU҇Ulx4 O&/1RŤyhᅋpxg6Δ 4F-*F),. WkXx<B[aTTZbyС,~S>^g @cSW'-;_@FLޖ-ilv1լ4\GES_ht{ 1iww%df~I}NMxX G,`_"(+v }/#r=6*?ʒNz5-"lVRf^ǏQ#fWq_?vy?yQ$Pt3͋N(;~yx%-]PB{ &1e)3÷1!O{[tUvW8.`ԁ^b/2 t.Y?$)SnWb{槿h<ݴW 9ٽۺ#DR ֧ m5,0!ϜZU&꣐8`|zW;x);Zy=$PC'z{=_} }xy-~~DzೂCb{y;a Q-noIW+kl?*'pO+ehDy6|jT,488qWNls2>Z}-y:?R 9z,E q4b<FʧG*=fIcMz5[[<{MP=v$Uu<ޟw+}7b}m @Nc0vW?gacN0bHڽÿ5Hڒ` t̰U*JSWM+s62BZbÜ-\}l?}_[THes3uR1B\2~U{k57lH!-15GEd-{f--]VWKߖ#6Q6k~{ا4N&ta H/XbvE~bc,1K4҆/(SY[e>['xpUSMsLym\4OG l< _OmBt>E*U7kj@c#聭 /8~l'ױ_g'-x~xn΃>88>?Ƚ.i硰u"қا\`[xaGE4[vA$`2L.]w j~ Ȑ|9)јH)1#xHQ'B0H0C Ї5IxJ% Ď^.2JDs'4~ Y73 1vi mq g$kA&b ] aIfQtP 0H!"Avs\7#ǒ_O|ghyP-f|WTAegk)Iu.e~c=H?K[)i[(VbUw z*Yb,J%xlAmUIR*7+Ԋr)(.8H2]"G;ja흿R nl*J F[&)ceskk7I,lߩ܍{ |'3>{}G{dig\^ _tnxǘs&H 0 D؋tf?饤g(؝Mx#' Jb-!)#g?7?s>pvyTZz7Ӈ ?}?a#O crGKk ʽv2)weYA (,vQhI&sVr&;z1Wd~3<:e:ehŤY  9KUn08R獲23f/\~ރVl̽F89jD7/{DNˡ:B2_\={_8/Z]%0}/;cĢh^ zIh{f=}5ДQY7 _xI$ *oW?/rjEaVI|!ϺY4=k=yRnx!R0ڰpZ50jfDžhkDֺ Fnt_FDИ`)9+pas&9c~yՇ BmodjB] *F@WPN1P`9Mr菊z jCz/ F[##iӿQC>0B4VÑ/՞R|!U1N]YMIi9}ޞsib V0E GrNca6}&K23f[wurv ϓm'2|#9S`uK*}~AKZjit fK'qHe١O"E= t&Q0^.nC(,qر6 ڄoX j;k^ 0 s1#н7TJbn16jtwӞ~[Ebȉ>X{ņQ8TOandOANq\) ջC|p'P=ltLC#|p#o~U.*2n`%ဍO=B 9|:|Ei߶JŊc"YdrO&'7TrʩBአp&6aI8rףTtaxzTu/%6ly'h(޵V;52Xc#-c3a!z^g*.UTDA ܽ\BQ|,y'NVk۲D >F1qș6E*OzO}{܏d!35} Q# (fDCY!r%=-eL̳v?{͍Zh>eSK_mY-q$l"59Y;PIyZЈXuxH[#Z:\E\ЮBO鶤7UHP[}HdFV"yQF_=rvJqQBm5Ӹl›L ][T*;!t9IAL9#u;%ƕ$drVTEg KfG!Ym^l5 kb/&qbOӼw|3LJ#(*26(9U/ xߟLLK&‰UGj㩁Uڳ^׾e.Q.Zl=L26׎BáDLYZƒ7F&z\o#T:9ychvi_rZbútӛM ;{ڴPٱMGh9%s=Vra!5O&7=;qt"2Z]$ׅ(~80NoqϊuUf*c4" |ɣr|neX̜(ۥH,F2M#/AW; 9~%BLG}Z9 %zI'94F4:L( kv( n>d3ÚFqlkv1?\DXtrN5#φE ?j,s(H2dzv/Z2g>bH )9BCLĮdؘJ2|Ym u:ܴ|5N2?\uj%kğ%|t=FF)ltq$O2FI^J"Rh̓VH4u ["R͗*"EsnG9~[yOFe=sArGxRhQV?{MgC~(x4@\Gh$7Bp0 B7cn*un{ I>-#Z">r[Dh3'"l/K0 ~lmFNӲ1M;lJwp6"RnvWE0|#/;7Rlp0В0؃;jA;gXro PGpXvX*ͣI<RYpƄPvrLW+zPs4c.L֨]([o QLw o[ o WX&ɵ)`0X{Lx"RtP߿T}bZ&DhO C9+ńX &D# RT*:ΪTNxgӂDl"iu4)YOHUȇhM d^Y!%5O؎rfoɢд 451hmjdA(3'"?dYK|!qh~F^ +7pXߙ2mhݬ+*<%a8'np(l >jIFTM^wƖ3ܟ迬(H>h'L&4qsjl88*/DKc*o *-SU&> I+d ? '׎;W & 75=C\FB"ČDC"E!$c]_7ή^.0J%Z-Ķ4а*:OP yxv^ ub!j@;fA+JECNIAp̙)E=nwTL/ *mw *'\r\r^Q~=բygJH![,oԷvgG;UuqB5_wgSzN;ǿ=:oBYFrnc2"c-MIh67-b􀡋є#F愁}I"BskBuƮbW_wQ%^>_#Av $sIo cލ,vrTb;rFN u{2(k=Z5k>oe?Pπm(l;j[m¶>VOQU0I`D_EttF$]ch*"J3vQ>Y) db0ϳFmf3#Ioox N0 OJ/^#4Oz魅!A=e}\8eܟN{"r#Nw^Hb/BIr=ˈ%qPC׈FD}!DT93Qc;j `HBtZ爱"OcA'}F iH#~'SQ^gglI\Cv/1aF2{=j1_Cq``p__ӽ5Cۙ$4Z!nYZfE0uG3!ḧPqoQH7[эxy Gɐ&Qt$8A4$3JoTj-Phkɯ#uQ$u!9P$W"< De0$=|$B\ @2}KGO7Z<2'\1=?jHKĢN:>M,KtEܻAb 59=!=w=D}%7E¦uP||?svHuV/0WЋA.uͼ 9tLͼ 3=F\e/.;|NL/#: -OshC<.iRCՅt`g09^.KTrpESObzSJY')Sq6%% ;g4T/٣~RyRIE\,&MqM0S˔-Ge>k>N FCatbzѩ9k`N?Y#P5%JgiSww,/v[ۛۻ:zgeMͰCyV;;R$?gqs\Vwam Vu{sR*SݬnT˻\=2 mխfIJ(Т|a)-m]`oG@$])mJT"- RqtßKZBU@5ßXUުnV cWdebz$X)n3"D,r{G[Vy^73ՊЬBW͢ݭ,A1XOd2Hꉈ5"_Q/ 3vi3Y?_zy7ӣQl/2ЁtO5<Ã_<[ٌoX?ix^>efw?fnSx=Э996bˈXXm@j)6;|75ٵヺ >ƿq؟6BМZ˼ta5ۂ9vHblJ[Xỳ4q \`wJX1.LJ"a 5QxwCqEn3#LGo~rax<2p!H⹱kێ2G:\F~Q#30? !3^h9ܣȈm(_90{', .=O*;YlP8bfZbu1l_>hyXqQ/zX-ufnkWJ vwǎŸvs86YÌp*No4:JTZ;e)k/uUDn?^ 5XA8˜Wn4:=` .^Xk[DIcEEB7Ҳ$7j`>~2@K`ډ&Udvr 2(8!;6@}SEG\p@.@0gmxɗS߆XB&0f-DZ9a ƾz͐Ci<~!M Awd¯-EO}]oqn<-1T%=$WU`)PXrZ9iA = N`G4U όN3S|5)VMtn5RoְcGM]Gf mnz\̮ *+rRJҫYt7FH!(pֽ|:}NQq4Sk(-;Pl*SK_>OԻ)uc4 (?e,MY%'ɀIˡ -9 'QOAT+@^4u>nj0vCgCxnBȜOU:ãYpܰYR(P $ƹ5Vy7Ƈy.h7wZ=΍-wBGSKO~ܿԎkmsCcz͝_l0$,OF YQYc* >#9+`=իFoL $%qn2% Y wQO4Ü.9;pxJs"uhD$:i$Hr˨V.N(2!+9O)(VLξ5;GV#gOhSǧ=:;SҐ܏npg(Ba+İ9]n؜^ND)2(qqvdo827W8lp?f671i'T/5ЛNw1U.-1 w. 9AX{]?x@U0_5ŹoZZxzF4..#܍ u'ެmc2\zts+C su%k]p((1JZq~1~(JI"Cߥ:º~nyޭR *t#}u}Oo.]2kĵoе\jC6^gsc(EbzQ, |AgDzf}Krp0H9 []@Kԉ&J0ZK]tz*OTrKꀾ}~OPvYNM~2~P1v 7^5֪Fܹk 4cHԖY qXl.0#:_UE 뷃қj1ͲAs1c^ t:)fV@ 5?Q&s u3L_=`QrT.ƀRd I2פ q]gLﱮ(."U&ҹ"$c6GASi!QDocѠ3=-L#tmJ^#^ઓ(^Y1S We4G>+vZ+ lwasxhV)\T*IZlc(aWC#2@uD"[08йv=l" u6ӫT-2!$"*M@V?6P>I3I~hH1ѵƟ [JF9<ϙڄn1f)Hl-aԌNxrpɫUIغ+H<[F `̹Jkқj~/X..s{IǠ.  STt1Y͔n/KŠ Gy+ʊ -1È`]4B[5@ I#x0x3wп-7("?.޶*ʈjʘŷ5V})ClѢg񋌟`(I (Fׄ '5E!~ķ8"g&=^.X ELbCj95*+IBKmƫ#{sxٰ;Z 9 tP{ zM\=/>G_1$ g ˣ+`z@iƎ"Eǐ 3enqCbӔOg./~L3b_ijQgDV#ya ִ?B` $>j<\8{SHQYQ} X@8K³OO [ L;xwnגi^qF: nX,VZdIqbB1(Pxs^I:8@sf}w|vp7( rF^ɷI$*Okhk`Ŵ 7'&bFgIӢot"fYG屭3Zd}BD}`?ښ&mt+|kn#Xx,`V{ op4$ӤBYyh9x]@d^LnA3)bF}c$XhX* 3cy3wfߝ C\>2N?s88>?Ƚ.Ng(/wTZs_?-ӥN6O7&*uW7DU/ph%*zDKPM#y:HaB eW+!8Ԑ EK{﭂ҴW*W fBPRT}~ ƽ_ |w_>{CiIdnig\Z>ο&c۹ǿ{ܲPG=f.~{K 8 {-xI Փ_Yk@Xˤm|@skZp_*/Y,oEl˓/|f<⤇_qcYbC]~Ү0zkCAxsI/QCgJ 9FgT -X aLO7Z 7s/ny`81&@ޠ ƷїP^2<QHTg߰?j)v534%S?TC<k3y4l'0 q$bsÃv܉v;_usD[1Fiq?yn% $f PziVdDX&~_$)]KHawTuki$RH@ }+<F@T h5y$6Ֆӡ=:G{nBKeMW0[+ QYKx1f=vL*q Jޮ F2 eY@>^98;-( g?m]zM-r?qn< k{.|>%HnG 3B$N'Uf5-juY.xUz`~& tx-In"[^>jӱ/74GYHFWV { B;X8ܯ-rJ0q(QB*60x&H*{+lhQZ-ck)L&ٌbPJYΥ9-'Q ߚ dY\xRņJ&C qC*nhxP.8:>. r|ޑ #k=G7QOӻǑKrJw@ ;Bn(% gpUMrmpۡN\HD :uu[ѩSW:uU`RаKeNARүY+fdgm(:z,Jy(x+h. xf+b^ƣp5Q0+Bq3Uzuֶ~y]k| u7ΗmОZZ3\jKցb|(;8;N w}QLWڰ#{3u1zdc##Aᘩj[DeMBm.ۆیϚgl4W%PJt NHיa*7&t Bs23{>14ZC(h^21lieZXo¨Lafr)1r/֩!bmbVEϢ^'VҘf J.ac7j&5q Zaq v8\D~c ݨ@(DOwAh ^hAE)|5,s-Y[jצY{7Z;4kȯ9I1Q(l#< dM˖ngȧHE|\XF?IIY6!)l>P!`'R, /P["BkA?}#Jŏ@t7@_4e-G8P"$JgT|"Xi$*h ې$}Q KYY`[l(2Q?mFTv}t*1j4rӭfa 1;5!^k]9kB5 GܲsВ'A*@o2?)7U8˒u-E]f(rS90h 6R%*G#4?SJ!!>As".u L^+ƻ @Zk= ˞e7R·/øbG*T08w)g MA©+%us!$ÍzJ_3h5׾6|B}!Y߶p"Da @&05s L}!E`ΰ89w)?5Ol:mE?-g"_L.\/~5 G0 Ah Wĺ73c7)k&h294wbe%wd8dg(#:}OyVQqxCy Q;=¬ZG+6|^=nGle.L]@ =QP@/SWvU;; 5ȅYB89V->4G1tR0`J#ب;yw=-?`0 -E ӧ\?-aY/8géAƫa4Fg 7QtElEHS 4XEb֯|aRZFkxy.Wv).otۦ9u5[UH{^@8^K~-uJXQkpAp!Z~)88b]*R$Hws3ClKn6 {!:rߓ6]s#IIcBq(d3%.6 Q%^۪~LvtL(Da:'pT9 -:`)hBH[pR/.WqP# !,bñZ{D҈p*)gQN4eH!cֿ=}HE&L rRB앟#Q=1g1%_Ǹ^Q=ѱ>e۵wB7vbd4#M8MqQBuߵWYQ9̈́;YbG}ƿPw񏵆G^Y7ߗxyVo _;0fm,V.m>Ah~60Jـkۀ?mkmkmkmkxE{/y\َKk|߽Gn4M>=qX:$:bm+vlV?21g=/2h7ϰoԑJtQuX"ƚ_+VCOTb/̅]-$1ՓYkx c90m`E AfXɌZ*7v޽lE  >|Q0yL92674x8} -%p4I-SpN ;;g A j f==|'FfhșQ ]"6nlbnf>9B3"]t:?UŞm7ڛ8M>=ua%pvw{ ']Ӂ_$,>W9_7'xt ۋ\htWF [< tPc0( {2e _H(T lku*|`ҷ~b้|l!! *nWV›~_)x׈>0I?#Ql0.F9= eLL Fh%-p+N.ǔnq,qrG)ln4$%7g%ywS>zR]m0xRF_z19:s 6=&yx䵓tnDZ_afޝ#dYd{dsd@# O:`4蜸ԏW3B%K !xW;jArj!a&ML'Mi82d Gbg*p'udov'-G.Jm?eQLzW7 `'@>/!&V5T B񡌳B^ N3t"L7 +j(?uB}OgN'&ΰh uV} [Q?=(B6]DSs}Z(q<9c3`EMNҶ;i'>9bOH$-d1~)Sh DQaNj%9p.Qpro<_{q^B~8ah6(Гe3R\RFrv q'R<nSX|$ü}N|s"\ZUIʙ'ɄQ{%&EgZ \Je}I~f*'љ8@>gvA__Y~miVwBJD\P3]ʕ`AS+M%J%.ϔ (҃9WvtQg8;yuf2=L #=La*/=JN, @7ę3~ύ?Ο1Yeuyq@q#j0'Ciw#.cii{7݊3rEvЬC':ya <@H k<͏7dP8 5G.%\&páޙ4т?YD(z:N* 01ʒޑhp3ɉ-ޣyhGԴN1u!ý(&셡=7=ʇș3Oh[_&9FD5~@\bdu"oq)1Ba" rC}P|՞_/ ?jyX(0~(g:Sa}LH0T%jqUy}½v_g̫FZd>}s6emW׷a $<{yWW;0B[f7cMfjXP9Y?65;hgAY΀<=X0 |B8!i_lex{tZ@c𪋜X2!kZ\\? 5;N(,Li Ç )vAgY.w-w!arNy8Y#@# Y0]O.8+Όs<i*jV@ eP+ +S@ uy`h'F7 ύIP {/ oĤ-_  є\K,bc6 d T2r4~˖|T2e@O6kTZZ*j%t)Z+~@rrG %]' (s|vU,/,0$raq:nnk~NzөKCc!b7_O{$ nmV(4A[/Om+v-EuNg3/a GlJO)A- G[a_lϒk0/@gLnLuymd`Ln;Sڢ.t8WJc-~/&JCU({_T~˟~sf{.P%hfwWdiJ,"$/ˋ4Ղ̤_n,e3禗C*ڗEɪN,..kT*L9Oa T2e EeE`XVK;Y[۠[kޔѯ_{E/^\.noE+5KOcThN ` NmDRd^+} Sȋ iK4'CH4sI@o?Cсb`ʝb 2؋:&t LD$t{1A^#gV#tߣaNb#:8SqoD}uH= kO'N8A$b @6RT`?Z؏c nҮFIX 6<%1/=~{agL% OM` tb(='LPaiسnʪm*^vZ'$N + 𕤐'U'Pm P# B {1P]  0aGkƍPPN-THr*1CF$1s# S/@/`n )t%BP GM }m`#0nd`̦!L@ۇ?HB(d?NI2e1X@$e8%SvgӐ4LGߎ}s%|O @ )0S-5USz yM. D TnHOɩʅ1||>+ڑE4#8<|H8>g_L 3ޛG*'{.{Ƚܫ|Ƚdr=gϥ SX>`}OK.t|Nm^4[l$.Xz/F$+#Ľjz'Cv`(8wBz$z^ #/5#2V;/=D(r΄o >D iVYT$cw/vA.TOV@{撞`Qѽ؈* BTD^5 :DKqſ W`ZF>ѯFWF_'|F9A9{d;FӯcԐ3˂>Fr!PhY%),_|S~S#&̨N%E#wnG9B{2)G >S{,qjMfҾ\^ڗ&Ы\u[<"TihsLQ眎i8qhe tǩYۼC^ٴG?`7LFt킿^C>O纁,vBNr qfA C':>vzJ|S.w[x^0a8 qgv GoJ0Cc4=S.7(BsO|`>g78M*n򂪴wny_V.WJDs*51KB1 G;o@8hv?}A7)n E28HE!8ؗ }љ<:O˯*?K^vn4|?Nz P8Mtf Q1QlĻhB+T  l \ ,{7f10>%]PBdD2V@9'V@ߢ[~֢?/}S-V/\R\>5_xjAhJ(jG b@( cK;,ˣg<& [y: ky2ᗵ}dPb/x.—yJr4ѢHc}yޢޢ&j`>v䂋]А^_x$tZIYV UOA,y-i~~gFpj#*`Dg$=D̚eM6amu$Y6p6m0 FZnΤGb\k\F֠ L,N} "TܖKUwݠj̭uO] Fɋ4קR*fBk>Fu+Jא{V{8Ukߕu[V bndRXg2/oy4W=*@xI2u7euX0NZ9D)K%^{t6_6/tSx.$.r,1,.oE z]Bذ=QYC" 4]Rm,?C˲X. a5D^.`b0=;"HȂ'>|[W "qtZޅ@Mk-Bz cB?[/v%۬#ˎVM x>sHABY_^}Wד_/|W*ru}/߇}m\' +ʐmϡAHayzDV׏Gᬝ?w2t%:2GFNICh:KXݫzHCՇS1n\P?=~ qN]Ñ0"0|QqC~ N<]q~1ccQ{Yո\Wu]P;.(?ڮVl^R)3i#sD]9!1M,r`oE>+QsRk3tvN2nMW/8]s$ٙ0򰇶kl >!oB`p,#Kad>2 ݿ:[a\,o+V/2t0L=w ?{_D7I+om9 Po`q$3^`E yh.' y@θAoSXOf35|ut&W}x37 G@kNMB3moA]Xyy^vyfl͘Ȩ^w~X#'s׮Momo1Cclһ{G |wy& Ӊg-UIH81hoWW4#9-fXF^2g UQLgH^ORO_|\{c;8ܝvwm7T>V:h"\dE}G;EN?!$6hߢ p4Bзb0'“aK)!s6ӹ;Dy ;CE G70_jgg F4C=S[r1W6\6q\ډ+3hfOD g˨2}Voy^eɩȠ!PV,2KHl04erRٵüs/6 8:-oG7GVG 1: S=DU~D!dq3g y5!B&…*IX8Dr XTeb͈qd0Ц7ry͇ QP'J099\(*>U|mٴ9h9hv^<\dvxʧvEzE e@ uc8FҶ lmz45BlS`0[d|aY6XV_j6IIlZV(T:z}֬V7\'`h_%mֺ?36ǝ>bF9L[, FZ;3G5 1d8=ڧ7ExV=[=Bg:txׅJbR3F!G p2|)v8ݣYRi:m>J/<8E3&{5ͽse6#eB3MgB^ЯD}衁賹4Re |B 5oMGsЖ&oYBѺ$GL4#>.hG{=ݺ߾֙MykV֢MQ#Y/;Zj'LK:4Hŕ|`-[}ws@ܼo/"l1IPܲ:Wзm=%$VK{ b^rh_$71x* mۜ4FRy)B*<ҐP[ku*:GmkAŰP0#4tJQ+)ˑIĦh8Ј 1<\XL1Frqf66EL6HDwp4K#pQj/2u+l+=mLNanܱM]\'tgrxt&g &D>^M^=y*[F8->Wm;\tcÍ B]R,?xiWx\&ٖO/=Z_qtqFDFǫ&[Zrn-۪sIqWgVwjY guԶWĕBǠМۥP2&!&zZ92{eQEiueR[ڵjQ$P+8SԮ;Dl>.܋ȑ;Y)]>rV#gH_%7/v9-sUôm= )O# }>$UßD;˚{AlCQs72GAVE-V"0Ro5<Hs6䮂9Qy(Тcǃş/V!ޭi9:Mc7tx0]p zQJ>q64K{/'@ ܚ & fCr =L;MU‡C ;ɇ"~0,9ԭOno>l(ׅ_'7[p|2 ]>+Z2,6|MAFDW Y0 E}1ReP{%WYkE39ɨjFrAxӖJیAЎbrdUZxY\5:cl4u698 b EB!A GBmZQBp A:"jzEMmc aoa&I{fxowYkd[A&zXG]K;q-t;#kj'8Q;aXE,lQ>M"iGh[md ^QNa]+¿D:56Mz% *ZiZmIú)bzGR%Z ?A:dym_U_&}ZIbYus'dh]AlV.NEv.4}b<:? 6 uxKZWjŃs>۳z0{G#&&J46Pfpe ;?X|{ 0ڧK hipX6TuGCah~廈zsL14ଌMLjG)7.L NKtOyHաa%"g[XrǑ7'Qa{rd )֒*8;>noq*>Xؼr<њhJugnew]8u+.!B^srotb{GC#\;W59+i}JS,cpjвEr~nxj?_k1ϩ~3:PRsUW\0 ~ svJ99 w{[)6M%;wmȱ±]"c^yfZ4B^L~1̙<]-7qElݤ % X-qƲ꺲Za]'nq֮_i*fF>$s{Q"hP=ͅLk1戙з_Fݢd$&c-48%lus7y?\JՊq.rgIщ[u@gtD`m?Y]rX,'cUmbF  tAaB#X&OO}f: ˲n$S<sbNMo%#+"1`L둚 ?yI{ ( @etW ^-/@|S T7&+qzל  S*LޯoF8w ԉy _bׯ߬c-Z?_*:Ҁ> G a& c<EH0' ^88! a-c[n|BGj҄ ·=snI~|݃I ^@~r>zg7c>6:ֲ|Чlu"3潃k}SfaR Q| YJ2Aid/՝ ;Z(>!H3 {Z -ABaܝuc.>;Y`H{aB3BZ 4ʣCA MYÅ6k{퓋AsF:d/4sA#e`?;G2 ̧8x?׎rQP *R|NR֮! `Ex&| !GZ"^4W$EԜTF'7F7!B&ƬR4L'iKAjW@fj`ixL~Ҿ%بm ,%9Ujmu,]_t3nn /}D9!MQ]~gjk9,SzIA*P6FCb\k 0%LA+ -wu: X~KPynUjV;{ÍXvJkQV,1bi!$#-S&4HFDjLdfj;cNttjCsal^8 C3@a^Pl$F3pٻ%pt+mܣ 0cz5=E@>ӆJPAjR3ի&7$)`Wfƫ?)`/6mԊپ#tKlxx )dU K@%Z$eIM=A{[h 1HRi84VT"u_^/qgϝ,=6hGEN {Ϩ)q7Чn[~$2x?5==/תwv}G^oi^_&wv,m3K^ 9Jq%Bfi}Kb3nU7bHQ_Up/*i (.KlGccHg)`Aq̺5~;v݇k*==Ed~ }֘~j#a0}4Ep!z|l5مBC''r$RMZԜ-x&v~Yݐ sSmHI#'t7= ]>5Z a1ql:A[!ƮAg_^# 1Av;,W?ލn {A. ߏq'y/~Oם}}߃L8yݷH'x4>3(qQqU .&FfֿqxGώjh@ vw7R j9Ga-a59Ҧ~8SZP(i|iS tk<gT&?ﶔ-J :_Vȏ-_a/ܼɄ:1J?Z\ƳĘΎrv\{Y,TV &CmCwQg(㕓 k>ƳX\cE4\K} F/%]*_VPz>:?^  T]|N8NdļLީ}:גAmTHg6EKY#'9 's^ h_*XAXM-oЙ#6,O54\\ ex>ieåd1ڊc4<2q'זR>}SϺ;+صX:^ش7aM~֮D? Uc$d]%OHil_,uM sZ-! jMMf%=-/k{sYk%geJlNacDuK  DI/rhJr Xn>G?zd_;!M"U7EX(jT@+!GmPIL!6%,Tj",T*Tkd")C;[*T%vs)RKbJ%iD 2}ބwP*lmUM%P~PBb)FxȋjTС[B{fq18I0ļJ`3c8Kx͏cj+BAMǯ) pxӗ>V%Xa+8,!}n&zf&%ADqFs}ɭ{9 h7aCpq-|,gRU}M?N/^a&ՙ:N#$-Ϡn%%" 'MVr&Ut޵(X]fI8ptsT MaT}~ aB5V_wȫY6O;ǿIؼ7秚2zD\JIh67tgON!Gpʑ}gs"0Xˤm|PΞآA?Iny3}/m9G^RV#ߕKWW+kwj.9ejLz _{kov?9^{s|^~}׾k{%չ2+-^].x~K~_I7~%]+ߜ t]׳GPK_][]K(..pKr_%U{%1:_,=|JcGYNU%_mpEZ]}E^E~ͅ)Z:ZwV=((_@ ;~@͝7; DV0nZDe@wl6uYHe=0i]ocCe:xu0M4jL"?o_:,ەj4Ci/_x+??AF//vl0PrK0@ӏPsjxO[K7d`qot:hEaD̦xtns=ŤL7=y4T `'ެ2ZZL8OZ`*NʃRwH%W.=NP#|/;/g/duH焿l5򬨳>?nCl>ѓmq}$rI.k=^kMߟ:As\'};OocIO p+I^WXq+`7nיLvg*_rdwB]= ^4Em#4>LJ5;OLILGOk'v!<*"Ñn)W)eHP҃T`ևAg5@fҿqwoGcJQ4GT'0F%{[#l$[`I~r:oA;݉ZӳF#KPYԋgݻ٘=oTNRgBܠ_'AV,7o+aQa(0 5BF;ͫUҷ byToϗz]f\!f'AvihʈQu+F8HTJA! 9 pw.[!BvY#}B}o8wlq7yfz4EsT,Y'C m7lkY)\ M`TB@^`ʴ='74ơvp Ec(Q؍n V G$f$: N)c._kK# >1Er!r/_q1腂 ݞVg8B=bCZs|bFCd<&٥|- ғ1^ϗ%Q\$ ,/YHLlԥeCdx+$ Qxd$UF͍n;Тm}QSc̼nUaą:"[`5W$ YFH)Ԏrjˆ-LfvlUg im? ։]0 :O^$T c9jB/SvV-i:M۴b}Ew>k~*C?R&Ǚ{ p*s1O:1h F2u7dl;0'>jlzLTѓB HNUvkMŸ{(q~?Iu5e!ExjQZJ%gQŚt:3;nu6 4BMIyA ;@s|J#e7z V% tBlpj*\؊֛ ,L=dZwJ?Sփ1}p 3OڜeZt' #ۅ?7l,5,~P7Q!iVPa'=v& } { fm=\Gm6Mm!v^;Wㆰ1ߞΆ)2{ԛdڷ>Y {Z'uFw\Ҹc^yNth6ӌS#. k| .Z'l皒ڦqbsD]e2!jhdڋ Gc M͗#FFdT|=*̝^;lC^z70%f7GAS9n.~RF1,$p]HB5+%c,sdph2R8epKATh}FW[ϲ9 CzF~+YWXk1}0}mBUїsDk8 I!#5"9Wgv oI~NO!@%yEH+YѲ=dH!Ln qXQ>xmXnw̄kcofD?*QFP Pp<] ,e Oنyrȑ>M09-+GxژkK̊8?у]W~s=# [iФcؘP7FuƘ81y,?A6|q!z.X?<DE Po/6ب]wsQl>SQMFd"I ]GJCN{baYů) B- ,PD ZGbkGKS \JI ($/ D7ȣCݯ)Ax+;~tMmϡ6tE SCQFb0+;G1 T4 ȍP/pRM`f Z?QRÈP§܊ñphrK[3Nkw\Pk dm>sMSsN7WA#4rFFq 3}鈋~I]qm?NM 9GM'3s%IOh܈۲/Ch4þU]_hG0la88>ysT"Y31?F 'iQ2ћs|PL A1*p֘kh-O ppĐ+:TevTQ$%w_2-P}Weq +?P<՛/y,?΁¹P٪; 3\%B[o1Y-lT tYn+U҃JyL6uNiӡ4Y,(**zncFi$[M].ӕJެbS":S朼Uن ,W~Ze]TRa]2%xWwCyP.XvAz(ny'ۥ{wuc]m"͗Q%^>;Ɵ޿ߢo-W話tvYmF.$V;DZWfhOJrVJ]`J|/^rAjEjۯ Qnu" >߷w&D_|N[=&{vuou/ck᷵v}_v:ONw_`L8W\ ^Nn7j[w tΑL>rC]ToS/k Y<X{9{(A.TB=w8(1{BAAMig>HVλ֭U/?jnjqv96AnȳtXewޣЖJygijYENaq|+j̾ۥnUD_R.m[ی[T6|S$lU\nq 78,?-!_%Wg`7k'^)U+DFN1|`Qy1Bis{zYة7՝t_.wv3\o77͵K|ompTP%Ge>qSmUvK݂:$9];1u]ZﶜixsfDWt  1 |r"K߫1P ?ҝ}[|Gz:;w:'@uKA ހO-5\=1=Ɏ 8Ү˦w]G{lh̔zCmDo~m}=Yd עb{l]c  F5Djg;tTWKו4z x=>ȷ3[0]GؓTN?Ʒ8;Eq+0&Ò`z&e;ٹXrfcK 'n{2q275>?"hmKem4ݰ"R{F,rši&ۜFD|Y'>6=9b,Բ@u\+.yֳaEͪ?~3{;Ǧ`7m0-H}ҙpj8tuL8mU^)%T^ V#*825VbJ'S,edtghh1%ۙV2@ V;Z /sá)Ǡ RA#zƒD- u !1#ڳv jj"pz~IʽPSr%;J+E]HQh0t'NcqԘR`{iqu s%,-" d&| ыG jIt6ը-rtZ&=8"'i^6֩OkHGk^fpnpbzo B=5yNo҅ThIA'}cbd?s`l$ӓuF܌&7mDhxZ LzM@UBޑ(,"? t(#nPn;4v5^K hϨx ?AǑ֜|" &KSav$'rVw>"'M1 Hy| qÑj|+ibfv|N6g_Q6|P'pv)&d_/t3r8'~-h6Am8 sqVt yGqh@}"vŻR`2iF#X }g@iD)Glt *t"sSzOlq$L5lIЦ5FZQjGuU ݢ .CŪUe1A/- G"Ɉщ+-=WbCg#vwd]ۼho!4^@͙0¦[hK|T87 A3Oc]5р&C8!,=?`ss\!ͦB VϗrC!(JRyJ`. 3{bfg~֏X,PP}\ko5qojB4GMCIuuyLŻl-Yh`Glwq&'lǻ_tcL~):,y^}w8hw}EC>D4.9(ɦR:p+Z2ѓel-߃bBD}gw 9ei#K:! {FI)q A֞E5]T:G%v6xPSNj(11RLzEu+E%w 0>["Д&=Si*?Pz흃1f$OHO5%┇:9-ә5̕ aC @b 9 )pا<a{Ma}dӥB5.e2Yʎ2";rP(Zb0}emp_hc:2BЁq }>%NםI/O| 7%?uic'XЊ[WFko].<: __Fȗ} h=lf~7GG9 z]mМ87t>gv)'s32.2?jݕϵI,8՚ h !sbC}z3v*ж!ĤW^ p<OшA\wD%Z鐤{Rv(R5Ӷ/N?q ŷJ_N t\3-vX$ ,⊱egr{!^osٍHd:;68m|3#>k{޵xr8$7%)c_V'bӊΎP\س|Y=dS`r ay~(?=ň[o SFr3z Rg0т> '_ϣ0NIi)?uA~W-*7`Pdwp tղz)`dJ.6#mq6"P}[KxTI|UNXRkbהћ;֯S^ P5B$6bl:6^l"%^>_ =|;"у8״;~g>sOod7o2xp6șǧx3Qr)y'cdݜp$_cB:&?sIHO=7h]x2=:0S0jxNF  DS7]]OR/GtV#KqĈ+l _rai ߅zW׺ 0v.Cջ'B{w(AJ?NX?&W *y  15x+࿲L)sy$ԊṲVEfb-_*Z I-)}TW[j\EEY(}p4V _cE~ @[F}!z[cԬ.M‹'eXjH8ZM<\7t!WB&╚˰F?uD(zfZίhGpL#1]hbJr"Ghw.xK#3`}(|%/M̲W`go%V^D ,V'LdNT3 bax]md G}GLqg hUP=byl1:ul`v F#QO ș<Qjl#p.>[x"HH˅ʡnbM3Dk<ЈZPsGA3?ecOӹb"yJ\,FdyGcOb>o}s!ksaw88?@/h)ѽGj.Wr ,W3D:9˯V>{f[0$HMes;cq] ut@UJcVx(#9Mn=]O &(&$]G6 ~Ƀ闭WITSN[oXxgGr$JjD;I_2>0:xUu<9?PAt8Q*יS:8'(j 3"Gg} UN;OϹQh`M?V1kI(#!uu.9eT(ٕwR^rZ$ۂn);DGz̦P#傷(.昄߬DФAF3AawP܉7cЏ6OUt[IbTa773X 95La`}HuX![jI㐦F&B̏{x>O{K ݭu;;6 83]wn`_>u'RGȣl@ tWнXZ<@_tDjēIDefR$R҅!L&e"hW9DXz*_q# L\yVa~y\u^S"#˅reKdS9DbsHdcP4yI#&}fHo|ɦ':baggorJ O XS_w/_*U:%^w'9jOp;*qaȍn+La+ RL~g_!3Qp\ gb_g1wxξPl2>>̇Bܼ5[o8}HԜ~$K0Ai罹D\)$kA֝/}p o!FG+;Nke;65%zep䳦<^Z;ܫ3a:#phXu~t.4|.#Q06 Hו:WzJ\~s[a ǀ y5E/˪Wumf<iډt={'8هi% ƥB>jfǯJWiՒbI##ƹYmtHs RՇ:O@'<YsqZ C Gt5>n4{ +gnxdP{T2RLb(h^ؖEf,ţۨh 㸵,hC*Z(v kf=̖aka'q[rw Cc:y`!NTLQeHpֽñz *d`qn0g:+*gJ)>F5TԊFn.x&]/Tz Q_o`3Z$brD|+|&sw[?_pe{}E?,_C炘Oko=RJc~MLwlJ_Cݺ?w%=ů/ח굾|/^X_ϡ|WfM,}N_f5kNOq0j6ky~[ڸKxDDvso٢T=S\"K|G R "$xFp2ryh>:XzKg 5 Vwwd1zևo]$zt!'{gReZW뫁+bRis^>y4^uu\MgЕP-۝@r(ĽJ>\ldk 0;i&Èi}dO&$ ^B|W^],"};?z@ѝH"$ eLIa^#z}{VuuB~6g9xAX " ƥԊ5GOrjWg~YgHDX8y%e ,e"`;;r %-N;޲בC]zviY7c//Md_^O\X R3Q}w qzR ⩗15|^ciZ49uk+텴NV#.E ;ʹ 4]7ྃ )Q!!J<z'^FJ ->O2 mȾUuf/Bi>D|`=pX0SI8A~{k]dh"5:ЬlY }v!*N~;C px0 s<(uO)a^!{zQi_8&֠OFL ;s&lQh"Gqsd?X?^*QbtT`ԡQGB{ɒuf5Jb~e`UbBwhZ/m%g2x=.-mdCnͤ;gwvaـԘ6}#43 ^f38Mk8T|vfaPCEFx:i| ,0pƁPb2uE'x \0{l>ҿU!1Ç5O?f3 74i*ѰW`R;'=*VYhˇ88+F@IzZ T}P$I솈jixkKAFTy{(y)cϛ& ㌬md[1@keY_&}CGUl}cY; ^#(WT Mx3Q%8G fյ~1pL`4}X0geߙesF'TI{.8NEM tY1<59S4 #;8 k 0'+9!,wchľS{BQ6`Y|u.iڿ|z4ַGTRQΑgjZWJ/ÜmeJɼ"}I(3ɔG e\"%rz(Q^IzwzQݹ{X<,vGJ£5BV_搠qgRޚO{qX&RsՌhcJs? gPnT])A=WνSg/` p2O`4!ƒ'1kكh|1h0j\DY7'TD,j-VìUz8$i0l9%-(J3LC+1 ?9G[βꤗd95꿚vAo¸iaEAcAHG_GwIYqc$oU,6uv4V򎴧ИR'Nk51ppZҒ'V>\cg"Z#Lf/B"n ގ %5[Y@Ǽ@6#uͫ4kS(L_Ⱥ 2}<PLl_.hh,g.[Ԏ^pL`8{Q#[q|g@+fP  z.3a*N8q5PCАr_0 b,+~smc%=Ÿ}c[t|EϹQhrA7Z_N{7O]BN¦ۖ ?S= .g ]W3_d[ Ba#*r  Au7YO;Gk3]c.8+&6Gh4~00XhS[A y=ySG R叠Ż^0> _JNٰWqu|樮%c@Hf1J8yd0&]5ّb\/OMwEH}|ʳߣܺ<-5ٛcr^38iaBWjfpV_+L(Bɛ]c6sfFd1TtElnH8 G_hk%6?q|;vVf&φ~ LQivuTT % oEo<5wÕ+r”ϕtٱ]&U|o6,؀*k~ؓ5xU%B($zv]_[Mjʘ|ysTWU.ʢYͤss&;@;\nRބ99in#ReXQv?C | ,pW%‚WE)8k(+C;q,·Z=nSީ!&hTU9~H ^`^X-Cvbd 3o ^ٕD_treZg]eTj/S܂E^PU5UFCŜlFhΕupAGXx ;R9JO2)ɺb*\Ă X;s!ǐ $9rGUI(_dWGr70vt}>Gǹ2S`oѸ&!~Jo9Ʃ*p* b]]|m0}mkfՂS@s]+E&ԟe1\XKa0XĽ,;XcaUZx{٬WՐZ&&vCraSEя`˭^T\@]N=  rTHcc=WN9T Z}PiӚ3C|/D$6L|0 =ʹB`/?)jqI [uNїhPMbB$+:3X-` }#q* Z^icY~)?Gt}BlH4nshƦdG M35i86= 2z򻆍*gg0CwԻ] *waϢO6~eW>+, Gro32PJh [SZ6#/o5f0Ba+Gw W|mF"E/ihB6-]r+S9z Q&K,!L!%Rfȵ5ScZ<}<2,d'Uݚh>[ck,dS}7`s8.DNh%Y,<ʋvj2|#јQ.7NzDAFJ4lVta3:0YN'&l &Ňߕ]cR_; n9zw ё}sTKD}RQlbC0x݃ Z(UҌ-}OiHL;M ]ƒ?{ +VN3?/=]gTT7 F7({(-EWDwd|<~\3!t؏'?kcy!jPj1?5e}te$0|9u,[Y~~cҊDM8f.d{lS ï| ΎE5b ?:yUbp 9` 0MiQp~iٸW_Iբ"4wת_ k/liu`n#OkNcĈKN ev5`{s2Qku?!-͂10nYl]xFb ^;۬ ׇ9H-Ab$<+#;NX%p+Kשt=q7;HD]z ^bc7~_Kt;"GcᗫaKۍA瑕E  ޏrF5yCBH+B}9ǡgXĢ$Pn␐}PáU!H32҃H?]+MEtC"rۂ Õ, DXiK\AIgσ f~y}Aֆ:C+5-Hu2@ݰߕ(Yݻ lH\]Hr.mJb,c?1K†<6r*hEJ4DV\] hGZT伺K *N=>Z-9Ntaq-& PȀ?"Cc1\B DK?K􄐑0R )Dԫlܚ@{%Ɠ/@Sm~.'rj< J JB .>*h"Ƒ@ y%xd%dEsÂ勞J݃>Z[ ޿%cLI~v<G3GeF/"D2c.뤿9w^!(N'-b jKwf"~*I#3"dOKu=9_dg@O\k,ah0L ..%-X^7MǢ$k~sg@ь7m"y^l6%B17#̡{97sh2M,'"M&X&pkd ڎ&:[.tv&ㅐpׂ\7sLXƴBeUU@0&1ޤFYbV zbDfL$W|BeԟC(;zW@ZJPV(!++ ʲJ'Zh$]J .C)"tԒ[*& EM?Ywv}^&h >o3ĭ_iӍ"'DsIZl pg)@-]m(yR݊H50'v%pi.Vd <9*r]τ32.3d%ADZfhbHlDj"VsA"]*ȥbuxhB.!Bh#Ko"ҸH*qu"DʮAƟe2 Sć+MxTBw;3̭4ZJz0rή͙/bAog.\[uVpr;^]a\N:\ X&ͅ,${ "L.D[lCGK"-69T??%ğ[xpJ -# 0 k/ VkI`?cŸWW;.\C:O[ca7 qC5PS&dçI FVtĕe.+q/`4L10U`@MBt.̮$$g~}D|9z:5<ۇө{ ~"4({?{ڜF5cx2b檙$a[3FE;v@h?Uuma^k+*UKаGT½qċo՞O4g q2 ª'u2^z4 8e ɏh!}SDL3[5|Ͷ# n|kK5I!\ت(i暣tsͥ ḟ'ُ Z*%UD:U]q*ۦ{sU߬'BtUz@*/백<-WH@R |`-{d8)?gB7H2@:&, ˥#gaaXe80O1VG=TޮTnm'|ـ\L"=:-Ss[a~+ko55 v5X.ֆIVOޙSH3ji!M6G!@xE #Sˑ/aBϚZPM|:~XS/1P ! o9ACtLǣ#ƣR)qyjd&J%D<Ѫ-nC6-¦Ws õ8Gz' eÃ~<@h}DhUH(uŝpY{w=uɌB̡ TnТ’%C NUiɁ_Kefʷ҅ eoʷI8eKpqMm"Bh}Qnb9 , MAyR9Lw_9xϰXl\@g>u Y>bt> 7&PBSp3e%T*"N߄dZ #ciA!*(lz?bbL~6 CѢ3y2y'eS~*v'Nrq| Ex{b7*ӛ.@,:-^@ v ZG90:8MThs7p<%GNd$m=p ͈G te @x~{ܮKJ]""N, #<<7ot`y; )okx,'lL4Ӳe=:;CH>ըߩGỠCUs'ؑZ`mD8/Ə|)0pNP5 :K`NPc{uhsAjk%44o𽄊`9g#9?Q/.ϷƹYi>h]6OMV`9g&ЦDV?a6 ״IQ A`\0A$5~ 4ǩ،[!α[Bg(J6V>FчUq@rΰH ᵵKd^DavBEGEr$a @1,@1,-ّ/L l"֋N9 %5`%6A-BR,@GY/&V1Vtb3&sm,(tF@*jnsVVHl0vg|84+QDa;&0MTŇ[Ȍ[SL4D_Z(5&aj"r^ SƏ􄡊\IR#$.dtA&t{* EYz M0(jh7Jon/(91e '-Q&$CoUfI tXijQժgInHxfAPBդ(5Y21r5)0AZdnp/ zM%T(UԾa"W8}(/TтmQƶJ*Q]F:6S5SO۸|O:O*+~LPT+E˽KEߎ:bJdH?xA6-]!;Z!h22" Sco1xS^hq #rGds#of,o1D :/wF?Q1Q9xs~=ÞO%WGt3;PDK))Y2i/)JUb E#O1ӟ^ }+ D,5U&(( ()HדgNCVꎕhl@OjL6|4P|p'R tN&2U7 UCiCy'0}bcLPЪҽh83Fl č @8q8 \UrӃ$SqΔ[3bo BuzæxՎ^Üm탎:9f<{V0{*Mц]|i)YDl9ftCkN4B S\Mr< S*d >y aZ?+ pW^3bqz+pMoI]?Y-MEUK2lpS#lY(GY+jдB!vgWB>ype,3ǿ}T(^qu݀QaY<&8W$Rs"I_e*j="&MzGHȍ0…A@}=L*A\eF0Gp;4 j}%LۥeiڣkZ (] yenGn|Df+nD8(%Np.,M+C+N= ,Xb-@a9,Q"Xٗ/r$?4HM E"ũNT1nx7exJGlT>i~ :art5?M\"(K*s ׳B9G\).R'bx\~`L6}@ VIb(1?|>W 0xzs X-m/`=' y"Fj6XgC9H1?q|@$,6界,W<zצ6ŁX2uɽضܓ_<{ͪ@]>^Ht.Ea}d!mن*QpGX-J`d:*p'x& x&-xr0-4VSz Bx' >kژAy) Y"! 9ۏuJjŻ.OBD|%>u§N|L׳ [ ᣻_ugL TIx( R*(P,϶u Te޲}V&fAzz4d6jطQ}a7 ͂.(Wo%МGVBUWqlX yY+3E@,y6;/~ɝ zww1U\M6r.,rWU?U;m\^ϟ?61x.+|{/8f3RN+eEmΟ٘"'<]5*]EC&\WjX{E] 56OPccO9~wR:T^?o%^V窺5^~ywp{Kh =AA+b{Ois#/S[9|= $A:"1a 6Ա3O*Ύ߼[ 'eD71a9`}Hvs@$\4hƸm5.>̦?(!-M)'?? xu4zНbXAfje|*@U$b3U*Dp$nm8~!C-=b KIҫf) dͬey>>;yܰ @v 5lrF%\Oх8H@:92igrNIy 3X%jZcGѕ<J:p[IgST&9Ѭ"7@,+k0 >?):aVi_+*}&#~#Vm l)4MM8W+jP,>5 =#ؖ-AvG*`O >ِeҏ:ވJA?P|_Uq6~x_qP:4ap?˕+G%h &&Ob]'>D<6:Ba&M%5bN% p{=sqt ߜt/_~*~TxpWs>ϾScPEȲ$SmNVPOD2IOQ9-{<%(LtĮ*sJ46DCфg8\r($hĊ0=l4Va5[#:, Jc)Tqd61 |])3p%:Rײ d0qyG6Ϥ )b<~,)zzl^dP #]rp9mXo2^FUt6ͱO'~!bi)5[A%&&̢+8e>V71<&uZJ cqlV<(1$bb6:bm6pD*ϻl]G Kx~Pڴl_FцǦC cH=_L5Hgè-N꬗jP+jg0I_'aK\Y mO[nfA]Kwy,JR:Hk 0Ve^ I[cۆt<\ƣW#IlVbg|!s5pRX{Cb4nK[kt='8+YɪOv 8 *g CU 28oz}!<(uAwNmƞ6GTkKpg)º_?g]>ePq|S=lީqJHh RBκ/ ƔnET2N Ĵx&9a!3Zue6| s_QYN]4"F= ZLƣOCϦ\%[iu[Nq]Ʒ.NYsmb2"ؖ R 5) W4M~ EL.vn7D7iYUa_H:-_O7STԵö G)!tˎu=3#'$<3ѰqMl K8Lgh7rʹ_O ?!g bDK\<[t"KO/N6ocꔵp>W AoKxIpE3ޘ.,ՏR t/) 7ljT9HDFU$ i0_`uR? 1>` 6jp3ht1(.Ygl! :7 슁Utn/$ABucTFuI׬w?x6dfuɿ8`/QEհ.RQPb;.c7o/˵خ6k^){+78{ RV۾./ ;:-RXz@P]NK2?K1 t!/GߑH?{4zW*n1 \|ڏ$qB!{ ^69sUB^5dw$AٳQpPfC2L2L0<.ǿ'10+f(fqZ34d uV 5鍏Ido D2ܖƙ<sMGvϼLbb O^ a?cnva$Q]<\τ3*Ή̃f81O9cձ0fN \&/KZ_vadSo9xy >\s^|ݣ xbv(ysD S,leBZwc`wR*̱,(TN.+ՠ_]Vh._wX_U#TE7N.` 5; rmm w w*\BBi^RRǥ+CA&ʾk[M,񡏯}ĉT4*:] M ߋ\b28Aasr/CrXހ;C!`SîqV^;Z;(ar3%i*u.hVyQMʻz'CE<[x pZ~\%qhi*6i=<[J /bm=^O/;^p1y_ROS-~]HV)ay }E"w$)"ĺq-q-6\}5#M c ^9?\߮{bS!q"'p2L@(G%# 0Ma6꠭3%wܑşʢf1*V8 S)ӟOPNŎ~T~b'w.<@ x*cj0\ew JG0#Ȁz |0Â2@$_ұ7ab*)WET(s˼xG|b4:ժh96.`$6?^+@!$\12ҜCl8I T4D D_{#_p/iB,~ ݠrvp#a)مrgBnY[m(,!mS :'Wp&u|Q^w2sj<#+?λ1#G#93?鯟:!/|&Vj-$Ds2)JMAZ(ۗgdW*#nR2.uGO @!On T2z8]SN:Lp T[ d89fO9 8Fb&ݵ9j hxk`f &)J 쀙Nw˂ <~e@rU$ޜ;E ?G}T+a=2C, Ơ j*4Th&k$%L3Z+RǸ0/>ysP 7k`F_p>UFt#w30&Jb|pչO6Th,-Mva5KYsB C9rl*iQ tH)AJyZBH U񉜹pf}hẠfF6%B݂(4H<{LSO\=I ީ| *jguB&l W_Wy4@}i.>G9/5P/)>LǷh wpb]#D|qAe#) nnlBz2 w`R8,YEGY? ۅBAkC%Ba  ] u5oNQ gտ̏HCG 7 W*NucF~'\WkWjW:Z?07OiТhA␾P z)e౽L.C:|DnQNȾGfF^pvXR9p|Ä9oF#uG$%Ŷ5]_ܕ]ؕry\OڕyW"gB> Oq&cG"2{Dd 1,WOʣ+"E1Yj'I037DV$%;ܒ3jܫeI~E&:y&{z{SS,FjYS1lUǝG2qjfjFUV"+~BtSbHBٻJ; r-V+r(/R-$6e>0 OwC +Ju.q!`tiow'?Dɡ޷:&涊&7#FbѲ+y21Hf`q]xvjK0yj' rS QFR1LT?.F t{tke";VB4xj!D#^/؆*.=+gukQ$dYܱɟj%|%'Cll#S]`rE:DҌ. dGg::[ol!+N~ -v,T&+3H :[mH9z5F“KynҸ飽)E/"$o` > 2l7-3ϋp*08B_=%q/;87o 0EYQ6!Ti:шZbFȾ8'PMwJbZ/iϊ :R"? ೿LIvmG#Gυe+ضb(jY]'zn8\Ԁځm, vY:$љR&UzߢEӘ0y*%V2x\V%blmxF̅o.EK$!X<{YҔ>NB("wh 42 K`B/= !3ͫ%}Ҩ&T1SrZ(bUk˺*pYZ^iZnn(3[ec+uOmTbrm%GUz٬D%O"Z{gexr&Vrwak%  bEUM5R쪄yT߷Q5jjղVJtW@ejaDHY[q3,2? y*~ ?槒*9j4DRշ o_ƦַR%֬`Tv7&7*˯_W}f7.W}H8ixվ(7aUq, #!<jd,&nX`&)E k~cl)0_M_ m;A ZW[8Nti<͙;rx:.yWBDLuq1t<ﳎ&}VsK' iƦ%Bns]/H hfYÇUIl4 SN:rl6slAz .Vq ]幷%ΓeyIM Zd"Y2,&I+XWJ'&7<>o35 F/B(="`}?MgMT4_ա6/ZȆ-*&a+*4YJK1nMo!mpU= 5 koY otnk6tp@67<ND;!hA2Ogi|VtǴ]\^HQHcDXKE&Xd[)'ߧ8Yex{*E /_ìPL~^D᫨X2.K9^]ceq#aDt)~窤L'{(WY'r:B4c3W_̷#k oU< +/| @ GCIL"Q,? +0j}ޏHbj>:FfࡒkFn0 4j?ZGK{f*5օqcwԣ{TĉG1 ?⽨ZnPXlr:9 _Pʋ&vE4D_P=AB$xJFM4:])?S(>|tGkщMCr@sKEEE kư3/S NJ 6c|d-<)N m`#I 7^I3N N;BC /las֖y4Vj)j7 B0 ab^-\a;Y1Ԭ즷fbtkx\*WO,Mm;XZM?K._K25.][nWP:pE,*vS]j믄s鰈o^5tn]^:דtjn\f߲3W3u˜3fX(Kv1Jc<5.; DvǓWQH g5Hԍk=} =,"-9{UYEFQztSblGKS箶wWsaM%]9$Xͻ%.KWQ߉F[`pMYg\a.ދ a [}G?fˎ6.v ~\KEg٨o{᣻7R#țl"`8 v5ÛtƤCx}w2Pttq^f?5+;*&7;oEpv<[bp7th lwD[=|Rʽ[|KP 뀀@)ܙ!"Y[O;xM BG_?ʝV˸";ObǸ`R<;q.lݕgIi6OV$xK 3yٲ .0 `t{U!!}^*r" C<'2.[ͳ']GIo;pum:g D2*Y&y𬐑fʼnX)Ü|? ߰i~yfd lAW<`3Ȯަ *l`7%=hF0f4B}yFiɥz4woa1MS,)Ȱ\w~'f =@z-[G֧d̝IbtK@JSЭt Zo7`?|TZ-- ?>]D3{ uQXXVⰬGR5IN!QEyJt63oY|0*\VR;D$KL젣A|;0?|Ł([X,wWfR ͤEےNOjtR6ћjt/ŝyuLom/͉JsjO;qYWJST]߱aQȢ|=ʰbH Zr ۚm bs^ 1LXf@4koM,>*yvpa,%uw0;" ~56O[䂋K)aPPYv7; ?*b. bDlC5f0o>aO@mԨ_ߑD, dF=O钳Ee wm3!^7 y01? F',2܍~zc,90pdv U̳5UCv iF( 8)<ũ{gc^4sO3\H4q60><pq,"gu8L^/甽1GN(SiF62Pގ⽜ )) 3(j~rqXm<[)s+up^LI[`֬Z!W%. ZU1=Ħ:h9t-Sx_3C $P~0hH6bg-_kg*3 pw~YSeNy]u7G_q+ẤEqҰJs&OxD2:5+黇X|U8C '#%䆭N ofQ]bPB6泡G0-.ؐrq8B`iF[-ш(I ktU1BJM( igD#4.C- g"W,0)1x\)CɋTPq[h(}|Ҭ!eWwn#@`zq#'DNW4U "\Dnߙolw.yv!3P49Ga*a3Ylӄ=3\m _K̊;0 OY? ʲtTB aFc:McPd[ LP7f"I1x ) S@eξr%ĹYK l/c7/Fz"Y#YW!J(N')-qGM*|Ț6B:p)ぎ^\8W 3ƥ&V/z`PI2SFQ(q}ꩣG>rpI41PډRXpGI80xj&!?O+d;|f\ͤ4x{z|qɲ-^ެGrɪsI9ґ*)`n8rPKR=xiα ۋ\\^|%W[.ReAS*WdH?LueJPM%%<3MH6m?PB6>^RvAʐ̋aiycZ:yНSYG37HjG'jGQ=? ];?ejVmӫ(gK@W/H` 椄) aFe~`J9y\: 돍N^Qkv2[z\Hz;r q(;Qӝ:zw7`A Ը#&GNGH;pm8ltq4ĸ]IJŌ;qG1GWnj1<"+/MAy*ٹ@|w3>qhxg.[ʿ9W5;7ր 8_u;O#@X>u yC76(cYv|vBSD3GcM!U7w:f) jf@r)"3#LJ<t~h)~J:qZAɺq364kISʖ̕{UK06pG3q* tsj=bMĽK<3gGwyvyڢeMQ=6wDz3~^ ;e?׷\c=f?7rm\n?9}v 6A5 KYGx.d3\W5BHLUO$IdzuKKp-6p.ֱI/R`_*p#VĒ0 |N?I&00?OׂIwLjMć-l &5 Jr(LQi˛} F̕#UIdCIn"53BHu!PPA[cי P U\9FhEk#>)Q)pGh&? (IҦU37%m\mJlAqI5Ψ%XCDL4~R覥5-aQґjIrMF@Z(qmV]$lC9PNrҤj $a$E<T d*yA,.P% J T)J$=UH7 ))B,@zBR )T\@-!RHP *R7AB LP B *RcNIB@LqlA!jTCC9a <C y\}Dh퉒Lo^ǓE%"tR+ Z{Q@@a]\ *VB.f X}#l zl"5(Z==lXmV@qKJ `&C$xY20'[ rS\*ݡ7 @\VxK# &ŀwс" $؋hp-fD d]#d1Qv<_s0%LIW0e)b{<I %tpWtgtHr,FK <#%C"%Q ނE(0-:2FdDo2"ٮS53L~fv`\H"L>P4ŠISU!ըOkmWz j5W۠( ШȄfi^ Q"R’"D!j JRDQ |'Qk(7j j 6XZ( WF  e76zsm\aw^Jō ^?}̓9gxhޓ9&^+7 s`>*X%zr\ MHF`'<t(a0۞oӿGo{Ǘ/{ڇtSO<;(tNM:."o,OgĕpX4VHbg ?zs<9o7k,MGP-q,Gn%ɟdd'S3_{1d/Pe-t`8?$GB.zR _`>gՓsPq={7Si PámC6)]g!CRWϺ6RH663 8(DzoAg&3Ď1SN ''s661f?</9[%/!-hC>mo.^Z&x}FsE'{E"{B\TSwNF5AMJ*뒒5veJM'Peu=Nm%GTChw[qǘMHĵ|` H9ԏ(Ij 3@Ѳ NmJr$堯 v 1Ǿqw*ᅢ]>N}NT=]-"M$UC-a7&_U}'&o{JҮ7#Rתݏ++*Bɖ+* \e5<ݶ7m\N/vq҆PCgH1.Fwý=m'v4<xC@Շ@dqRI+&{^@ Wmݱ ӆ: !;.Y}#a$8<f=ߏG1`mOgi;CAiR*Q$29`[ W .҃8"pl*H^ B U$' ;9>_J\);fZNhЖe.GͶndヌfA4Nńcޚ%UGRPk0鵪AMw3H U&l2 @WroW)t{.HH\eԖ b%+m?:q=_)аW %ѯ_7ʀ媍%,f_Is a B(B}M/ _ߍ&IE7`ٺ bްM4-K`c&0ܿze+P K~e\--F%_YKBS8+\qs 4H_Wj %e@4{fIkn;Fa@vz_Caϣ7d@!7^ ۯLdz &A|Goc#acA p"{48:i8-ΎgV}BƦJMo$G #`~&,A{uu`z60 __p^K7/,,&4F6zCw}]#b gpK |ߋ=o1BRQz'[(m?“ka?k#q?gW^iX~`ffZnu7(!D-4ƠE L\+.'ȳI%8ĞmI|2$hHŌl5gHbnHcl՞ċPPRe1RDJ{\H7ćZ.rb;Ȝj{~% EdN䝯Ⱦ9Ѥ4~*\۰/5P7L|G {)S%Q|B.jKOwIenDW&#<-@liw(6EXodNWd r :HT0nC FL6̦MD&-FEف-6m?[4I4'QcY+ղ82iFt6mjPfP'*T7l*=i/B"0"7{'4P"Lxb? 5ji~A:U!`ZQ_Q3CY%Ҋ&oTF h>دDh!mY6fDm44Ky?*t(gAËj+ h?jG~ :>F~T ]}T]ڬG cjRjTU^G-Yz V6be +Z>|j6* ;5 ^mej6U^єʍy]_ kz5kqi<f`]:7|i(&9aʸ7jke_FCEzQ *W`nQZۆP$Gr.-fHdTD좄A0H\G4O8Ҹ لHÍW9<7`^!ܢP, /2(cH5SS#bu"&2nMq Ok %֌^g[7({u Vͦ_m;sVqz;ztQ 5 z.r\_{Xd3pc.`CH(OxN=Y?yS^"֨G@} ="!+>=\g},QAbC`v8MRO;: Ua)E:qZ HhzC]de&\ZsNɱsl᧭ɱslarI5ɵ&+jM>kb{^sJc d$ u*ň|<'&[idul6{9?N<$T0-&;1F nZs I$["TjEEQvȞ(roh$e:-Kic)b)GXʵj ;k0ҳsa)S)9~M/Ki_ȉjhy[Zv,Z}({9v.Ͷ?FQ?6.oLσ OC}b= Z܋ÿXtnʠs2_nHwnKGvb >-_Bi8)im՗#^afhW$ѭc?a:b5lF?r3X9-渒}"{"P`@7l!ݦB4kQ&ꤳN 3͕6X_!U9"XaxF ,Vaf.ѡVׁ^t%3rڝt}3QH%_%&>9DӛB@8|`3Wc tB5- >\~;.~~#U FLg7xͧf+X{YХhL,PaB;9wI- L ;[_!qP]Ʈ %6꣛h#6eH )tȡ J{l5j$_*(`kG%jO5K=YE%%bG$3XȭB?*F)ӦL6 Py˸Oj~~<~.U.yׁ)r:еndMuAg~Had[kүt*;q>2I~[hVJ"ۃӇ:M0iG1AV1m=8]L<IX9~Bwy+CXyssl &?_ԗ_1~%TڥRCV l4ZX/\(KVpmK7Y6|IRո_KӚ{4(i#TSdJ:iϑy`;ta`!YE`ZZ71a4.jbІL48NPe 1$pY:id0F/W[ ~ѯ|8{IZХ2`ٸ+·5+*z7zwҝCw?vLm{T-L/JvNV[[ILLr':٦םpeV]էUz ~_hTϵjvuHn}rn78!~Yoqr+d*)k hTZބ֨e7e&ZU{ ɂʢTydX %8Č95ήBځd/ fԊZ7xmVC;kX۸|}%? Q~pp?:k)z'v &Os]$6v/,W$:WYH++SU:dy/k#徦KA[u-sr[~.~[NY[~e.g:ɵ.;VU\eG#`e7]]5@4X@X?%KW+ٚ"9N~]ίgۏӊOyzPse R ~aByG A>=liWwÑZj⿨C*`5Wvt؆o6lSXъBw9Ǡ5Szi=TJ9U,SCدlt`rQ@gb%;Kd+kl&Ѳ.t~;~~ #Þpܶ(HNY(m\VryZ tO2 | VqHގa#T&/9Ep&OkFT6h:dGHM2Jh($Թ H/GXfdL1|sWcć؋Lx!*'(4Xn7Qe׺8BEW!OC|f[>H (ig>n3}ib":yYFQc^{4!O/EP蒚I!o9ny^w84tIZ!6q<,e[R`uVf݇3ţz#g Fz2d6}aQXeV%5`U_{a|fv*e7/6ⷴ/O !D^+Q bzOdzQm`\c됱 lW3p{ kor,<lr(2Mɔcp.%l!P \٬Gڲ}\/1ߘB|nѼVͳ;@ŜQdStZ%Ҳ=v](TP{)z|vot}<En+{}ۣP. /oY uF!XvIs~K#RF_#f0Sv _u1NIew{S={V|?aֹU8̔"ggb&#lF<'/ሉqt Լ`\`ao(Mi+ c8N<0Js@MPM *Y4B}?gp; ՠb&QtmBQryز_U( +cʠꪝ75p5F"a" ޘUÔt-[lޚ#T6Rr1N"0jE:h0T(f !ӃUjPN)4[ɬYjPĮRä?\UBm'khd,GفR.^I  PѸõm?O(j .zctDdN3.M%I%^gG7d([of!MI?O+[N^ͬ<9q_J*"a >kOS"k{,@,Obņl/>`ܫY)~e%d,v؉q dGF-P[2D zz0(e6Z0ٝI u*1g)7xݤ癅c%Y'_d E34CP-jQUؗ#+R1C4H_EР"(n%a*?٦e8 ;,T;yR7e|:ݨVTΊE98g'[8Ǔ=Nn Uݎ`~;i$e`Hn )ct[>ndY¦WQJѕD*A7DB+lY Ame]uѯC IDfsXgљdV0: UgSdG6fpSfÕPJ͌*hbYe5--%X3:܇z tc1~mYIӝL'3C]3Tf? vZx@i+K@o` P%@A j&MԜ4 r`yVh/1O>- סB8ݐKjdW{:#Y$!C4!xdQCOV"TvCQ5da0܈S0Y,yͨ׭-sc49MrmԢz͎?[? 6k$6㿱 F ei)ۂ!dlxHcf6/nFy7]. EІ,I=`" l|AȼiA-)YlʺE×ʓ*>)i#ȵY\M>OǟYnG `6Z|JNYx{4tك2ݗw<"ğU(|p74 :bgr ?@Y%+`у{F`pxX y7V| WYB'H6-0dzO?_a!wDJ]Qyݰ o~ ãGI@~ :>gn–<88윰Tof םzJ;c.VU;y x}W2* :Es7c[ ::"K_m^T@P֗%=f=ɧB (oYWJԊ۟vv~vXc:j*f{&Uvs,/wY`b9)R9lAi{RRk [E@7֨iO'àת}gzM۪8\znվҪ3@(f436lo 67խw VwW? J_?b#($JDK8X5,ukwBzkGz㱿k8s԰YnETz$^?Y"GsBLB` yɆ-\ F= .(كw|B$P4rS*kP;!j,Gh U"9x5'׃;d?_p|N7'W|ӿ/fgxp^X8;o;bӑݦ=X?` n6^cp&Y{ Gvsypq3Xc*A6|p/ll!\0h\UR", f ۺ]cَ 7'iD7- RSif6qjg3=J|/(t_)t :`*7.7ݷnD!fϑ/Ϳbyy;B'x$)e8-Wr ᴤEvv5R$w0íIMrK?{XczʔteT|FAz; )w "1`2L4ɤP I ݝ q7 tjN@@'L4OEsIE*l>ZBkkZNmCE[kWʢ[+ЩoaAerqڟLZ|/`#=2'¿ep?]w}Đwȸ}7~" uv+Qht0تMwT^ܥclw0dl GaRl8%HpPt)}eʳIpD1yYQ`M^ G*:dJjRj:2+'nߘ՝:;ũB}w*;uQ}LvRfUM씸S 'ݝw~WuGJ1tP'Q4J\QD>¾Úz_5q,N 3|\rE-|-EH/4;0XzO0HFIV]TVIB܅FVl fыj,h(aFd[h|#:X]a: ϰa{lm՚-qy6wab na;vӻ _aS漮;/3 ހ7` {fYD k7wzؾPݱvr d@Ga'*jxh4F0:w9܄&ΆpIsnafnaf'{p3 s7Cـ:]P+DԜ7exex/ë02̽ *?L8s]eƓ2ʽ ŕp2L4ɬe: ^{^oeν }' +y^=/E-؇at|ira?bѻZ|F,Yʇ5a![zgT4%Ut4HG+"}DktPeXH,bUqnëon4!O~ˆBq6eun\]KHXnFFegoP>|q#h˩7L!*,tq= wπSūp}ڵ??u=cvhCsFcsE <+{\-y ?R:P؞r+QE] 5X^dxq''ϊ 鯊Toj՚Rs5]M80)\@ Xg\gM?T+t5I$y[A՗vvo[n)q'wPxt? Ό7g#5=yD 9gC嵑#xHqAG)v_j:X!ϬL{$2U $!([RG ?-, Q+:zu9%œe4WemFS?W,=c姻/ֿͯV_;Zp)( U[dv/kxV3][˼BzȦfhp-Ap6ݼ voK_WjA#Q5@]b}R7e/i :m\ý9-[Y!FI4_X[۸8XgzcɑgB?+{@RN_ACޖh7cElM:,K"`rX'㓽Nb~ @c&[,Qc4uQb}P; IYkeg,t&&x6/ίŜU־>ށ 3,OJ׿rv+Ru+G׿zĮo:M{K,ĞDU>fa2k~vw}=ԝ2w+__7)6=K'G~#bX2zbv` !œT7;56.ʓ B*&Gk(qv/wwA2|ҕ }QwjE^v|? NeO]Ǫh¦Ax?SVkwPrT@)ӛO|#Ì4m ?$~sѿo'$ ,aF>9D,0&eNp 2hY2 gH3H]Mz 'ئ[8)s˔Ly@5:~< c"`^Ջ!+1!+#pK<547qpsp@f>O1N!G@ ):NѲn%"5׬}F-W* :#be)uϏ㱐T^MUut0 b vX/eyuzlQngyyCny`4JB:;߻NgLPqLA4 ZGAC͠9(lK!=@,mlgWw/+m+o=;ݲA8FaoJD/0aGEaU'K iw`NmԏN4[ަ p~FLj|ld nϰ{ i?~xGryQ*ζl$p {qV'QeX`!#nh _y@R@wrl"N**)#TLƚ"pv tI qx8uW̓;asf2A!]NӈIVˉeƐf:њ)ނ6x=}!6`]duc[ksoD,|m\'drbX%5V9-x8yEEN+`[qh,ÝV$:fk5SŬ'biT)Zm猅ӷ yq<Ԃ|fee'fm+WPm;)bp`( ?*ddOGէ\'z4YOtIT +!wV)o0b̺@ѸG$`4&#A= /D^@uo }<]J:wRIuE.3hO3-[bEp nφP|}lli #_u_qABqJ=ӊ{Я*׌̚g;;ձ!y7 ԵIq U h BUN/hiu˲CLvb2 8LrU#*뺝*u~O/j>*hO)!) g5fn1T^ҪQUmM5(YFTr ٻ*p%kUQاڈ͒5٨Rm۩xJ، JHlT7Gv\u +VN7U,=Q?*/8?2oҁٞH0[`!lʥو%zFo(0Fרx"e(n+jinv j~nβ1̎sZoBnmo{Xw,v&aFYj%ݫrgJk* ho!!/X'b{OU>pi+amy*xT9WVɀOSE;\1~c8 wU,C/ankZv$Fn~fx(G϶ 0&MݺӁ"D#jQ+ctJ[jjGh">apjwymqvfvX~].4BEnau'{ qUB!gׅ{:#>^fde{+׶=u-.M{\Եuf>f{+qfPx'Zv1Rֺ1RA@d+ֺ.W~ck]dֺRBfoRP#l}wnjpGtc/.6|چb*VO՚buw faԏBQToڵ0 4(e7r\ 5 Zם+(DզYID>6S/`{(+'yZb? m5lhM@ftjQ[sOcn~QqZolM켇|aӑz&Gn~=˲nhZoTqr:l @TvR>,q6V;0- 3vܝv RIlPh ufP!yyee|(v4sZ : Dvxѝ -#07 mx&myr ٹ$~&ΉeHM.d}`n r0͆`+qF# t> V$@QyfW`F66Vca@X)!m3RÉAat"Td{Tx5q@X qzҟ~g-oNdqui<`ӱ/FNR] 2LT`PMWKXK~0Qk$w>XCVQōCm zJP,;;ʷV |CkuV(ՀC(+E L QM\i]W]Š_2p7x ?+EkxхtJ/g{B-EeHѿn#zm w{= nO*lL@u?5hӠ-ۂ(^X ۅfŢf5ϫGQX?h4iR&>|nx +'El 7݇9byõHenp-(ƹ84 w},V3{$.f=]w~6޵2^*0K<ND2N%a'aPUִYۙU97Nl@ns}8b(͙mdSq3g3t?S6җp6PY="5a0GM6bjuP|ȑf^||lUˀ >ygq?ڍA80Z,SN>}q n5-ηPø7@s?ތ!|hFcHtN_*A;I;3yamW|sXzfNM0:;Wn`4l.}?9Ad TA`}O`>tZs:"g# -Ùr *exLءǣO{dďVx/8*|CIB9 vnpJlaz7RXރ'َ$s9Ps!p9:bsN )l:D' XR/.Akjq8?76qADU,$ ;БR,kܣ%brMu@#Q&]U;[`4"v:AHj_۵P[P(cB1dvM(w =YPv8Kc u-\S?rƸCR Z}C3yʰEݨYݨnm+-wD2#:^;ƋZx,Y%Yuߜ϶*#W5),bgSo٬cFuaFSD~a߄Qxl:w&n쓟p/ FJ,z(~q~-Ӳn1*zx~)laYYB?LƷ8b0I(]EP!kcؖw>C c6t:!4K0[h1YV4#w6Pr1Kvi0D$;6JF.8eW0aeƇ 2Mzk<%K?`'*';PNzSdžͱ3Ľx~:/sdYGQ)O'9Nc:GY޿*qP=>edf=9bOؓ#d)zس5wĞ9bO# 8Kcgޮ{׶{QL**fD=sQV@A޵B|i``j}GP.{ 8&J;NT# 4i=Z{G@ 9~(pn09lD9zMHlCamUo=~Z]~ޯCUmTfX5x/'Ӫ;zH}Z{Ԧi)1L=,*1KC}W{GZ( >:72GysmzlX?zˋsy+sX?A&Tှ5@ɱ ֺ$b(Lآ=T9 M[ITK wg|VAW1kH pЕ,J8yk7lob@IA)bp[HL- Y'P!n,9P&DRfG(ptADZ-rc-i5h#AKە,(uzO=ϒ#[dײ3j9ROԓ#9ROz]Jr*UVp*+ϕsH>W} }2\>9ϳ1e'Ɂ}r`\>9%2܋a@,˾@*&`MUo h=4M(G x hBCJo&_8C&$.â>ArPT(UsP [@ PwFc(Zc>9ƐVxNgcᘌ^>C#@?*XD:1DQq|"!ifN fc?D#b!ʑQ';ҳ#H*Usq[Ƭ,FM2 IىqKhe&@dq "2}j'$Znqm?#}8rl(-mb\E2`H Ф WJB53={V{D ѩtbSe 4QLms%ˎqt8#puyrR[ki1(ٚ\W9W~pY_z96.룍>/Nz=/pMh;g фxXAuB%A@$c Ra۪KuQ 0Nw.ڠGߨ$FJ6tr-Z 2EٸBs :j>2?!-TLXAg; !n" t1LȐ.LH$ݫ"QU?RꝘc2Tt gYQ'摠s´Fל_Oz-W< 5l1x(J`N{amP.(RBG9-p ʗ Ub ϗqNO[zW5X}Pv1oڲAuL[ CrILiKP?ΐzdg{C!yȇd/HHk_CIltK\wU+_U{$Uyeb_k42~6|qTOl(5O]6% '#u+*i Kxf7?eU[+(%ԉ㦋(G'gc.".Lрvͧ9ab4Y g7@݈^q Fk $*gFSɯV9z|#+JM862uR6a6eJ5=Ꭱhlt7]3``3/e^ovY { ",eThޣy$ƞa124V"XP,}?9*Y6[7+J/ tz'[Uf%J9 _rѫ-k'l_9 t"󑒟ڟ^*384޳l 5Yy)RDU?$miV$ =qeFvh}Tl5J&2NNRHc9ƍ&$4 Y Ae{$F BUF0mR=zIQOB&im9)Ob-Gg4^3:!8b$[sp4g G[3TtP|>GɌ#~|"*ohԛRpӰfCRH(8V0bu رۏv޹y%0"-TOr{e pQ0y/<մ |ieX l6t=`kN0WL|>S &˴]eZ.VTJwi+~`HI-ĪTGӂzbڨi 2~/?4  >>ODgj|V)f(5II1D}:|LRM){*))TX+wkOtT:1x}62X1؎!!΀H$ -HH<&0]C g7O=V Hj. K1*A 5z8 ;y36˄6x֡b#_'t2r6D8{`mhE1)1ڇb%Gh HE,KyޒuC?5ol:i iG0и׃9aƕqp[4K]bbo _ 'w'<+M~d}q%*O[KOYxr>Cp&r=e՘4Z>={3XI,[ S|'Wq: uk+qUuc_WBvlWAfdҷHU,?wϣNr+r NKCǤp(J!ldHI q![@й50Â̼ ڔ;ߎ'7ide?ZBՑ8ͧdQj9fђnZ_So\{RH*_:  DESH9$V`I7{a%jF-|Rtl6Vi 7"zGu=#wanF :ɏ_DAR7uzoҧV,?SբzXOɪ [*Z$v9[ՈQH>~ܮvK/e⥬$l8Pm.nEm=HiصFM^~seOk+0}V(%tJw+@k~:5 ?Z3OS kU[$j2jUf.ѳZzJfl~NY=QQn6s vh[)ӯ;]\aah'uDݳ٪- \ESuNؚNNdl_C r-\^6k=EKظO'ShECl"t+5~܀J3 = yt c}+HIGqG|E*QoA8+<<֙*Sw==uGI ] KRÅt%XjO΁?I+,Lɣdnvv[v!M܏\+8Ĥ\iUO:,1NVY}htee J陰ER3DHs2$uWt#sˤeAXzsXbV[wD@sMJHZ =iZ9JBep1t:+8{lӼ,Q,~ٖSMk#6=$k/㡾JyVV@ &++He.- &f"ͫ ݪfc Ge>d.@`-Y!1_ED1Adn kvl{+?0w"0cRB]{ r8-3Ρts(mC dDA U_8|_?Vw]<^(1õ/ {R:RO{œrfs,y'C-_jΡ(dU\U N\BXRy>Ta[y 4뒧_K˝i9 q%Ά2yS] :WY%]tTYi*sB<ʞ+Aoo+F/ &s 6 {%uƉhwO͗ݔo`jE<:UVwpYK1)XW`M =ip^ d+G=:*'.tUՁcL-q[9v2N GMīIX믴Ou LI끉y8'O'GI 'vfm'vX'{89N,r56qb-=(n5GTE KC%©B!:-dը<&x4.PP*琞!=S@z,TҳϾ3Hϓ33g1={nsøධM=#?;Qvt4{&:h. \~#ךgqY?G[iZq6s|_z??frgwX܅g.PCPScnq-O@,[VƁXa W= *sLڗߋdмѣH?I]f.ܲ{`U M!y~63"w?GDbQL$&ҟS kKˍb?"5E UweT zz WƼIՓgL#܁hUUKDD5t渘jGW;baC7Q!F9^S:ef2\A0GU{sEG+:4WtԹCsEG+j;Wthlq;WtBW+KsE9W7>Wt}sEgsEwSs>W#) E4z_ڍCZ9ܯo|$)T,={o?xXx%YSN%8 '>O6ks",eOvg:9)͘\K384ۧ ` Co|L@X\ D!RdXG|yLr=!SGwU..I`TT_Y-ΆX>^eyٟOe ou>gv ͘K ڗd5pL plHjǗ/鯜t>ނt0DmI\BǶ ay(#NW؏0]"s!/ugח+喹JR-DmatFUȔݧF帽g\x;sieӲ&S1i_C{pK%PH<#td<,nGmKѸg[#R*[F'w^;Nj ;x p4M3 uMCsv}Pwir6jQGĘsSҍg,sSH?uL@| h|?]ZmAO=* MF m4mЫW:nп=-K)gn=}m^hʴ+})y%"WB57q<$ 0qќq/ׄg>o].l1t3.ާν߯k]Wpߪ rk~O{>]5J;ikrlxN=Փɧ^R܆jTRM&,Ku[O^[BJ =-8,cĩ7zA4/Pl!prC*at7}UTbx@Q͌} MQ#^hj"mUtӐ(*IxʹȎgGc<fxPz!N4&Q@ሜ- z + k;_YCjIK.S>)O [[%CSĖ评-sd ?:䱠9T"so4[K2Y >_1?\nY560=zOް걉?JGO'`9*YCiΡ ǾإuN8߼yu9 .]/_xS j5ڋa ȇoz`XRW*eQdl2߼;,׮b"ZO,Ӡ]SJc6SŨJi|.sX "9pR&Sd;Pkpl6IJl?2&> 0?3MLEǁX@Y?l̅\] {H4ɏ'l6eM:?] t 5-J].lb(/Oav؇KO{w? {J|,v#HK;ۯA飝!%J{rHVN.+ՠ_]VhSvJ!pګq7G~g mTrJNr%ԯ>>ԫXR}OAV*9xXC_创Ux(%po1Js99_Nix&j#%k^Vz]s;Hn&qx: _ӶNud$C,3o9>z0ѐ.>&Pl`ɬI UL,:,aH]DaE77V=›z>/kWIlՈEרuM|kkي7M:O@Zi7"6j6BOB$j9njV=ZmH);:OH&ndT]}5,=p6ԇ%vl72 (_\/ݳ'읣n{9 %R1ac:&!PRAmy䪐ĠDI)ٮ#ەFdpwē +ݭc>mq!zd`_F9"M? bjGp9wJrxNiL&)!1OԉHD iŀ e!yh6*bCzsIs@HQK<"{2-cXype]Y/^eĊ=SY즄bZ+5)819$ e .?lƨ,i:\b[TRYz+d"̄CL4y:f(hF!Xch-AGGio:F#Gf,o{:z#{D9j7(' dPR$^ ^@ |e"SNQY$ ;;o g$QR8qC:2VQTu[gYT!/{]o µ-9ƕi`/C7A$Ht$ZN׍OW+ja?sar_5\(2aK_evsg=U &Jʄ1VUcIM0_]#F]-Wq8PQZ`h&?$ba g{!PMh {A6b{^SMqM1& M4[R ue>x3M!0d=xn9*^^PyhJ1|v(%j Μ3ّj:R,O?9f.Ni,lyDK[JɦnvJT5CF@5jr0J&E{M}S;CercR?8)"u"n6]j#KM5ռtyS;ZZY#w7ٺe=[ts*MT{dzaS3t`1DZaUS?ǽ`itG$҅Pd\ P ]U[ Ä]ԶgB؝=Sv'd3 2'#xm k?TcK z*}ħ 6dk kr&8OZ蜿cQ8/G\-gSHs R$3<ϐ #Z۟EF*^N&q/0 I $8Bu,pY/P5 \ҋ(Vy&ǂtYVm pCXչEaf|#8k2x!-3,䊅X/Y+zh-jqr1]YX PB%R%eO_ VB[e?X՗P+LpwUk5G֦'aUڄ]Pn'-גܢf*lyVk4jZzP >G?{լI6( Ј縠 0 HsjRWdpg HʦrQc›VyV9e= WfFGzòs@ZU5[ͻR((P`ǮMkFSwX8mϒl՚kQb¢82ྟ͵Vsa,jW#uyZ˻I%n֩:jթ}k=5mIPԐ7P ـk4ɻřaֿ=XWCͫZ` +ڨyy6[- my?9۟&yl]i`4)!6# `r !ѢCb-r +ƸA`!zhSӽH`e1H=wGskif{@gf7&dS4Zpjo:'S߂Iu=fǀ}ˆvӑA?[Bս(oϋn7w~ )nO‚s8p̤y0P9{wa0ja{A*&<ӊhJ4'/Z "iUl$+e"Y!zܣe`d0,< =&iB:\/_ZӀ|nL6#ӤAYMVfo%F5bVD#]eBh y!T")!Vdu l<>L;tF_f8ީV$yw ]}.\L:3ޟ/#=MExl:Pbj?xZn 4*-t%[i՚BMDۂlMC["kFu78K X~G 7㯄4'Н^iט':9y+$4Q8//Ӈ-wb5zcc!rY}U!y_S8H]# %5Xa2Z)>L:+8' >loڲGl&?K{LPVUGQ`6U||x_/!{rJ|m]/Gg iF˜\HKr&“(/jo^M_^Jp''{ HٳsgWٻhLÆ_Y͉ы>R2\pf:ed^&J9I$u)#9g)g!HF*X9@O:7h6} CV `5z|7-9tx3Wȗ}{T C/S[[\_-/R+q܍rtj$@\L_^$*l# sv[#HIOEϭfO~9/1Awh=U)Ҙȑ嶒_DjH*O-MCߨS 5cf!Uzz~G K2AbVPӦd8&o/F7\KUȯPFNui)`%wG"~ݜ5cV~qTXTҏM.t[8!vsCZb~PEr# FG7e:|'%puqj|گ\"? -EZ=6}dOFNpƧNsb$u#S\q@ CYxe$R? `B+m818:-sd)5D $LsygkN~(-UFDq6U g_y>ˁuNHrp%-k!Po)ѳq{\WNtLNh&I8$``pn2MH^9BGvۑJ7K9R Iq#Ǡ$37(^E6ld/C=6abОy:[Y b&N@1 Y,0h.<+rR"9p:n$_$`;U`MыmB8ߺbx'ЍA!d BJ=L+_y|&fɆpEУ#(HkAXgV 8-ֵ p4eAPQ i * BT!-=Q:&f+ Rֽd:uOAgWoFyVnFY oκSCkɁll<_c-F?Q8:A9bx4 )3M"6L#gMYj{3'X MƉɀ(tB|"qmٮy['x&idaQX*p]]7IԾ=BD A-͜`x"TЎ|U6 7 6Ԫîip{5vA9hU{dg6Rͽ4W_<;-˦/>lD $l>mP,dC9J0FP =1 nj7f=7/ĄvO}P$/O{ģ|"B'qt!KEPɆ\1L@_:G=bnP'r/2 /llnE948þK(Xr> p 2}fz=̇ b+~n 9{MbNm7o&{XS~5VeXa-@3/ڠ :AQ  BPPWB|uE߁LʢʢOY]]Y2E2jEN[~C_^nTr:/nߣqhw7^q76.CqLJRղ MKZI'Z. #@/r HxM>}KD"$:fSCH5Қ|S$rHC@;l?uD׿P'JGXӿ?ϦBaMEiH!.jfYa~{+~m&D |X:BCp o@k7lruE٨jOAt\+" "\*ZA-ߣB07+Ê/k>iG9V.y% L`q;>u*!%F(S;H 'gD"!ݺ<11H#sbTquD-eT, g/ f3g$^-;M!91 k[4)+4wu&|.< vA<+|z4n} 0$/s%– $cex&z J | DƘWNޔ>D 椖xw~#8,jpU <9S0|={S?ӧ706wE ={hP^Zа>L 네-;j֐ٱȬˊs85Эt#qS^Mz7a%B~ %jW݆^(O1€n}1n`]//l">Cq>1xj6_)Zp!C5[^ fZSVӕ/CC?̇3D O~qp= > HR<$p\e6u}(RE5& _`s Ɣj/ 2σ.bj&2~?X_!>GT;&.:). صb]7,a| aVVaG MV &9B=9EFq3S6)'f#G+{+rELNmFl,̓7`8z?`NfAxVz:Bu \7삳 xiҶsGhuNf.60p:x0#2Tx8BM=d睪>E̥k(`eʰ!` &{SYJ=V3wmLыoj7c\Q_! q@4`6}*'e ŝؾ; Zy-Vj֛UQb_?n"֕7Dz[¿Q^k^oT6۫au TX* 0^>"N?uϯVMl5yϭ\+ЪzvK#a8c{d,neo~?*!PP+FG7M4zF1}6U3a= 򢀳P;jiIA~xPJyx`AVJux6_l0V)_ R# 'jtO㿷?+W@ͽd,)`O]iC jfK/V[-kY#^[,jŋ|TkIk|XLjsd~:h_pRx q27eARXþ;wì*9D~"lFyu>S?=٪`?l _! CIx`\0csaB&0@# db".F\|G\Zܧ* MFW_-H NDZ,,gGI /_߮/jv+EGU;yW4hjHl{ '7qoͧ-oE?M֑*M㤺u0Bh<5{6!Sg\!g9pq\YQh#?PsѿS{qH!_飘HX,a$tX{5[h %GJ(..OV.ߙt% ncUidI>숿N:ʒ52Ul{FJٸ,V(IK3bq4dRrϣo=WvȖ+W@͝E%B;)o7dxPNjT!Q qC ݀rCF&dM͔ C&IϛL2OYP2AڔҊ k)?L%騿OURrZ"]{'4KKxo=W\+~P);(jf|o >K8KH/!^j m4 G%-7=;Ҵo+olx3al&G Q^0!#)w|x7Nu[z]pfyٓMAT3-S@T* 앶bg(26lS YyC^Q%gH~ċ\ PAA[w[[i_g+W@ͽD HbiXgwoi۹|_nn6"H! /͂}l ?Uߎd qn4[pOt=[ oy\5ͬCMPw||wo3 .#f DRa  ={vفClf~]gEIrWuŇYyIpvm S {vCQUhPD*z4SGq4UifI)i{bcT֏MQrƿ3ƂO* B)z|( SI͋lz=>S訇k iV;M Cn'[ B5z_o!`BJ]J{7(- fd3Ui 'XƲ l; 3b/F7#flBܭ)Vk8X[v{2c*U욌&v 0<NZT} B8~)]|X>Sܤz-!QT k(l*?l"(%v[]ᶠ?^ZEm}z$4jf#iIa:KSiu"K[3T}#˖1ty-M8 #FTc?a.oߕ4(q ZE;-<݂sl77m\+vAka -A@=2zʿl+a)Jgt#^YF% IcU$VD~YjUHS%m}Kq'j%uЙTʹa0#MRWg&FNK>"+u3p:\=qx|;oQ97?JR( onv7A{2gØ1p/am$v#t?lqf@Sn<9QCԛ rw#tfA  6^{Ҩ ~un6ulޯ6n=>+t1~KJu6{s}v1WɳVOIU,67)5\ᆾj1KWM,nI]Q؍] Cgo؎(tѦA u\XmSܩ|kpz==lUwsO=,1}8L[{qymD?l߬ϤGj!a= Qm7 l^ٿ R3'-kEB& ٿ5CEq*I~ I*t%Zk_Wl{$o\&Ϥ<*GA.r5&\o9[evi8hsi'hѐoMA?y=+7'p܏..ǒ'z.'+v&@ܔ]bUU9\t\p,KJ>,,뛴vxl:ڨ[7n{_OTPwWpdTo8I~N'<}5j5^tyѣxRˣ_i*F)I#W)cu,sV8W"F)]/g{]`vLn篋oCgM}YYzOnzWKh 6|H%6Ͼi־+Ͻ٥͛naZW>(aw96"#. p?a4lB"`=, kfO~Zl5'/bG}VﺴWPJ|P=_if+2]Ut~O?dj2?G23׾KY6;;&rˍ|yc_z9o8 0SN~ @EUq1Dx tɸ0t@lz0|۵$bz3.bw%'zڌ'C;)AJ6G'L,]`+}aT!!oծS!F4^m*K1jQAqؚ9X'u ]Vp3_5 _n#mKgHY߻?~/LoռGKi_>6nX g/zuꇧ޼|UC99edTUyOBzdVzNWC'pdګ@PþU 0L Q9!67 %HUu1+CGkW`DNc`FjITYƒXMCm1>f.n~JH%}V6;5^0%h Q[^(Sf?&5j*.ƒkZ@`7EW.YD2Ք\ɏEI8v YS6] -}s鱑oo;c5o_W3͈Zè{0UE2Uu}_Br8`!Um%A2TF*SXW!OI$v_m~xU#Rgv\ z{|>fMHTΌOXC0MWVkJLcCemh%`ccЉÇJn/fm+jz"Yz?wI[w@A%ZW~aFMNʱg{峟 $BYF.acDžh I-?$zXùH=$.YDio5YQm"Gx3Nrqe BIMgV+e5 &dncҔ렜W$,'E^D ef7tu V8y_|4BjMaa-&Ȼǩ}QCfgW^2U9wϭqG79翆QUhՁ|OOPdtN*X5H9loz15?hx+蔷X| Xe1nʘ3j7>h,ok>Y&Ϯ'ŻjR?Iۿc#ߞ?x= ;ϭR@1%gobEUy?>u j#1L$bK0 LF/m @#*nB{*'J< %S*znѕ8)Ͻ~a2]q?_-;=`׾y6ϋ±$}4 j>r+{ˁ({R;2 ('Ǔ?jwCX !X % gU쐆7K_۵/0;q#&(ra'Ͻ$zl[4z!'o(xGo(^ӱO忯DQ $;J|cv{hr^'UQ?Q0N~WvNUsz#vyT+onZOYkV_s[96//~xՂpz5n.@utV?o/^~=Ywnm?OPY$m#L9 (Ҍӧu7,[0e~TdVgo^= E/U6h_-R/勿^xקU{e+/gyoM/qjܮ,XďxǟOO? |!piLꏺaBc|(w~xRh*-5l:/o{6>d|*OoUκ^g}[86m.m+&?I[go޾B$ ep  Ep?ӱ{<C: ~ܣ{K׺y~۵nt77_綅n>,>,>,ٿһ/oq׹4箸4/ >-;M{-ܰt>i5y_zjr}'6ۓrl{ߨx_F?\|sL0"vM?W6&z_r/_>(Sr˟d_Q%=xAhϟ-L~lN¥^w᏷~C5QB[_O{WU#$a-{g))y/k,-S&LϟnKSafi}ti:y7p 7b$߸ }cdRZeVvv_[9F~8:{T|)LP|7x=Jס~EQZaǡ0?>_>=zL~()m=YY|:{Ds&K3eӶ(nh3j's zWm&ogvo ķZ1rg'L;1nV Jm+8{{Z8;8?XN{j@ɐcwc"0;]- ߽xۿۋ7"zWqW7Z]>yK߯~xjuj˗Bk*&ǽU5yo|ZVN:]Zzh$Ѽѡ<ʀ6^~MH/^Y/`vQ!ۦ@qa£)w|rkaw?xiƴX?՞cߢ'X?[~'oXm`}?:w[Xك5Wewӱou &axܤÁ7~ȮC%T2&_ʄA7qT"f dX1 ~/ckk^nq(*_*!1j@`P!q?jܢ6v1'˦Wr|uy3>MK.c$7~mȏH#=9VoWr'+{-7%"^B]Dh_8@sk[[J-B5ˆO/ݡİF5—)|J G4S{\'Qfd0>" c1qtF 8n1*Ro cXX\ܣ1ȻaS{֨ȳQ:\ܼ;czl\Y?mXm`];5@b`qwU)q!"uiU?F);+*֝{H^d[eRy$i|UZd^iH[I>7q~U(mu񓴎nbOled`7fUVJV^ʚ=j,zŚUj(q#UU hЩ= (F4cY4X^>vE=ҥcjcwǮo;hcǮ׏]ՏPx_"?8^.7~l\[j?俭 Z3|,:}. ku#oS ޵Kcqo9gqoG{|߭ `҇kٗDX6"lݤMݷm.nPn7aJGr6co V3 vV8b^CGŔ};#Jxf|(&?bbZU<߮ZMШh(&V{^T84Qx]1zv zl\[vM_l. _O˱۸]vy@XR b-S;k\ޘ7F{uFgJtLh8HIzuqG|'掍sc?V_9VpoՈ,rؒ/;j"I5(jh2h[klR@)`;g;Vp_}a_6=a_6nLǦi?yūwD(w&)Րe$T\TRbu9v<&4Mԁ\*f% !wPu4ʿ C}C͒H YΙ߈mwW .+jPsظMSu #ewVڑE?򎪍QRaXI, KtCPmF1Qw}QL~c5w]ݒh{X{j2[9G$C w(ܡp w(?ywбqoS_rEO_y~OxU,K޽A*|2v K`TL.)SXu!?/#)} yFG "tB?- 5CSQʯ"V0~)ߘYNұio=ߗ/ߨ3تV#JÍ+sT-9n wcm6~.V]}>w?9հr޸Gy.joVdlUxh Wp> cBtN=81!Bc3rh= UVWʛ Q46I Nb3i__`-qߜl0S0vgV?]-rv_| mo.V^˧/jcf o'c)UlFœ.PNЂ]dRc}L1ʇ}ǧ/V}q"JmYM/l83E%mCIxq m~*x]V8ܿu5ob'vVM忠!$ڡJ9&!1x[P֭*`P덢.zp7}",LXUDPxuّKX%/jll6_?۪'+.Ʊ=&Ue*IA^*N˪Ue,HR5&xت\V/X5~ؘ*Ul*}}EX&*'ꡀ!6 P7Kt_K%(\qp ytrI~-k Ueܡq&G;kNJ:?|  ;T|W/`MӣP!1"ƛY튁I#n+WLeNBglGl۾xFW?\>s ŽnF$L)LXңѶ!0oUTP:iԊާ)m#m>ߛ~T}s\~Oz_|k_RSOO>>S3T>~|¿~-|}[t?X|C},~sm?zTKk>TrǞj~K?wTj>s}_j|gCӶO5.k>l{>|<|C}{v/}-ϟj~j~Kk>6_|}cs\0y4Ɍ`t \>s6ƫd˹C9w>9U}T VJ'ݛT YQѴV:W.w3k)R 1A!_v<&*jSΑQ+KgsѷCwq?`?JF'xujߨr } ~|i|mHktn9 *}׬ueTl}l/U{6iW5ʵ1πz|mL .sVs~K+9(?>Bu|L:.QTqmc=Sm?衞K:CJ#xdi^e:6h˨J4Z+ŊUj^EԜjs1(}54><u^9yŇv7Ivns[[=Qmڜ4κٷH׾1/~uYiRbjB}d_^߬uJ3tk]G3ϓ,^^Fvݵ62MmNVU>q\=!zʹ&J&wFoƷѶAҹzosaґ>T}Ll]HtbAFXjcmmJ8q:^Y"ϫN Aʷe}}$Ÿ^[1$7wjr4o}.)xuPOHXu?![e15%,жȔosOT^)ƴkR,]lm=PK2;? xKmZ۞"Les+=dyid.(L+ͷUgmǸ?,]]~ɷ2p]6&TvÉL7&s$QpwT,d^_yM&7yL֎MnDu2UeCϑMK¸{ll)-<8Nf :&Rǝy8kedEhtD|hW2Mn Q=]}C,-]/ybǹyEQBKCiu4rhDMv7~<^u~Rh u^J:..V-o}'ms;DkEa MG#okSmZofm/f99q><0z]v'ڻNArHKItٻ5%yT^1e8W\2!~DsڡH]R[_jM_)S(_Gttc&u.= &u.mQwR!6Rfq~Нf)oz7辮SQfL[lɮOms"(4yo+d> -l|{:KL7'Q5Z> ^j2|i8\v.B|Ȗ`-\>z6 et[VB=KUᶾt1@s\*]^fl{q7L2?2BVC{Ӛ-lJND>Rm Mwm>("|w~L{D=b׺w5q£='E7Y 3j2atd 27:O}molKݟd-1En2RTCڻ*Mqu7^AzҮٝ&<-]t!}X҃1r曈qMmlȾ,M:KߗL۸$t۩#[}튲5튼N~93t]9gRV/ɇ粶!Y3`ۈ$lt", n WLRMf&˺#ѴYb_әبQsZ^+VVxm0:evgzv?!<?ၢv2f6.y!6]?Źz%.C[6" l7cuQϓ>6t כÓI&gS٣}׸eT_}0m6i$fv^D2I1Mfg 5>kd-O͎$s~_/m 7YǾvȦ*gMbvKU.0 4=eYw Еjv±>YY^w *Z}Oabp&6_ZQͽ'NsǜZvQ}>l}j(l8&!7?]~|}dKm/kzz[e^N~ jz+'(v_l$"wlj9&u?6.ܹd{Fi\o2Laú?ٔ6[M/S4ʆ upߒNǶʉEk}}O8Nsc+jw>ױ qZ~s#Pq؂}~oKOr9 ugͨpˇ^HDcMHSk!Tu7VTA+3 GpjQ=rR 7X^7w[9Vp(+V5y#yw>oԽ>>VjNR+S}ߧJTηO^/>s#?>Ksʇ-׷ES>Wzt>mko{TöSmϣ?ޗϾ/mҧ_ۢwcՏ9;(A;(z x}ZAA9] |  6 캜d;lxwP=b[ 6jg`Gyf;`Gn; 6`x`Wr 캝a; ;(;(qAl3;(}a[ v]wP3޵`w'<6?nUL&džZ]GW7yu @bUUt 7 !jDOI08='|`lA sH|!5eWw~Ooԗ>*/nSGXF*jS*/ND3|,'|f@gNǝG w>_^ ֆJtjesE&bYɉCߟ|Y}Z#P JڣƓ4mj[+QJ[Rt\iڱ^|z~tb%6e]_vXý]߱wy<7;fm~T?u珕[> çcu}̯M'k_*x|P>k_-o},>yֶ{=|Ï5~|*9cOZc ͟}?5SO5>x}nui[xߧ5=j>n{\|}oOŗ>O5?55~l>١Pߡ֣w(eP;z&́ v(v( p p ;2Ov(#ߡߡ;|Z#v(uP3/ڡzxgv(x;v(Px.Pݡv(sC}C zߡ9C^v(uPGu<];xw|c#gAql^ {~S`W׿|qx?Rp<10~zsq F+=[68_ 5Pj@0ZedV'XZ֋]% V8q!OUBmB"BGE!=FDXZb)3 LrC =ݺ0LCV}8(t?D(M~QEuQvQCacAw/ATqZDϗGE.J|.T ':y6?R켢B4j:ITS=S*H1Rc5qhD<;P'{yLÌ!:}\N2ErVQqJ42X1[-F4rPDOIPhNJRk|[@,9: m)ABBv! v:HzbSdh \N^/hZ:bJ`2zq>WpwMo MGS  HPSdǹ^Z@:-BhPaNzcBWb } '"JTmo؇Dşa菅n=.q%yH5;J#OZhD[V&G: _Gf{DQUL-[ u . |/7^*tƧd>ǜK6yfѮ[/ȗ6.xp:%OeW7C_F6O׉` E֗1yd%;L \$1lA 3QsdtC#&"穮6?}FC/f0GNVF kPf`0Ē.@uYD@T:OiaUJW+#M\Q` ]4OįY7%p&I"2gOe`tyl*bl#*8 fej- ʪm[#,ceP&4N'kpNHxgGUitᳶh[CmG 4p̐t?dkD<ӝG&L˾|[@`0sLG)>##K]4Ч=Ay^갢0$.Y S>N \ a۝zQ=tLc!St_9" = 4 &8pڸ@t02D5}>2צ"yчUbR F #1X., O%9tx7m _"^(k"d؉&O,m'fIҖ-&Y=Es$m1- Cɲ$[ֹ6}̫29GM6 ů0EIg:R)ȦoGM"y*F-LJ*$M{U6u" ڒDs}pYF%'ʰ(Z"4Eqt,Yv0*ǟѦ|Li˶EAHB!IAMȠ// $oN6np)YM` DcvYG4X]*ȎYqs2,:8:rL ,{i_Q9O2=VWQp,({ 4H =p#F@b ikN "I'}b1b`DPj2? [V7!)M2,ZtF , 7{O)^>}BaedQFQiUmC"mZ!MK4ރ#ȒDJBaȀ#.EI:=V>jьnH7d)X8,B,!ۙC 6V','¦h v2r֊M"Q-}b F1>=lֲ#o=C l:3UyAOyFlBc dMt$SN4qaa=ؐ==(-H$I;[ze:x@zu|B~jjI}%bh`eSu҅J8id=&`xK,N(+=H:CPfmEdbSYYe4P΂"u4 ־]>2 DӚ˶H0Y ">C2SikDJ1Ă5# ꃂ @-RdKU4ң4l,lQ ioxZOld! IL!v0e$DZ衖 ջ0 r"4FH]I軼M…)л&[)xe+lDpBr&u% 5P֞*"K ns#QC4`<$Zkt[u(V;Hc<dwlZ`^ v\E l[* $AZOO]93pp*G%fWmk;3xG>C} M`"BC7q0D2U+ B )d}R܅ .gAQDRgB'yKBpJyW3}XH4j@E͋a^) yMev /;rkDޒՖ:)\>EWGHPd$$j:ma̢ ME ˷m-XXRo⃈c䊗/W\]wDVHB(qF,iDG j-8#=)4>d=Rw[ִ|әALF8S s5d0ؤ<)К&B'ؾvoEQ) )J#–[%$dwHUI n]ah @Ф~KU[/tN~vf"/svQ5/4"M rɊi S8W6p5\ї۫hi\q!^Η++(mp`5Ec))_V8N?u `0.{ewʲ' dN@+Y~FHmM#瑒ibZGvl^[h:ȗ_ OԷa~:@!lv2R=zۉل]8a1]Ć6*3C7`I xx.l@ 7.6PBY7.%1pІ-:r;9D𽪾G0UQNIQ; LdA0䀅1 $p ^]c`5ho.v{af H!a\`(S8f:g($hWR \a \ ,d7`yen@b{8Yi8 4&>MKyށ4`DKEcfA[6!sbsL$en.}Xkrζ')aGfn[zY5#xR)9!&w Re)-we$yj-m@T6xgG_dc)[E0pČQ1ۂ~ޑ}JS;0{4 zL>sId5mZҡ 1~bw[ɚ "fNgvT$<,O8Dߗ=f"&ZKhkv/OD& f|(;Atw5BO=B彡߲feo4ۛzayP,9t.`%~Z&^p RaQ{RVL{"'Rqc{YxzCf*i`HqTÆzy՚M.^)39ڦyŔ vPnsĕ̃>5f% 5XDDVY]1:[AĔlEÌMt]hD:[2tsY]:8`9AyMEAopĕe@> {|=5"f"2OO"'ƉRˡ B`:X *& D6`,Z˾5fqI} Ql9%{> ioyԬT0L"ݣ=6jf(Dk5Ԁhٳ l4 V)8nF,VJ|<@Ȯ 3 im.y|2M~$8,N!-HkpO"OE]ha׳HֲI Mb jj7to* "\spAm':(I ٺ#xp !5?ELв Vd"q\'QBvzG.W pd'J2Ne=Ee/1&1߈gל (< ;(@r֢Oe&>ȃ p+[L[2 DlR3ʹo",Q R((&ǎ.A L£=R3slrsYLvL[ LC ҃XbYd_78{czl' :1怨b M\ x+XudA@.ɰ cO]H#d A! /]" MQ찃{DC]44niG";噃5L 8.Aɴԓz#*OzgI Ii4XHfgrOo ET&!Os\F[-4?3q9Y2j:9fЪbODULYQb24TO+}*lD)+Մ #଺TdQB AY^8, MKeN/IiE{5IEcJIS(<YYuEW/xhր5 E 䆁mUvNӸ(ؘ}KXk~)5jFR#|\-6C&сrEȶ-;BHBZ \czČt%)#GDB<f>xPPJDCp{4̏hL"6'1M .I9(27TpWדPE•t`ES5)'07HN ; |i)*sNQ9O'Jl/8^R9޴E [/ȹgM2ʤńm!;qZEVY%sA!E;nдaWkшf84S*S$2 R4 E"10VhH܂dxO &O9gCEآ\s ҁ` Chhu>LzF6܍921LB+< -hl|?y*DtC ġNg0M$%0YQ̓b#DSgB-C k$L~S@!L!QV#KToa_E'",eA 7C B g;Fӯ& Ŋ}CipᩌxzP'`Vprd%#-#q)asnµ L[H,xl!Ko'hD DzS2pb`ysE4"KA@$#γ')R^͒,6. @o%7 N;`˪`# `?dP+g.H8&c-oi+K(0trܸ( I@"Q P􅜲gq(N |copf)7]L喈u 02ΘK c=d$p*Z;24 =_*cNXVAQ&)@v0`Dh1nRaܓPRj=HkN4a4ThWvd ]2]dr8oCE,`/ 9= 6Ȫ4XnB9͈pR: ,Q g.vWMҲf(=bƩ.Wd S$͓<#BJJ⳱GeQLgsr!(3 2t *\OAQ.Q@DH^ɘLd>-s[K&f/D^^jr`f3!PQB4c7ue dR/QC`ַ5#陬0A#}`"jy*1&3ɉC] Q-eqHd498Mcva)fq؅emzD\l3le)  <=V0 7Cnt7>EFcPYE$DC7dF0մ^`E, =::V=""GR' E}Ȃ)S :)Fι ZKgVO12_O.d h1W:ct39kIb3%̶#`Ee.x.Msߒ!q hA>Ş2Nk֒RL=2<+RD0҆6J-&w2Ht`!o90e)rsM6V !vMdR)doMZHw@Nd7[Bkx#3lY> %` /Zϐ6 P~`!n9ٯ VV"k콇=P%&f6q{dWֳQ DQJ"zr \~l$xgv @tD1G> F8nGeːCc>Pqic7 Lq3, I@ GT@fY D$idrTAhsRdz3zRǔ)^[  PaI)虏F!9.L"i#"FXIkbFGG"EECŻBh}46iNQ?m+14V̹0%`"k.*" ukհpqD;ULHf AƐs-%>8%U@,plk"DOd)l/ƀSSO6Ҟ H|$b@/Ù\P"QX HvyKn!tHY..Qj6~۲ZQf'W /MKuߣL#ң~#8ϪFB@Cu9Yv0Kq!ۓf9y@0t~cIǷPF*#O(<[ qND|)+Ar̊1v`B0LJ=UQ>>xWr+ $ h2oNe'9i1B4p65O0da*|qACdE OȲP5@V<) |_ 5L>()Dpl3nRv\TQ%| ov 9֋nA%!І*"c14 Èth79Efb}b {ZET@⨅iy`&Qg8"?>FefIn%zY,H\ Eytߴ i\Plv@eaXXAhz.`qI{"v{E+}V) D]-Ϡ# ;0}&A6 <Vq\%B.w@LR4r s~]F]@l_@ \ ;@!񽃆߳9H_rxz5͡]Hyϻ/uΚ '8-h]+C# XrH^.TlGTtۼzq63/D%420Dd/ #l!A|PA*DdxX\+BdaM\YiC3dfjPgl7ld[hR$\ >6SdF 1Q\qzE Wn"_%(ִM0ѴU1f`@&yN0'AX aAbq#=#KH)B# _dq#Ot~@|2M\m(΢dBmf(1@T>pѶ6f'hw >s,̀Ob/6NJ[{+F%>q@hԧɬ/H.M#蠘m!~kh$ФO@Ĉ2mNE0 #jsW%m9Rߌp ʘvSsي*-xڴ#r`B Ct8vM`:Ce#i0XCNR,NVv+ᵠ!=jb1k(Aj5b@Y/%`<)`1ieEpi򔩃u (DQ줊 x]߿6з~ jޓ쀸I(vx#ou$R^c Ňn \{pZ"Y/FY#H 0VL] \ *Ňr/l/,*/h Lﱔôgrf-2 3T'14B$ t[ˬ@2B,*&Y+7CD/%!ނf9漢GeǐŸ8ZNV}HC2Y+7gS<:Vl(..Zp T"E#-~'8$5"Ki2C帿,`3@l2H\p8DnM\X@{'!&M)QTϾb0dlǜev9<anAtmЋ;C7Fkuo-;BF3H.褴B(:mF}¢c EkY>8k@=)a3Mip:0A /i I0Be8:BGH$lB[slEWxep%#`FMhuv#[D@Ra;ED5Rs0CU)Z =kIK`pP:!Bϰ2Pm *b! N?DJ$GO!S*?L+9d.;g@G~5XE!)(3:2lDSs0S !;섉oZA6 r!׆lnd7ϞzB=)~,JݞDd46!oQ$F.QT0``'89~ҷ9p'&%|+l= oΛ++dž\Jee}~Ke&'SI5fN*HȄdPJRB²kQԨx-n2)m2]yJ+fiI ـm բr<α %c)wzZXd i*{**MȪ2|'6_mȕ[ʌWD+(3cVg|5k'bIƍ/+W"XlHq5zevҖrIc.^˴M,w~ e܁Xx'WGD$3;c58!02)PX0?W7'wtX^9먚QVu6A%-ة*u?;O@gs'eC8$ed4%wFhxqH Bd_^9a\i5kcHDF$$jʋɁ58jАJ:XE]}#9Y`CFaSb`<P9Rh ć\T`Ãm:.\Ƨo:sR@h849Q)E9>HZwa8}+AzA& dC)}vVwK2FEʰ(Fv|!1)aNtS 2jmɤՑlYbOL̞<ΉE6$?Nꡛvš)qpB2ѢLJ_ M>F<[`9dFFI!m1 yl #(B !U:9L.^q`p8qh'obt#btqVFa"&XV$ܴxS=(̚L3"WXZR@BO1DH)8.e w5"514#9ᯌsqקCDOO'pRfF*̠Lxѩca2F߳͠) W11cU\a(A G)9[w0L~(ͱ僂,[3 ”BZ%4{}ƵbSHp̀+x,R_Fvv߁1uDF*GQ=0LpRyYpRVdiC"~r#?NJz7ހqEivce͏5O8ezdIӱG e { :p/[IP|GI_@=:I{T$IeDWsE>D:¶#wSϚDZ,=jۛKN.v< Зjl0$C%U h!r;rL9e`"N(:.!$Ӳ9d9VQ.[1HyG2{a>ֈM_6Ю f3-ɖOGiX&$H}r/SYK7 91u[@2 &@PKs Gӓ0 t|TF u%Az6uzͺ b n4N-P.W^sitoyxؤȷ\Mt6'fiLI^%"㣄"LoѮaT $GG&G"t&Urxўظs.ߚ&ED42;xM)@M &E\щbDÈh.|d>PG>-aOܝ C#c,!Ktib7l|]v=*1]PY`ܑ&3 Pk95l ~NQID Aʘs\& D$//c.I+D)(oFMmUw?% 莨 Y*EjbcypjVK/ U)axr &K|$kF.OF$P8-o9 2u[<6(*].y/(wr Fm(Vq9<Ǎs* c6B\ZA !sH/=o\Zc8͖?XGiG996v-Q7)zS }, =d;G )7n2b!"'cq.gAQYYF:gB'dq'#l (jam n0ӿDWt+N!-@/&1gt-+0u ]PD"E:#ۢ*CXƤ^/[7`Ql cѺ>P<7/=6B # qPxb&7q+ 3):F H`?J*N vzbO|YÞ&:Ql9dIʔ2nsjNSPВ5-P-*0q(EiQ``4Ck tT|$Fj[g9x5B"zȲA 8gEy3坿z?6#[e"tʗ(De@w$pP_;6 ,mEa@D3:(E[M3A+812b$`*8p5h΂[s)Rw1 47R뎌p2~{RNE3)}YzVCZK0 )Gd+0D˃ Ubibyr@A-Xíg!֨ep,l؞+`% Iq@=N,P'Į91y"M9{ӥKlo]NFy=,2l[yI Dpd!kSd !+qFl"xylLahё=ܐʎF`j4AF %z}Ur] s}9FD1'")sj}"N8/u(>(>@$̐0.~Ϙi`)aMqTA,¡&Ҹ:Խ) kCpH?ȼ2QcUq8ihfRI|}ǰi)&EEa# (2͡o(΃ &$TNh`n.}#Omrv\rCE`IvGdQ@uFƐJR ٕ:"Z2rّ6_nEf%HXn  Hbv> K45rf:I$.91.5zvO: n\ cjCMPx Bb 8DG3ţTDTR!T6:RRw^I<Tta °f@ v+cQesWQn# s)r,*iM¢a-p#آ(Ra_DO*i 3kc{(6AGEIzV%\8*aCQ<ǎ/KWLCD1I@;05#n%OJ*}e9X DVY];4@R AS=yXIݵvA#C@̂RQ 'hR0D02: o2BL,g$DrC@sDQ̤:\'aI~b"Y[&o%i3).DIb/(\2' t 1xezJf-p8%{ #}U|$rk jf^O\([+ޱIM/R> eS&)yTn/%ځ\f="5f3à;=\,PƐx z鏝;(Z"\ۡIڽ]&M RH3ؠβdϮ9PxuBCَ pt((!E.sXӖְf&bꞑU}G bjrh p=XiQfō{ |0p=*>7PQ3.k2D S&?8g9b,\O]qPY^s*=hd` d+X,WAȂ\5uuc}P'S{3r2-&?(`v=uvpukM4niG";噃J{k@p\h?HR\?IJS$%$10 8{J}B­2HGe> (+iRɚ̔R2`hUT")c^R)PxUO+}*)%v~jb90y=&> =| %zD䗕K:!p "uytW&pan bRdQyz3K퇮\GҊ&T7x0piSw cͯ>p4%p?6ׄ5p>&5qHlS̶- 39:ŁIѧ(#f`X`0isJa8SBT~| (hl 21L׵7`y/rk͹ SM%XJ` T ; \h'H6Ql JR"55nq'B:o9 Ь֒dbo jz0e 90DJL T*0Du".b\L2C B g_yP9BxSkrHOe8 2=1g?CC&JQ$qM%asnµuhθHT^L6ԐHUՎ @Q9 jЛfޮޛ\8z!a 7Yj]B"cG(A) mK[!#2Y{< wyRHv磼X CLF]ؕ3Is$BʁL1б,%b"}S׫-JdC"ФH рwT1}!Yu ?c+Ӓ ~)7]L喈u 02P~d"z@%Er._24 \{U2]@fT Lq_%a!Oz.* 3 *Gslrvmk-IB#9{.k9)$dgiDC p9.P`A6˒(s# lu@$X^ \"g6Cyv3NE@I2.p=C ꌮ8" !CE.GeQ]R>e\L̤e2`{C AkyL t %rؤ4)?d,.PK1<0MJݝn XqY,*(RM]A$$Ƞ8('q %z'TNDa!'=A0`"jy*1&3ɉCE5.? Fq4H34n&|M| a, m6=#û{YGФvľD2(OQY^  = 0i:c3ºbP5BZ쮤,,m! lM\by\]h*2"9$Z2<8D}JZ/0k"(8/9:TCJx]O=bfD)FN̸'| K'@fJmF* 5 T0]%%`DK8_̱٪DEx5jh1Dv^(e,(S>"RdNdE&H@`/b^G2zE*ʼhױ9.dҸDg$; Jvԕdv z@{xLQ$ /6 /.'Ywp\ Ɇ)C Rl➔ 멢ClbDmO CBg@2āeD'E0,c]N %_+ʈʰ}ZŽܤ򄗃2UjR4w@p>G:Q+sֲq9_#F_|9_fUs;J[̤V/J .6FA(8<,Izن K/blSJ'OrߦEUV. .r%XMe3ΦFb9-z!oܱQVK6%4{w ˼%Q@+pl\9m[+rrqMak.ҒZd#t"8)8BPK<EL)34)q(M,^1H+NvU(̓_M@ڥOx4sD&,CN0E&i&@DN FPWC),g^t)V XY,JRi 0Ɍ 0V80YZ1h.OP{3hBB"059;ȊBf#ެwEdKC$+ "ѣf˧ѥ\ED< ^GXP G!YM\5jd (.h](8%):^ek p8 evM+DOd)l/ƀSSO6Ҟ H|$ @/Ù\P"A`!hio'|! J y,.Qj6~۲ZQf'W /MKu%6[գ~#8ϪFB@C!\!-6)hOYN0 *X-  F٨w;V\("sm26ĆP20ԋg4ā!eźޕJ,Ij2<@pSIl|ڀb l `& fcӪ2 "Yؠ e("wА eUMɁGs$Q9 y׳aUH{FU. [ĐvT.vareb(25͡]Hyϻ/uΚ '8-h]+C㤞<,s9$WP*#*Nlf^Jhd`nu<%Ay[M =`s]\P4 5qgaӓef͐ Aqs'nФIk:`3%JMl:gp8{y5覈)[rbM MKQE^pj6 d7d~ }xu)73P"T]ql0E&.D Gg;-#+dP53% =^3l."]|>QЁc' @(B}Lm97m^sN(0L}o),=Yk^b6l ȷ(W%>q@hԧɬ/H.M#蠘m!~kh$ФO@Ĉ2mNE0 #jsW%m9Rߌp ʘvSsي*-xڴ#r`B Ct8vM`:CqX` 9I;c*sZ55S v1 s,ޗ’d}0 Jvs "4yE^wS"p(vCvRE@`i ՁLiF_r[G | Iv@g$x|P};AJDrs7L\[:s)1C7e=8VVQ;NdEښdyW_#)'`f[0)vQ(p1(ʽPl?|riwcyLl:c)i%*Ze.gNbiR5#H鶶Yd0Y>UM8Wn ^JBNsSʎ!3? Eq(Ke\!VnΨ&y8uP\.]#7E΋FZ$N:q*)=(ҳ0IjE*dqXf4)&'G5#0e5h] Wqěʱ4GOdCMRi}'Qg`>S=&$َ9?rx6>ą%El۾wo(Zvf\@Ii#Ptی&zE0|A* |q!z GSbgN\wZudC5a<_ ٓlA`(.pt8QGk"A+*fIdلl<}VJF* 6F9vΉj4qaR;Az֒ؗ$СtC*ae*bA>TBA ~ xWǧhw勋mϖ8ܫ[8}ՃGo?qztg{{;xtooV?zc?49|JxVovsۧ_fB< }?Aǿ\B7|j/m޾x[V>{˧G}ӟ~z2)\^|6?*DD^Qk~ \o'FARUV9P'C][F=Ư?3Ȭ94xU!i=xsxӠwC+Wmh5fzpƻJ0E](rMBOdժI__R*Wy dV.&W3پrXt myϐ?6eTI v-t]7SOٽXRV_}cZξst|UgѪ΢Epd"^ZE^uWo_yyחy? 뫧?ƞ?]x1\=x~^}}/%go^b3ꏐ5bJ/__|:xvwĐ?ʾ`!wP"e]vI_q_e_g)oS kSa6q d \x ~_rgٿ|[\|?.^PqzG_uϿI={ܼR^Kxh7囿U7W{*o.^w?_1%h\qy3wӷo^tNt7U/ד~)2֍7xӧoGw 2"dXe!(/+c?\_\C^ʣ_|BޫW¯_}]NrǗIu0~b#Wr! VF *hcz&Ż Ȁ]<LڄY' '?\>9|WzGǖyFx~~NWn?VLzƟnrs}?~>v_Ļe/F!wt> ڻ|e2>ɳapzo7ptZܞ[܃~>j 3BFOoӣ~zOoJ'~z~OM唹Ooӣ~zFH[Ǔ~Z-7e$STSOm==m[BVR9>i|{rzޟڕ+'eq~M9[ӛL?ENQ?=I?NHO~tF^a?=ߴ: pzo|O;Mv=vjNouBqӴ?'>,M2Q8}Oy?~Ngq8>iqzOO۩{:!>gtfF rOS { i9rZe:nNtwŕ[Ǔ~e?O]~zO =;:}N;wホq;=W,0=WM;Ozӓ'o~nuoӱ^)rWr_yXFWH#:D>O$F҇XKbˇX? G$p#HP_8 G}J_8 Q_8 G}J_8 HUo$"xH$Da!H<$GDxTH<"@#hDH(#hDB@#hDH(#hDBH$"D"HN@U$休LEoNUj$nM"q8"GDHGD⨓8&DHD⸓E$n[DV!qH$N 8!' 8$nD6]H&;/ėDK"e!%C$;DN!qH$"_WWDN.K$]"qh&ZD+5h%ZfY*,2KmUe*+ D~^7V@#qH,$n8"GD⨐8"G18&D⸐8&ǝ-"qH" [DV'qB$N 8)$NI'qJ$N)8-$ND͚rX-+#|^Hs!߷/I#|n9&JB ]Hh"; C$ 0DHN K$,%8888.}qL}q1Eo۱M+G/}{uXma"x@$fՆ68x.$_FB6=!qH#ĽBI'}"qO$jwޥKr>n!nAI߿u[a7D⸐8&ǝ-"qH" [DV'qB$N 8)$NI'qH&B6I|I$$_/ /ė"qH!w ;DN'H|E$*$"_wD;"]!Koq.w-8%DHDⴓG${D^!qH$D!xXH<$;3"qF$ΈY!qF$:o7D"M! 0ԝPwҝ4ԝPwҝ4}"qH/$"H<  DA'AjhP )jhPMTH<"ģBxIм04/ S慡ya(k$Džc"񸓠ehjZL-CSH|K$%o/#1>yh^8 GһzGG]+υD~^|V/x#qH+${}"qH' D>x@$"xH$Da!H<$GDxTH<":3"qF$ΈY!qF$:s"qN$Ήy!qN$;o7D"M! H|K$%o C44;Mf44; NSf㮛qs!߷׃0k@F#qH,$nzFzgEO߿hHBHwDHBH6Hh".$4DG${="qO$D~!qH$DxPH< :D!xH$NxD$G#"8#gDHgD⬑04Р2A54"FЈ2"F1ԝPwҝ4P_P_s"qN$ s"qI<&c"xL$7F҈X[F҈>"efiٲ,-3ۗA4ՖA4efiYZf,3Kefi^X-Ҽ}^XZfef2l_fSwzN_Swޝ񨓈GD<$HE/M &ie ľ [DE$nĭNH"qRHN&x i2#M'x4"F$4"HH"HE <ႅ+ D~^-ч8W>ч!dQ:'9Y΋E~߷ky%ѻtuQ###!G!GCpNƇs2>Eo J [HX"a; G$pDHXsE9XB5XG$ĽN>O$}"qx@$DA!H<$D!xXH<$;GDxD$DGza^I㹐5롑8"G8$18&Dž18$n[DUH":"qB$NI!qB$N:/ėDK"e!%C$;DN!qH$"_WWD{a7$xw~^M9y*8*$Q'qL$18.$q'qJ$N)8-$Ni'qH#ĽB 4 1TcJPӃj L"H<  DA#A~3C~3C~3Sff,X cKh{L$Έ8#g8k$ÚH/$y `$}{= 찦u fOnt'}7$=I*v^O;;)h} ' k&FnYMZ#=P0'CaN9 s2=|M$&_ }ݠzV Z7JA+F'A}a/,-}a/Z^I;\ՔǷaZaU6wL f77L v' v\#6p[&mW-k}6+}=hl"8.}pǭ7q>@ |`FA#(l`JJ%}nh n77]D^#J]o0#pXۥo/v w7} w>aL47'P2zGWzFlcj0#po"p~L fiDcj0%VɦXz ;JV]o0#pXd%78jQ0ybɧ f',%78mt<8-tqU}T >3Ǎ>@ fn558ij0#pX<@ f45Xww|G f7Xi#F`qg3}a5l}|,rjNN\T@DMD؉~#?P4@ f0Mh0a4}y`6SYq#x`FM$i"2Dvo:{Bn4l7qe[]ʶei1.DOs|p%i*2Tmae06v02vqww|wL fy?S'MSu aO ӧ0}0}Z ӧf>d>-EȖ mXJ[o0#pX17,[rZ%PF`?P"C9+٢~*E2@ fErVEqIg"3m"l3e"+-gM=$QlQ=H"S3E!gY6ɉgEN<[q-&i1ٲbmͳ"h- ݴlYLvq16y`Yq7YqJYoNvѦN<*x؉G6}QOh&dl#'/~qMp\>xZ ck9IH'̓M̃ypX&vRX"K;ּ.L15x, %7]J178jU7j) fn5j( fNEI3_6j& f4"`^0rJX%.d%5lN3G<(Ydq#8JYo0#p,2AkJ &NtaN09 g2dLMPg2L̢ɶ@)Ŗ@bMΨ8?c9)L 䄯L`LZ 0sIә,`3=i;"1G7Fd'`n")ae@ 1yL 1KFR\c/#駗紎g٥Y8ƘO/^to~iٍcңo.{μ٥٥#v'Nujgn//ݞ_r~W ];ou:to~7K4G.ݟ_z04 h~i^«~;d<4b&]n~KOfַt:ߚx٥f}]Zrcsf֗l1fh>gk{,\:1cvtvi} E1`~ң٥8/:/O?xvi}ޏ٥Kg{g9x44xk~d~iA\K'8ҝKOfٌlzLxYKkFN/=_:_z<ғ٥o< ['avhvɭ8瘣E~9f7e<^'>qъ;t{&l٥[K'K_/OlU\턳KGKKK \4}|`vio۹hfܜ_zou>5Z]eG{~BgokoOxJ}[m%YԙSYoӲKjHyQj="C 5Ǡ Ԉ_k2-=?"i@(FqXihtp'dZp 5$Fk |ZcHk(h謁q5L2MȴX# k@`([LVJXXAZ6=r@pTR .1B5ԧF?xJ#D%n.`52=&ȄIx{dȥ^=M~n^%X(nڌX]{Y}^gkǓuBgrir '\bo>#6вo^Qotǽuo]Ior{ieou\WWi{}~[|oטo#TaCqo6q6L۟טo#aCܺ}A:l[n_A֕uoWoE:lXW?|?|V z+ ^uph}z+cE:lTW5ާL6ȩ?O+ayo~\پϓ;}=޹zO GN_w~+zarzwP+4QWє_O a~\J(Vk5N Ha5\wwhӿR8-Y܇tz+iɐ>k?'谚no^Ʈ:kWx_djoFGRV5?_}/s3a5,^}:s>~ZҪA{iӟZPϽIo]ϫ^qz{iW^^QarWQW&ӫ?GM+W?7WNnmo58:&ӫκyvs4WcgyvYή#?u:Yx9Nk_^κ|rvV/5ڟW.]G>9u䍳.?]G~8u䁳sXNhr;uѷ_gޟWף|uf3|^G}R;+% z+ ?rؐHnC|ϟu{u:䰡\VoAFg+aCJ}z6|+r? Gvg+ۛjym6wյ}w{+ǫbgVW5ڟWqX]hߞw{u]ⰺJX؁s~{y_Ǟ_)8z+Kś8lWu&q؀%lzkOϯ#WhÆqe{_}:p nOz8]8\?su?Mȯ|x^T|Ws.W7Fy|rݼQ}¯~?6W?3Z֚noش:{oyuO^~ٛՍ|YFPNB912\:`QҾFFWB,r_iw'UFk_[&{>鱸>_[5mحmhoMsjNg]+}˲Q g ./~[­e"{nq60׋yjp^_y_^("6Q .m㉊aI{7朏|FZr/m܋:7M7X?Å~u2ʍ5\CI*7Xo,NRHܹcr?ng1v]{V=7J}S]ʽR4Ig>..c,c[9VSVw^<{ff?OXz߯d_|Ϟxߏ/!7K:{ _Rf\1x?stcWWY]lOSBDz6ŶFnrWg^9 }3'`Iqv{;6msnoXm`mW_kӿ^~=}W|ԕj(^@ShG[l}?٫^zW, -D+?N؉ \W-KILϮb˭fvho>9,s^χxA ^Z n{'|qooWXr60Lt鋿}.V$G 29ʠ(vC>] ;;H+wm JH9fLNt6vrĝ-2RnKїhgJhcR#mKTbj6)owj1i||q!H!9NQ msF>QB'dBJQT+.&\;LxGŜ.c"gע8!db0d)]\Bl s>PZMdkSvzqQ3 m@f%9ЭKtjg/ B~[$g-&Qsb&^61{&ӷE|;>DZo?[8V6i󋧯߬^OeZLVZLH5'$] R3}듎IʼnMtI"]7]{lh3SgT*ڽAj&?w8ڛ ga]( D/7zvv6=ܬKm ܚ7{E7;pNʱ*XSr@['s63jpfU\4NKhhMsV5BC*@GPLNCcSMI6l4bmKrYygKҵSՓ ad$RbI6Z3Z秒m1ZF9ss#vì1#Et\{#+2>?Y%۴j;/J@%2ʘ8Vp>ݧUөhZ Z~ ^K*+sXGߚL'{§e*dڔȴ!́w=>۔: YڌxF.fi=v|9Qx؆B:+j ~P:>{́q"t^gH;;M[Z5L[_L2+ۉΖ^!=䓨Wk|~mʅ5H CsլL*kM^an_g;K8?;^6]+?,t,+";G_&oiïAcm?cwVՆ {oxuի/KdG#/ذQ=4F Q ;c=hDPzQSі/J`t]WI~bp5^! GkRF(ЂI-_;괍Ŭ5=KvNABO:MY$|.^͘8X\ycDD#<'n讲#bebDzww_v1;6ȼJZ&,<˭jE8s<a蒣nYt[T7TϜ:zCi'#k'vo1KacaŸG#F{|=s횵,35HФLTϼin:v,]V8@?Ԑׅ Ft8CR(J n͑%9[Yf+ qEL*IcJP3A?|>A.D0|" {>ٸP{oش?p>{ g?hĺSCF~z󲵗y~c%(K4VbpeI8o/^G. jC]Ƨ^ag"z籼mwt~_U3 ~MM\Ǧp1?z__xſ\VF݅@00rEJ(~  \1劬(ML R\Hr&٬{_]oo_^:,^uo`dGGDn7[UY~xj|՝{=uʹZyӱKW>0]+:W+|%.ymK1P}rZs{^qB=P'*0xjl|-m(l} FQ,8i؃JZuQ:X-2eyr(U}'"~+Hը W/ JeC6Dw*~MڭmTᇋgo.~"gZuM\Yל}skiUϙi1pz"juKb)4R0;pcym7>ױ{߃VݫU^?MPyi]yu v@_݄+fólo-fJs6wvMCi&] c>hbNqGuNQG\X#&=VMj"z{3=j?ې3aA0n48 `ų˟^DJ˳/̟xMX=p-ov:Vp_k߸oVjַ~i[wl\_wVM:?Z__)2kk zW٠Ƈa=6oPc S?)IU.Bzkup /cqۭA9 rq?[>wV $|?U"s}6g[T,'cK jtjkOī@>6-8v[96gLqϿoO)< ʥqVΥY< c^O ISt}Aj`ZJrT:V ?%4LbmC qW 윾]͓S~*ܕ,Q=(r(XF5pt,%_ uؕbA5AQ(%Wdab*WhC^էci\U?q0i*5ugK(J4COE~ʍ|yQ[;S&v8 l ?;ulZh{__-ackv2oظ)fqlX,jvڡDW hÚr)(,{^]uŦV`zBX1TF),Xk OnV7\w?W'B^f0J"S𴒮ǧXJ`I+&ե+Ø xfgTAikWgyKrHv+aᦠRmuG|h,\$ߧTI*N8/nY_o n.[9(A{(1WUta>KW.dNgO8AacA buͰBApS&lR{X##@`axs8>kHKn 'DfE[ 4v1аZGm:!Gczmxe&^g`}Ѐe-0q-r\qz vhY$+)Qx8gyOKϻI[{pymo58EBݪY&YFW!V! .%ҺkawFӕ ݚ׵%{4W ==}@quȚ ZGYs$uSB2C:mVӘk)eHvV pD&c8ݦBp(&/T'EfS YJks202Ɍģ|"OxȀ$nJK6 t{eɄYZoB V NjbG@%lF𙗙ھϷH[йpDQU^&h[4Z=,ac)^vg0I&BN&oVB*W+H5Yq\Qe7Q뱭O: V"^Z3$S>䵴 䆥tlhQXf<<’ qt/¸qrg`4ܷܸmvZWlj7?/"nO ™~2&Oy{-C5M![QhYQ.KG{^:dyp= /t8]D8Ẅ R*,x~?ݭi(#ݷX_cp/8w!c ?߶6HBQǺwCp_ GÄ{O^㒩*8Wti٦3+;\{~y< _?r̸֢Enۚ! |8}=)$ ;*xT.ݟb\C4.翇ABhwGyrL@ jmBd\n@9!_6ޭ9;=WgQ5Ao9M9|C> n<3r B~[߈矣ٙEgYIpO٧.ʊ/ 6|251^l/S3]$xO^TBeH(t5%)QF=JEYL,͋T]W@ ]bs=1+LH3+Nְq,dj3aY R­XY*9N[.c7 Z)Nh?U-@!lqc-qv&|;> RޔxA_nroXy8*2mTZuoeʿ6:7WRʯRph?#GoZ?.a/+geJ2i87EyH4H#P<2,⦅)aMEd3~)%yDlRvg&㩮9e"tgf:Z"'~^5`: dy .E9`g&6` ԘE=ԓҝ胥!Y7yVD;ٕʰ96Jp#C)ŒnL9da[i4}k{N_2 iA}4>'$cs,e;wJTLf\$6q&l{˦ -(oVlQbv9N'c;]JK~"6|Ilaq[RBH&O62]*}$wiJtE }?/H}˟x?xW(2cxsm/Irr5?q2U/֮3m2rWZA1V~2$||WEĮJJB,k9Ρ#J3=+UǙOJi˅wIq*]oir%E1g{cil+eNri>c.\;Տ w4kp>cU^w!:\_VDcj-8)DRѸa%f I1Q1b'kxK75ik P4Ǥ -RRKT !XD蔈S7˩2BI$g1ɢ>c4¢| Rh$Hxr4SKdN<5@Q"n\noJ"⊱f,nw*ĭe#H\C[gO ! l%Wt8Z/ѣ/MmR9 (#O‘Q.0YYhElWK U*2"  ^0H@&L$&N*Mi9KaI,R=Ǩ࣢b%"mT;H硊tZO?Z6&♕`eSkZL;"DT "M] ĮS(݇,=~JJ[C%x>1Btϰd"UDY9aZ}*-N-ߣAvP?^ǻ@n0 $SB%MrJr:Ir"0*ly$~0rR)Qd*2!P aa!YDf94Yl$~QuE`Q*"II X)#M'yEyF*MHMJD`P8Qt06 ^ǎLr&uhbؤE;P8/R(#T6 :Ň2 h{2$OzGtU:ShzKXqI\~0&-VHZf޵C #V,F@E,6I ^apd:-dnva CMQp(FOJ`:@o(c46E}:39&2e3(s-LTD U04Ň :\Pb8] HXiW`\ L49U" ^p 1yQ:2>Zä/&Q2-8s펐eAc o\;<`0˞" Y (ȫ4ڑp^e)P Ԑ*:tho2R[\bK`H K4Ѩo\`UñSaU̠xX0b,g# ,Z !)ʎqI[9lgRb B) z!k̯fgB&(R-L]0`(]עBjP*Zۓ cR}_O[VΙp>j~(jMŒ9g-a{&'4 k>Ƨ o ݓ*#k|=ph+ g6Q=vSTi+8*sƈ8X-6 L[iT]C G߭$Ɂ~ d'Ixy΅(HHמ dZ.FvkO;aT@VA3a4v];vLL"dR_ΠA1 3AGa&VH+%4p%8j9ShN"f=0a'l1|(SQ3my QPkvKp2e1 IPn9Xf"e* #$. FLV/L!E {ر5 I"qQbRÌHD1@\kt3dT\H=+Xg!4e0)kpD ;!?RHB1TS*$F"  e K)l52fAxJ4I#_p?b  a^0`[aOirYb 0t!Ɗa Rv)mCU*)@MrXOE̻IL-!s*.p5 CvԞ$@((e9?`bob:;yj.ĉg!N< qYQ{!Y"#B< 1,I{!pC qYBx⤽P!ͅyij#B q Jc 1,ȳ' P!mT7պ/ GfYm&T!`P`"\.Tdrj[Gr'0@b,UdlpԶ7`kaK 0>ef@ql̜H00!ႁ*q̦1Cb 2̞}+1VFrg5>'f9Le _**Ȥ'E܁%aɃ9d P!kÔ6vؽT @ P `4UDüC\A DkXW#;_PYepxFZ}e@\No]4yzD/u5Γ%8\z։{e8o`$We}{.u} 8 dKC(@4 ;7 c>b1U ݉`B 15M5u%L+c Q(#'띧5=׌vGJ^_Zǹsx;2L9uS꼜3e8F2Ur,\݌e2em21sD@nx kYYq#MKGK&N@ 2H:M0*k@4gyg^dIe6=& M[G37vqNh|q͌,&pR nzdi"3zp %4J-dNe9㳷TV_*`E+Jǖ^??q[/*{3IWٱqJ$ePR9q9ZMJh1(]lyQr>aQڭ2]t$nl|L:8^$љ(fH1- K$;(6fStXbR<%)= +IA[ą;X1F-7;[qe7X;!Ԣh|1a +Y(gk7cfnu&h:)'; `iپIL Zp z}(Hh;d(?u\eVuuC9F7'8їG'i'DzTß6=|ڵ(j+8QhjQ<}foDy\$sI57Tk?91`L _G;h)c?^ǖB%`u +ZH屐`yfBzu -$Xn!a%: 'M VثYHX˺YHH/IBU-$ʮWHԴ`!xB"!GM<[>da5ˇĪV-BU-Xt_|ȖQ4-YުCҶ|0V+!X4$Pj m_W-lQբu k"Ӱh`EϮEVm!Ii%Y4\ŢAVjjj 9T-V-o͢U VnjuE,Di`RVY4X" aͨ) sMa85w^UVy[aع/i(҂j(ʼv)CV*fܷ.jlUUYhkwmԪg-,*|u%X}4xuUk3PSPM\TT5PMAU5>Bk{MU*Pմic8/6nMd#ldw-6U-hq襡JSKT53k~Yհf5 kfV}̻u]Y0qQ~V$)~džuuأTZzU/M۪x) U -m@sCն%,*s!φҮxmJd7Ze?=m[֥q ˬ9)<*GCkUR梑sΜI1ZcR] 7H8_ww=x5$}+Ԅcpk7bRM(.,bcq&vU7S A>1>-3gHZ|''B|Ԅԯ['t(9  |5󮔲V;>F*|e0(©"@{^G4[sGAB2tSAQ0!w<Q$g £W黼qbe]qfFN~32IDgr#gΥ4qt evS$d8|2ՉZEz۹ҊU ;_dg,n٫c4Y_AQR;3m#-C)XpkfgFKe]( ѶJxmfd:ORe)hR+)h9RZs?`g2)-\GܮbJ)ֱk#g) j_l3Rv2splvT d\r1!m7"ݪmd;?Kb 9 m;qfѬb*KI]ںT?gdMf-q5M7ĭ{e踙")YjRq u=؇>!?hG֒$#3HrBQXQR 'Ա҉59._<9 ɄLT@!-b9Hda.0sgodw dd0A剖ґօ;u29fdߌ,P\Ndtzf_6oD#f !pX0{;9B~ 6AkɩЉ]'Ywh-ˣɵxF1WJvT̵t3ʄ Ok 2X_!{&</i& b mSX.YV~j16ݒ$eO iTz4(ALb u!ǖJFij3K+@0,aMЪTv|!l Q,K*=5!?$<u;ljew,<X,PAgE je>nGh,;ثL,[/eV!p埴/6EUZmes"Xje]3A#mߢt0 //4F@diI|5Uj=ra)B!,LftL]@u%Ҋ$S\PLS ͸UxL!HI-&zaܚ<#rX9z |ȫ YݗvD Q{tӖ*3¢UhITvl=(b/)'s$HÖ,@Y4VHŭXwL° 1mwTm>,9b{ YCH[89 ئ I,Җ2vڝ=&vcP;ىswb, @IyD,H);[EfQN  [*Nmš vvf+$8XmP&.Pqp\ىɏ=-E2o?q8TPq2'aRgvb'Omc̞hmQWma8ESD"zzwčcnT[D♅aH /*;)!;}8%ȸ >r۱q`jL2A3#Y6vnDs^4¶jZY3r]=A? Fo=n*ޒ)qliљuiAd-JbI4~.cvV3j-~xl]<upf`wpjbXʻܪtc̾זo W8HIZ]̓{'ܝWHҲwvj^ٔUnlljOxK aqRMxUH(k@?_1x?m?7k8d05TȢVKk+sk a *vr 2bEZ rhsSKZÿ?!ԘW#?H@A1qyr| DO_Wg㳂 x&xK15<,2vjLlj1ML3QQBZN,Ǥ;r4ڕ%<93u$k[ WIxA"yn4-dQ" ld~!F.8.֋:ַc!?ЍysC?p@< -1gI诙.O/̿ޯQ+jϋjz_z}^a/qB.|:G 4)ia#9V5`HVRz僞nyrۃ>BtưȘ>LD,DEKq"P1>,]r㑦&q-lpłBpxkqB[SlUHUye S>&U2g0JdQ!К7ۛJO0ZWJpݐu hĕ7 k0Bs 8~'f!FBho_8(7h$S ]|_irÝbT#qSVY{Qa^#4Xa݉ pߡܹ-^6Jk ;20F0F0N*a0.?UH5p*1*qøTi0{R KWVhj]{=Z^+GUtUnMA"s4NZ CPf:=*v2}ΩT VG瞽g|,YtRNS1$ۧ `6l7(~PBe!8_&^*-C\h=HҊZSxjL}]Eqiݐ a!5Z(WQftб+DB*|wMݶO<Ņ SI15%6Nso.$qhƨƈq.D;z$0Nx*>=m&x_< ?|?k#J9!4.^ޛ{G[ /cg+S8~?ABb#T>´׿ _ZDFP6tUq~=]<~u!b ,r9o$A`/XWoJo`fE/TBF(D Rs6OrHALX+AϜetLʑYY89%bj,֕,Ʀr~|0یr/!C %߅-d0iD$D0]p}.@v K ˯'8.`sz~2:2\n)uP(6x@B{>1=z;݈,6:Ol,_V(+Ϫ۵⹘xT!$O!* 74u,Jm'FrNF ;iכZ4I2~4}_>~}t}_+]otca_ GnBycҒ?a LT$ws!oh1HM3_VwD#I%wy~(~WS{~'ҨT>Ƹ(Z7E LΠv~?D <>6%T|cq?z gy?x㑍'p`G )9)*0aC.h{l988MTֱGʾgw7w !^_Yޅh'k+ {cZ^8!ǪSBqBq鷫y6g;/n>LP)t /a@uB78[L LVɥ+ hT",ߊN(=mvf6Q (s*e:##d%(Js6='/SĶ8"qPˎ}vz5z:Go_~tliXܒA)fy3>(0CQ) ;Ne*?~ ?.eaAXH&iJʶg2 "?X%DkF&KtjI؟#~H+QM5r"梖M%5GCpHF?GABh/M!^rSiJsIadN[W)r|%R&Άc ޖi(ńARqD(Ğ-bKB&CC2cuRs]1Pc+@xBu|)_%췋ҤT(k;Xf>rM&vP^E6ZżD&[i"r,-&KBr.9,vʓɲD; հ߶ " G)/Q%:Xp7n3_&n@!?LVq$zD a0jn4j%1nyzK&$: 2fdh;?9|8Bߘ#ŗkdN"j8r}'dFşP!,Naƒq"&a_b- ] ?BZ' ¹`ygz~9$m[7Q eJ&Qy"iFhD(4sQ(Qt+(*=пGwp/K 17ģ !h8g~Edi5S{_+o_3!B˷BT+-{'Nz@Aᤜ,>o#FOoj3&pO[f@ ſ/>WY} ;P]ag1XTFfC ΤheVY1qM:Ԣe4g}tC$D<ܒ;ޅ"gMmZ{!:߃WIدBWjڗ*/LKF-ߨ7PxqK؏^2_m &StTp׭3 "|z\-?#?Hq~^2$#lUR<֗I0,<;x=C a&]"E $[ڶq &Fb!ObxB;"ίU:Q.r'>ܮٗ'{aGiLB w]jXh7w"yɺ0P`][!r.҆uGLQP-LWL'%uWFT49NDD4}DMpxbBhu8?z` pxwg/xGb#W nQL%]*2ĭæ5TZVllږKU{űa^\ZT,ic [FfkH Te2J ^/1gp/+5Z6!P)vw;E d5EogUstk^e4nj6S]+X?Iq:B뿁YwGZ!# ~o¨kTƸ7bw{?@D̟bU N_Ӟr5BA){GI8V %LX,&"K󢛶|Q=xXm|$D<O0GYi+-F/}5Dž<\Cʶtfx';ipOdQׯAU\UN3'eo z˶7?Dx#AHT {PmQ{Z%a swUKD"&2#}pc/fǟT_?4/GÄ7/_^ [|ݿ#7%&=Z&ի9SX.Nf9~|~[ ܸ.@1jċsfZؖ?C" ~?9;J\?~'V(2:4{om[e Un` n¦v(zEFtv~x"*sePYlv7xa΢w:@ߝ -J[VvhjvB߾Ja~ZӵC%hDWHa.O z0"XoNբ+;Dkr]A (vD(l303_}KnA!_y_Q1Vܰu]D>eB?:eĵ^=? lt#:9- jo?i1OpV V,Msapwɔ,?v'x$U2N"\ $Z>?Dt;%cB4-QGl_bM)EW%ԵWw=ܭ\??B F(ogpΐ?]gty*1?݌y;&\AdStfDFgOTP[N~!TfyFMFJԙNeB*qirz~Օֳk:髫<QF=4^vI::M6yh}~`S&6;?bſw-omFp/<2bv j1fhwGT/'6 co5bQS˻_Qm=?ADpAx#?H~'kr©HUeiXhh$gfbMD.pI(wIa?Uk S =0Cpm=4Pm|ai7=Pq2wi&nwaaip/M͓BԱfX~i|3Bpz$ym:@]x^jg_Ν,i-ٟ{Xrpg!^pUv*tG ?ǥW>W^a!9GABh7ЁP,408hWÞio8LxW8ت}WxN${$!7HN< ?8>MEU_)^F$yV*^yHvH4^0-)IP߽$q"NCp? B%Vo 岚]o "<S>GABh| x! ?o",D/mˣ?ĒUžijfp*ew=\C B뿧_b=@p zA8}F "Ux5{3drטz0N4A%Se3$0)2BL#9Ǹbqf6 S]bE2ӊ9j Hl5l+9t0t\ÝB },Ԩn"=Efao_dbӷ4OB{*NVAL/3U*M,MRZ)Og\ŗjeU+b;LqAJFTVD.Ϥ+b_e'qPH˘\v02qDɌӜ d ,:adP= y_hsIb:|Bü [N?Om !E-U_P1qڦF !{ъ|RIaN-ri \ZqNn-l] 9e)4ER CZ!ȍ悌sŎ-u* 5/ a??&D< V=lʓ<-d>.K=d J]RDR[ʢ8 >s+Y9'Й%&Lb,tϤ.'QcZ,{'k_) X nҭ%XFGORm,cIL\X܈ȼUN,E&,T5` cGH}&J5 h'k\#mzCpiEk B~uv|}>z|#2JW2ɦA&7G6W* & kҤ#FO&MXe7x=(~Z($D?};v]}y5^PD!NDm,UĔ䳞ӚZ&vSzҖ_^7nCKk\8@ʹnoL/K=ҕHi=NFiY g/wwv I݃? _zQ/pLjYg$cۗ1@w]Aɥ7+ "i$}`Ä%acd!i'B[51e1Y7;ֹUN-TKNX; AFu#Cƞ[3v ZlFbd [H2e&"}F:t gKGa**یZ=?Gr;[H ԎR7n̵EeBFJ%>fv i&R68c&\8Ͽ]A]}_cgV\̃j%dCV(m\feZ( [2X4BڑIqFLӶ=&NCdUp L;f=_9^kgz2MJ0l$dnj+KBZ93xs&fgp=lIca]Hx}+d߹{o "#7H+%]6Imi₢7h;HYk[,8f$ڳֳXY*[g֏*-|ĖvG$GVZ~ wT*"Uڗs) "nLolQ.?bc7~Щر(N>$NCv86eY_"]#>ElOg%E74]ɤ\Cf714KtVg䗉+=*7vipYn 'I`ve2X9fYg)#&Q=j7G7GV[[M78uY;GPh;,ZopM  l/ \F2q -ݯEn)q2>j'? LZ&|r;0˽(HM0Zptub9tSHOJX(Ǹ.#߀[ZGcÖ5g./BDAmɑ'[$z{={o ":#=^7 B0?v@ޥ*I#OON&'fE3[DClX֨,QȚM } Bvi!*oENHҔͮެ/:B3c_ be*Fg-__e򿞣6ڙڥirmG'Ox"EEu5!}X\'0!'ϟ'et9w_O4Z|_"ƹNN<)2$8@#f$}ѕ4RT$/EaZ_~\]@ݕaY Q Br0URK[N݉0ⴽ$D<_?yxx?\C`Z_ ZK>D!*T!Q)juq멆^|X_I? "o+3|L"$*.P\W]_O.݊Be,] $sp_g'pf6.f埳zG.SDž@c..1VO#K۝ķE<Ֆd< wgxz V%+ @ IR'Ҡn}=RjEVt߉TdL\ur+;j֢H ׬c.KUϋ )Z~Y j16WU֥h6!*j]˿̤D䯵o*n$?9$i(Y`Uv!BLfvC_2O? ur~vuq~z:s:!NgP!x(:[W3e.d m0rfLtHK{nMF|s(ե4t'n J؁F]It#*A$ǻYH%xI=Tx5e̠""g]BÚC8&3BKVefÖ$EBNjDגMu&% U`ҳ0ynRD)dlwcyFH&:ȥL1]uBmBzERbscR"v6^02ѥJ M,pLN69r-{4 8,ꃧ)kBIVB9R߃2W:95W J .CZ&?&p ]^꿚}>骓o_~]\"lȓxV3G.HT΄1%!*OD$~HPtJ_>@!Hi$g fԉGkj[#jm3}Xks쭁bm7VyLRgL r;~tIbam2ΤDYBR$w.tIvp2vC$e~:0Yr߈ڛ'y%($bwIq,ޱgʥVnt'qh?-42EڢmJۺC܍2v.[);ҮEb썬h "EB{Cޑq4>1O=cnO,?-N jIaiEgÉt&e[oob䴥"E1cNbW"묞ҠYWQdb[e\kZdۚyU(y7ir ʥ%ޢM==EWҒQU]?b"e-'J{W^?-S ‘ X6h<Ä,/@+£Seu% ۈۚ:74] hjS֞Yn}*I(G_ <؆ S%3!bftlO@#/NAطNn/ņzV"AjXflQ0*CaLO$6[g sv2))4&qTjQm'OcR ,3)h8\peuQsb&ro@ofk0/RwGN1$rVөm -AEҖġI=O<%.pRf!` s$?,a}4z|Q*'_>MNϿZ:K=sEr䮘5-̲~P4&5(cHC1 4&ZQQ[ώ/^evRP01]ch< 2ODSU?U[&!#rRՖ B차&߂f†X(~k#pP^C*ݑZ'Ei B|Y|oFbHs艆r*:2@kAKFj|\jo8CꞸڔL/$Sf9JOb R{f,1@&< o jU6B`F2}F^ecs0d 3Yv^푘Ԥy3Tx%fe f[JSc,-#age*9E 9T/gdP$@f@8LǍ&})XQǚJt %A'S0j FZ~b56 P(@L'G !t/9=)=j┹qNw4srfv1wkH127v32yZ#ÌaӺ",U~]ʳ_rX?"?*M*ߏmEc?/U}HxםBpx;wG!?~#eF{@R^ע Exwa`h=HxC翲(˖w{ݚ5rguqt_k\{ Wq<ƕ~Ii&eb+Mm/%*a_\Mvi_Ĺ?YϢ8 `lpYM_=}u4o<?Y&)u7e -{Ox'6"xso=ٙUizi|:Vm g.#~ܣM`îr^X۲@}|==hxGg]ߑ4po>|OӘ4F3ࡔNW_Wɤ=esX.V9 4i7?X=JeSGuhfG{M,]H\bD=؁v~y2oj_o֟H O3LD sU= JRUš -yҩ\~=>XY؞axXOH.a9ӀSWZ57ek%TȾ[0~ulrIYPsWGWg}9f+Ej72VՌ0  v|l 5ԑi9UFw0 4n#;H(mD@؏!Z+ZC[!YqfMeVO=VnWp2h5 rr%WxgG~VbU*_ciӵܶGBk8ay6p6m<áwL6 zGF.`;3=y(Nvd\*m%cnD6ޭZ{{JشfF6R0GG_vZ vthxGr[Z ԫ!!ТЅ"i  Z $ *qI 9s~==?ˢf?r@lϴѴZjlUf2?EpNٿz\*1rZ PÔF%ž? ^ )7:m?0^O_z)a(Ba`@m}38|nM~={GA?jgDxب̋{5rxT{ V׫WY5"O`VnhnEWѷ_?0__Bϫup`w'$~O[s/˫3Z,ڹ.s}HǏ>pKH"1]Mn^Th!V ^umA-NӗitFv R?6yxΤ  #R_>p}:{]?N$h 7u\ Y!?;0|!ܱPj:lM}ukl!~woC^!V-߁8;^C6GU4hpjCTvd,bE+>"\Z(P.MoHkyZonlmlo<6 vF|<)ݶ[?;;F#k;rL1QܣVw!Zub*ݾ#8TznvuͺY{-+L~]ͶCZxנb_Q?oHjAB $h;nX@`>هiJ&g^WPؒ-5Ҳȍ`A\+\M/="a$áa[b&.Z;r %{a1p҂:^=ڈ|n"X؍H48YluF-iB  D[ L7fPtfRfmc6汽"v0";Šk9f)4).3_<<5GTAhXZ.{DGhC>:Su&IEuGqQ@JόT{H= շʈ;Z%џp/z;zF 2%KĒNfmDh'($+SQzYؒ $ >׃<|/ ;~䍮n[n嵘O{1|X˭g!N*|DQGfЈcuĞǞ[039)}GyG9ǠEt9b0/цyWx W]j)l'[ -va>-Pף( n]^_6Zs-gҫ =Vb{b=!U2 ]-?f'WUPfv+lB@<&>;'!RGAB>|Oaw_Vm+XscLF9"(}ܗ7 &ۍwqn7d;lq(ll+l+Fضt`[SWV+n_>޿QE.a?bA (yYPJpJï~ W^FRkb=r)PQSx^NSnzo}Oi=f'qE!ƩmJQ=A[QQ.Զҏ [~ǥeĵ>@Y ^ d*2,TnSB1Sof|]PulFz]kzge/^ym:RY߸*@.b{"#wGuTc]<\%ׅ (ު4>Jz"Fu~ xӭ=<^Ic_5C{(g C oVGb!܈F+B#WQ!}|w+1˜ ѓlGVnT;4ڡ;hpk]u)rjT_wvݔjt3ګQ]Ч7~24YUYӿ#.h֎2zFF=!;ԥ-QFfWu.ר7T]FfW|.ר7]FfWz4; mXTJQEټSw?f&UGJJňJ}ߏ`~ zs^?VeaշKXOr}˽enw!Go~|\ /`P(  [U'u +:xZt3"O]>ky {*<6{/_ۮڂT--/ '#v K뇥DW"@~LS:CNb״u\ŇU~jzd 97l uG;"yb0G{o]jܐ=ÁAL?6.,7Z:}UY-2 /';eF 7aKN4yνWuy7kp)?jjRiC$:5jrnLiᄇupN4C߯,"["|2׸ÏGmmOC+<^00 o9P*?sG]rE:VKQ?oh)x||W|ƾ?YU@^UGZ2Fno3+M՝\p?a` /4U]vR[[?3ㄗ`dC<BwۻLU yk2Vî.dT͢zx#\Thm/-h_F IA<}~msŌـFxf>w=(~}dȢ$E)C]2|mג!AG[5.y]^6 mq]|>CeaFe ƧRJٺFyQmفg -bCd;,}k}2ԇ;@'|(-'W/`KޑhHK{`t(t0^>[ Ѻtp悴[X$ LV &Q3^rY>S/p5g줜0/# X2!pR@_xnV-.۶W{4NCtAşǿOW>9lό^|]2\g'a=vGͯ~'N$Kd_E?_o=(`77F3H#; ӧ%Bďήf̫^@:/3RX%_Cy 0#ivr)La0{fk?)46O]Ef1ERY⛠RuA`3`rǷ<=^S[zo5;Ȓ#PK̯ZcLy~6jSJai9Imvw茋sT?_Mi]3 Qz^7)[_Ҍ P?ϷvSM*bu"($YͦzM}0gWYSc~Onũ]DQްVPa蠪tQH[=;07W0Яv^u~>~z*v^'dY`g H;ߚ0|}MTa:zqs0 $o͗ss;ek=86jSs I`sMu'܇򷜔6叺g7v]-Wjl/CWB/߾Ju[iGb6] g_?NkIZpFyo^Tg&FX: o.[𭋐CV}·)e]=M}nN?cp 7#քʓ#րJkM r " W_ ld~Ww.KߑPu@Z;^H#n nR/Ҏ(FWL_%ё_^;һd<\*)[l")ws0!lX$mG"\c3W"ŨuGvF7]FKMG0KvBHS`J$< vЈhϝ=;SqmoM 5m^<F4jq.7FmtQ}TދpEELz^EԣR@I :TSjUDF/aZWAvG5G -y;d?zݥ|HO"#wG߃gB<_|=.uvzWߏ\cFEL0`je]^/c>wie8NbStBoFW*oՕW=1uϴ(=ZڳPCE?T=p(z`QtOS{xU#x@/{%ÏBy!IӶWFgP?/F1֣NJnbMDAAەNm *|20S>ʔݤ*n4 bF]0\iH?NGgP??}z?[b]mռm,h3~׺ 5ryF"뵊W ls9 .?ԞP-nxzMkݷC=^z]-57F¯7hOc[ wi ]wW] 77c5YݮGvG(/$W~Ⱥ:? ~yOƓbfCRźm'GoP{cgx{C pVP< H>iEڅ{@"և؉jһe+_!Yͅn4{Pu*Tv%LzԷ1*'C-C/whOo?W?oD8԰%tuI_]lv׉ X'"Gx5ք}[P3<.Σ*#1ۘzeNYcga=nZ#l77:ʽQ\.AZd8͠>[lyv' EiM4]>ѓ,k~٪t m{G}R?}{?$}X~F.rA"ͰU{cK N4YdY+o ꗎ%M}W&{PhebQ}ʢ9:I?` 7{ !Yl'l;<Ұ^߮y\g2kvԣja˫ZaՖZan.U' VCX[{djӵtV 56 i-Q̉UbPt=T̥{ɧDӝ`SΣ`Uī`sh:tcҢYzD=Ul6MԩQ_&`}tlV_&^4l<(Fr[XQQ_{S,Z1HFAOp;hW#o'n^tY(۾q tϱ\ns+s˺kW~}/?TanINFНCغMw)~l֣?~Υ1*y%d.ϣOI 4?pw]~>5=q!,]$W,+ף߰,k=.h_9Ϳ͗#;$܌C/H:tq_3Z/QH׆7,(WzmNX^{Ul'hNMmaڼdLeŴgveJczq#,d wSip+!m I[oFoP[#w_=5rίa>gCeYW+^l^x-Bq`w|n({GA \/et~I  Zz$pPe}׵4*PL/y{8|q 9*.փj= >B aoYR Cro-`eݾ641X= X?eFoP'JOx0 y ^Ͷͦѫ@ gLPq{bNӹFԄ(F7&6lqfC#K󐓼ou)}o=<9T4y{]F媹0,lбѳSDcU=@0z.TcM}ŕwmX?]:LR4b-zp!@=hyWߝSzWWS"MW/6o!zFҳEz.9i  >2ۣ2OWvQ O?9Qr#R=MXfOW i2*5,D Op]v\ޗ(}>ECMu %]H4蹏]Ǜ"e&M >?nД>kMStjJUB.J҅hh[4[ϖkXRZE #(WaUOzukT^?JY u }tGnٛ#‡0*Sw;J}Wx~/jdMA,(_PxrH5LmK%/nqu ⽧:ÍCIx5X,O iŷo@Yp76EGiҶ3$Xyҥm^5oxY!)uUyTpswq yApe=dfC9љ1eы 93lPG= rٚ/ĸ+z0؁(*gр_`>?G|$mmo|^>w;l|~7l n"mu96QPdk(^^+u">JW~Agbzà\/2JQuu/}<^s} {QE:6HQ#s( J-Su]鴐<8BtQ0*N??4?Y@-I]z37K{A%L Ky](-tU'\7R~]o[]$grW$g2əə$#9$gI΅i-Y"WOϮ.OOW'X9, YOSbFI^G$+yy_":ztm5pKIV4ɚUHV͊7ӬB*H?5D'3F5\ۤZE[}gT"wG]v*rwbX^U?>B1Y]ά%@LV ) .Zc˱rgg^jvTgO.3ܛŇ?.3:=Ò#k8A7AxAhy%(¶o$a@0G<]Hk:A[ -t2mA="PO"zO ׇzRBTWmASlCK"ˎz\ToJ{HqW?!S-6Mv:&kߝ9-ӂLa=N9|[V_{gC}ʍNg/f'. ˯Wt|1ƴFu ӧ7oKwe~ON(8]N*$v+ pOo_Ox[nv#/>7v??F!޶6+W1waz6\Է=*,=^ܹ[-G]|IXIӺ,)4E֦QEno_OCއҎlM^zz*Z%vˈ`T,y '%/OHj /DD#g֠ퟕ^MzMR6& NR꟤IkrHZ݈?$ߪAGOqF8e!cG5xvLcpL{q>~Gq;3{wNGwT*.YkWJ7=Curu;u⣗Z3C֫!Z>ZU6#VٯX/Vz 1Kd*p~ykÖYrUW^ ט9}JΩӤ+|׫tY._L5g; 8*t+1CmP Bl 2:ECpe''4(!>FGk选bmɸdܑybbG&KDyG'6oͿO/=aф㪑 +X7\衈ɰ"26Hz55lMz / U8#?$67_#XOeIA=Al}boI%p?T&D}y} _}?oQ_Əjr{?$n:?Dx| : ;4 3S>o%9=k6 QCIJ 4lyPJ b)WQjAELmN#)M(' D?W -A.'ʲ92㫜l%PI՝`»B{?$]&ͼJ0Sh8M62x!h"DT3,jro"jBzj2%iy X/JpҔLa`vmbKLMM%!ZLyUg6T[%㠝Y͠F;'@ -b$=њ0'P,NEOx})] ljY&rbB2nXVKWcT$52z#A?mDBýI Ss"c:(bƒFLeLFit)JKIRl^+q5˲+ELds^_1v[!bX/Ÿ*O$*: "Ě/Yҩ"H2ChIRS-$};Hi^I"0;1)NZ)^e:ڌ597 -m&RGhnKPXYO d5 0D׾* & D3Cu~$%RRfق]˿=Gp>Y" &(>(1kOa*v?qZ$Ox}Bpyf\Cz!2?GX+H|؃SrH-&2y' &D/AZMDH d&5'ͮ~ˢ;vߨ}/95q)m F[^Z\Mke S<=J` X!(y|wƴ6@|AY{4{+lAZ.`ù/׊j{o:O!^W:p AwqR !тw-xG h}dVĭ&D<ܽ* :#!=1HNha腨%-T>'E$~ 5 ^ ZfvpȒڦgIapFu7ݔ*xyk3"]~u>\[ w@%E"M-"oOd54)[W !{;Znb|Cc$m/i1@bjrgE5׵Lq&QYjIUז?zebjKF !눿*2@:=`װ؅y ւI~ZZ_.pTg5ĖY~dtYPJJc5 ^"y_+zg&4D)dT/K/N2E\=YoDßf]feN(2*5y~2JR g'o-9:_*DjvA6F-KɄkH z*KUbnce uo67{uotTx !r#%I;5:"yifɷd+P`~_9Q{L5Jk%:|E,hg7>_4FnR]&3l3Rūi"2oŷlW?PK(ջ+0w7eF_{ u<_/MkV=^o1ߵioZhNFnUaYWk$7Ng0bfg'ÙzڿXoVom{7H/)?]\Ξ:kw"F$ZmP,zn'V,`|cetc/!`'11?HxF7ykx۵gkg~i$lH`6ݷl~ZDN/_/ }{``#:xp -c} GsCcB^0 9{>,å܀?[g?OG 2A68lyqqwWhn{um`ݟnD[8Hc{?:+Blub;u_Ʈ+|p.]^mo,ca'z4?aף'ξw_.v$&7:+Ǘ# x^+3-"o]sn57|up͍΍( Ȭ4^{'JVhʢsHSL:r\uInp$ך:zMN}:DڿiQNyౕ^k OVj/ކfjhx!0N<u6ZBHfΏ◧k8;?q~}8DdOqH3t"j 'N*|+'>9?ԧҕݵƛjma#ݤo^U;^/OOSIT"mWǵYu^>8Dz]IWC%$vQ%$v/q?qZv/ϳ~Z,k E?7 !OQ b]!`UwTy~㞻ߴU"m`MJ|NffH S+-ą'.e~ד (P7O޲ϡVG@yc+cQw AD𗎂?nG9Ng!st_QWy-yt5cҢoCyG%ㆾ6~eCEܻiliRK:-MHO ^E)G #p"Np272Κ4H/ Ԁ?ӣo5[K`H1zIm䛓A~UA_)n8a߿ a6 qE@W!/w"jRnGV,N>cQ7!#!#{,ߚ>t(j,bOmX1X]>uTA,6w4P~H/88.DPeV3-WU^MX)Os-8wU4YS4X$IC͓'O=RffMe)jl=.hU₼rXǧX &źWUdV,[^PY&n ygU32b ;-jl:v-U;NR[aq'PILne@ZJ (I*A"Ѫ⬎&4nOל .8H+,1mꧮb.k]t4_&E]Yn_&:t\&f.eoV61}O參iC| =x[Wt0 IYܗoǧߗW/,LfCDHKH`fT?ԣJf"W[,Yhٷ/yޤZ3jR_T+]ε^]͕'4x4_'?Hx{/+/F"qqҢZucHvzK/M.ۯHc!km:@-JcsdѧώO. i\g=TʛI<2KNm#jNٌV$xH3V|ek=?GC\3BKJ&{e] +(!vH(('Z涤OUtuq|ve~yCg ܱN*=ޗ: L&7{lOGjфj{Z%WpQ /fmvv7҂_. /2鰎ـJ= dg?5l!YLuA$ ~* c;; C 3!T#3HxWϠNQt? 78)pfxT* xg0,I|HIH}M etRuuSȔ(6qi|f)T=$q+G~JӠMNtgI)D$. 9dYRktq'6twKWJ*T^n0?!Z"Imw/SZE'%gk\-. GI` YC1zyf#ߜ(ԑ 8˧e5s^q}ƺʀnx̷ ;)2i29QMp.`mۯ`&jx??;1.WGSx~vJ]!DXqޣA.݁uvKtr~7b[2rCN"?.t=xZk*F+qy-5Ruj˜ؚ<نQP=Emӑ6i;.IU:26 4cM^7W0MhӡCɦ?'XL\ws)h{ΚJUuC7}vE-~M!|M6F#xw!@Jd JpKmD^T dsGAڱk·(<,BlZ40R:lëP#u8G=It !>迼"vކJ]L.Z&doq B9 ܁01-0B149!Qj20??C$եm쌔 o0-"kڽYpCkih]בW|ԝIy7 ~=z6h_aF=DOIS&DTs\kYAv>H~x$WK('m{GЪF2U_ͨ1Hߋ%o`goi*=Grzb/!Fh;Z4 _ ƞϸϿ]g!*jMLas KT%LT3Ƶ4Yb =-zNH<@ /Ru284-g< q1. vȗ{)H ЄQU@7'j |mB\o#̈?gWeoo">c. .X&S*b ZT/eq30G?DISƺ&YoU%Y`BR_&DFk?oO=|]#m__7zYPPcGؠ~$6|!8G&DnB_}Pҋjj8=@w<'Qmg=LߋpP`œ v]0~ӿc8|k~kYMsgc܊/Zy '.gV?M't2;T [bn^ E{Mы+s jM'M#۾0|Oq@CY' ʅmm(7{nMa ݻwL堔lP2+̵~kH^/D1|7o|XQ8Pau4}!*q+$j\i5~\I k D 8q>;j`?7fq UBRc2bqPXL?D3ܐk?M?}ЕȪh4VI ChAM7|d|P jPxT%CUZJՆ\\Rj!R2JΊ4uN>?u ؤ5IKD:GǵJ:fT7.8}^~%4u ~=^-2ܩ(le._/\iq??Dl׏8oԤ C*p\%2N?W>ԫ z!s#14rHt;1fH|5|| :̛U|86k|UU?YmУ\#x\ßkurz͊~+ \A|k>{bD/x molѶɴ=n|d6\hhz}Jǯ?p/+dZnzFgtG0-3 ..忹" \ m<q\zŜL|63]1>K7~O"+|3V9q$JG…vWd\9w/$|՟Qi^s#}^%~7wp+l",[HKCw&ljFޫLJKuA0u8jZU8yWq:/F p)TZgkҪO\IH&/-X bT˯֋'9]+WJ =Cրr {Sh B=h^nAm=Ӿ@kw;J#SaaK2_--G~:T?̰XbFaLW>Ʈf?lhl~Pe9RMX5~[m,Wš&{aK"nd?g xx~#KvfD&~׎P]-z}XI]έ>p}^oqB?^9@+}Oa4vX8>{\)pt'6.(֡ ݄-O.Ow T<xPH  ѻ@K5 hMlԜp-6O5YɯIpΆ9K2sd&1ivXQ2(h:k;s8 @ްل$GߠiF 5R 0+ᰌx~նwf^!ͥ7V&6,~. :4Ns)[tCT6 %cj:q?qL͸\P!'}wx(IPX,wL1J91Xc¬d&yU_%EF P"g|Rt_a@ !!C", x* "|' UO_.)GW2xAпS ߷ 9H>r 0[S<A G]߹"z,?85L@<Fo&rFMN:@8^V[C-(AR< $_lό)6r.6!P8-E29(L|0W3F {˘W c0I pT-]Ȱ׬ Z\ěnAHNƓSwldl#< ӈAJ£@r2pu3CBytbb/N \1"l is>`1 ԉ @3U{J*@QWr^u$ݚWLG`+/MX'8 d:+[@-*^W{Nzk2;ggGno޴$woHP⥋78 xU xaj7H6Yo."wVno,Y!`!¿& L޻J$CJ[Ay71zLZ\\.PPY"P=~{čN6\Qzr<;Ɨg 8NZ2k3R/r/7 /k ,򬀗 xyGɀ^V࿍\R^}$wdGAw ̱@;|h} 9Z5ow| {hfkq"~q(rP뀏w^7ނrmmcHȵ}ݵ} S1DWPD#DU׋ʘuԁQHz0/I,N\ e9)q1[4⹤l5qHXet۠U -tYSDVݗ4<}80݉\?ݖBˇ՟qd= GTF wPA'w+~+@ ?D<'Wqh6:l7!0zU(ڽw@KU"\+:h ݖE.ǿz%̈26,}mMFԲ ׃|O~zVpO"ݢP`?M\T$p}}0 VI5h R|~_< '!0pzX l~K+_><#`lGGXA2\.q+A7;Sv2Y#L0jY}LSyOi&`!{,~ܟ9DzgNrԙ1Ѥt!al=,R^ASDD v+%T*6xTtC~*+FrT^%q }S~S1"4)2J+G" QU%T"s0>*;tvW\ c*o6j$&=ŪV9 ,OU磧vU8P'[R)6MU7ru>Agmʥ?ðk%^lvUFTA|U O. *KoXyp?wޗZSh9*ޮyKs98;HP(iuܮOЦ&%1Wwx%4mªOdĢFi`/k呲/ h:DA+}{χ>@ X>WtT.4N6*" ΏɎPQ{X oH{#2x~%?hJ9 %(*RKAv ؆c1s=*!P%g̤_<l0{CrWU|mŢ[w3xDD&dJ=@?~HpL; _򗿥˯->QƵԴUMݾJ^2W"]w=)Ǻ/뻟-n}|_e-vyo FaPE%=S[ /DFU!Ѩҷ"Ryv}\UsW1G R!~=ƯuS \T~UE? @jbԢaPoQVCF~i5- P-Ķ!Ć ZQ5Ї1y-3`zj4Nl@5 <*'Տd05u?6GaY%o*"47ڇo$؂v4!lRJ'OUÐtq-lbvtHJL3/RE򂢱"!ulC|ڈS ?b}͈k7g~h / }4ϲs_. 6_t.7 !mC~>dB> oU?o7 ?F)==6kTGlTTFkt YcĄ:oHU›UԷb~BY! B2Ǖjq4˭uMqK\Z-T'DF;Gd€J'h\9rIpL@zA'$)S+O~*0b դ B^b V9n`Nk!"jucUA7l V)cR;&8ij!~-$U 5J!#+^hSLJȄX?ĔnVBj+bq1i*tW!ۣ΂5%6&C#lrflY T }Uo>k0Ɋ%sId cK vȯ7q! 9zES&UCF٩O8F^6DŽ6$Yc1@7K-jHMvkd )$~erǍJ7 5NjԎ)}|G5_@cUm?FF?ڬGRD$OǺq|]3h+@p[A[.9 "VQWRGj(S(u5-jyw][먭NMB9܇0Fj^ k57,\0).}2%_B&'0/~EeG"eD*Oİ 26İ)?%X,*ҔNZTJ%UW*xC"6֟HMOLwCX:rH?XQHj1*{&Kio<.WGWLZTnJ #B-4$`_J^ '` &21ߌ/X)>9nrP"re&I:Ӝ~{$VC3mc5{^\?juZy$2&-,J7{"|NI fT+KU}(&ˣ ~TSck5%2fABKwb%c^7o1qOUo撀aCG]Wޒ Dh= =||XBii}y8| ֫+J_YDU)z@mBjX1xQ&xZ@uV}QIF -}*F!8|?d[jUd5#oUjX13j Ht4Cj'-lf@}nVڔBQjZkoRsZ.riPFqոjجmoJ@#j lqȞ_ ]Ak$;223Voga^6d~+0!jF3|U)CkeVOOصՓjBvM$o+cY=>̎[!ᚱv n׎Sկ2_Z*3A j?A;*U-@moN^ -ҫ%k_!h[? UjԤMT0^47!TRDbFvޫ W#FeׄkPC U{5eD"ep6c.w\CNZ_Ko??KH"o7gDrH1h`d;Q;a. 12l`oQQ& *Y&22:p+mqL8j1#j6 a$;#n:y\T{ "%;md:C^hp~0߿}0!?_U7(sID-6<-~YnX.?'.bxx7o`?"\/.O0w{}XXh'H|@ʻ88Ĉc>)cxTI d E>,cABo4bFpR~PȌ`ck$4~-Q *˃:Q*Qɚ_kcUkMnjڟB䕇ZsZ}J"ۥ*tC-w,dSWaNc + J3УڤSgH3Ϭv|5*a*,&n5~3 +v%dKJR7حLnC4=Z V+Uep*AS$=l$OZ=]8UBEn#ZB 7< [m\jk4:nt+=Ԕju&fËB؊\p֨xGJ߮яa|.}3C=W /T‚r g':ǿ"AQs>}btY7<2_,7#Ӭ:7Qt'er^OoO? [e0D=‡Fxxm"Ej5H^tv*cq!HA#9K}2sX[wUJk5-k]2ԄI*a+N錃_{`L=—RNk0:_Fg8%;Œl Nˠݚu>\3 y 'ioٴhe| z/z?:9_[2p:CƕGh!=l}O#0Մ5}Z ]d3#N=\>PO6DRƁHOn4?r;2:B!F~\mO?e|-xcP`85q҃GNR=o&%|kN0u*gT2T(tC{'{h|՛k&i/@~QG?6.X /X6dA?Ύ*e?j2=)ѠwTG#b[`e)Ԡ  f;+YEBs whЬ' MԧBUG A@fNs ެ!|{u@| d( e e&g'5p*Nѱ$ ^|%] kvEX D K}?֫R](*Nzŕ BRwzK_O/h{b=DLf#ÛY[v"-pb< {79șyAoW^4S:{cY-}̽ѧҀAai"<֗ OctlYzGt'ߏ ,N;5PF*qe =O%oѧoĢBhz%TJK8Q3įi1Qkfe/pcG#5cZM0=,8#6#;]IG1ͩڄ*p/ٱ/-tv>z'akS+O>dI`E@ ^$G+!?5TG{e 5.fs ,51@e gJC[z)c(e$]m]B@F"퓔Ԅ,~<P I]I󨺿OVAC:j|KJ⿅W.)m!ơ^:襋^03qQf:ݩ`_e! 4yW4!˻- $ކivw߀\_7!%Y0Z *ADUdnTKYZ#E*ԟ#O VN1H,%LFmTU.qˆ`KIz]7)\( 鉙i]c2&l4⅖{)d ZG6 LA ذ4=]֎ɗk]-o\qdCZ;w\rVY;GYщa\5sp*2YBlymdL-Mv<ݒLuzYbSrf i2)Y'H:az2zb*Xm5;ezCd}2 5Kqy`siY`B[h{Q*>q"`)W"hp ~-x[5ᦋ·jB6_[kz$43 2|Ϊ`VWZP摈MCF1 BUHm83zUXmVfaRV*_dz:RT; $˴iv"eKShTrluM n$;Nvq3:|NCgeFGBO .&&ʄ.lU[Z0/?5b]jBq~?pߩM]3\VL_L|x9]c4u\k3zbDnѸHvWDe la%^F`a*L6(6dxa2&뚌ɸd\KHi7x5 RaNh)Nsjx4Q[vNEvb\ډ&ِv jW2Xbq43 Z7o-uCf)IRѣc7؀dw7]6:LWt@7n+ݘa3wކ4 ILA@BbTD,樖"oYh5T]o Rr\՛7nWS`l'^5a?ou{GbÓb@M9i4־wu,ȼmGZɶЮ0~ENzNad{|Zi;\`Y_vlhLi as-V~ɐnlYz뭵Y~j;2v(mZzoU3o [d ,Rb&)AJyea |&".[:k6g䂏,(ls= 63djz&]XQ \j7#KE+ĬgdդGgle-FS9,*L3Dza9%SaٛvF6[`Gf/eiH>,x(tR]| ).JMJ !nUw;;-]""S<ЈK$?SҊ萱Gƶ.}2:eXڢWbMy ZѹkPNmct Le]NօȻ+R_0*:*;ݣQIsj,qeШ1Cv"4uTH| \`ֆp!˹Dͷ1!N갠 08lHĹ;[B{M8`.O]U@sw=c^'zeFB%ה;g7YC $ɽCAƒTHEMIF짔\U{Nf` qN$AJE#E8± pG_π?S;||GHL@SDN;#!DcӿZ[{ZO`%шٝ혏-Ȃ_|{cڭnQ A|n͵!4&`n0[P:|!ķpYͣdtԌf[axI .T$L>y Lm偶Hy`$? 4RlbOG/Gsr nn  Fc*8Dfqz$җ]kĄbߡVZ$yHEvp22)zGZ d&Iڢ#oNVwzLg(tLI*}۾|+'ՎTR?h8 F:S*Ja׀p40Rʣ8~ 0 {BA &oJ`j&f5S( %uѴ9$#t#WcYH3M2nxАb4H"%SL]sk91h,5AU"GftXBoksyw$:_7-LmL&MVchk fUcg{DjpZdN|fy4@ >`Rq=0ffѝŔQn,{}4@ZCTUs*f2yn\O&/9>6a~G{ wN)̟'agY.)flH%jR.T.,\v%_2ʢbcXInY:̆hSfhηKopgV:3{O* !U-}na|n y-"E'ܮ> e+D5d<8zЇl-EiQ4hG 9fH %@H85` W*֣ y׫ljLJjId8 HBhx`w]ұ+vXԧ͵m,[ʸPFfZyؘ'+p'םYK8a u,H6\f 5< 4-2?2R6xKr;g'w!{&ݦ"u]9G]1SyAi#Mdp~zgت'e2W1j#KFy.|JKoبj# vvﵙyͤ/̧fDyƢ:wVJQOVE֦-WU*P$ VOP\@vGZ-=HiKuDqkmuC uC7Q7)}ep65 ^RS4IS4tES%:|8],]${lbb'*x F^T6@md]CmxS*LJ:l+܅vMj0vAjNn)>KU-Iv'@NxuIgM%{+U/Ղ3&`*F"AcOV/'C蠴s e ZJ"O22ʷỎ`v(mFM`sp4EW³gjPz扄DRkG'BU` x~Ik'c-}F1NM,l>4fL׋ȤhufP<6=vz}l?Eb+f&H>NUΗXu ouۛ\_" =p~ry[бw~=Х9O~B<:c?˺(=>[x9m;_ͤXT\X<]3YdM`TуsH[ڥ[Mtki1s.^9 Kr 7N+]sL H}0jGۨmk)yܘEs/y6ly|DIɵV;4Ffl~6kHكdqDo& 2IGbèamj1H+J9)0GͰq#S㪔Y2'f lᤞc/Jʹ^Q@ga \H8~.KW5y8-M'Y0W+ ? P?+'N?'|65566m%uJ&s=0obaлP|aȖtP BSL+qQ`Ԭ:b'w8M Mm6w _@HێͶ#նVAv*0bZ7Ѯ;^wFsx\=AVo4) a5oBwof6C{ 4r>4*f*asMlbNѱ*tC$Y#GNijP\-F|%\:k69 s_AC*'E(Á(\#J|ရwynQd;:I!U 8@!g IuDFZ62qU4`~jA)^ LA49y1-:c' uR&'빴Ĝ^I-`qd`\:))XLm 2O%nu3鏦whL4DEYvѡ$JAYfC6THzSUMC$$/.1Ԣ@IH\ Md40U\sksГh&# h9Ȕ^$L*kUN™f\L2z{&:R詋kvJ:Jj~W=Cx"X,f!:bv-jx,܅O2(=CɤTV44s e6H_Dѻ9ݜ^ybM* ?'&:d{ч ڀ)T~$Cɇ .ȠEN(S-n:O1\QcdP' OĂN:&x | S 2{߷ZS3-k]s鷓}Uzݜsգ֨{Lڤn43Vl m qaYىWIYM|1ߘ8Ië zȒmlJ\:i$)&Q> _ۄ$Fאs[c˙/=9L l 8N3i`fV ;t Phɀ|SK/I@|HȲ#텠$pEjpQ&0 0)^C|Cc;Cdlnkqᡑv0 c`y'Η¢cT>/NVzqvi?^y}#DYU|c z,]| 0/㫙' (%\PBY XaBa#@M(@;0oMV8 A,a>$' Jsf!y\obۇcDzƟV' 31z|$m%3hH3|"6cEa"`NB(MR ȄsR[I Q0qn0p~s.PewVt; gLN-Tπ[&]@:n Q1doq 'J>" ۯL=恻^EA$F6SD0'fP'2&USUk =h~G3$ZzZhҗ񺉞wb"Iy*% pA ve'MGq3F"Rd2O+rM`D-~ֿ`:+! >'x>zٵsGEg @SYd~o'jPz\K\C:$0kr)]cG.}-K#<|p[j&"]GYzVLɻ jfYX6_6B f_(W2U)2 hGl4˩`GfF[u8,ɷ<&-_/䄗T/GHO>`!ÿ$,ǃ{eg?Sp8SZ|ӂ-( '3PpzaXHva wd/ E\R_wOS`y:@d/8W"~^+6ܺE3*oHӀ@AQ<bUqDvG&s 2^ Z-A Pvs?M.fX]FږwD@XeKz^^FoӾd'l3`l rCh-EV)+>bO~!eL̨hK hUJH5=_f.')V۸ibQxi#I'&+ fȪgY-qFVpWd`p)vXIۣV($w@$ݤiDǰe)2j<*ykɢ(3ƧAwpa*I-?~,cC-xSl AE $xS3R–N~`}&Ka&?Q)R$O ?!Mj7 ?}ImjL6sE (,@<(+W5( 52gE];_y4'F565|.#dE^=U٧=@%?'g_"N:j{UA̒g|;Rbؘ%,8$g+$ңBV2P%Z,c恽za@_HG >dVo\ʑXϋf}],rw E^ϸ2^͑)d`}|\ vp?<űZ Ż:h=:->+ jS /"^uC7dѰM_q_=n1bt=܁ 5ä#*U+7a &,5RGZ|@#f& -F0>I3ЅHRg)IJ$Q]?`us*G/5_Hw ,ܜ^eZw5<E&V.lHzeC-`T6R?Q!TZ˶Mm'<#]_$clˉY1;Le^ p;YëtQKJz/lת5ЛZ-$ ??890)YCv[9nsf1&7AfG) d+>\_%=G{z& -Mzk^Љ Av_'@?{V#⏹=67vBē2U6o +GFR }f$X"piŤTև 1vD:;D=$e8l_5BZH*qD G?r V2@ Z(>)ŖN4EkIQKզR-+c˭}I!hj@hVRQU4nĉ [ޒ$" EbZiͩd7?V럋;"*.6eQ`WjTXiel$ٸ?hdđϟ7WFH?o/~3rR(VY!A&WL@/m @]pjE "/ PԟMG"DO=67}L57uf^__Dwz~yet,@G(ïVZx%/a#~wꌿ)TG6>P} OBfDuH:$lMS*ݨJznV(QCml(}8>w?kKTpyMGqJ Z-ֈu!R8f7ޔIUp.J7%R y =>/%W _8O2th;)d%VĎ*P0ɡrnkW02xx`~8IsL8XH1_sZ#E ~mi{j-q錋`a3d:$1dpoW]%N=0~'4P8j5[ X1dTLtq}ʿOsHeEVV-j&q m\RҘ}ے/W^JJO^QO[*, 4|T"!L:?dD!djvx-R I)M:@4!"815v-H dg+'ymf p0L`%`[L_91 v`ǠQ;IA:#Łނ!nq_Y +TIꉳXO I;H ٰ6kBc埪b P%$tğQ$_`!,"9pcG`11CP9%"!IeC'Tpt7bF| XԈS}q.l)#YdG #Mv@iq7SFj2d7bPXvOfͣ?dAOep̠m(]'{ 4w#3!wdAv{]KcKɩGגS~bPg"W4B$ 0$F3$!|>!QMd쌓!H{*2h6h'ֆ6Or%^ $~|pN?~\?Ovy_nh JVlt7w C1B\b ðInLnPӛg d/VϢGq[wf\e"եi""&YV9St{~Q/#X| Nf[*-~V>?][9~$ͱ:53(p{~//o_l}JމIE0nL De}O oa?ǠH3,G;‘Du 0mj\l`Tt=1$pCdD/E1 &Ux's -{:uR?&{Lә`E$p{z/:5e}Qy8rIC/ Ac!4cG1ں2xϑTrrxԚpA.J%+dV92CSI zBjzttzxqe[#V F yw˟?Ub/#iUbt<0hyYmKPoɚ#d9 qF(K,LvO1Z{3"s {lF9ժZ!"on̖(]WDVZ9Dq_^۝KbV!ft%:5zqv ~E/OILHTr\$=hN,KN5U(*o'篣)M $W7]d Rf̤"aYFWaYF.]$>D g}1I 5:3z5BIj ]']֥{_WЃ/`k 8hlђ^TBvQi'75 -Mz7]Lx\BJ&}nu$&=D.6bxXLѲ&+A1܂=|r%>_cJ{ti%H}-btƏuEМY$sY$t{{ Sy ,ϡQz~e8_{@am~]H|~CqE\R _K#k?pk\7 W0 I6L0;Xk, xod/44a"◰I`fewtAX.@]8."Gg+|^/)h;O}I3 _bG17HčP 5*3=e5/>/ g;c̏͌yYk^2yb,+aoPꁽ+rp]=jXtY)+J?ND o Ǖݹ(QWb^@@eT13Xc YdPjB?jWXh I. mU"ghh^K]Wfe4JZQ/p`~>S>!װ]{sJQ$<5Ti"F5BZ] DT >RJ uA) _ \R$M "w?ȏL'3S%_{94pT)l%BeԬ`ڿpC>+ʚYj( NAi/yEH8!Z!:hfvѝ,%\[ SnQ:ݧ{0L$hge2¸%kV(rbWEw\7f57.6FǨ%)v|$ s7 MBJ)z Axq*^NAI5h{֗Y.YigũLJU"3%*ut>|J'QP n0>sp{]!6= p N=Y @/9SKx|_/)IjhI(`,.\֔:%r.][xq[ B!(MX(޴¤삇MtBK@{F(2_({Dߡ{\`g+0VX]䜯9JmkdbjOQ]z q .hP^ܢ '?JR^)ECJ!00A{נ ^&OJ &(>,&tce̾M隆1P^TL\r~4uX%r{xã`kͤ'|V%bCۈV3ъ5p0o2\4’Q/hkt*8=Y)3%:'+/\\a.iN4*.͠h͒H_NxãW&MA|`Ɏe)Is[9wO PݲMP7t:p68:i>*GoFҬb$f%yBKە&2ԉn5NO"0tiQ-޾!;n40]tZkrԎ}޸ֵZfuhF08:nX$aȨݲ;/{ [C鹍aD/֍ TNg".ղs-k 9oo?+]C8g?mq5&{"粰_g8h2O\QBL0j C~%`[bDq!B͑#;SNf!93z r >:&eCFn1#RCI=, 7q^tl1op"7V A-' JnFS/!I8V쳹[H‡R'\&c5EB&%pd-9 9_kRIjy23~.C}KUi=HDh2/qIº^_P꤀6M&.dVi $M҉Zk:,d4πi-iƀ͋L$ hfULeҩ8XXWke6lX`mzRB~vx]l#@=55*;: wOwA ̓Eav51Bp0wN}]ZePFġcUb-דX7^2'm kZ/Dv;RnQnI8y'5G?JH/eoW7*# ,bV$F$q#ePw|9_` 7&d&4 2 -b!t@~t9(}gZNa7[ݗ6=1LZƢtS0)$ PL'07/\7$v\7p]=nBv¾I!@c B0KJ$@72ۓ5%'_=zkeɰJ^BG~%fe6}:q"I ,aL@JUKF#.Vn @Dbp8ϓ"0݀EXg꩑*7:ċU΃2y-S&B&Ev4>HWFf\. u*P5ai꟨Su=[YJ >$u5][;͗F~cC7n>p$Yq$:vIisrSih^]]'4vHAhֲ,x E6S5 SRii$=Sʦ#ɬssxaX;$)(5|& Xzj4(eQ:Hn&q{uyCu8G( Fyu7fgAl4s5%wX<ȐJ-G䙷UU\ 8`K@M`rd&d1e\9e.*Qc#sxv . +Ӹ(%#<}ML Yt2= NHz Sȡo4 rW+?uruøQ`:"FxM{h:0{DpXu)\?Z=0b"58APP#.F24@x;g.*=yU`?xzZ5Je Mtُ 1ґfm*[᎓f ׷GdD=v!,r\WQ{_'r~<^HCOyTK=gICCӤAIB_#  դfٔo`B B1QƼBcn J@ *Ǽn4y=ƐD D́Z[*#doQ/Ad z;z a-egKSUĒ”~ @*r#W=A+5X$hjlqΛLaE(/0q1LξN27yԕJXy)vzK9!A}R.Rxt֕<a}j2_! Ԃbg-aC[uxt`iǫ `1m )w׋kz='(1ԯ e9{> #:=E 8[Rx0xsu "kfUHEs,`';?}KXTRh;Ĝ D+C Q.(m;_w1{#S#?ym$+FF:$H̲Z9$$i4:v 4Mm+[20F3`280jǏ+kPfF"~r⧜&IҪ$d& 0| J9jznD%Yh%hzGUHu%a9ux=XO]ͣ*6IU2Pg@ȅ/> g*3(0_xW`QhK~X ə +l,X?؃L\UZ)>ߧbĀ+aEcCv$l`e.HꫠHA DۑN ed't.Dן !kJE@`RvUBJ~aҋ@=23@ ~w|wDHt{],;|D\2s(_*s櫯]QE2POquD(#dktt|ڠuXTm@Fj1.GNiSC'f"p"AGUHPdƎ[*_k/٧[ivt;1Ubq\BULɐyn;mgpmkY_ 8/Ss9q mGQ\72k $jDߠP] a$$\k𖼀uۺGQ=.uVgx8}Jhn8zP[5Ni.Rdj^ j#E7"u75\72\@[ C* z ԽyȥEalW> `6)Mf쩬(<>0%b _z9#yrwqJVY (&.Єiƻ 1w+ lmҍs n1b!9Ͼ)^o"%m'anxz?-/-# bݖ`] &B#^,:-aW.<9"cs1OCf)ax|<'Y wrޖ:'?VuODj_C 6 D"6\_Ki#?-O cP0%%D$L_K8.N&[~ͯ6? ?$ߴ4. ;1 re*hP9#QդT+SH B) hd\W&@bh%/>xBH|IIUCKH5Ecʑ謍<1Mww'LvKBHlMԠ;{k,E axl ! 8yE6;qR~cc5kj}آ&kA_9y`lҫJo @ff>}⿜wxen[+(O9qJlHžT|:'ia֡5gY{&ۚމ_ԏ&5}dNsUš)"u4KF(D2iȃUL& ui#FD#"Ѱ4܁Dr?b)_j[6|5]9DC1 `Tɻ.keC//P >Dć:H x=)* Zӎq})O._˧?2?Wp.s\~2忰ҨB#EP/b?߮tiOz%ٞflKve&/wmPe6|N 5DyX"@6{g8[LeG<O2t.:*2Q[LOa*wQ~d5W5/S`?oЩ`l',G%feFe157c`qNwg#e fyssp]<ގ n{CCL>:+dF iϳPΨwɊ-K߉>ʳp)c1*el(RR\w1qrIbTigKDeӬ((ń,أx\:2hNW,g\(FߌD+T ;gEdfʔC@ՙuT5k QG.5ʤED]E7{,Eg%DYO |UT<&SkPUϏ$䉣\i dG;Zc8W ~B>Ed7v~j'U懼WG0<I].J}U9a7%;FZ+,\pM@0!ϥ]\:lp!$Ȣtv$EB#KÃGK <2S*A[0ņ*lOeY;w"dumbj?gC~;HۓgMlR2m ^ [$24>!^ ă:EjW\T׹_u?0/-*9nhM?ߖ5Kz+.3Y{'Y1Q/~ͩ,]zR=M}²%Nf\ b D""xw:]X7tC7Zw ʱZ*k+#\b)쁣G;뒲^/IWcQJ>ܮ1mkjFdG bÑ\fP<6 E_Ru: 1pM4*y.kG",>Pg;KǺEBZ`F }Vo!5,̻]测EOV;Ic.!UMyl-Ys#T%e_JX;>iL+nH1q^]Yl:k~t'wB7^cK_놷C{f<0uInFOÕ1 2Pzaf)lH6hWԙlm'ўX裊#OHDR:wφАՄgȐa\EL 'NyOl^µ?_'8; Mg \&%=26/sV7 BGͿw o%B[qe=e-*z\.-R- =n-zh8 =n*Sq =S =&z\ =S =.H^F{Yq =&woP5"+H;fPmPzǷ^-3p5DHP7h2QY)w8REg<|d+1U/cclafv=&| 9EnYCV1%7Y\mtbҋ>eL.<<(HC^cDgA>2aC2e9jˍ$P(vdON!۽ڋO{J$E}iLdɻ־eȖ{ŧR·,EhpeJw,F[Va~'k؅Yn{4z}N ;4Qn:$8c {|QLÞteB':+p_W~e'̝!/֫|e 3E_C[h Xբt̷l(!U%!b$K5b=U3Q=Iy-t lY& OtmO%VU7ϟX.uw?>Hf#Zʖf!٘}g;/J]Qؼ7n@ ӸE,;il0%)sj$i;дH⳶2k%Ms<>CR񁩍d}Xࢶ#)id+ݑik}2D#Nh?R \֒gWAB3K5QƑ6ES A0`b@F܀NmPC %ZwЕZ$ ɵ@@85(F)yh6&au4ȅDYN#>xe4vJ4CԉbN[Y^1f[e rcNQs34MN+lg6cU_lf*/7Q M8M?}Դ'Fx>W_xW=Y8!V-複twd5uוQ 8;Vmo*oqjHqsHm/AMP>'d9k?~IښZE;?c fHݤ:KС_.E^YlTYlr8zMbwJ^WhvI\Tpb(<)S>\Ai R]%}-6<;>LZdaH;`3n0Hhv=ŕOH-[0>7]SxzeyB`" >@ji 7^o tڋks_<&=E!iوwn qTa8QX*g)IHfl֊'tڋa$Tꞻ]]MzEz͉Dy>t:M178O1!?K?TļP`. '.c>|kd2`E6e ĵ%_L1C}tGh{S##(L~)Rmj>k_ 匦]NKҶc:GǤUp-,'Pc8WlƗDAKRC} )c VRaR뀛Zf! /=.EӢKhZ-tZr0C\٢e"EsUĹNGUUB-pAi9cCߗUVZC*ȰV/ɟNlyZ Re*oWbz ԰T-cf̵1jLH@pF" = ۗȾL ]+Tk>&Q|c7]ˎ]ؚNj.Zak3@vhҪ,G 4'9S/Oɦ`Gv$$Ei+i~p\ GFҮlE=,,o/*B$xg4B_r4[;*'xMĆp,U.[$8~%GR}\i7Iru 8^A`X[Yu4DG_FgCÄ QV{5|ʲf;ru= $go.n ;w5p|{$ x0 ZsD5AF?/)gq0GX||%S鏓 M? T%E=z?`찭LkXxSVjLO4 ɐwp T_X#`jg;qzj/|#} 휏=Lѻ220tp"L-Wן XF_R`В8{ᚄg]iƹzd/B c4L%!_ıPl<-zZ=,GNe ؤb>BLD@#ǘW. ¬kߪXʡJ*WJw*[1,mI\iLưё0Viow:jᯚx-N$|r [\ )FqWric!|e2h|vv<ߨHȲ 5І Pmل.݋:Rb(YoHV =}S\"[;H j5i.:Q}= $T4HQ>6]7%'/"P} Ԅ1W/}p?äU/>_!7g2KRM5GecAL4o&YUp2MV> ~yZިH6T5qrS {9#=al箴wW0ɻ1jj^S+GwwWz\ $V:]7 VkYv(L5h:;fl#rY0X~y%Dťm5N2D@ÈH97r,HG,wdՂ apx?ܫTpzʼ#".ox9ghnqsq_ƴ$Fa$[%=COv_ RBqWU35.TPvZLWojYw5 F ͨaTB٣t?5) \hvJ a$_yI+ܙZ/i%̰Xzo={ws~ҹޥrF ?B 7x\%30л>એnWefj0KwឳOf\X{arMvL|yy^Z>O{>z2LREy0psM}:;9Ų0\b0,; 5_Qy;/n˜?b,5[*Ѷ|r$FE`nT㔍I~inpi фA|e$Ot"s:wG%s90Cd]%8\>@^p>֑x%q~0kn%U}$o˻3?aaM:G3'Ìd3q8t(T<8YvSL)K]"~ev%dL\89{E$ltE݀?/5iɼf8@3Gw=gq!ˠ?@;cpOx?-&=I>Ε&t&&rb d@\P80 7M@6:)3л1? oGpe 4C MselܷQR;["A|(0|c7f#PG䓪8ĠO`>e3cxV ?t2)@6^. jq-p- p؊QxߌBWfmaP@uC-j|uC'}pooHKڒ[ֵҘJ,75-6-@\CD؏mFL>/䨀Ŷ@P ]KI eBщBۄU~hÊȧ-P%W!-}g%z]:*0^tTNDO m_X kHwչtO[ a"|<ڌ6 n-R7O+XtఉmDIr` gΏEf_>_bI)7D$,A@›-%wHw_ I]/ $O6 R$M޽780 DAPܠ7fgHHIba--g5F\8Hɧ-UWRsHsY'os]KcƢSSH_wGl :C=$􎃸;AJ17Sws|cJOքrkBҚKM:جPjV4K#Oi-F'4 OCQG'%oZaf W$IΚB4kDvDsʎ€Aؑa+ȎؕdbBr}9ɱ*4X\R䰸U RU7Ygxc`H9WhB֯ 4OZ/^)EN_ٔ} $9O2wjwPpOxD9:l.Oi! iv>d-6k؎<Ϫ/s@fhc:3)=\s zrq2=מo{H%KJcxWv VE1lY8詉,N&HgSBm1)elV?F<4䌱P>rs븁PR×}͓.CqogjM+)E߬l^Fw,betC O[z r^W%4jv\fgB2lvP` ;Αago,9"Dn  !vѲǿX^<qh f<0:>qD e-≍~d6B…ZVcXa5)駔rdeqnI Wkn M6KK l3`a5'Zylil)h0JƥZ3Q8BzKL&FK72tvQM3]gB*XB..}˚II,}kvKjiኾ$9@?::4t4}GNFtcIZXI ; o)!!Nʕs< 5$X 5T.$DS>m< \Modi[*Oў/ $-X+06궕O[/!2J™qbjD`J{ojt{N,KU׍@w ;9J Oǔcs\h;vZGw]9u Ouq_.)>e0$F(EXh!-/v6kՎ.7LRMc>!Z AQ쳹C@~^d˿7;6L&:c Dwsb\NXٴAwi'J^.tARL){&LEj+_$Ν„F')SR_R8CH(A3S 2p@]3V[Fg-UΑQ1dQBܴX?`vsmhlÊz<I:\y,,qvtFk]b=؃=ln"euo_ѿY/H'Tp+*73Ab?[D"D{$a?9>~ N@z0Iׂ(vcqX#w2p~1oWߗsX?OR{oIp E#hA5G u#=GNG(NSjb>b{×/^ HC=G3?'g&%;9e08|7L0]`#2JbNj\ Esܮx~\<ڶ@U>sqG&3nzc6]|?ڃGV ITbiI)B3 tp@jQ-S3Lȟ c=>/{u7<9>z҈ao؛A6x,{ = #nj$OO--LD#L$C8"ߋMD>jC<aƁf vb Z*H">TžƓ2}Y$MGUtEPx'{R+ бG#b#*B>׈3' ?p !FMVHOh"qTtv9!. $:R =Lo;?oW4;Ds2w_+$Tz؛dZf2+y_V0;kw` Y^F]VlөvO`.\ kƭGF.Nږ^?"vIMw:=-:VDoF]#W+??{Tc0evOCvj"k5f{Nj&U}4tO7S!a ب`µзFߪa[ۅvnVقLMZ۩UBʾ~VPUT+^UЫJB!<VTuJ=cZdM?Y-df v̝Ijv\MiJZ"#ڿod鏯fY̸ % Z 'L&?wGCVHyD\oz)q#/.2"PL]v.>y)aG+3 #/܋rL<*P#"IF;3KDS3Z倆Zj w@yj0)VԨV}O6 I8JxXxZ0l?Q(MN5!nDxMze;$3fFMNZ 8j7[d}C|DI$GPF#N09BKw^<`-:4'n,Bhc49b+:]jJuyB7?DrR,`oתk%n &SZR ΥCu.O[K( R"cbb6юun! !fL2cS_mw#t_ذ '8)hpZW*A*X}U[p3u-Vc* `]E>ִY܉#)BM-P;Qv+_TUK`~=e^.]S{od>%԰ P@HU2gL&6WCn%-TD1q+!EM" i.<4)h&G@Ur~-9Zޮ$RLCYE$߻h$rq`4g޳]~7FLRv:.Y{\~ư0.~;!.LИoLc" {hOg,nH|#NzQf0"8%G:zR= ʟhLe vu('?J"2` IPN7pb#zЛo%Įhu؁EPA܁c¥7 фq&?J% nK%$ lIJy=oiZ]Cly[WsuZZ5T<9Ov>HMcBPj NZ؃>r_S5hf@CKƞo=jk1CQҋ5j%2!"!}\{h-qIreY+K4DQHw HxEup/nW:<7}{A5|>A>iѧtӻt#dns;~v}#dvu/\Qb kYuHBGZd/BL_8TqΡ rWO1B-B#i>CǪVzq8 СHtO},jl9LE EEQAO .]=-q]H15OD\} !—+{29@O+K俋`[/VBᥐa m-6%aЯtO@P ӍLVRƦv+SOL?sΣ-U>SM*F| 8[k|9L*ieg#md >[HhM,($=%7tgU z]|g?,Swi d.2w'ᾜ++I[ڔ^y (G7Z=n^7iemg]&ٯd'(YaFk:BM ž35US,SR30hlgl,#5 !2S`d2\pl."(OVu٬+l%W-p UNU`HR4SA1?ĉXA!%&k C^(7ZHH^ PR^`I҉&tvt2sf*5Z cfy|~jY<ׄ[Q~[5AQM3/Q2aPWZ"R?c)eH3!DZ&dUc-M\~8ӄ$l1xJ1-a:McFe"oibT0E7`6ĸΒ%HҮfC7@:ZvCX<8r:?ht>;4[8iXfl}Hĥ֮Ӣ4ê;]0he鑙`XZ p1WB" 7d^` ]QND-}d^24> S{:g ѨLFM޶]1q<Dxv 4Go(!S?93o0oM͐Dlj+izڛ^ Vִ7C֡_[cf$jj<1hu6twRa,+cQM] `bzܮ!eۉy鴰/}pʉY,l,Ơi+ҦuNK`4-2Wç) &N֮%ץScEȉ* C:0FSr#.kRJ0Sa[ྒ4\ /klQALp5d&0I y?_rJ\jn{5?>KWOGx7Izr[I&_|t(f ׃PvЮAFL=b؁C*Q!!o^.N%&8s?[xT喺]á:>& 荨F*ĭ|v;>e$PZP?2.FxWӱ0$EDYMbnvvF %X J/?+jX-rx+cDuE,~X: 3yV GK?1fD\ OrK/oL /E&aYrCo6T\ sW9['^{_ ^ x>9X$hSk'7~Py_9LΡ٬C JgoE趹ИI;-CS.ݖ.uOq_Kܴs4ZKs(!}:Mso7wD;§:"h(-n2Y0'bX.&VbNXS8j eBZ_8Z [ -cFN\Nswq5fr0͡EqSRd[c, >6+rL2OUK)ް`dU Fo1|sѯmwU FbT F$5{A2_[F`dI;@1Ji,eyWQGOCr1tq\Ȇ ;6& JC{H$y+ b886|}(B.䃩2n $Hj^<4zX Nj@$VM7Q&z4 <بlhXHVA9 w=L]]IUEQ ?p5[-_ n#b_)3aOA袗z9A/cz5J2!ڝx Oc !рQ)'K%6r>ʈz٤?)KfE/mdh^vzc;QJlMACҞC8vIT_ĥ7gnuÆ1&3g6qcA&"~MAJThڸgsJwA,۾!'8pJtfN-Yv1ޣ' =̩5&>0lC]ˬ2Xm4ޭ(FILmUbzcl*1_#mUb@6LduDR{] ` [a]k!^5U]u/tu7X2ص3]h tb{o( g y $LjJِѤӲH.ɀsUR"w?RAަHS8 xmz)skYBF%Ա?(IW9(D^--]N]QzU`S» *A?*&/lY:9: bz{KeE!U,0?)[lE3w'.x72A d4b >F~JPtfkp?WO ;tDfF# Y!oOqdMХݠ<2B]aLK8.cFY%Or~; \.ߔ?lO^fԨ]̱NvXwp_̟pRsN0ɶ>*1AdA -s7pgU"UEZj-d4`;'| ^߁ d0 ZIO?}uE0N~SI/7;yk_Pp?_(ɓ tVE=u'HC{5`P?Ax,w=LN8jTZzYckk/?8Lc\ov駉'تo&a(."M" +0MmזTt{qJ:I{\ צTZOY CS=YUBUǨcCU-ELXzX'jA"k6Ju&~(w} #`i݉Y3 v' N$$DX",B'Fh>U̡"W녪֘Ln7:UG7>LEx8KbW|SUX8F$tw8ۣ`lIu!LRjsn1,6MC a"7;W ~fه&J&;4ǹ\&WՉ,d=nG.s!A,4asya] S\d#ˇO<ھI*\hvż㶱c)2BwmxM@̯ 1 12ԢcrQo0n_WZ"[;-[`W|HX̻8 IaҺRr~D,w5Z8d(WFrӸlv $@r $ב#ݗAr)\Ұ-_]&;+:64.׀v[M&@0f#7j,o@x @xbɀP #Eo?odk%dM*q[M$[쀍pdCWd,}Gf s 9J¼3y9qŗ{|Mtї@dY2\q``0. S< +N."Eɀj[iO=)WgozU0i{R "[ NٓEd5"[ "K!ob3 _&): R{R R[ Ezdyj[%Eݖ?#V:&wPsB܆2:Mxf vx+I*+ˀI//db|$O&P<C` uCL:2Pu[QuV? O'y\>B`9h?Wtx\_qjrDm.ќ3.d,R`"L^AB rt]c 1$%n4ȕb9X'ickLm))=ҶvPK[®hI4gZilhvcy{]%mo r؏{1uom{zآCKbu)ȌP)CCqryknK/Aahqǫ&W?JXyGQ+)e.s;Oيo~gc$='_W ?wQiZ }zNkBn&:|EnO)d6@则`yKY[!6mMeϾ; 㮅}'~ij2$fY)b*|zx mČ㝩^@pquP r]4"6NC6@d*ݎHvN*CU#\][ID$a 1g8Yyp ')?s"-~Y шZCr8{7h]QS|neXqh |*pƺ7 :*gHcfdݡlf=m2KQ3 ĺUb>cB2l Տ?*X f9T [ϟ`^C *\ZypYR.`U- hkvYtolbl[g"%C%L(Z~C[J~AIIyj2!p=;F-S׶Q낢vop~(KnN}M \_ۛ4f~{z}Gfgxh"hn`\ik@qزEGn9Lc,FkeSD_e/3w+xܢ6gs;5r&0epF1lHv"m\?t`QQ AbWs( XbYՎ ͆c(^GmU{M`xe œϪ̝xᱟ,:<3i~|eXn>\MƊVs)x+N>C9؂w /Bi8~QmG/ݐsS/FiOdR*["׻%_3 )`?+0\K(eM_V '.25.LW?d Z}PxStx}J%QYG/{f5`K LY6l"L~#L3JNPJ2 RH/_~XW"_.)>/0O HW˜MBM4|l&Pp E489ᣍFG5cp+ $y1Uь1EH3 -d+QBtBʹV*Lf ]a)gn8 ۄےO@;^vsDH*܉I1fU*fjF$6np--+a3P"ݤJR['C".4w _ح[}Y`7,SKI)#BBIC ¾O k0 QaZ]5*LKT8fEiv ?xT8b(hŽZޯV]l0zn!n{#"6;\~H@']1sr)i(ɤL=u+i7hQ1픅"*,V2, GqF UtaA$ɫCF]zBO +$䎹$\H3 Gj ƟIx!hRkk2Y!7d7l;uࠕ|Z2ܤʠwqهїs"9~B ~%TvtIDP%Udzg緖t$ b@ #m[Od׀O "8hL~a1YxY(LցukY|3 vBu u3pI8RCk%ZTQ3gXúqV*FMCO OcxC%bh^91H6  u0kTD冫퉇V4-~8eHFOŭttbT5zMwp!6/'@.LT mrjG`.˝rׂzE۾rОo]¢{62Tk~,fO"V:䵱w5+ ]!'M^q ǀf6_hY h.pg (~5|=/&&#P`Pyq>ƈ`#{VDyhIJ Oyeq @u brh [1l޹lLz7 =d8,I%# Dq72X*MraJniGE[Arl.a@or變vq2$h*t Nz aL{ccGwL`=MvbW}=}O4I}jt_3=u+Bpـ3;r%tF7G:woópy r=$nHyt\숵TE+rְ,Y-a$j\c2aϹG >"4ڒt&;B+[2m$T )MG2mU q*4YFUHDvU:}5!QAҳVtޅc3ɡEH nH1VÊQcOrwш-Q}IebcJ6T' mYt2V>I Ww a(4'J܆DʨEl&cH{ʲBP#N[$ Rުn;Եw3hg+Hc ~oVkpXAd"H`HM\IDɄG#e@B/*bR¢US$lw M2 J]D"dRjp¥FJ=y~|šF+~?OGH!C S3X/Y$/mSDJ6W'X >u4|8x&Mv! .bȘtDHen݇paKF(mwܶ6>:/$gWkٖyhs/VRݵܒ6O 9FmшAظV8ysgwþi5tOi* %XAA5)iD_|ȴFM`y )sTJc6ltE`n`nv]{~^#%jמZu_Y߷Srw 'oGQS׮J|܄cvTU&O&] ֟ky]=SF/ZL{=o f?>Z=տY ?@}׽WVǍJjY i ~@S^Gm^+iͶ^Lw1|k9IX_σg/Vhhu]IhE={կ?d|Mdi:lOKߗ jj8 w\#y<.MuTI9P !P|t~]mf#I'9 |fgz13?w?12_1?y?1?=?\q{ӓ9+{ R f!E.ΥEܽRoi | {XK:ubIzXi` '? Lג1 MqRzx|4UU/\GQ5 wvZߖ9^6Oh>zGM}}\)̕%qytj joENݯR[oJ@WQ_VO&?XG $͗_|ij%DonK=XK7Y3=?<;?R`D~J_>Q_W53ŏϾ**Ͽ{I wk:g ]S=yvʋ{Bof^Z뮼quz޽b:uv=3x_}cڭŞ7b zHzvtN!$?_&kb~d⃸+$+&qp=Sr [֗.oK[5Qn@.|@#vUzq՞VcP_h]yQO:n.0)B=obnxܟŀU:*uoώ\$9E;e߁cDa:_ Kg?7n.Yvնڻ2Jg4adkٍ:~ٍ,jc?=_w;Ry巯fςγ_[ anާZ$̔>&an̎w,8uC0x}]߂$!{ B(TQ8땀g22V4Ebxez[᪏3MMc]򦼭8jh!'_ uHWuuaeձ"ubh5k$GXnz/ t\nP~cKe0~)7_ûf<ԍ.3c”"m˷LJͿSÅ95Nx5Nj2K]iR 8oNłnj#s4|}]uڡaNz٘}#GOc\s?z5bk&f?F9ḛYeVWK%̥VM7?Rz韛R\)y4V_՜??>sd6C$k}LqY5̔75sĔI3d)!ns%JrItfq {Eza爵GV{v:iJ;>G~Q#Z _ rwiN*g|uI {}W l%{Y5 O05Z)~l7X\;Kcwg[>| Hn۱>eؾѤL/dKaWNs4X)FyӍ{7`^X}G@6p-]Yו R`܊DI=4 1Ym)1djzK߇Iֺ_<$f'y$vy(^n_uGK +R/]`v:>#kceoeFvQ)Y긋7 %. r^.FWjSׯHץWf,R2u"p7{l2V%T<~_I  Nx˷V~qgoNN馇0vej_\rC!ޞCLjzOr$&wWxb]h @MjC?ky,[~9-ϲ9.^sqQ_9QFQH }f꛿?ɖFWϟH}e_ooK2bzXGh3|O36*m%@EOq<{:]Q^:.ygO:|A݂)qSGu/5&(LCe"u!F~֯Q*d嶹h϶~XFWajVKZ/ FMuW/nTp)kvۦKL̎r}[ƔD}qjpFviscS۞̶D8pvCV`%pY/ȭu-Z=[*+9VL.Bҙ"Ie$7;c,5󹒛7/5=0HmMmH2CdlAf[В5b4+tIL=kU 6Z7E*;IVa[͒/gGGFh\io矏G^uDA,=\@A]$-ɶ[n2 SEۓXml홦ccx_F/EI7Q?6}޿p~  +ޤAg -Ͼ~kKɻU4XX72mۀȼay{_co(,ouH L.Qs:i(sͫXc6m/S->Ͼ_ڗKwݷ=ml}.1wتY;lUŪ!jS,l[VeK1mʆp.N{+2N >n,Ɣ*Y32zI]gpyzKP^M^Ӗ<{96q,i{Z*v,ܦ[,>>{&̛bȫ0ۏǘ펽+l]MBO8'LH!2!RPcv3%PyƣD\wvDYsqY&c8̚]+7ؘlgsLG||7D/eu-oH}Y)`d"qSu8x=SHɨƒD. rx@w=&ͼe0oǚZ!A\C Sؿ'3?Nlz585'5iď&b/1qI&ٻ(W. TL[N~>$pX+۹ƕo9[E%=v]F-W7lp<֯n"Q(n@vKu3F~u8IȄ-aƳ=\ۃ:p@ r:aQ{1aCd\Gte0i4JpbC]z1ƣu^P34]o~n<3mT#nd›W~q[qH 6e'ֵx@)X33aNCx)ogo#v܀||knhh 7=x^_esL|&]~;G빱?zٗ8ǘ+8S[z/zfx5{(wmd$dk1>Sdwҷ"Zfn#'aP3'4ay -Տ~T8oǮ6'i>r95 H<ۯWrE_o~>;?NNWG)CVbeb_\25jx[F4$!~N3x,] XAer~}~I_iv|4e.^Kޢ5ɬdUǡg+g9q#OƟzs]yQn+fV%9[ZLUXujz$, ]= #aZCuG6X)K*x7/1+1OZE+/f# ~$ELݧC<\pAC{uC Tf n/ZZ~}\-pkmה⥝:%Wϱl aᆄMQ2:ʓ?re0OLzs#,Lsy |w[HF?TL/k^eseB/tc9*]ijV_}-ۍfڬS+ NR>ctat!k I,d(G֌d)g\XC8m :߬y͐:0}g6HGuǪ/yk};6(R׉ٸֈٴ2Y%ɻB`YysP"fjAnThû e)6%>@gU,ɩ/,UPRф˪,,U%x{|vbIi]wN@wyXŸ6.nVocs1~ ?BOeTs[::'k9_>w_aZ.h(7Zm\vVڒV2Rp^…? 1l/x[;f<'ר1u|KX7թ?zuϬu2B،7~]2 ?ɤS2 t1ܐ~HErYo/1]#J:p݋ B5OܾA61-7F|M `;ҘRk:/J&L__SI84%aBmhVmgJVoVq11Wo~~&2=Rz@kѻËߎzv(3|1q'WmI!/Cﷹ 2"2WCYϯw-?m\ȃW+?h @ pNnpWjn= 4į%3}گ`!ٮXDR{v܏qYQzދÛ$` kdȉ z<+tS[Su>Q9F&:B7> piq,lB# ЌQaF ZgHd(udАˆD!QJ[چߍ-m+F?>9~D*G'9EfsݝR^}Knҧ?vcblzV,o ՟G~.q|)ޝw?r%}q!4Pޔݻ`-~=RC3f!Cy{Ѫ"/K5Y۵ywޟl4FS.,YJEm}\.Ղtasl1l4}'sIWG_ڀ{{v6<~뢙s7BLxUOݱe kW0R&eR+S +[.WG^؟x0S`o_gn!,ض-o!^ xC6ա3-7l>ؼŸןܹ,eyDETZOåR_f4^]->c! fc:Gs/P>tfu6x?o:ey\w? qJUX\YKHlb av墥x3HwWI#zY+c 댵=n?gyKO+nc2$Z`fzƇӇ{{{pO*@bf}OG~5hlԁӱ&t7ug9iE{n!~4c/:UJ <%6co7uƍJc|G2b.k儿tvZUMV2??NZ'9w0wJ[eeߌ| 1|4j!`2=reU/keV#jy0F==Foy$GW+~J?VLW U<](|+OIg@NͿ}zqMC7d|wjs'ӯqn}~W~Yq}{\[[kkxR)_UnۗOYWmo[UmI:ZnoUl& k6}}^!^@0Գj5+Y4<6] kkkONO/> · -߱S֪Ó#a Q {<07+j?X2(T2]6--)Ix(>[3#< Z#=rd^\j\9x2r͓Y31_N9k3}/gfG;4pw5*Y5_ݢ3({~<^ 3}~>/OO<=_yg^իo^mfAD?qţ=]s-={{׵7(hc4hǼDZGrǩO}gySLNd k$5MX(1#,٥ӿdQ1:,?eCfE`Pu0#ioK߮}ƚ]^H/|t bD|F ^xQ"j"œS޿nF<ǟ3.RՒ(/v!˳U}/uy&ӭx ū߮y_7&:$\bAEr 8P?zMG# '*#߫)?3c(߫YR_xW˓^Q\>7l[ilmG<5G+L:ju-լ~ޢyf( y&2ѕ}}}O^9O;~vm_M( >>{ӧqxN:1~_zMʊm\ԂYL<˺Y}Po}+rPOT|N!uؠxu'^tc=;^uKt}ebAt槣O Ԥ5p$!ɕ'W62.Ƌ_9qejcP=cOKP$+ _/N:bv!dhzR#b( 2]o/E$mN`I0`\lf`~6,%gd\y>|Ίvm3P4KnWf-5W]N ],ufeuc pWtq>u٪u;j7tXsCPR69Yaac453Lve=\qg>?hmuv1EIwy'r_=\NU wӁ=\9R甏@QVǫʝ.RX*.};Ǿj|-^n^|>L0?t]s{tu?]ӯAiΟ,/ȍkxuuFE*3۰cDߟT7siLU<^?u_ .h__Ճppգyq#W]"7dȼ#FtfPr7y_mHC˳Ρ 't4tOSGuUAj!=ETK[%6^TݪbCךgsFϨڣ>cRp> ۤF WanǷ: c.ڜeyuxop=S٤pgv1lT"St׫tzZ Z4(ri?1~1)2;MrE 53 _#\9|&|Ȧ qе_t2] 7S3ҽ1?H^F.ceo"x%by/khgxgx4d4{i{rJ/Pb8;ߞU]Kz@$ϯ&?|sLj3lrb \tNEtIt.IKIt~$=F]څ1&ca0^cg*z'9F߯&/j1jE4곎䛱q5Qh~z+JH_zW?uz5ʙz>Cn@ywΪh85 QjsPcR2Ӗ_Oy d7"-Xiӊ\(zz (t;HzmRPlHViMY'm2E^+u҆  f;ס:s^ gEo^itꮽvwYu(S'ePY~ue ;ysJ0ݻ=Jj閘<"gy"cT|~+Q4l{jLș[->KbM. '+' \ūww&grq;.zrB.t~tۦ"j&wޟ8w6aojn8 n2R/6t\rmB5t>U]y]{ 6w7%a?/Ǟr}mWOO;*Az]@Em]{ڵR4ՙ^z|vvÛc,!z,g=|rb[X&x!" WjtO*0ҕӽ/S R;!4GWFh Ҋ& Wۢ4GX}?4֯A( kJ¾ڈּ)p@g OKx(ǫŸk Ÿm ~s6{KiIT^3V;y{|ī|;otiml$c0Q?|tF_GKD'K's'ѻwOoӞ˺{\wM~B-HH7{HҏЋ푢}xHR7s( JRs.eK'A%zqbѕ!N70<ؿALv i֤bPE]蛄bӱ݃F,F-C?9/<|A_O~rfKڑ4_~ˇl1e3_\4ͧkt\ W~:`7îS Hj4+T={I^_E(7kax>vA}cx2 aXYd`s005ǖ#ɤo'3;0p0;2Lzr-ᣄ< @P&J\3WBOfTT8 3(o1\ ]Wt_Hy!] w=p%agm]{(WEc!RoP|Gu~px&W3rJxŦxfnj\@$?ak|lz?e;Qߋ?r\ *[0םZx`oazt8qӫC7^m:N/ώO.>E<\%;g-EBiSj]>V4LjSvy?Q{I7lQpAmXƶV6׵K؀7U\6+eegౌ:?a?4z?8F4}CiO5;/N#M#>oT,ҟ\Aυy)_B+{G0mO1ώηuKֿ׿Q{g'JqK0{?i(FE Fտ '$#*~ZY:G-N^˗P]b/q%R!9 [UuQm>v@ .B}Iu3b꒻#/9Itj YOrxd.ק!؎O4ӷ:vċ>?Or\}߶v{30. AMjx Ƈr݁`-Ocă5?4/.]'MZrTK\%vkN_߮3/qio//=D1',V?cKiWwh;lv.mrl$Zkj_5ۿ@ƌӉʫڷ6O ԠMU5U ǰ111/[N~v"􉦣`݉ 60Ld-4xt3]x ֿUsIKgјkQk[09&-ksJTUֿ2opRW[X wE I'̲?1Yom/ggltOiC?IKW6ܿfdO?oUzc3N1vG?zoΟ#,7Mz٣ @"'I]ɿ/ra궟}>Vi7sI_?@eR`w1;V= EJs"U]+N_|pZ<;;:|w?B$aQD)T0I7;,~]:/zVvS{;UGoóWU߉o/d/ϖo|]][d/[y$G^%ZB|3O[n߅v2 NJ?/K$.8ZDsWM^i7IZoDz9}s)RͿϛó#4;ɡJ롕ܡ;ݮ4tH1,\])hR֘NT =K~o&Ve7hv}=HFI'$n\:%,y{%Gz֨>vQ=L2]3A]Sߺkc"е ~i+tOcloo9He&ĵHmFP86HZhjڈ>,5B'F!Jg[p(T+@ܞPvUZ p3΅(Ku&cuvaW *㓄@h'eKbYEѐPOxMJ=8 ooϏtH1q5(',T|cD).37Ѥ='ME=gMq\>\{+d?+v[ d N2K)ng[nrKpApw1o#\Y%樓Yv_$G^Zo͂)om=Rdů^ u'r,pQ:yW/[]zp!WO_w{X?Hcl[-Eǝ1OdG9{˖Vmz2nrn}]fhZ~^-76_e5xk21&,kh@~Xry[9);=99zs75dEHQqe~Gߤ_=XYnh Ќ]o9 F/˝ld7M̝\63ZPGcr}}5?GYsiRW}9d,W mcR!oMz3E+d7Nr-{-q+(dfxJjqdȘdQ-=lemkhfL-9)&񟬼f x}+s$džn|1Z1Jju׎1_t4eogx?St?㿏 ]2jxZpIO6no-GgmK?1wh9m_O远uMXUl7};-V7Mr9;I(G/:p?M枹 8z;]gxq :vCqȲ{PvU>p~+o|l~/n9I&KdoBG=]D *8r,{yXqs47/HfZ47iI^F ͝eyӸDŽ/}|~γ[c_-yOq4e_lg!Yn{bOWi Nr!@͆1vtv~44pJ벁hw1z2f` eLƆuWK\on&9;ͿPQL!'e}MoN:?:-S4v۷GoN?NS~z\to>/X}to;5?OdK` =KJpG1գ'-\t7+{#ħ݉ó(i5h?:~/3i| z3T:zghv>[~㓮O됝dT'\ju쥣 #Sũ2:*_OdJi6jOx$z}?$Gq;Wimg }&kjmI7kbIwo3~C9t&jnҷoLJt7}}k|ձBOa'o-UŬOr s?7.Pl,=zx]Fh:llI/{7\;>p3?EI&U;`*RF:[fU"qC']jLg#0H>Si-P1\RkЙ.]=kz0V^ߵXK!G#-~ia;7=VofcL?"~xC8ۣw8=9Ah@; w?$/@+uc0.Vכw5I!?P݇m,6#'4jX͞v&{;'$[aݰ:- I.~m|)0a xE<>+.:;Ii!+C:tCMCn".> 'w+Ju 2@¤"WgBԳu1dJo9cI/g#>t,8}1ݒl{ZDXH`[URBA[/S{N0`~i 2m'-+ϗmЙLY[Y{>tݺaqn1Nd7Jo(t,*JI9Vvf ߑQ7(;)WcBO:rI/{w+" K>T_~ŋf2dw_{>eeof_CzQm6ʛ 53Kϴt~9#}/YK,}5z,77W\ggcL{HV%k.s^aH'4 t3 hΨW ra\j_ur> O:r֪ql_\^D9{CؾɠajfcL?7rI9kI/{C_7C}?#`i_zt-tɣ/zK7 8l ZwdAvvtgP0i=l3 R;P<撳iTBBn,qTE :&vG %j>tg9#IDaC C7n,L {]o=B;v3vӵ u.@!vw]ǘb_9w# _8ߓ ϛg?OXl#ؕ]v7=_\gJ.F ̡X!'9wI/_ώ5?8=]sѩiĻ{csVIKӷ't^#$XxпC &@!&da9;Qsчw91m9$G^5D)CD+A7GVU{ScS~q_o D,  h\0]Pb1WU$۳ &"GvVo{P/u U0'!~vVJE`|[n bRK dChSCz. 3N졍>4u(jERl\wO&ar~'$ǢwmZj{wkh0&MYsi&MW.IP.YV:C*x>Tdi"#>_㟣7c99hT0 .& hb1~V.c\A򆮍.o#_2/.5,]˟.;O뿊՟_T#~r_Ͻkh+T_8c,8)RPLz/l=HHٳj)M*D,^k[P$1[ՋQN[6fk]S )4'97niUR:?k:f@0wcʮC&"Bw zZ ?KDz31&f b8Ui;5.l{V RntĒt:d< 2zwh ZVLKH< a;gpY0mGza:loa$ L%6w3 y'_fwI/{;G|[>VsI1??)󿘁$G^u?vSǃջ|1zk Www[!' $ǘ?=7rȷ򒌎6iTrm7%^G|eBM Оh;lNxG#\#۾wǎ10iׁsI&mY3n<+wbScPF/4w4^԰c5ӾUFD1}H1{p}1Y{۾J/ B^A]l>ɾKV列;ԏ俜Lr4e_)#&|3リA$'=V?Z35O~= }`gMK0%$XB6@qkr2 McZP3;Ѥ}5W}I>'(pkwzc Iit=WK{AB|~խIf>6>pr9'9`)[@tvNZu^ړH۫+/=6uvXT) ▄?2gocl/}?>f`", f_|v>?Ui):uܼclO_j'96) ⷩóo*? vYh˾l/cPo9IiľءhWD~|H,2z:w?Y2P͈(Am|s(Z!ݼGc?i!PԿ¯V&|-$}U2;]ιj;3\ևFaZN|k78i*Ͽ{gjo$G}˯V K3Gw_LG#aE$Xu~#ݯU_we;P$2UҕnU~Gթ ٺ bkv^͈$A23h̵p_z /=ӯU_J.~IWGJ3wQ. =[ldA[?Tyd`.:~w|{svyE/eWZzP9>9}a< sVV*6[SS~5Ѥ}4R싇~J+ ڥ㇇!/_lM<؍M=T þW{\k43,t0n?XI.=cW̃`:!o61&k~g\|8C Jo gcp)„_lI/{!3&v}tÀX,}˗ue\ы׹l/.]&n{\ۛ%׺lkdV;>jwh]ra$ej`ŻL]4RWnFZ?;cKɇ?p'?_5t)cW98S>owo2%/>8fq*9:e}w=E7ߧ;w:];=U&D/ݯqJʍρDja/CTדCS.26 7jiZzG7k g;FJi6*Ό$G<!I\gj:--]ᖮ6iqiqVxZ^KTt[s|-=Ku[[~kr`,SXhy^锡AZ ?kˆM_|ώ1.p+3E8Sc=~,_Ŝm#a`Gp;{5/ۑ;{^ -qc,jhF@???ӟ~tAC})> av|L9Oܧ|R>)>5W#uz/>‹TT6}c\H$4(tkoa4M*kwXK$<V$o)H(gNS]n)@2_#:$Gz3+9gglT=lZUmP# &[i/amvH҄6Y!Ui-KoALrui{=` m"=RVl=XCҫ5#L X1M::ځ_i;)DdP?I)!{YU-' vǙ!Ov|RF{_.wa#RPk|n~]>lIawh6llKKIaw?l?nM]sI=+?c)ߌ&9P1JolbXLܦ ~<ڥoY s$GzG=VyOr4#`lo_/w@X4.adMZōKQwg8S!pb9KI/{4SkIGyǎĒmGi;Y1,߶'ZuРl"J=d2RjE:j:+@ˆsu_ogI_Z'6/!=8Nʶ"ɀn"Ĥ-Ȯr#Ʀߒ1 {!$Vz1_N/1Ѥ}>c^cB =P]MzcLYif -ngw8:ez+k( H lyroqiE>- ѳXX?ݼ'9?9}+=yϏO:xE"Rf\T#nU"Z@ -ຍ؅ p{Vض.aJZjӟ|4^=TYRpNtV$ ?rgI&;8cNW[ AW:;ŧ_P]Q2MV;"pIv8OҧUlELR{BCPJIӨs[][SɁz<Ѥݯd7,< ?B +$B~`NJ?? Żٞ? c {JNU|ڻwevu.&&~:m_v3=}B }DV_}X9Uz~K7w -Mzٗ/:]_K[}モ^ u%X=琺+NJ?rOs1s9>y{U{Iix\/ג.^)anT(^))<2(i{ⱐNK1I/{t m߯%%)PK̭ Kek\>.滨qBi?B't ^P"Y'Tۡ'C)qm!oB+9JIONtΤ{DwRO`gB5!>fl>cmgI1__,B>Ei.7՚SfdnckC:I.+}nœH89ե⴪7 -霩"A>|jKGO.ĸNk[J^˘vduMz;+g|oŨ,3f=V?1&RI!h*>dc ;eY7^.T[ MOUH( JWG_6J!2je_d:Kpl7!87K{cI/ue=1T[zk# Â1 JexG%'NxѢ,fBW JJۦg+ErV33ٟ!{+z?nq0"=[B??2>|Lsvtv~ߦp0JTj^>P\GD;yVێ t:-ѽpfK2*=כ%̓.P:>T6nxt {6nFd~[c)Ѥ}e7)+!ҷ]f7wX!oI1]uW}۸yӟZ!򮯞li~R>+OTbOa' ~$1q'@c):/? #dwFbL._EJ(%vxn }:6n2]ǟwLɳ<2ŭjg"Nbt5XcMW_o{BOg?1&쿫=G>YEKm d{duCFFz(KZjcor>u22o'쥙JK׻H%/9j%_'''ΜQ3 55MD ?7|th1&x?c0/sI?9So/{. DWڀ TQ{jt:fwL#U#Q$-9&YgfA ݫmQo^#4<+Kj\uI/{Cʦl}W&P$#n_E}B`~-[9m禞mmUۿ~ˠt1eS.oӈ~<}A~<1Hs;I6V6?>…N\ޅYQv[_k, n&Wm0JQ7Bx?=Ѿ!7JgZe9iG_~g}[%3Y=|^vR>{Dsj&k^4m n~B{ Jim?}ۦD`8I+ |`ﱢ|߻4Tl[1}_X_X26y r:XXeN1Ѻo 3^\A繧,ɁV~^Ym~wX/|Ө ѮU>6Х%l^(^׋yNjkҳ{~i 3tJlmhxZ߫ZߋV.RAK>uF|h[cgK*~vH"l٩و- UY*%Mzt>x~[] &~CI׆<'ycR6}ib~B=C/ӬP?DZW8}UA1e^ujeLh FzM/_Sel! OӭQٻ \,MXqǜZ _;e?X7CgA[e!5E"-tӼДswǿȟ/ ﯥ%حwEH"_{!Rƅ{mgC#1u.qJ}5[Q2ͲK۲.^e6Yhg?WNe|K/`cKi'+ V7HɌ9 Isu>wd?9I"hs&RgVLK3?Khېq>|RBkEiudqiD~Zފ|rȓ~9>˺ihc@8֣.UƙGs*H(dX\^]kʼ.8~彘dk]^ |s瘜ρ@v<&ڋNp,h@ zqh n[e9T~E>4\ӄƈ "ۼPY_)YK-3^ettExM@=K<AN e>>-ed=z*Myy*2?c%Ӵz͠^;dA;k,V{Z7+.T~ Uf IMX:9 K9&5=&_t7ƥ}4Ö1JNCj;ԟPZx8k5~<]"яU2Jgg/i>yql\2ˁn IϢ[{I[ju1?@q)IZc3qlb2a* e譚M \,A2ڶ?Z}K烴w'`fGRy 6JF='EgHeLߺڂtAtmG>Kje[-{R3uL҄3F R!^x biβ}R;U2-`*D ϔUs"^L(s2?zG͜Yo3ן,\W8.&CٳhRϹD>OާI{\+ 8i+Vz(9e5$Z2w+3=J97[=o&yO `H2br;"7<*!W}6!Gn4Yʾ\1a2.t"mwcp^Ӽgdcr1}Ƣce΍v' #QBe]2].eusW}9ߒs^4l1R>Tv1|g$%9?5yrަ-2isc2faNzYVYv!#$At?A!U2W+G s&d}inRqS wqݭ3A[+-Qmbk2| )!G>?EUv%u"^Tr8WLmڼ~ϱ־_T{ ?_gy9cP'ue;ikY/;sYdy.n AfLαG}f9Le}6ڙ6#˰Am tL 6V/\ n>L[}g+ WO.Cn2&zC2Fh&(縅4DùOR8^I3IfljrAG nT51ϥMqϴz54>W<-۠Uy/a:帥ǚ" \u;fzfxs &g9uKC<>g 8ᤵf.T( r#&:l W;j`go8a@.*Y3+Hl63Al]+)x+ÒnDT>\frތۯGa~u8{YW|ZF\  *1>'-|܎L#qrqN<]d{P-b/oCƨgBY,ȟrmz/B=ܧXy:cZ%Bkm4ߩ\o+)u>KT+*"18~wq_dC9%Ηr]cdݳOK1>4ؾ@Q5J/'R#bξyNW%- d\֑i{,kq)c*.8omU\|uvOZօ?6t)3OU,ܷ3kʶR~9h{bCsFx9f\cؒUq^|֯/߯oƥ==-2/EesgvJve߷:1R$@;\ /cewnmlŎ\s$s1]a2pݟqJ1/7'\RY/AgnhC{:2s>=Uq?U.\И' x8]W3c,cY.{d-a'|xG#G\ɸDRFBƬ0T/Q ӺMU")ץNܤ}k\ol[?9$G^ubį_㿏_'s~]5toVhMZ8o+4c7|7S?:n_e~WM˓Gojrn|/ڽ)-w%n}8OoM_\WzwW߶Mm˛{־p_]Wn3WߦM͟mۖ?SΧMm͇r㰩ݴMϻ)tSkv7盚7- ٶ\ݶ>s*9Sϩ`E9l7oT9l? s*{ͩ`Sv}SƱSvgNTa<.ЍU$[>f1nݧG >|?DI:} y, ;WóÓ7}[^s8vݐaKDwȗv\-~ܻ!Zyϥ웳k#_RܳMhL?2s[:GBitU6ݟzmEutM?qSwSYn}_M̯iyr[uM3wUM7וE~>U7%%{޶M^7<ۖ)yyS}ykrM]rtޔugut4:z0|z]U.^w6y7%nj~M|S]5ۖۖsgY=bܯ9 pEsfYϚ'<3gN,InY㺛2g,7eܯ9 "0g^ s~,i/9 p?g,œ_ws],KkڙǍ+?NW^Scb?0|r|q|ߎ\5])axjq]^iR<֓#_?*+m0J8Gʥįq7GbY$"MlL-OZ+ M+Bz!hѮ鋘Gxlh) (C_QD/!(3|)cˮh_y!H!5کr鹄qe@"A {1DpRd#?: ֨$^.HuR:Bi-=nDK#!I6@pveZ FyG)c1'աV"7JP`쨣 A:s>?\ feHWy<4YSIDySbʳX8Y΀[-ؚRVC˺ 6@NkETr g JyogBCZ^q̵BBI7--"]l8 m{ٴ&U[-=|0.T.Kݦɯ5( <'giKǪfmHm ~0. D GVA[ xJLb00 txAۇLR'M—@KǗ:Xt$. π,POz8Zrҫpp.֑"v yj*6 G2?, Xye:|1ºr^B n:X*6O=yV`Rrk|&L?1hIL L#xKLj%mi ]a m7Y2E{=>fy`dATO:Q{  0O:-Ki+]ʸ*[k`B;$)tO˔89rM^F[1e-ݶL$Y{@ƕZAےٲG,-Z$[@1{.!y5©k\P;hئպ yҎNFa@g$e5!M~zQJ|+uے+Rr4f@ Xrn#0|jǔv kGC޾q4D|;nؘs-uMzڶ}43E N\Z&OQQ؁+4~N1ReIjVϴh-~UBEGEBX, p>,"~aR[Q5N4<%]X Jc ڲ rdd@ Z!=7;ǀ^wL(=~ɚE{!Emp@d۫R~MmA[ED|A( I #mG0~JmAt\VP-2PHCI;(@|{& 8b@>l Z=Toҽ5aBv*cD|8l⒞!g4,OZ? *?~wHSHf3ub()vp_u 6`{\`{ C=L/-[k,0PMr]#_P| u**V߁$cX&vKHC)HR$\wԠ4`$7@([m ɏ,V$g@hsxhIѦ]9)S-4?C/ &U9st[-0pb v[Ornc3F& !޷:(qItmZ4@L~ c|;P|&<cBښ2I,#n'Nvmmqo(Fڲ Ӈ"颵 Nx0@|Gr@NЅn6[&OVE3 +8PF?҇rLY0-c 2Yj#96/`LnZ9Wņ"ˈ9lj/KlL<1i|Ю*Z8GP&<ŧ¬2&r"DVuZ)EY^ 9Ws-]/ì3OTu$4 :$ |Kr)A8{6qi‘L~ /F8Tp֦ Gr 'Tk5Z05N( z( ۀhU^/6 5xi_vWfii[ZqD T|L=6[s1~o"WTWZo"ſQ\|3 H0&L FqJ  ,yO++t g7f,-J<UP)!(J-m i&7ȣ~Ek"c{f`pi$,~9Q҆ %t\C %Uxd;q/KtvnL&34r8speEC Չet %T u  ش$O+V*%F^aqPp[81V2:O.xUuHZ5dC5P\ me4N"1yX MP005Rƕmctx@#*8-G[ ۢ{J8'V@c,eq=(NG i5 ;8@o_Q;F9ePD(p J,> zŢh~[ ⢻K$-gIb4COnʹ6:T1pE3| Nn=S부ixF5x-M0m]y6=*`- Khl !K`ZfK wLu|1֜*Ψ[V$XXPH2Hs%v_ԦWŤ6²Wإ/B9kٛC-/t<ڇ:\y*2HoG$FC /D2tzMK{Ū3FH-GSJ <@硲H NϠ䫽Atz[Rg$L4uK"Z;p-nA@W96fUP/h9e"QS`[V X8 k.&m[J"yy ),aZ8-#.٘J$hE 0$,$Ŋ[ Bgs <mZ(d@pO_cf=-k4,t pPǮD5;z+r h!\H1<VxԳg%-3Uc7%//.EQUZytV(1kEQhmY5i9=H3@ѷ<Di' `hn7`0p< 4dSd,*MDۜ%|7i_I'b"( & ,&(c+y7ߖnz5((bHw`^H(SsgKi%{-R$l%EL̶h@EGAZ$\re;F}G'N+׸f=%.~ S%QjE "=Q 4 nUHڭ!evS665 Hb3a0pbVe&,>kJ'eQGWkG.!²i(=°!Č"XS{L"0Wmۖl(r*8_)b(1g^Y,ȅ4tY/SD&.h&fK ba.*,)IVLЉBXeZ)(%&Qf"T1fXõI1 ~9Z&p`I5(OAC@zzh+XkBנJmo j9UbuUr`l./E[ed!-Qn131֗\&MJmS=b*gk$>c(a+üAUh8`ײB ߖ?m F# d/Q%Ľ,*j?8>j8í+] bA$e} c<{GY8p^4qą*)ZA--9:GڊR'R!p*Ļ0.I{lR1L1=CZj:Z8M VL%XQkF}Ku[a<.BayFOaO S\KjC[+͓$d#9oib P0E8򸣗S^6) `XEQm>Xr`F}n$*Iced2\xێ2)b`Z*B:%`PoYF74xD=Shfs Ʊ1ERnH#dbM]uEָű~Kh@VmM|̏Sr=;<{|*:XI=?)QW%^=Yy"e.mtd )l˗zLV"EEAN)H Q8OaQYC)PU

D#J;+5+Di5<:W~J⃇d* DD r(l8)pR9) w>$P{b^GrA tbR'hFSiD6ߒ y5Ă!n=WIZ|7m%٘F#Wv+auWLCR~XUniʷ]j`{0f|R' f6 YXD*#ҟ0l)`;\Y ő eVhqcl8b+IWGBISH8+1Z,dܢJ©h$G4>ۀ9wAY*h08  <`Γ+p)a)2m' IVS4%|Y *P/]HIxp?Ƹ x\"amk$Fa}%$ Ef"m ҈MKRE,OxIT Nבu2?er\sÍeĢz SPurC8;J£-▸!+V 6q*.ٔ)(M"J' :pEdT UYC-w11mkZQyX7F|˼]`#rfGZr+1 L%sൎ%^E4*֧ÓK1MK#e2䨐\l#h,)jc@FNK+9mb(9]ƢxnʪD"-7mMƜl?M'+C3[J$0 "U<۴#yU24I☔wmSJ,V`p Oz'&ԍZA#C阍5S$Ah5ŐxYpKP>$O|E`I.y%7kTui}t}+o'9y< >Ȳ $-F0*֑\J9ξ@x_(ʪ.bvBEK),oy1AqV"v(p!$Q<(B-{O%Bw\4CkBy]FnZ-*!fuc[VU3L61֔2+@·Sil靴U^8x/8Zyhup({ъ2@̘+UUMè[: bNJ@d fev{6>me"`уY`sHnA76 J$YHobn1<}GVFv$l>J>%L\dl:]a0Z2O*.:Z 0 q:*e/O B1,mgj rŬ loUb ؔ>' J#&ᠾzԒ- ТtOTydQJ:迼ۇq'<+aK?fl@u(%P/{ɒg[w#' GT"H.a8ĺ/Pm!3)6#1AOU%=l+-X7/X%嘈;]ڮ2mАƣ}9\jOMZUI-QJΰ@ MFb.e1}CE!,yx gq2 g}Y#]FZULazAjRF??rH J-`zZXیHت$YրUGTP'{8HSE!`y dҜǃ CR Чvt,\j>b%nE(2[$ R_$#f3eRHrda %)(&ˉrⓩgUId Om=B̯ͪ3s $-t-m~ʽ?-{>wG=|뻣sЏΎηszg"j'`Z+Ԉ~iMџ&?xi7_zyNF힜oNn.u8~yWZ ?83{|qtvxq|zr M?׼9=~98j~9;|{|trqi'owAv~ߜt|F _NKӄv~CyQ'PX3??s7~g<<$0 7~462VwRx&Rӄ;!/^NZP:H=, ;jl+Rou''R=vVu'u%Xzm,mi&[sU Swhef)mm XJNF6q,&Mv-b"ƊԓO{o/s_&J_Q+=)&%GDR(GboE:݋lwcw+/:TDRUtqes*ab.{SzT.+?OcQPzRV)b;8=ǔ ,* ~)$]]r#ixU8v !B >) Ғ(eV60x(ADB!uMkY >4F!ȇSl#1Xŕ`СoS j ́K\8,0 <>,؆H"d6,=HYth*m 4RulNi<UoZ sF;B1NX☴t18dAʗ兼",1D!9R6FFWZ+5QZOͰT(]RÔ qYUdfE)W&nٔBbɽ7C,XS֨!mcx e.Fy|jB9ҡjf t4iUq6ux&Y1\8YmE"wM – ɠA*%29!j5nS 1=[b>[3(!s$iwc:sEIH'T&A:f-*!t-Ϯm GR(Dkҷ$MS@TQ:V!(uG> 2ժ*^2,;v,EU3N^* 2wim**:!|P[NI_< +x HX}!"s|\ qgpmB^8/.<M 3U$,gئLw8pgeE%ϥɯ5,a7-7#hx) ZCҼ:H)nنE%`a)[^rBJV)RH)!%`ˤ%<d 4р(œdYfՊ|ROHW)mHXN4Uܨ1gkZG$_yF%+2J8e,U0覃dVmɕCe϶&&5,w<1h2OʉXCFW-XQgy<{f&Ѫ*3GT$O/Dl)u2!'p#W3  |:WrSWekKHZ0L S4H@ O*ږ(Yg*3&/eQ;G"XL-ڂP, !>pRId1 %$=FZ%ڀ0q\0&,fË0WT><[d -XoV$L-\Cmfh׊M@PK KN3ځZҴ{h^ SpT7Rb~ 9x@6mIsl@qs&qIi<^ZVTF$#Pf@橿qZHԐib{ :I oE5̿#b)Ap:O FmQb~jDJA*cAr[Ĩ,F-Ғbcj_S< OB3aX[Baj<*rTA0+ w7MO-[؋ -{/X"t.@hr>,4,wE2l!E"+x\\y*DƜlciM$_pEmQq8"[,Vfr/ɱRfË/幎PӎPs"2궒1fB ,cGva=EͲژI1ɘADp@p(Jc mDv хj@I>g"A.P԰,BĖHց&'q}<{%M'xE>)He;CŋG t֖+4D˓ta@YrNT*,N[֭m) 0>+/*׎盧,wm 1) q qLZ#5"6= I% Dtϋ=)T4_ȴŰ諐)/NB1ge ==);v bFE#=2O@b=R[\((R剭.Ig )b"j.&KV71-K/M)fAZtVD/򴴣˔ػ7 c{9R!DWlRNK\/dzS"ޘ"(SjHDHI:^Ԣ$]D$ ;ދcNVpIAxMVUN¡&h\/u{u.  9ZC"ln/ʖ qsUrrUEsIU% uæ%9O[*&G@3 >Eixp {*ᄚ'ٽϤ[Vz1WUmmNvcXHT@(KꌆWC(K*dQF|q'hɓ.1:D_nx"ImY" eٍn5  Obn|$9Vlp-A'̸$QAF͓NZUBPY0>4$n L& gހQPW>  d 8T*V A2]1Ue +Y^taqaF;+cx-m# "R 780chQ$/c*iӘfS >HQ<ʮ"@I~-X½-6YF8|8~a]b{%`J^/F_9#'Zħ](}/r-3`J \Ii+tb%PT AHi'K𰋾kOGBx"aQdcUU292^e9f"m.ph.&QĴ΁\[2MN8SF\Zb訉$A,_F xb ,Zŋ^ °@ (Wy^МE"-<y;ĸ-E $>0UykmJ`6O*JU%qJMiGh;>-ʦM 1#Au[0iq\v  3@U5a|ĩ+bQMl4P@,E$MBܰWH#LFN.U\.BIM$BeCF} r<:&.HctGd&J$5q5wԳz`iQfÍ*9׎(`GuZ k2\Z67t[ca|Y^7 _sE?%d5+e4N!7oxE>J xFiXM-Ԣ2gBBny3}/89Tn匀C;ypiĪM&:4ulGB0ފL9FlBj<$!)\+_*xbT% n_NԴBHD0*V")).YO) 5]ST\_k8re 4(6ftnql *#z g #O+S$\yQG{e p[81V]E1Revhk(*ɣŲd޶2{<{|bu,DԄ0>2Ј NI xm/Fr6cqcApl&a(x̄=Ծ|EAxHXA)++ٳ󲺴I-occqLqTs%cbERM4 0wU \&hk-g;R)xuV2nZQ <9zjYЕG*RS٣b\}FPr-TӲ^b0oT e1b>:ߢROc͑ߕG [nyXET,c%5 xJIݱB}WkdcNbIa+ciVIR_[K~Ҟr>:2qRJQCB*00V{ Ҁs <mZXo 1fJ4JFy|a16].4<)Ж;zT~+r h! 3cx0P:rk%97"SL5Tī,YC, p.4U&zGQLJږQÑUETuw\EuPHj C.M)X^M.2y y, |mb9LR"K#lγ@6)"$ -8貐hYP"Ny|[ Wrvѽ[PRH8^PD*|YK/Mb b>p׮8֑YAhfyR(@+R*X1Y7 Ӌ-[x?R#^UCx?PܶJ!~ o*yʡOl|fbpKLe5DCuU!D{^y, O*CE6O);ݣ#T,&.LUj3x+ZΏEOp=!R)Cܝ2lZ6cEPӶ%!k`Z.A![BapxţnKh/FIFSdi\dgr4Z)F$M<A+_IEJ/A:Z 7t_] .fn9fiT:rha1;Obl1w{¡rl^s$+qw4Jl_ 43 DIlbA:&my.(UFJF#ndEM DžܹD7BBGq>/"b1g ST%;E[Dv* a(1c[u*ſ5O/)%/(Nbg50F OM-H8;(=f[QGx?@ FDu!(#ZyBX3BGZl)92@򴤌ȘLKxVggrPJVEs󹧬%-2 <ӳ1xt˽*ՋGK^О~[ ($X< IWmм~)B9qF1 )طȴ  GVT8cgJvxz!nrVK(bCe$r){"[D7pDh9mMrEIlE Wr8T352?v H8CZ+N dD"~0VSJI.Q QYxH1< )wX8eP E3zd2T?ԙI <7J 2 "&#]UqW"([HeQ~ 8$'M[QL.-2 9Vc '`:DRwܧCYB[= y($3絆wPYoVúBҔ0XZzE Bw)"BB˨í^qW CwC4z Z8Bt Ց%S<$Sҫ D2:W(l8)pR9) w>$P{ ^GrA t !{Bl$76Ad-IWr"y%s=N2Hݰ$o(4 t X ۴;Qb7u\h)|]ˣ 6)b[8YEԭ4a"R!gٳQBr %O)#,Vl|WhIJ^ &-2SHh|SsRU6$3`&qZ=' 'Th5x1'W$*SrRdNhYbcY5$8hJ zFU8Czdma߀*ֶ=Aon׋]J³ UDkL \:l1DJ]KH&OQPQԔ@Yg8XH1[4$=WR=-]J# ]6-xBj%g&]8QD@ⶆ\7pB+9rv!<7iBkKUOzEd\A㻉a5eQӧripC*Grd#VK$r1 K~EFG@:T`9b1(@,x‡% .B^+:V&v$<|IhC~cH BDaU6Ӵ4LHzKm]Sh$BU%stiJ>lQ%$0%u&7jMSga&kZ߶ ش$UN>,(yY'SP-X`j>'9h[F,0UW,?4)|- sDC[XKSZ-ąPBgSjh$kKȘƼ(}Q%TIf1Uه4YkEa5W-v [qVQI[元G/ 1mq!]?"( !l!ˌ\QՔ<:Pl,]ߜ -ƳZ1.at# PK*! 2Sc)K)hW 0i1=k.cpݖo2rRs@6{@dSTYfgRvĺyyd~vL'oJ`ݮ<2 _rK$h%KGKHV0n&x'=JJ⓿4;PUbö?ڂeqʊ+]^Xߥ*f )k<oCŬLѤUEzԒQH 0ܴHjTk.b[nx7T|<"GX yv1)p֗UQ0e]\UI6$&ei-Ɋ;־HY4͎Jo XD E@y/$>^ אAJ&x< *J {=d, }Z*lG'_r5*V^*`0O"E@N(E2b6S/,-@Z[b.=h(7*>zV՞ATHЖ#ڬ:8IBR۶ |woN/|;: x|;׍|I?{|6Q_ȟmS#sLJóoWwpzr4E&>xW|ы~xw;;ͳ?zuМ4G=h~>;}_WiE|q|rQ'gӟ54{~8|wOp@4Btts//OOΛ?%o>,]-_7?Fy_NK9?}!2BM? a$ I *jѣ jŬ+ {lG hM?HRJOm>nMT+dxwWHZR{LQh0Bhakg}w˯pIaʤ'_ZN00.vi0§]ib9b!ӽ2=Ӊ0'A5WҜd^CcN ]ܩ|nknGb g?mϞ|}ϢCB}/$ '4'o''Ogg7i _ߟcԗ7:>9:۠+6WGϏ`\:qivtt|{ݚOQ7ћ#Xœ&+ZF2QЗuǛͻӏeGѿN130^wf pAfߞ~)sɻb}7S/s'9:!P|gd:-=!z.nS'.Nv..ſzyߎ\ľQR7qahc=$)7NۡѠvߖ@[G.s{zzx0E {>vhzgZi!һ;-5Gg+n}rzѼ?;;#y}~2O /g2|H՟hқ^*ڈmd ;z?/i0a+k}W?)L=?WS%7 =4g8_MËox{v^r{v9/&%+R;A;'o}xKh/=}g|&4>v?o%em*!P(h'~t/k#Iֆu;^4cf״m8u6Agzwx!UR.%O9==^ǝSx|U -|q &_f)˦ yQG!ԧ%Rxn(=2+bM0}6!Z;Qg俣?|kAlD8G x D!"A"BF2$AH1b4j)4jihiӨ-Q[L-Q[|kAdZ׺y "rlb;Pl C o[w7xA ċ^AE{Ab?؏ b?p*ȫ"* ⺓&Z|F|N;zcȷ$N !#C8 ,EbFb "(8"(@ Fo#6xKLݎfv4SiF ւ(v݉e-N1[ "u'&AlFbAL"I1!I1"*"*"BEDTUDDTUѸ؍n4.vi\D ւL{ɷ>Aǐo-ם\CL#)AL#i؊ "b "AlG6AlGE"xA ċ2xA ^e؉ v"b v"SSSAAAAAABDxWQ)^ExUTWnAn "b/#b/@ Do"7&x f,E3E6xA ⭇Qs9EԜSD)Bs9EԜ"jNA)9~AGA 8  8QSEԩ:UD*B08  08 ѸѸѸ4.D4.Dtֲu񩳈O1[ NCL#)AL#i؍ v#b v#]#A xAE{AE{b?؏ #}؏ AqADqA7ěM DoaqAFqAY1 fČ fCSEԩ"TA*NSE#"Q#"jN5SPs9EhNBDm!-D"j(8 (8 qqAqq!d#2Q#2f2f2f LF*NQJTu *i&i&i&ih0d4.d4.d4.$  ƅi&i&4Qs9uԜSGͩCsOD> !C> my &&G@6|+؊ "-؊ vAlGAlhϣϣG=G=G=SQGET"*EA(RNEpݩ <;xǐo-;5CAlV #b;&b;@ ^F/#2x v"b'!b'@ ^E"W*x N"$8!C7z!C۹<=fIfDbALbAE8 gxC@?|kAu:A 6#b3$"h;W G ւvӔ"W*x ^G#kxAnAn "b/#b/@DAq@A8 " "qAG1AGg99@D'IqB'ĉs(:<0zcȷԨםJ$Ab3، 6#M، 4bAL" AL"PQETTUDQETT*I"Q$Q:"Rǐo-蕯;ssB9ssUdUdUdBDD‡Hp H1[ N AB dP TBE".Qr.Jǐo-(;e}A^ #b?'b?@DAq@AxA DoM&@FaqH#baY/ ċ<"1[ CL" AL"IFbAL bALVAlE[Alb;؎ b;/#%A ^b'؉ vb' ?E?E?E?Ougob!!9!ZMYwv*bALbAL4FbJb v#b7%b7@E{^G{Dt<)ՈHFDJ5jDT#RDtn&s3Af":7DAqAAq!s3LйD87jT{d#IGF=rA"Y1 f1 f֝%8 A 88 #c8 =QTGQ)GQ)B)8(j#j-0 =[|F|&|cȷ̹֝iBgϤ |`Lovf'ěDI>$Nh7s>Z0;[w&ha b;|vlFsd3#٤9͑'"5'9HIԜDPs#5A ^iԍhnD3ufF4S7D2j Q[x=2[O*$dtZzhtL^4JPm(A@*ȶ*Hl @jm@Q6P T[(jL57MipQ*@{!k녌z!kB B r w`6=f4JPxId%L= `:x`FL>4S3Z5M3[HPyq7Έo5;,v=@c/'pL+ψV53O+hʳFZyfM@も/5и(A h\PfD5Ns fqA?k$gZQ3}fb{FĶOPL+ψV53OHFRwf5@㢊/5cHd͈V53O'щF:bdmIdInl&4gDh MIM&II6N&ǁlƁlO&6$M&8oDֈQ76b>qy$ _D j~YۖqYϷ<@$ _D jQEj!A m(4ơ^h>'[ P4ZHP3gMN-$ly^Vj!A `Q j/=@8,Bh}ZHPxqdN<@#Fi!A@o8HeZHP-TK jвX YڤUI]H j -$(YYB+8-$^O5]иZHPKY5и ZHP8$Y5cHYHP4d}N<@z@g!AQQYU,$lzDVg!A `9 WAUAQTCMCf!A5⤭'ԈF*Lڪ0*L6,B*-URU*L۪0*Lu0t0,$yiViۏqM`ql%mmIۦ%mqIv<2kx3=@#@e!AS S+ j<Ѫ,$L=@#J6e!A `4RdQ=@#Jd!A hTɚ,$xf/ kɒ,$(AiXB4" jS8Ȇ,$z,Bh\P~,$(z!nf0B]kΙ3s&ˁ8h89h;gt$ϙWdm,Yd"< `%l:(AG jGGm%8ڌ|,JP@/ :YekeB:ty& ;ӉߙF,$/` `$JP ~.4ZOPA A3KO'Ghtݼ>tFp Ι97glМ)rfZM9'g,0)xE4 B e#e7ќ>y.&hNyb$\tq7N ZH7E m8n&DPR4ߝ0ё;9;nv7ZaYw sd;{tG{yA,y*'Pǥyfg5tONRaܩ;\3/ߜzmu[Sh,?{ˤH/Cy2Q!Z*}(Z*_-S~mݻF[MHf!>2퓅ɖi<ϗIo={eoˤeOC2BeoˤҿX&ː2wBeLW!e҇Y,3>0ފ%:Z~ ok{Z~/1׺ɵ8vHxC7[ւUk;Nh{Z /^yZαO)4D{ujq~W{?V ҿ_,~/_8'ujAW<(3]N-N/OuPjqhoC Ӈ qg>{OOBN;_i;rNwGуKE>E>|-;_ ]r)K $i݉eIKH_.Yq;qB.YH;g!d;q"w.~~z3~KN޶DÐ~zKN~DxRsH˟u'X\"}X2 g1?KfNDОr=2i; c'!Uh ]F^+u'1^"^H<O!a=z\0_>L}udq~!܏{O$Ӈ/3> -#uCֽB%{!ӿ Ǻ8~!z{ ^/OˎucqIHxLz\^nc{Nk%ҿ ʗH//3ƺ;z_"AHp= e]ź;_"!B9Xwӻs<(󏖑;9~|q&ֽt I{ ӫ~zhz޹X^"W! G˜_8?!q{Sz\0_H8 ;~x~)z\~+_;w ޳/Cs&,NSHP^\!{OB{ sc=,O.9)XwQˤ?Hob 5r`- ;eK? G-*,HO I'~-~;^~7'.y(yXIғ] =J_CCo~x1ɲсԄ,M_)i5+ɅI%|wts{z$ӎt{W>sH_6v^o%/7v*acPW_aؼ Ij9ge oߑl~ߪZKEY֐륊>to:|cR6^B?ܚ>%GϓI>^_tvl*TtZi _$|`̥4տ+3qgR2u2IzT)`Ԃ/*9ʿF~Cזif>WBv73}_I??}]lB BؔEi|q$BV0J$$ TCbLaeSj WT)Rغ,/$hZ.eaKB?= 6}V 7CA;2Zʨq'qxE}ZȴN/!iYIOa;v!ZC%y*,Czml!>|]YhRqc(>yuu!]=2W-'tYev JX"![S^4EiHi%Jl0Fێ# jP͸FCʼnn+,,~ɫnsZXJWE6+塵[_,SR@k+Ŷ۳y㾶$Za[++@ 4Hᇗpo:A4[MS7X\5͛6{z=>,; mV?\? םCiԭ!_bva-w$)u)N fBҰFUpA/se6а'ۚO-Y`]_'?]'MbJy)1Lv#yuIog2X~nur 3|xeEU^;JG&^±W%`_>-a6"?mg\ _GHZw۟_&^Kn̟͓f?M?{m*B .R:Jhҥi}0*Ւ9b*y’6&J$b#8#K', N Y NC^<=aAKn6cuo"E0Dc3_󿗐,  s}zۧ `D6Αӌ1Ebéqav?+2ƹ,2VgoƿUmԧW濔#`_*S@^J^+-X#TIoȶHSmU@UڷY?cM?d(c#$- @EG74-H0122DJoNa$osO*l"x'XgQN -(qAR4MI+@iA'LJ̖$i$\5\,ws2.(IF׊LEd!Fr2ŧղ_-sB\Ѭjmml}L yDLQdfؾЮH[xj766$#*I3J l>%+CZ#Z<ԦVJJՌ%Byk!V$W*̰!ʹ X+BT&r8,E@L$) eY)ɖtNR"@Xk{.f=ǁhsg=Z+Bxm"i5Df5 ^ڇZs~k2*SȘ_zkf 7{俜?{ ם_Op5MÿU^UhV43"i7:ڧ%V-8o+t}B5/Kl">^%6ke`9 Bgd )U1VEJ4cw?Z)b5f ?G~osuxQOݘ?<'֝gq7Tɟ+Ý^Y'[ڋnnwFf,8B 9B @pel`&F}N8 C!. X.IK. gE t7P̄2'IM| [|MrSiX;i_kK+N)\B_SӇç[4<{{@^ϒӏ4i9+́CQuKr{ӛԿ^?X/%/7Irz=(u!ܬw3 "6u}?!^a1'fHS,xh)t?AB_"%xz}{~zqgӋ5?F'9{ vp Yp$&FPϹI"| HĊ8}>osכgИfj}|wߟ_܂ 9=YsggyuߓO o'4xl).6dN ҂TݍNB R:y.IQC<#KqF <:8>Of,uƻ\H^8t&U^ >gR j7$^ ^FYDѷ7ֵ_ _/!nz'% ~@!A,1, ~F cƞsyR0{c'l%27~~v{0l-sOT5MR82.:\ ߬9H0o]Esİ:,Otӻ\k.]x1`?rW1wΪ(NskDnsIϝA s>sHiϹFxY`9趛3Qw6`@01dW`rvuVӇ_Ve/0wpx6yC;{uoV*[rQ o :o6{&/Bcksɟ8Z;ڀXw3ka]Fb̹3M yU TW A; e>1&3ǟ_ng $55 bG̟Voe>~ \|v^0bq*%//BQֆeߛ+?%[o$fDy {s+ʝY`?!=`z=֥pȨj Ir *A:ZN(Wm.,Wt2q#+<⦴ Rsw}q{5ڣ[Tбv  a% vfRg9]5݄̹Y%S(yR)Ѹ'Y-qƀ~jܰDrSa[*5;iޔaMW#KɄa3XJA͢^YJ`X,ភҺpī2d'Q*(BFViBe|>5ָsr0U՗Yߜ'^PL6N';/ o ~XER#fU_ey[Y.&mmQY!ict(t̔5 *_3M* wRؾ:8\0Sݝ9+-,HU0\QnRcO2 ,%/vZS%'M^~ A4LHPaOn%gD.|_ZC ʝ;<@9Lazý+[ȴ`dI9PijqSaO'}b_($h +?3D׆؇1P6Iy ,3#/pq^:{><{z/'q^:CPC$1U.*Dy`g/T2(oyGGM68/t;[yW!^B/p0֒I"M67p5tEN_q푠=_hK/!^j?o.txߺY-JIIaB @mYaNΗ:rx ,pDf:s^Xl'rg_|Q =t,_/mx>6$)ue 0]2;5\Y<Jb{!7˅x(1P i\ jBZVxDHLG=(FHVt'f, ukhiC̨̿X?Tְi,xFJ9#Gֲ@s:Н\gr4#\J7 ߄YNa&?^Bݺє,q#I7~bu.& bŠpRQzr:2jïmsg[PYS%ߛ 0{mm_7n^&y7]_}?x4KQiTY#CZ)CJ"b`K'Rq`n &,9C"pYsgr/@sRwl-r++wm\PXhBeX9,2Hδ*gWѝ h༛<+hfĩr9֦(e+{s`8EJ;As(,?mjV^u /,5FN&+k,m{}ߟ0I.qy)jW`&R+N \89[X\JHF62ՏxRz,,.E4$ZEץDm)Q_@O\)L Ćв{Ż_O$ggWq|`JK%=]i$Ÿ~q+BQ%NwUJG(,u%ӊk 38nQ陷2 sN5qɘA޲wr*]Ou%eWg{EyWTK^XUVJrn,w`|֙*s[C33Vz;k+eWx+RrꔶqtFUV%Vԃ#߃G y6b߃#߃#dQߠL||&؃ʣ7a|&GdQׂ?x=g(1iŭkerrvzyuy7qZH In ґgnn{UrÓ9:iB@ejhR@>Y2nѺS ^n( t!n0ƭVp/*VL+|Fq׌W,sxT:1~';Sjz v߷ ӥKi]7*/A!BfNOA@O362{*4%CXqՍz~氶A7oif_(NY`%\"#Uą&Rդ`FnFtrZV j3Va:'+DNiEO,Z5r0l&y)Vi^.F+z|bpMmfO&r%;Cӷ:o5o)$- @>!r6o4{WpSg(*r+CEdU0}/paFfQppf9@r >>)RR%Z*7D `f,ruPfdO (6l0( }3-5 SF)3CB2苕r!$Z(]L`!WYTEF"3kJץaPT 3ua( \LrΥkd櫨 Lю)UZB"f6hEa\=3]hgZط#ǁ fI ´z^ f4P&5K,3[I(/ܵ  `ML%@Q7לd +%xk6PA"/.M硊=b`ZC(T3є Bkef/ ę64[i^C^e)3Ѧ:qgpDh_ B^%o!7 ў_Yp;ѼɅ6,Da2)%(A+W,3N %'`Y/237ˌ4?h="sS,mʐS16Ύath,gf4P>U, 1Bf/7JfFgnkWÑBf L뒅hrB;<iD\xAgZ˪Ye/~YZ.٬?hYPpfFs`&YW^+4j>[%TUW#z ͋=AXAl!hmXx`J>XZ䨖a R@Ϭf:b:̐OC7/PSSHƴY֐wbQxY,/mΐXG̚m^iʭ$,&|KIiD12Qf0[B-Y6 3$H.rC>l9!@PeР&E7=hvL$!M3f9 pyj6h*&`!;tDH0=bI5j0ljx ph  ͟Æ`O)e:LĤa"& q0DcA1@=JR.K3u4^70u3kPdfD,D+ʵ k df>P,3mĈ;1=jHL|~jW̊Amf#J0ngg901qY9fp~7x /u0aZ pla G >4 2h\A,aP6-)ť*SIO3AAhXf5Trf&@+ ?AkZKpb5[)UpT`:p04YFLCeٚ06V81 .#Lۘ fhUXvܻM,1o51%H OefiԱ& @pcM 2Dd6!vFn1p; \R܉ָ悈8`^1$0Ѧr[e{ cj` 81+ m tfU8@`z׬ z%s# Hٙ}63#妋iYJ0ua8ۀB䚃 (Nq+0|DL&b0'b He"&b0G qT},(#Չ8j8jI}"ЪLĤa"& 1iI}"4 o- oN7rK3"o=9O\MCVr,$ ~YsyuNОWe#AXLqv;w<@xcfT8?)wE`:4"Ex?qN{Q\D^O# eptBiR箇k2?;.EN^"[ ]<-j%ܔopۢk=s>sN > vj<'=e˙af\m$]%>A[ qfAW,A\n Xr= Uǯm٬27lX:V-|>&%ҕ)El ov 7B02̦hk5C4EQ󹧴9[2HR%f0ܰ۩:]+k nx i*:*e WxpjO*>PVy!CyA<;CYͧt&sXBkǖx?qK/*5#dv\Zer=Ѫ.Օ=b0/p>aACY&KG⦎̗̆ZJ;>G̏?$ ~4'V,)>DWQ kA,{RmOlda>s4`.=|nn"s<w:A:(EɮO\vEZ6l\v`Ļ[c@y"޽徉X ׃̈́/ i[Uaf8~ZPkO[u]V\\;@Q:u#S2_y? =ٕ(dLt]s7;p^< mȩm\9s oC4i.QHf˔.s*k5R:h2ʌ֐f"woNr/'?X#֊ ^nx")h+8_^oiu +Hrո@ޕ57Dm={Cs>Cg3_Cndle/ xVB <,YH}@izBž-$Pl!AڒZGU T+YHeBtJ\4dٸQBLHRC𒅄쫖hyR|>,4ƖmZ>}!_EqbT|H3dyc]|PV+jLׇC`ѠP'hֱE [4d&,HbрJ[%]e) 9E``!dѐùȢ[48ECFECʲE,Pel@eTc-[4`[W,Ae:^h "a() sIa8Sw+ 0ܗTy턪(*ce^ZKʼe^X6iK-ZhŊ)cmi(+ZE\Q`Qdƻ* TkHAJ \ZF'56:)Pq*i,D8NTnNMd#m0qZlNAwDZ:zhq㲲:uN旱5,iX* ? KϸZ '^V#גrRE[GP3Bn/.*^U2j+xd9ːXMNNlIM&jrhWV&؜VҠ–uRY-kPa#XԽI_5C3R/Q^7aNYdqk ky"}y{do)%̜ FJ:h`r4UH$cHe2L#g;)-.Jҽ-.*i,kalCvZ>l$ޜr`jqnp}~zy|gq%@1)Wxx`7jaWP.Ċ]<ˈ_EH+Bp嫬[V@x2Ji(=)7sH·+rkPs].<%E껓\SôO܍+{Uq?i!T%/(~.W1+KF Wpxx&{^54Qa rD*v9\}<7dZQ^,Z7 3Y83_7yt,8,,m$,?A0Yj_nѰ|#i53`_&6T39N4pT,G35-S8X˜BUenxdK(z+6Su`LX}G|\Xg.i'PfSV88HD}PBkCfI,35 {@µA 3T_x՞ p.[68P>[bǺiiM^nV_,(l[z|$ς6`H 1IX +*upb,I-hnH-3?QTR+ OJԢ#ƬNE˜)S_I|n3szP;)nЗܵ4u pqqqAG N9@\.G1m&k+ZF-X,h.quʔPbaw5ˆ˼5C ux PgCN3^]ɀ^p9m-.K@wܙau5Gϓ[q;C 5P$4i$GloIucpu^Bkd[RƃA[&$K3&i#eXXar/{Xh G kdig- "tȦ)_!nJG:Xa@b]ݞf rvZPFJe t_uYȬvV% n$v:RBH;hהqTSppR:p}.+VRZ`0W"HZ(J!VX"xd̤хWQ0q<‘Vp`~e7 +Ͳ@J$iƾ#!CD¶%iӢh=A s#mąU}/3L2 )GzZ_~e42ѐ9}.+Pʭ /B]J eksqu6O2AU+3DTutfņ\Rc;@co]brvњ[iQ2}7X"VX]`:KZxv5Vp)M!H*E_+Άqy[(MGvC=+,L(5DNuVeeԠMlYmAm  ;e2t9q@˱~d(t:(4j}ځJR5>?!& WPɔ}iVg&VNӿ4c*)cwgif^-t7UǫVDq4q̴խ "n+.#FV)5~ZuoTG$?mҺèu/4ul4ˏTD4kZ%N#UZ˺fJ:rqVqe!1cog#AK<١>ßAF|N%ܡN'4!Cş:Ghf G$H(jK$!1IԞs$Od'?% =HKye?wiJ":s.|Ě־X?܊&NfXiEF{(E8Ȕ!{wJ"sy.;lJbȒSM# tV SswhH xJ W JU"Rr{g 1Q\?}K2>CߗLв77Y Nxff.H`ڬ(e93`E3mV9H}Ji ]f4 fF֬E0)1P]I`Os$ N[K~j$Њ .2{|fRʰj-¬; nC\вBqa;ZzlBjmX$\ J> df1h[vªՠp? Hc^4TJR YA f jTZ^ pxjE.F`s-Զp:Pm6^4`hFˉ!%zNҔZ\TڷP0#;E%9#f`ӅaBi̎$SƔ\Z2wR/wr 4=3nϗ Ci2VzUy>i/Ns.h z3vEme=E@IwF*F*;%\;sGn9 HR1ˁ0&$Na T1/D&i&NL= q4"9cpR "wNZ5eWA`E:)L('II̘`L=BB\he9IDR@NF諆wj+Njφ2Rc$K/38mda厶sgoג!.Q߻"7~}w~}:dd_FߠO^_<5 .qJr?+MCv WִLhWEwU`JOnqe/¢qj++j]L{̸2=f_$5 Y6Z`~a$ @')]J{`k##Sr;%F<5~T //͔aHvܜ^۫KOvX'F0쨆{؎9+nf9:C5&G䔛5><8qr1j/|'q0i\B'Gufd 2{Qnwś$ab\d<Bë'>ݞޞ_]]&n@ϔvbU9V4CH9V\dA Nu>BQ8cXdLC#;msV^Bݺ;4ߵD7HNK9x5{Q}; _ʬ6aWlhۦ! :Vx |!rE)Xf60l(wƇ/~`|($٭?nwFGvKLHh"^1G\C:?KhG0;z #G{ hL/Bi놻qޓm(l5xO60; Q@_yJIHWvi2kbNfӓfDpI=Ma9U"^+tr Vt.N;Tc9.89$a4"SA˄?dҐ4Wt zO,sz[yt՘]k.͙$#濗^zgr64r>+ 'kB&ť}/+ sJ1" DWE]„σkD) *2p{ኘb2NB,=lXT]W !9jm0wAr 8⧲uTP9]0iʹ(ԕs:\1wU*X#ɪp&\I^:6¼+笨},)ܓ/?"s0UONY&j駦-nȴ?qԇBՆJ&ԍ#ߍ#ߍ vC\؍ƑqRuwcqݸPix7Vߍ#ՇY?<+_Zexi]K>i/)m:LX:G'F૶tu\Z3Ėлm\I0p-SdiJM1aԖY8ɐEs˔t467};XݭߔvDa\+Ms3o$VHl2(iG2?Y)VMmBt7>^ gώQ>J?,^5[KlÍܳk/(;H[)5I,[pI@`GAd AP @IRw-#k E%_1fx[8uZ֌0jH$.\n3r3gD"S(%k3UagI5u6.YT[ FSn6p߱W:~W}ݽï۬ QxmwޥCS7&ߍ#ފC\؍#ߍqRdwqRߍ#ߍ#Շ ?ӖZϵKr|[8g'i cdه+[J{"m+&?0{ϛmSS&+z F}BQy dIC"CgҶƺ^UbUᅣݞH$΅W8B;O {4YΗ%`LnjUM Hk h!ӁFwS}ܿnIIO[t<ԭ"K ttԆa0Z|aG #^s 1Uk5a( 5ȷWk5®9DP|;|GX+WaXډ O9OL%m!DJ;!O}TdkUĐД:PʋS/- .!\'H!5,ct@ R$Q\;I]a2SN%ro) #S2H+1NX5M jŔ|>SRvOĐHb s/`S/!i!HIg{#Ȳw-T8mEJ8et#Lz^) /qCyˏv|;7|L V={9XYXtRoIfNĠSNq^xl0Dn=ϵm-RY;H./UOׅf~Gr&nH&\ao٤;LG$')#4e Wm[O?$nna7>T5nn,-r{ GP7&ՇJ#KT(v1yk('9HB+k{}eACB* o*t*/y'#2   mqe%$7E֝jok8Ʀ^W.fpKJi+[IC?o_^^޼` <=`@0p7[}Q>Slj;V"j[KJ@_tOPuQn.13_ĘO_@l5̎6v[ /cGwp^;u;ށ˯5[ )]7%sJvՏ˳ ؔͳg'ϓ>|` zf#|!ZkZHjZQ7ʨ>M[?PӹasnzBA%k(F *.ҔZ%уMvïk$n>jMOտx7q~O.w7H{ Z)E7GZrdi2J6 qn,5KͯWޝ9\ /#}0@v=жYӃ`g/鿑9jyFgh"stھDuCyTI!l><,5Ĕ~RV/5K)퀟SSMX@SFWrK4pJAMaO}!2WMhAsY=ş~7=_\ Os!q!μxnւ'#`f?cnn!~61%GD1Qs96[.XY rFW@Þ|-wOY0* V,T:ɵ'a$*Tby]f"/H_hZ:Rr H&(sa"kh.33Lfixu&#|t;QO Da3 /q~!v_?9>o'=yJYDϒւoaIm{ ۿ09eÎ;ٰm6 r_~8e0s.\[zam;>X g& XR$sW:ȱ:1na'r@qnE賑[*bOBꦀ. LuE߁yBj'_PrEe\"whTǾ׵j %$ *d^QYP֝T6*^Ì*'7:o` 6+׿]]|=a||lh)Q\ñ'82Ll:!쭆B l!1P;J6$Q6ٔw$H?qJG@ҜME6b;/eS,EE)?-]~N|-7zNjsi{_ߝRw? uL, RtN%73*])<f6|9n Ń@M b,ƺbF|6OO^_/!^pgaUf&`lieI! Ȣ*- g.iȭܘh-:o_x?z meE 5NSVRN[W9Άy[viHmM ,67GZ3 dONW⍖`1BRcHeĬ!"ݶ uV'E(A^KovE0)elSR\Cb#xwLfB'(5g9%H1OsJrZJ5++ȉ:l) gꂞRwUs`-bXYжy[=;Ng^Z iaxc:77)dp8=,gfPb3 tY Nt:x4 g`V` m/M\DƬggOoF75L2΁G|q8M |4旷w˳0|B?IYA#KH=ӤM2u[__A3mK\jI`%˫fmk&߸?>IM8fylL5 OY% &a"IUTZ+IT- )} a:/o/!^3xl?vzCmo'6ns= -?ki5c&;N;a9 W:(m*u?5B,Q,"y@I>V, 10S/mW?ՙ?x5N?fLQ8~۬,Lx.;bg6%WS);[S,,|4fX!~(*%KC2g}]C`gwiy%Mh?ߣKhkoG{,؏Lox&3Q)OIbDhoz~B.0^vC7{ vv_Z^LcE\i: HЃ0tK/m_Oo<yds ,9;1gߘٳ'H6O bٞ 7ޕ0o.5k *BYɣ;Џ`lG} `g/S_=1{Y}@y7ɧKp^̝K`Ӌ|tC~mma`gΧ7[ G?Kh*0Y27-!>:d+s쟵7#shu%$٭?]Z=gc-E*P/mJk@,| co{ m|tn24c7-vi<[Vַz){TT붊FhO v8xY?x(( @"^0"G:1mݫx%Ĩ5ܕc\MG|l:oƆ*V?y'f|ꁉ@'1L>IY .q"2Ԏj.rY3@X:(RFNߐ\[oaj3 KD┊7r*5P RgP,uo}ӪA%$ h?uOi-qw8qo7baWO*K}rU em/1{@EoO/?]\|<='xw$g8Uy1%8_k=(եcJ(ޘ ,P \6ԧB$)vJv2iOS"R5a1Ji1,F-,cٛS5F=иOSO_/!n=[S ?U˷%1Bm{o->4D 'pO[PRV} D.%?]z~zNv=NesWnx<ȫ )aY%翽;{_E nSHv@ <1{а/m{w9M__}pyI@|4>|`s@L~L/0{3?J^z >JwLX-֖ToO>0^mn|"Ԑ0GQջ&._̝MT5WixPl;:ٛLZxnbflUyh01]Mqunpr˫[h֫Z!kV_*k:_n,Ʀ. 9&>.ؐvOv.oɁ)zsCA~>|wxmm'4,P3NAa)9#a OL ߜafs55p 46GfUpC?!Z~l'p 1V;pyՏpYXX ݜl$QYee2\BޖjU8.Gos#ޔQkcp %yFݐ]}~zqSMfv=w /p}e0>^]XcҙiX7y?_Nu8p5x%#dq!%9MUa医oE]_7m%O(r<)Xq%Q%nF|i'C(9yaؚg'?U(6d)#O /\]&u c56 ;Z9e\YY+36\ :N\fcE{$mi)`g/_ڵ%1`=Oh}0^t^ z(ޥQ - vvݳ'cɊ1|51{0{ m?=KyU;q:w:/;{ ?_yO/m/?^㍑/F Krm0 vRS =t:?6 ?-YZ`g߇okkL𽆎R(g. 柬7,!R`JqW(reXo }[īr$h/: 67 2Aߟ`&_,>h;{$:k#woOedYobELS U: 6`F6=3C"}Q!7w|:A6?p}&vAZ뇨_.I'W?f(0z<_/8]]"U+/ȧ3e6{O?!^w)W:osZ噝fz-c3f'ES(RfdI Of?Ih7%$`KhwOcR&A.?;{:O/m??;{1vz m_/^B`A?E;x[RXD72FV~CO?k^B_Nd| #/4@v_jʱ*R䅻}{`q n8 >wòyB?PH[/{?~7E#Ox3 )3u[٤o 2  ہ<*XUDD &3"4Y0/ ޛ/Нߟ=iou@Z4N}A8k mO??!^H?f!He̟yb~R ؑD{}}m~E!YS``ֆQ*-(Rw2+\֟3>'=\5<xDEF"\#Ӛ:xfnS~UElR&M >l$RY&YxC'= ?y2=t&v)Xz@X ykdfR%*r\pUtn9)?=iCFu)6*%UNռ#oj#l[+o8ȒyRSOR 6k/YC3DS֥zR:?z m뿧a~} :n AGnD Ld*d_!afaD!k&IMGʼ8+ ZE٩,H:XB%_Izi .t1[2j8nd [5eVLMXΗL1ӐV^}r~8L%wuO.=͠2E\K)}{*meW7fcq(yiz6s C2REէ[SjWɛpr̊LJ8HI,[g}ȽrYQPr%iQҙ)"4blRƩgͲ#P5 ?IQv3Nߴe.x˫]e7ЦA!AEM N8ڂZq:E. ^ -#s&N8\$wɽYѶOz v -=?%жߙs,Y :2 4$_dm+OKjHiɳX-s#Yn btJ%l(B+`Eu߇p-9tQ HWjoQ?BSV?PcQ4 eQC?fd' Ed?4 g|ijvgo;\.s̮V,ϜwVes("Nh9c2ՎYގ<%&3OcvEzdBi>r4Բ4gr7nfG)v B[}#`&p`q= elXm=0GPdy/YA}g|<x x ;0g+#=55qʟz=?L8uB |gl8X{uU&{]kH3-٠6D:k:[tW _C_/!Τ7_/mOPw?AJb\FNl8pRi %8Y1cG]nQԈrgV l3JiUJuvɘe:#/&YqkR+-뫜T;".KU;>4^B﵄ ]W#kϾ#8tu6gW痷7}Ӌdz=47vrڝv$-87#6,~7R|^2;P `mr0鍈xrɴ'vON, =;h>ὥ.e#W/qh߯H.UƲe ퟢ-Aʀ, PUK|K"i.5k_UZZ~rQk{16)킾bX{]`Kh[+_gWWsTA^k |4ng4_{.HgfUfٵF 8W@SXs)K{A*#m wKI *`gٸРn"L6с]Lb],^24\R\`O&O)86s.~ Ƭ`5@qBrTej%3mEkIa2t?)xIU03т"7UDz2Yd`9@j3kҵTj[C* |Mp 4сV!nSfg9U90xa_lHfB*zFo,eDL-sFu4dde|oy^2GK VNSa c^<-K졚Z3 QVDTGZa&AqΡ1-z32϶py?9cVlIG,W/!^@㴀["c:?&cJ>&cZ5S57'ּاߛ,m_ߡOg .d/O/5Hn/taӋOskoƸ4sk=b7FKXfO3\Jx\ FBY֎t7!ajc Q!:`/$6+d ӋJSäk?z v*nlWWֺ/TݯԊg!(z[} (@ `5!LаPf %PO6 p/$kgfI ,v^ks s~xZ2fJr1J |\pkuPo_=Th? v~d$pCj*Dž0<5C1KTq{DnE(sS,s{XkB~ ĂٴйKD>RCζ9/1:d)jY7'`N#DN̙1L9dng$/%VfV=t& >(2{#'AKH;o`Z2}BJ&ȉcs SB|ȉ#vDCLeE x)&Bd[2&c,gLL<+OЅ* fInh1y4ER9a9&ӱNoH yN/'3!ThmH-9q̴iByVԱ/ T)5aF^!Ӛ*m(H׎쵦7?wz?gqO K?1iR p+u;C93|]wkYlbnYH9P)1yGf#<ôޑBMK}UqHyIcKH((nF>W5h#e_^/HW2>t~c:vB|u*3K9V%IC}l};m$e٤'^52r{ߺ_mZuH+B4ik23h,R,U¥wZu=>Blx|kc>! |MGL4 3rF6> ^WGD9QYKMBJ?{4]Ö RikUߢ* \"RJcBdϿj{}uvzi܂M?[^r;M'x\;O^LLI]Iקv}{ 4d ==?6 NL E:۟.`7 zŎٓVvfnEoex+Q]#ZnV/0Oh8[~>9ڂagd{n_oӰ]s|z{q%=2LAÓ?X,y 4J!ch19ztڪ$5V\'OvdO&=K{\N)3a4٩?^%IBZ?旤835uHvEl$zo7hض9rPA=ރxG&1d Mߑ5V*>ئ ;Jv%wzw\!ud wö.U۳8ԏ͝`ڔcwlQ_U =R}CNS2Aq?kQ6RuGpdoWY֞p̐EJJIC;NL5˳Y~L' 7mDJ М$?`/5}!cny |1'X>/ E{n?}8YiX{lVؔmCa ,WZ,D?} dw9..nn!,wC<&5_ ׹75#r0QMLhxV3!vo'k{ps_kMj n TɓTʝPJ,n*'".9彘Q-v$W㤫f0u;Y&u>3: \w%#FFӮOǾWC|ީ.vr;jK !;!:}.h/J`/&tQ,tZBh뷪!N.d-r//RVjȸ@XP7>2<74Ȼ߮_>,~on* ְ:&eհr~Еc+ k҈r6;fhw/?gt]@3ȋE<=KHNԋEE^]a9ѱ }n[GO`TP揷I+SV"|u{{j/6F>`{gfhmLnO?1APg@ǝk֮Uy͑,hEdAݢu/i>M Ibd$KC[pH>Р`[hPmyYU.,s|]Anܾ`Uyx)K|v'<}/mdߚo%xO~=OV1 ~wa'`C8D\nj1D6aƵqlG8< tAjԤ62u<ڽy23Ma`9!lA@AZ QV`JؒOJ%>hiE(6 Gc-l<|>y>}:~q`qy:|jWf^2YF:`d ֲQ/]&[x{ 9ͻW.>>Kq'8Oۊ߯Ӧpf-(ku+4dZMM樕9@0" rEg{XGb6|226}XY"HUc%?qylyQd;R?|Р!*.bfW3R+ѶءˍģY?|<-x݂Z#N[5iCgMaeWI NH@H [s+l ;BD&D-$" H)¯M* {u E]ei+eŬVbh͂W ˈ_u覰C4$[_υrR ߽gEeķi\5]F2|ϊ6X贱Kk `zM2;ȣyt3;9;Zj!~MltB]Wx!JY1YjXKr|%A)O>eR^/׭KyJy\.%O{/6BZMj;yw6N]wJAGf\E#E*皘  t#:aomb^2^/W͢]RF%ntS a5BPA5vwsW.)ɽ.mH̵|vIJz׻UZ;~IY*E-PZeţWyeβ?./gP?wì$mD~5{X&A_v.m{F dnl_uw EnX$E>}S%Eݒn(b9%]!7 AYŶOlmĶ8&Yy;ǻUKcY|UDɻE>~Ly$W^$}Mpc@1/Ѓ)* _G(%+e*H?H? 'B7o)VAG߃oR7"mԶ$xR2ے基_XKZAkE@b֊Bփ{ YH2*dUڇ*ށ!ORN7:G 3?%گ s/T%4+zPTH$%t_ABd;Xi}XKj^%ׅ[RE5`HzؒG:~E$x0Hpoet?8U7W} {M?[@ڇ.fҾ+פwQ!4H FWͷ(Ƭ- d%,`?תYCGzwvNRZmuszI$~өs&G{5)+4. @j]YÿK5YEK&&KhCvK5YEɵW{yU~RxMUwcj/ܯ]҂o,_`%ݪ _xP.R7TqHlQےg'+}*?M/AGï^wz)=DG~q$H6萵wVݭ$9??NV,P;8XKM쯖N.|`Ֆv_5.tq(OۻtIa;Hi 3;=U;!o- 'CLx^νpDf&ٞ]@\NY3O`*`O`J;O`t> pЪccfF[*g t`T.o3v̶?/a:T[9Te/}TZein'AU[[<^M)x0l*tEnxco:+:?]vo֎зw>}y^mg\Nvb}yDW%Ue[|aw'uyۚx W,6D|bID'-Uc&K@~wœ$]uz^cF{nLj+^aD~7Ugtow>[阢e:>9EPO*gw98IcS}#Т hc.E@DZEf4m!?srd`3^?^[ ;I>:vIC07%?}6} gav sqv ݾR-k'>Km1)vq걃:B.g8pb?@ xN~$⇲>/RVnfCʣ7G\AX]} r; +@/|L'=on;dNgԓԯ]|ɸvj.+ZU"ZMuIErAm+Jw)2rlvx''#9chŠN[hv .q]P~g7‰U$2A,!| eN:,6ϻ- >D,Y`A,ZBnZ8^e%wxiXIjnEM_ɷqg t rڋż}{g?z_agKY"ݚ&K1+qMl }u@/^6L`T${RGM{j2d_&ٿ(f~|v+s|{n~ U TQ/ߝĬ=緿["mWAcǹ]{kIs66 ׉b'Z`wʦ'X`nvB oJc 7btI~ػJ^] "狥*ա>ߖ7K14-=j0|K[WR9X]e)l(cYrG҅K VjoVHiϼeq{yK|KyZojmnmm`|E[$A M R /̀c"=o7N`k][m]Q߿]ތ>ܥ&6Ee;;OMI3?7Zwonh% h؎ln%Zy Agsk ]m4#P n|'+yYJ\ܩ+%]/ݾ׮tPx}Cp14z|49=ivcˏ_ozżQ/jΟ_ZUy<7~E7GAOH #EosC]|WWll]Ag|9$js~OZ||O^\M}7ZԻ & .ޟ_֩u5<1KitMc\_o>^˹a(=ïNmn6c>TsÞ&Oomџ:EcckHUu};ƨ5[V_Vv4~J9[V6·A\;dxrvu ʛTr/WS kYՆV%ϓ߫x+Oe+[ e]BI__iՃW/EB#*ia _TNd :;h?ܿEլ>,t2h>=?"ԠCnP|*ѬS:f~J6j:>@-eRh,&0Ϟ8&j)FԆ:Z!3O?>MPyp/֥9|Ϛk1S3;O{1Zݑqف[Ri,߹c |V{v%u+(![9Ϡ|)M̼>M ۺO>5ݧ38nN_9JfnmԗoKq'K_財&rCl{zuYUEdsv .7*S*PɋV}xY.q ҘAsGiL)}i̴[Ca>;xm頳wAv0e|շOkY^BYmPGs%z@6z:”5S "_Tڛ B:[ߐP6ñFO6|6iPhk"{j^ k5uTZTLGA.⮭A蛔m|d0;Az4\mʺ(?WÉ%Q4ku:I˴I"%Ye%ћW?Eb CTipY$f Dˆ}(STTH%?*> #ַxuE7=^`~?CBc9C^@kܦB[NZ_(h|Qc"ThlJJW^kݢ}هn1\%2>V"MGN_>҄^9Ԅ^5ք^sj ߟP7o^\/o1'7̛ F8j(OXUHy_A^1񛆏Ȉ*AD "9)mn0jt8JKW^VS$K,䍖PmZBn?/i%VB 5J?X?/qBI^Y&:6&y}6ȗ0 Be @"?h:UiX1 Gʱ< Ԣuv7呾H+XKV׿׎v_ur%J[)ʁ5n6@JH3cn]ꈛ4Lc\| ׻ .+6ٽ,fJåѸ1ͦ +CdaQ+] ] Of葳> b]4q@*|M=}MG,^\ @yQ|O!Imi iA&B&m"6. R\IqBiH`SvE!19mR|d8R[,qb_\*1)NȱyEun$O#F9=`p2@p-~qy4W*w%;i;.Qfmfnj?ara#-z,T3xR b٧}zCicIlk&N>u̗YGdY}Q;cX"9Zi8 kkۆj{lVXy(؀1f϶l-7pj(, z̶m+VbLp>* VN3I)JYΔƞ^5љif6ZS+͋6X:oɖ&zmA6pAVKzhfZxKe[ 7#Ԣ;n(Jr0 Χk[C$ _ZV;8Tz1Fυ4ZaK^H7h;~2gm{P#Yg6psf<}JNuh:|;4KYKe)ډ^{+rR**XThyBg|Jt([c[7~ ^Qv^O޺sR"wIU0s붵L5VVJ <[NюvV09ěRh!t+5Z ^pv>#mD مE+o!Kh+"[#RԾ$N}Un& ݒ<;Dc-w(_.$_Xb{5ߖNwSt#1RI 2vp=fi\"o1XH-xRi̒Ij,NdPE;"#9O&X.&KAt47vrm-t\Dz6"s4Ǣ86K60vu͛dC%;0& ȩ˻DFi .G`K)'yEnﲟQV5&E^NF’%ǠF*im˒d`lHZ:9mR{o ; ??p~\]-ČM]6eyW&Asl4)j+w3X>朶\%[[dA!"& O`i HdU@߷"8BW鉩NRV Od$9f5Pr= B iqCkJ˥RњxeWrF"``VL~.y&XP,hO4ĈWG6L&h7D&O]N­m˻Bw6\&q.f?/bT'ź sשUl;"~ɗijf,.1wޫ{/RSH3&Ih-:^Z/vt(! QxLnE-F&yAdqyK/T;YQ$D݋i|wF[͎md>SMg&84`SRG'ߎDK0tAϫW횇栠3V}/m#5/Ɣ߇? 1,W}L3xBݓQu02h]7c=?'*YOL9?;:t<+ (=c؁a,2lI8DmwΟvy- zxĬ(O # p:`pe)n*vƟ-U30ߧάs7zT2#um6,D Hif<㸇Nx0a}.'-KBB1$81_#;n1xHvZ_d AD<0K$̵|V<EscKlbEѐaƣdR *Dx vlsYw(G;?x#/?2iiG1O3{¢f}77dua+"k;Ճ?7Xeh?0VDIX + '0Ƃ2 !ѷ {tB`|heJB`DPn^Qd z޳IiqhҐ%]咍vPrP&%H.E?\ 6d3Imo/5'PN3EA4̔MineSpt"똱TNߪrW\rtsqZ\E/C!Hk.H/TN$Ncqݣqfˡ[i0 IAs-ՏHnk'-áDRZV7aXdjD(~L*6^/OeIr6'Gq|j~l~ x-I'*aTLMN22z{NF/1z2z5ݗL2y6? t`}Z5f}S.k~6\,g\,gd9_.Yr:˙AIz{Xnn3I ),+&9Q M>38V=le=|,k}#asy0=̲N7fY $o̲w,kȤaY3q"lggbZ=dZ_L3@%j.SrZATʝ3wr.iGʝ3fջh>rCV埋;.(;*A"/ԄmK+ GYHmp><Z֮c\/M%!b2p-/?׋{s6P§W-¬\ * BUW2P Ch.!| aBdnZsdKz拀z0 asNRe*6K)vВ)ː{h)0Ar;hqs^/WwәSqgN)jMJEwJ&bw`d i~vq=`o8q n?nqba[un߾OCWF^UrwW,]UP&PS,7#9v .Y30/W?oo|(ÙGcL^Yu[ ==ֶ#C۾iI7QqcOԼme,\b;fm+#n LDOT>bꊤM_"LZg;s-Bw;$" C,錈$v ͼP'qF7Okۨ96rgY#.AM90͎rt7ZlC%myb9\]/oLI,_ S4 T@;,}l\}G-:-~,#_b'w.#.Ĝ~2CɄNB&TJm7Fqc}1DY ɮ7YG>g^<wkƸ1l` R:)ԔNj^ h:;Ij'5ɴrR#;ytҏ%Auz:s<,OŖx}H'-_AÕsIL34 \ QzFM%z|ldewJ4KY]:B=9puqeuJ~7{8?՝%Xz5@O0eq sCD!b"JGD# $h?սA}<^#_~APD@q9,jd!ՠ;uQNޘ~C^Ѧoȏ jЃD^( ԑ;hԂyZ8*L HRXi*?ʒU7~]>tב{wa Z:yrf͇Du2le8`A;/tzӫv,zq~ۀk eld%]IhؗO9~0MPNjcۧ,kTyމǤ1]Lu {6 ¦)ri0MH a㦃d9Eͺ!hϼƀ'W'eEnԹ{An—?oyxA#}_!:5U U_ibܰ< K?(ҿʓ B !_F !+$ԠH#gȩF!lZhzB#@r([!u-Fu(;2 ^i;!n$#1Oӝ"tDh 6Ӽ0>6 $Omav'!'.oDT鶁en"2 'Վ85:I\|O-$ ZU!a2#ɡS?'B;IRCXjDh{: anREiɷ "6&a4&!2Ly(f qw#ZF2e/k3/1KhUQ[w+ċo+lUP;< ث5ۍ6]O|ѐ~>"/H<>A!է4ARj3 =ګOF@dAH^JޤȏdQz8T)GL GbR_AȓãCrf H>)$| 5rL_1y9ʿ4뵠]ѮۍN0"ZH9e5!'8Zdz{m#m@֗oWV,m2^(WQ jЧ|H(y3x5-:4!8pά6jhIs3ȇM2q|¼-a!6<%j[#}u8u-5^m!mIWCGm @om+mw=` \ 6TQ/"r7y; e((oX#הb[FV2>h )GEV]1_by YC 3iO,('2[^9k-fp&Q)vM|۵d:7B0'ӢUP =}-k,]H'|"$l(ǘ769ܷMëEHX)< "leM d%aD>"Qk)Lb6W;l-78aoSV-OD;۸ӝ*ʿΔ#x (6va4J(=XO-/nk5_D0y^ؙݒ`^oZMWE*3Ra!C`9 e~;;/B w^pRdVonɴj;1z7FThg;5(Q[2bԺ'?-2AْRJ}5&8%=b0{7=Xa@ Ó/Þ38_I@&.Ż-ڣa`:X5Aw17:\c.!%I[S0/sP֒X4|ǑH~!YI2& H/ֈt**oIMN};\/(#uХ-_`KW3,NYi?/ ͥq2Q뺵 F/&;ſyJDoTS{٘JM@y9< [H.Wmu W-$ 3,J/,aMeo`Ze<[-O'xQyUgC6Jhg;"6% 2;?mBM83yanyEOsdF*"'.&pLkp>I2GT>/UYD#J mU')-'JO`i\1z`5s\ 3XqUoBi'1U͇Yz1_FwkB`Xk.kI,PVN,4U&,䔥)/\(Ɠ4/ޯ~={0B_oPD;;?Wr~:Xa_`*,֫{=mK1w{F͑ >o,(~57;ZrK9rB|󎴆.Ø-#V5~IQ_nr'9X[ ilorZWJ`~Zkk N|j!GQMIs2̆Qois!`YZ5vɯcٶ12 6_+&vO=O81 j !:ݣ)E޿qDzUq <?Ww_(V W].l+˻?.?Q<ԣ$aP%kHzy!1~?J_!aߴÕEyn]{w|^"m>G4ZVCz~ X=`ܟ(*ηG@4h4 ~@F%G>'LbbZx$neT|t>NÒ#N Ӳ.ViԀ /w[qL?  >iF9\]cf?bv?b]^TA?p?g_G* ՠ~$wg-d;9?"c'cԩVQhDt++S3C!*-4H y\!]lO|Z!Ce~hl%ӊc O0 TiXnpݏ8ޞhĭ7{`xEmd3a^IߟJxmz|X-Jjn^O$~| `g@(e:8WȤ#A9c/ATXlKLp*,s~WkS݉fvOx\k_Wz`<*+@v;08RiiE!tI @Ƃ#$cʫsȫ̫@k @̫y64wp&da>:!ᡫ]D{dM+Ӥ:E=Glc貽mlK6[a d+RPFt"99/JXqT50JH˘R##JJ9N5&J͔ļd=zvlTϺY-[FT"k ԘS<俧7(EBkDx䖦QA1#H 99co9?.;d +edFQQE4 s͓c 7?M("pl: ]l=) KmolX) C/ P#:Fo3!CgrdC'bޡHNsȶ#i)bޡw-n[{w(];WE/moTQ#'LDт'Q UvL'St޻}G8VwX~\>-D8 )ZQ;J ))d7~F_no4?r鶔M^%&LiC!mф|yVz{EH]!q]zO8NnK [BS!qSznH,!q(=7$l*$b] s}V`~]V?kni2?aj)(`F;V1fO?S%޶ъWHRO+dg2ZF_b"/q_/FW/*P]TbmRmwQ6nXiPFr `a&nHgwaR@ 'FsjQ_@OØ1 =otLdFG,g0G 0g9CJzg@0zP\ArY^3_?,*_DR‹REK?)__YߎOކ>IJѿfݺwҫan;yxr{X($ u`.R\!y\ ^BqOx [Q>I| qBH G#s||2׋2o?g<ֻw s׫ŏ%AVNvy7X9zM`muz"Y)Pܨtl4B^š`JYHJ6OL}Dl'&ˈcȸVwdʕia/Tihg&aBI_7Y4_dњ£X?5//Ly(!4cqoqq__v}U¦OW9_[>9T7?~^N;\p"oR! !v,wb昽*7E uPضss:22{;2Qo`%<̠]= NH簞1j>fDk'~|V##]TžDdTp?H'^Qsp]ַzu_4Q-O\.J?.rq{*<+uz9"`QɉS/<$;]\,ЮUƒL+;.@}hX7UiOк?fg'I6hЂ?b*$L=<[B:.~zvJUAM1&nooIok|`&1(? 17)M*rlc.yMX2U3) ᗒ;|5ܡfNJ A}{F3T/$0t: ;3p 7kDpQH7>0BhvPaAepw^jCXDfK1.~}0*U^NyDZ<"J,Lqw*Yh'Qo^0 Wǘ^7"3kJɘXSxe>|^DlNyY12e(&_t mZ=w\$+"7]8w95B~[`H+\Q̄]K8p;Zr6qajSF K)dZ8 TCʚMt눙~̖g`KԞW -0i^…Z77?|đB Rؒk՛u#勔0JM]62yDjEe }L"i˜D2yFHͶ!^W  ڕ>L?.r/yhggɟs%`E~+}~3u0+9{ ue:L[ )aoI <,|?)Oϥhg; _ [Bfe[_ot p;1vbߧ.g,bVzx۫@꾿GZn\!įTa(vx?;**Ɯ9O'GGGx;:qGt ѭpoLtIF>isubM~ZqV`<2b3cF376oBLV: 3O LR4ٯNKKfC ,—߬0 W+boV.`|!CɔV𔦏@3c[ } r#gL&QD DD=uA/9h Oa#-&د4{2x9*HqlO Qr0rF̈́\ͮh츢+x)e9TpQ/S=:]IpD8M6$ΐ|UյᜱU+d-u ]U&(K2p 4JO "̃&i$MQ-R0&ҭ:"M`ĉ<XS3*B-.lF9:u#A_mJk*+̸T_<誟V.n6Р,H`R°l#!x\Eb$Uoj<̎.\ƪYYom$k:6-1wC/ Pd}vwp]h. A_}F87bߣ煀E7I5vƀӞ^) D #+n+b%x\x|64~kp%\qxr2y2 +I 's8mp2Ո.Qe%\%^4Eg%\//ߋz7,($[9a X / _ ĬsQ7_C'A}29\>;?'tsh;3ÒoV1<@OsOq:ނe:>:[:>}(S1`FوT;D$^%*Y#ԑW+:?G8?AUd˫4WB\< " ra/d,)KMCV9MPszwIH獇yS t+S<pp8a"~o3ak^D~0XB ^\agtXr-M̎8Oc}"/83"U5~k;xtus!tZOvx;뜝͝i2t;<{ ؜glm!U8ɱ6<5UDӥdxŏLx Sxxm1ë.2*J |jQaqŏI#JY#}Zb)uRqU^J"I}%/_RX RT[S_*XBJ0dU%4%YAɌ%ӥ'Z7/,xF:hMo'#C=2@A2 tT3 6I6`CfkZa|q'e9'@IB=!t@6E:/Z~Ce%?uyehT#kMFjP( [q>=+HJ;k;C@Vb9;^|_*FXE0;[ٹ?ql=s\qN{YZ"G3{X5ky㉱0g./q&z" M4&7<Τ%W߃\II/BTiM54WZ{{&Ija}"bx&6sce(.hcac;yxuKK@Za%z3BXBD.8/Z7;xg~!ϣѫdHL4ŋVXu%~+2 4|%KjڤC/co,&\5ȗȸk^o'߯h_@@ ɒ޽#2%2vy}ն^o 5^o_t~-ZDbhza$76$D ׇѷ[+% Q%=W<R?ayb_2!x_'~<xA#_D}W9]|)D}$X'sH *^=Nhr)”u)ATwI RUBXC1q3!WP$e̤73wrVB=mH+T9T ݦ`Yz~[b`aؚOy%Y wkrݥF%u{ .Dv)􇺇6@ۮQ5Y 6 !HTJ< `aSÒ+$оvT{HV4 L*>n>PM>Bξ<$MS|5T7YQ2/$ Y;0nfo/ab ڭz|4Y[4RïԶ! aW :j4i6ɚMX0#j'\>@P>d{Xh!~6ɫvHIA1Rۯ~0z&y]*D]@si6èi0h66aqCx o/KP=__,̣ "y5LV2YCt(F8ġRެ5TȦxsD<Ǹ5&h'ÆcoJeg# {^`ZFo!uFfN2 <a?4zA'!Px}˄ƌfڌAh7!8q&B^$cak11dIa_&EmB z{i7qè WkAX͑bt"m9&e6{'$Bh1^ aM797z~rDاjpؠh4dKj-Zf=uzEolHxaV'"RzPf]@,9n'+V P=n,\RZiZA;bYzV $@v/l7cJX"UXŧC$CH 7{` <[?qY->Ѫ}' uC;EBѷGԕL~.v}kڷQ[c!f雔|3 =TvP~axNO<Ǹo GL:r9Q&F8xEbT&2yR&F9%1G m&SF$D@4`|*Re*Df&|"ҳXM'ȶى1x;喟 aD:ى"Kj)նMk=N#}#BCd $}9"ˏ(2zr b@r #2\;Ai(Yv!u:% Sdܤ0mURG܏qbhmdϽ냉XFbk"%ɿN|4^4gRidFe>eYH)T5] 9jhK~JMHT1F bqMKnfY-B2l[.5pzusC-9_? ?~[!oycyb^ p,{r-ZByVw .J 7}f0@ d ^34?x߫4՘?"x<d_WF#dM^F==fg|?d։? MhrF}Z@J;`vQ/gIv+ö亀R2`63hMICo˹a= E^,WvSo#`iw}fᅩ/FA+zIt;9$Lܩk徜fCMll֙a|;C0.`z+aBx]kiԙOx襬W~KXUkzX^fOvЍpD=cMk)4/~Rr4bi$vͩ~vߘޱ乙2<[0B񿖊_!cSDvLMznj44 "TuЀ]=ܰ M4bTvMD>}hڋa-#fq Zϥq[,겗Z? Ȱշ4O^<=@xEdN?v:B'J@ڄ~  4EhWh r`}gOD"_dɤY[ oʜ((F[ 6ch .Mr ֔H4%eY_** ;u׋l} .Xu_./V$&@%?~,֋_&fy?1@\|h?`%HPc.: 1A|䔞xTMv?[-х3ܕc~n4V A#r_s7i6iЇkЦOZM*^r?`֘ef7*YKsa,z`bszj̀ D^5lc$]κ9ނvn@~;U= &$* s(A͆ǑX[xkչOg^;䂓JpEGg|[V&s3:!M,úTz$\0d=ah͐Q= )hhl4٘p;91Waˏ6kpXqȼcwfPiVsmї0^ZVċR~l);yF)a|r4Hh24 HRo4-ܽ]ȏzݘ)2TA^ڧw}sZ=H&DiyCdϚDN^A!#>wU+wQםaڂ_f㌴-w1\]o 1<9t;8?fo@ 3,\TAa9@^ioMYTvw}@}-d QYU2 K,lgic4uͥ$p֏W8_{8;6X}H=2xe^֎jf72'kWc%o@VZ0ř BZsVA޲>2`;[vӖ U&3ԑ]-H=Ac~ xNQ2sʊ w,nnDH $^׋hWh  Zro:S%rDaa"DHH -IV8PN"쬱;!+Ve܎86|ģgPv5DZ.䭔 XERvLN:LQJ`|OLVi&qdHG7׈8QOD B%vWV9݇E)Gf1fjѴ[ؒ~N&(d:ab;&$v轇cb2Lу‘V9:<73%?ȧO>l"Df4Ec= }OHyp#6t ,EO%)2~\O&ظGr'xaEhHȟI-^t],D֒0S2貍 8VhH;d4&M<)w̠v#ֶb:pqHqwHsQ@a'OeÌq⼜P\^i}9L3鲼O$Yg6j/.*{F0Pe$~|v|v aNTxT!\*S;v+]LeU;˒$𕱣f "ҟNAC:**U~%&**]3exHt}*J m֚ ǺUIT|R TZTLā@Hg_)ûwHQ YhƋ.G;x A;d[ Oz:2)w !̈́$tw!gT>3ҠHTҌxl$6,}+irL<@OwΎ~C5|ۇ/y Slkc6úDA'ۉLmqvumW# I/5MnnKGRG4v\ 05Dkņvs::7R 'x`f?MÍ&T\8~=Q=c-KgzGVQ J-MiAYf I2NRfGY;K:Ķ&ǃ_ 7QNDO+@ 4(~ $hta26_FnB? %׫?z!ed"V5o!͋Wz?PI uide<U?6fS JBiI'diːDilG Y}/J'܎&mac6DY8Qia4S:l:KVhQɓZl%kju@'<[sizh#^lG\o HgX0o)tcq;a:xgfR-Y8A)$4x Y>]w`%:&6|t>lďzƞXßzז5a1~>x)SxoA^a5޲]M« )M_i8__i"^s򥉸5&Ai"7Wߢ1(c=`B<ܭ@IL+ 5%nl_ڲ}Җ/M'rn'10eӽm_?ݞbM_7kxh.m۫pdE@J+;w s>ٴq` |]9ht}ܨz}<܌]'n0GmC~$b1?d7Gy-ljѵFA͜QF+z~v#FaL cX|RLEGN=ΑZt`PZ5q8\>t\\?c- }D[cVh?v7v4i[>,7.J;YvogÏk1~dvֽ@QO;ptl[oͲ6nV۱ٶmٶWgw9C&- C#17KeXh Sv-t4[gdli6I>[-X}Pfh`f&i['Rf3bF+I2(ie,TbE)i,W1^KR7[蕌[N$O,+=gzJ!vLBtyf}YlIs`EFIs {߻ڗ"1 >ӔYh$HȻ|_!m<1MiPj=n5"Ŭa9qJx$wNzr5h$wO]Ob'$ R30Bd=r%cRlDzd|bsn};a9Aa_T Ęi&~A p817pjlxte;,7b'/##YNlꢀO[Ԥڠ! O.ddاv$GDåWR5 2b Z `!oF/-0e2QKƓy,pd}"#Uݧo{H4g:}7c7R?S#52_Qg_'3#7*%xN~G?VkNhѝUpMmWHDmi6VH' 1ѴB!Y{3Ոd3ް32@FƝ&|$d #=!Gf dJ~~>0@@3sSaI9E~W:*r 5xh:x*D&]uƖc"Nzh]#k(|$5M۽YZ2^,]{g7~W[C)POajUN xsCݖW>{c-!z=Ϛ8҅ddK"BXj'WΥ"%o >,)ڦSsSXuqPjG}qm w;nH4p9$z c%+wb{?ݬ@gϛ\uw2fbY镫JԧזPT*ЄZEg}o0/li^EXvpG$Qgzg.2D<$JynHC1<^f5k,&oEa'zx}[bͣ}$In Ae7b)VyF.(ܯ=Sދ=3o< &эT$["dKmt'_9Re+@\FUq3 8]qAB.9~rAc.Ģކ\N3j u y!YcJ < dP(A`YJsL|f4ܓZ{va'yBښisfBlY1NT26(#.anBKI3ЮKGYP,jDqDu FSu rIu^-қ#Ҙ[coI$F4 -?]\> "I7\nouA1j =Zʓ}Zي} X[n[Ô 8gn-T8,'lH +$Սʅu+Clp꯬ua5S'6J'͙Y+0:Ѻ.:*~IǮ cQF,*Fef^h9,j`c "tfq,s)`Ա([P C+rEOTi宠i" OKvl ʡv촟ܾweSM1ř T|\ k"ȡ)~CnI⛒؊%2W7j#7=—}4-Y&[9;w5 ћQwB괨y7Rz*#rUq J%V.[=`!swqZ[Y%*/>7%ΖuDIkMuC uC7U7k?Y^{=<`arFO))99ؠ%:|$U,[$4܄ POTE.60yPGX ,̪~"kg|8Zbd3Fj.9]h74'T &Ȯ ȌՍ0:c܇y*ҵ%Ob(a ߣ3\g>ۻLnqAVX9fJ{fQPozg)b",XIT<L<&Vѻ> _t ^9()090dF>̚@1ߕ3OGV*6.4 No]T__*TH[&&nUUxYs F s]TCǽ.*s6tIzPG4?˩L`tsZpD737GnʺE/@C,[K)!)*%sVtԜj2cNh4x>G3=T3O dbO /i.FA>1M͖fn}Jg&>3!EdZX-qƫ3,\/v{P)V%!]TXBb鉿鲚>tדNԹ2>DM//LBOv:Ҭ_*Ǝ糣W injhx@`hq5]HJRvLkᄉd7S Ɗ}Uhu/ROwe]AWBiizKB#93ZFYα!ҨbԪ[*Gi>:sSc#$#H|! N-`Pm Wƍ;YE-_b?wo_ń6r4EsWpH9F]f['y|qK>h6to g])$pV\b 95/Y BA4i -c$ ' MZ͏ 0MoW )snq*I8[TYr!.t+dX8 2qʗ)|=Xڻ wt0 Q@`!&::묡@8$0R76BR,戔s 6n %y.wNgEN^W⇱W A}h'D{CU9?6b:LuG=6rj)?*0 YQ. ό6t4!`–v]]]Q U㴊"ޣ{>` 6,f!2UapqHۖH5됭T ,k NjH0?@VIռN4`՚o\D~~>(HLTٛusVkqFLhXb. m qᰤyMKXLr1F0m9r ԭ pP=ZW%鑱*IZ&k_f)ܺn\,S j"$'0 es(Kw;;0rZ;0$$Wǚ< o܁7g 0AZgD'Jz?~3Fwg8ةY'EE@vq|Q_tvD%6Ϗ`D 9%G)b+ɺx-l&I~ n %*ҒSMG†E!C뫇LlI Dͬ$-9m߰D= h\M> *y ?׫8]8a;!?otDfo 6y3*S\Hk?!b3vZ&il` ar,F&>-IRfa# a( _*B7Z<Ą&Qcq40C||j̪(:.x `|%Y@ 0  ˥_F}NVLJſEJ۬3 )_lV,x=$ sPÚY:̊mhČ<ȌސQkIމmb1Mذ"'HKOc?xqb  8$%;0]4_/Ĵ!d5s K <0?BBU [4)`HX6?cGȃJBKX\O.IF^( i_}POHLKh:IB nF5k@fA8Kt8Xρ)Kȴ?$mxYa4vɄL1v SP>CkDƌ6_ @g[eiZb_t< |#!y.pS5? 5zm*Ɂ.r aIHD dJL,. tȚWlPH6q۫&1aP6Wb$n/ 4lp~wm~X`փ]xȚ˘B_TiE\c]Bm!Cfk,/Yi v$xǠÎxRL4C%[4r۹9[գUk!'ƕB"b5(vo Mb#*&%na#>jtcr~s7œ?%.zod#W8${՝*ɿTNNZbOYQn*(p4MJTo?=/ΏDˑ^[݉SvlpXߗ׿)tjg~E&`V î-qۧ-n28Ivvoglgl-ib.`ّ$NG܁߰|g^,#*ZJ#Zg*_VHn9ON?F]E J; 0LQm3&.eXƁk\&S<zU4T'ֳ,&`ҟV]Li;1cZ 38W %671#*5cek+R冴Z`E d͂bz SA)3ّefFE>ER-9?S3@ѩM-Lf]E4|X9t,Xr[E^<˜ђ݌ʝz1ZqP7kOۢVHw`ݠiņøfjNP"~ӂY(Gx: 껕N0.|r."CW'?䳈'[X2\ﵼxVef @#Alǜ(͊j( 7+ k,.&_dh뎘% n*'2p;&]ydc1$U$OH1 ("%GEӘ;\TXgTΨ Q-+)?UԧϞM2l$F\8@Xm~**42 9MXqb򈔒%,0kS\H_B[ W-;c|AϏҵOD阳?.~qm Q,@E KOInU2cEHNyzsM%gK˔~褭a)N]}Izb M.6Pt,.$Y4"d[颃~yN&OT7xx0 ^'rXj+]dq55rl&?TfĂ% F0/RH忋mt vHL.5>n:=.1ަfGơ8.zP e6)]zɁ]]C`0VTMe)Rh-M$= lE/Ҿ"S,&-}֧~OщjQ0׋asMN0aD>'scF]+\8m)Y"3[TdEzE Ǥgܒ 8"FF,,22-I,xZ Z^Q:و̑[:?"A!bƣ{HP˲hF¶_8qCɚ\5A X휫vSnX|eXn.4G\<'yv(k CNl5RD$S*$EY,[1K93i{v׋*Z),5Q?f|F37q>wo2]|` {Ety?lqrpX9Lɑ3&iVRrý{ܴI@`FR䀣 /՟tԬNe!4(^<1wrVHkAIF1[Qdsh|;Ⴆd ҷz=dk̙tRDE,j $n$1YO3"qִ^zktP_X?>Pw4~|Ij &sȧ|DeGiC@F&v FU"'ĉt!z.  $Õ8ބi ɰ%NqيNN$ØUp9q˴k!aERtQ\x1Gbյ`hڇJ-m^v[&n4&{C$#ـyCFvÆ%[Dߧup9Lk`Ϗ l,Z E'-.clz2>e:㉹/@=kiW.k<$^ ط9x'r\ϔ*{U>SckQk=U$${Y}z ,%_/5#ŋjG _v6 Zhz' /X\ ,to2j/Xj.Q!)֏k֋ş_b *8o(0'u\XzR)ƂC{<xfT§NX<b0v-lv qH\]9MǀgQ/njS^񨠝77;@Ov" =ʲih]pD=yڡZ-VHXw4~h-qiӔhDBzt͡EW2I]T,| )lm@VpI@BLH:%87ik;[61Xʲjpt@XhpgВ^|,]TZT)TCRUCU"қ[`hQ% [c"3^DŽ@d4VY 8>! 70p[͒"YƯkMvFb-k&,t^y]Aʯhong<\I&nm'[֜@goKǢ5gj^Ӫ=.Q )w pH-4d@񀈹0 ?-6-ix2`| g&0?r4] ltA{) F+lv F#B@o02 "#FTzZK|N`fđς!Ş-k1wk!TR~NWJ~%4𸷃Wx^!K:,m5^\0 jwIf@Ao#ޣʽ &ψ>6n қ[E^Y[)ƧYШdzq. z%k F,Ѭ"ɤ<2hRUsH@~ L@p\aC)=7r0p 9d Qiu5cQzDW E3!`M-Mjt;Z?wv}/#dk|_?H.cau߽$~.7U+ ۇ#_<'<;Y6c(tOx,g^o~ܠgzȤhƟX%G{arLifIut .[L8\x"\eӭ ]Gt:-[ˌ/4Zld+06:cѓ62i}0Ø.g EPp U톗i2N#= >k%F,nq/tQgTQH^Lw(ǢDCCSFgT _/,"BQOi(Rbe`f7-? _@MK$9TǠ})7u$yQ:a5G.r08VƄ7Czh:=2=xyeG HUYBAR.(`6vG<]V{|etKمwnuteHDe;/p4)}8cY|[=.i?^G 2Q-i*`4_ 57<4{5 a1c=sqZ {`mZγSl_HWop dltՏ]_ nc7؋tq Uw.!U b;ZwQyiKtN|De:@ ͣQ. 'ǎ,^ )CZ|qa_zbobMR5hvFd5 $7mzD)fbsYJSЉKk'@CVȍ,)$I2 (ֻ#դKzy8z1i[VS#X+$wSz+Flի9~ٜTl3l#p91ʈQF-U%E\gt*2EiذKoga%eCQ6<pWw+Airq zxjjAxl.|ZwξmxSjyyC?T`9I c76pK zG=%zz=8M:L< mMv#"ǫIj)keuS>iAroDٳH'HHqBy;3Cykq.\7wH q+B=ϫÕ~̠oI/y_`'A^=SIk;^yomO?=-y3?=z _O(?=}2*E2M:?ل-iq?- ("B?)9V֚s$ [[p|sNF|64{o /F!'VS}ޙx/neu֢IgGs(T*BそFg[cL}v[k^2q ~o;$W+h炾ށtZ?,_ܣP_x xN 5?ݺ(ݬ|bAUP1 xcsề:@0(f Q* -Z"1%=YZdM,ۋx+֜bW* OzT )6djn$VłW6C'su]Xո%P5\iMMMzD0?_yR򟅈,]c0险IhY]( 7bHS:#xS]VEOp6phTT5)U2-^Q8~zz VPƺ urf?RBzÁB>DI|HCKBufT-, w6Xtܢ .En/RȍO*LgH} m*rl6T13駘.H=@H v؟~wW9S 1Vv!A?{ӯ:$)œRDE_!G7͜W׉ ](]Ó/}؋*\ %pVh_1"^tWHX,FRNNTQ2W#I<&ՙh+TUIH4"QHokl*8=;kuŜa.iN4*H;â]ѽ߭kݘJ@Xkt0ҲfsrD]> 9:~ ɏ[5n0?El(O+"BLݞ< _hݰA.lim1%7B>->`jK"TVּ˩vkY'%h:)ġg: 櫠L&O"U9瑁2,9E(u\ݓK`S tvDufÞG>c0E/͒/"[QT)ӈF|?%S0vDlGFol:S1 HoڒiDf.9%#| Ot'=uOG'T̔gI=4-YeSX_u^bT?*Ww?f8E f>H?gEXT4L yf"('$Kra$NuIj5<{O]BSRghb[ϔHLIYqH>G;=Il|ةk::7" >H/JjF+Rrݷ7P^q%hՁ.JnS/^AWYh RMNPj:@̆a4mc" kWb+Yj< É8|B!K{崬SnxnC\B#vA4 ٭b 2 ? `5I a_r ܔ,̹ξ3Kx hU7Nsh?-TwD>YL3&=ϯ5I,+,.'MDQ`n`-?T??RvWytuf I\$p۴?Ǘ?qv_TqpŅɕ 6"NL䯈 xXpg">J(K}EgY`6[/@ mzDWْ^F_o(x/WO[$[[%l]]%E]m +}A|& TAh#Jd'iDJN#reyceaCuB-|xiWatb=@EvR!H㳔>AI. `$X=nQ6SPI'IQT4:'kqb?tXޯ` Cv^*L>(\L r( ah}d~95\Y),p=(.N=4kz,nMd%H`(6tmfmn}{[[޶iL`рЭ7Rr4dUɦci4uY8`(cY20h2gՙ)ϕJG#B> f; }s\ ۇz! MUFݨsdW7&R43+(%ACZ4NCk(c]#᫙ONk՚TRCh>̚v;*Fi]kf(@;YmAq^ƩrK_ 縸8& I Nm/$NI˯걕=Q3/]֠ S(GKƦqz<ɳ%D[\,eSst^΃?/|d$k7tЪShhys8G nzB}TE Yׅ~hϔ2:K+wG+H4utpu%9?~@cu/qN]0^ƚe7Z VW$2L83J%ΖHxh#wu4Lbi0E.1EO|% Ʉ(. /ℱaּbFAF_o@A Fw[:ڙM-Z~q~C.Dw4y!ݜnT?gH{]l. L d0L MUvxiRt#" 6 W\mf&/u!}`$${z-Ek / ';M5M9|$?u*Zs Sr҂©iX65K!(376-3)u Gc\Utvd]bk|:i0y+Ӭ__Oa(0]*w6m,FW 7;HQ~Si݈/\)~Qʗ|c2J2LXQ/" 5@1/lc3)@0 LM9]R팝j}@Cw(W'qg*X%=v7Amc#jLeE(O yj8![g'֛߫OFb<Wga{ƎЙ2f!1p0[~ LF\Tt-tb503{Eq\dO-[*B. C\^FGGWŪM[ ny3;tcGe@-QCs(؏41+nϪjTލW>r9!tOeL*ٙ8ggRL= bOiiЬRZ'R*rU*ډoYRw쫔5RBsRR̻JJ[Dh<*{ -,K\r~_/ "(S`WsE&}Pgw>3d,:0 ^va4bc5sG2!i8aKʏ:N M9_aS'>ٗ qp)Pi<+ljD|Jw#rUӝsEMN֑w)VeLʠ_ `ވ:FzWm[AvQGͧ<(IWo4Jcwx@ f7_˛ c:?wTƐOほ+\qמY;"6$h}Gl+c>ߔ#ܢMO4lg& D)&B\4I.7*l}?4l^U)FࡖxVcz.ʪ*[3zwM ?gs(y rL;B`-?K>;p1kmW'ȇ\I?W%zW+*zt#zd|RC[+IxD-G4ԣFW7Mv+Ą[gq j;3 ;_Lcg CەH\*ȉ@;iސ W>]ΚތG$f& Q@H:΁j`vEw!Yqh5` :IXJ8dD/\N\ZHDLJG)F(FQN=1qrGpn?зK{.oR.=q;[bۭK=3S0Bm<ॆn]U & /@WP;nalg+Xrlt? flGFc g+S<Kj`%O̳,vۡn{Ɍe3Gێn[K\S$,TiW~*4 I'gnlHjAɡ߷F uk5iH@%EGn@xgk@x?EtQxŭI<ŽEm;-GZj ) p4p60ۈaج+㿽g9x?=6=rGK(" Z靏F_+p2@+?8?Vq&l++/DF+# Oߜ4FT'hn7987/_V<.JAgG K|$ gt@ߍn|״E™%܄:>?Nw4J4u9lɍ4_,m19ox3한"SG~rNw%PwxRߢkȈ?~OfV _K /8FV' !cSJꎞK=pX OעYkoL7LAqv#B,&g:Ycnv?o/L`rFNZa-3Ugf5}Q2gX`.]h q^Z~Su@.t(OIbhIq0`8jk5ALER v{B﫿oEw{m,Ye`xk !u888 "\F?IE񒋥RtӴ;\=r/ CvUŦ3]hԗ̃'DÁ =5jѫxW$YMrYZWCW@~`Qg F8QEG-XlkW>xu"E֤qq_PR+"gD*ihD*SIsn#_c"Q|vw h7ڂ@r=^)i+[!U64Nt E.6e/WBg,7[}jq@|G:(j  2lR2S5f.\!̥Gq®:"&C7)'j7 !*t h!1Ʒ|Td\B4)CpnhBЩG-rD1XkhiTH>َJ%_uZ"%ME:%BX6i Sދ-^)2ID{H ]:xIE LV(Zm#}Q"j4 z+T/"B/qlKK0ی_mkFF?Xk2`UyD"=D{^^-y.1M42GQz-pc,yQ6{y 7-fHI{5ju@0'f3PK'Oe [4<"0'V~rjZ4nVFԹ$_20s#=$@xhy@n0UdSN NnJ= Nx2e"2\&\,p=I^rE1B(yiutMT& d^aN?%3,ctJXFnv J_`" G}Aň "؊\Z+eԓ(Fό: K$̦#ZesS^'K!4FIQb^})s I"urT⤘R;usv2G5hr3tRL)&O-vQQ W($=2y3*1 ć@*Th|th`Wp/ܐ^TXu:eF ^ iwП+J{wVd>B{^eLF2йW!r?+79O?AJ~ UڔcZ{шwNV#@+y;:5 Ϧ14L K?W C=@n׸7N纭Gі qvO.QZYS[,Ob,* h<`w MC!tCX7Ktmt|ژz7B) vy! Lܫ]KŊJI-w*\FYC* 8/'-^p@J \Aʺ6\ 3nH1<񨸲tu(9^{om0ϊ:7-_=[/$3vw|´Gc( =vƷV8=3Q _:*cGJT茧YbFBLr1=c\A^4:vƸs:sYgWrSU{M-ӝMMzqcNDBkY| Qb@,GZm$]@ W%{k6l j/.?+؄SJʹW}JӐO׮Ϥ?0_* +ޱ!lXSigG/";5ˍd)]'4iP#$Aĩ[؉&4ahiS4S;Z8!](ulkZ>.<Fzj; FG3~8I9Gg)7Qz)hqqP vMN*}VeKpcݲ// 4 oJ%5ϴB^4lsr|Ā\]/o*{ήbS\ঀ[4Z]i6 7_a-t c:0Kp.á:Ci!F? O<dR:Z`]Q+77(H(AuޠaݦJSFAaLAfDm|rV't̬'6v2+Q$,56%4v#PlR63BȏJTf" K'H3u|M+z9 Yf$ JX=}}^hTpݸrIKdoQB_4o$>^Cs6bDV=T#rlcgMjf-LCaxU'Kg:&ur2!H.͈ ύo/(jF?OL@m|P;D g}韋8N+d9 p6)7`zX! wO| :ϧ2ֶxòvҰ҄z5oh);^6< +y/uF+~,T4H8c&fぎ48Nί ?ttKac_D^=A^5 atGV^(q(Pn8!׺BrAnF*.H(ґ%LU8i;Pf:vv:; ddJ.ޅLDbS葝rDKD`.H3!ɒcƂI/CC`Q%HA%D ]%4i|Oůi$`_vFyWM~y+`<tԃ٠f6c3[O8+I| ?''x:]t\B 銤r@K[HCBEX͵ ɟۅ-q4!%sX(( $REhRv* e櫧XcVR&Y#0OdOѕ|Mוsn_IMdTP.:, Vx WZ̮\u']oFwW;:4k70JeʒOY,G`s<`-~0R[^7s9X# A`V~B,vUƥ';^e46HǼ&1o??׫&/\`ar!,Vͬ8}xFQBgwp<``/Kő]'l0 xka|tL,-=߫?Z~⿥w!!o8öڧ5ٟ ?η2SfJmOG~"H@''`"?Mmd4Z톏+hk-𳯣*F?hǰ[c{8د\]~ N։4 >Q2В֋5u o϶}{yēiȹUhK@ZM{B﫿G9n9948: 'FfKX[8z3P.֊¨K_xA?"[Xn}7m{gFp&%Ax,w4}j[WNrr\ !6I#ZziЂ6*z7]Ж䉊<9Pg{\7oQ@\,evMEce  LtwH0Wô^@F;x? NIJmqsm05dh+z!4 X]?&8|ȃDOȴVO] ?ONt%2Kr P*>HͲ'nÎ:1L^fg~=˴7RW>EcM{qYje]=馻a2aa3ovJ{wYmW>xuoF͘ T3?Qq43n υpOb3Hjl9 ;Vᐶ{ ,>߿_Sؒ6Ctx% "$^5as }CQ>,hC,w`)+.1{HwgT5jX`+t̙'g e܏1.ɁQXw Pt]Rqܬo_VHy|h kBXkar-fL|L|mT؏'4/,BBMJ? ÇMJUu$_:ʾme,FyXI,U7GٴC={ܙq?-lo-,"B!/{Gv5P3,jnL{G?|TC!X'$+Q ы($o& L7!Nni Q7ٗo~(G ~*>59\G&GX*SO*U:](~Nɦsay:I_%:pPŶ@P ] 6KN-uB4M[dI\ c!`BH5H70CxVp+j 8ʫW.N8͌=Ib?9%֪2Î*CxFVmyk0s lhd_Mv *X`ҟop [4Aojz^܃SM.'u1VZ@U$.)TR^jDP6L68;yRR*_NR$#?+KBB^?t'd޳jte;{=τ¡C}!6r#5 ;Gn­^;.3뛞< ̹1As)Pfф*UԏlrD#vGC`%Ҙa\9&Tvmk5 skflgֵ ӹ߃M !mG/w t9g PhX'Tn>Iq*HW!גPAyi;`j#wV6_Oń;+?hNDY,X+BxI`΋U\cp>LFY@_f UM*pC9rf3{gI71~00x$0y8L[}[oktO'ݓg'fF"0c3hױL& {Hh;e,UҐ' ̙%Lcމ;]"+IJ&0,4DAqhyf+gV) 3jbU1㝜$HaQ_bBF3SrR"l1w*>vU~\_҈Rgeʿo~ԣ1Y\_wkJB_?yW&q>{w7O^` es_I~_hWםhͤuwH^`FR ! 2tde6ԛ ԗ=3qy !jz#Fo/#/!o} })Nz_^oMOa!ν*:Yoּwe*`SҰi5)S8s.&B:K06m*:@BiTS1ZB1sc5dKvz Ӥ>thk*Xx//W'Pa~ w!DX4/-_>_os o@撓4WOM$r [?ԅ]zAw\MwN;mW։WD)>1eLWhWҞUۤ-[9H8] r)w0#U)=Q5vA3J+R짵ZھDۧGlqs71 YY'+D3}Bvĭ9p"(HX. 4,:giFONӎ-4kL)"4h.oҦdR;3mǴ2Գp]7 E7vDs<'fY=4dɖ#\s&->*44D05Seq4d:HCv1pli`7ܦ7: uK)i9Q /T&F6sAxWR`8MQbfD`_5 a'QҬJUǭxj:J9M@)Uvk:ٵt<)q=){aOM0?l5zbmVE#gL{&\` X&k"9mЎP>!ܟzo 1激V@fbBȔ6|g.ڈجc{AE>Oc fibcޟw5$SĪsCDYUiRد׹DDk,żppEHB ] H擹omQd6`Sg'Nh 3 G^ &źO|f0׌B9,,EA#Ĕē"M*,L,H iNl@V&ֻD?T-JD|t}wq3{!"E}Bڳvt3{aAZmm0f:DByw!URM@l mϴ9r|IV8`i fʺ9+ӼBo fW}-;6d+!ŗ6n%r;0s17;|Ǜ\qPxB>x9\ЭM(ZcP8Cm@0+/bĭ.|"#2 ޕ[SdSuU21%o H6z;xX H()L\D8PHR[2-7eĮvu|!QL<\ _?HxMFwd8d+]4RRͅzxX_o<D0"ARUܞv2 RS oEM rɜ ^L`eT?Pi֡^OA=oƙA23v CG X ~(үը6V~IE r:鬂+FmO8[f[[zdC|3eO+qE3qi l ~(M 3MB-v<:7)x~6 %0GåU|[ƥ3,氇NߛLɿgMN[K2MgiZR"0ݞx[0K<ߌ03aSޙy$}W}Cތ$ٷBf2}q:}}[}ٳ\(Q`'`2(~0qKYD#$N8#̾wc=$%jG л]{Ў e^h$X{ Zd`FUYCv[ۡۓ#/g>S^c5ZuE:<) Ҳ[KIsN(,|8o[_nad'Ֆǥ3(LN89uO@;NAR怀q٘!h%<]qXdtKqGq(޸u {Sqm':ֻhՏIV5n-HR!W~L+2iW-?2)w}\Q, z 2>&&5>,>,`evmu_|yO[ngg8J Ў y5Q2g *H6mğLqBFyu ]7T)&>S(K^}ʺ쿅݃n[HYv6wHbV[ foX~+efTOn /Me9EPΌlRA VT_!DcZ\UK1NKsj%0a-[U9sչFanVˇj ۰K K9LOooMͭ1ZḘDJskemV݁MYXZ+-*>~hkjUMjU孩USbVMmMUTegll{&Zl^y҃9`ɾzŶyVʊiti%lH9lޣ?'݈i?jƧB4OivH8D:!&1Z /(w\Pr"|WKH$B*tK8b`B\8.Rw ۜ5z!,@ ϯY*\{-Dc-1wJA!t'gJ[ftrt I7~wxֻ˷gH^z: *݇3p>]fWBҷ6o2wlu$m˓ nkep,yeVvkp:M b#h??'2 s\)û@*VkPj̜Ĉ )ma}ocMi8w@@rLk?"f <1!O:o'pW&νX"prY"s4#o 1r7fx/ srY93:r R= 'Oq~C[%݈˽IĪo0'X?lkzND<#I[g>r#gmJutDevS˵% fkyv?RMf3hjjbd++z;G+=dɎ"`I򜽂` 'dO > zIox;fKX -,z@m3Vm~ PIı07 *vVFXOpıb.ƆtF!tiSnfJE{خop E%gpdb.QDLIޓQhN82jGٴA2xbHgTV]J-A[Zn .CQx[e8a.67Mﭗ'[}ik ^ ;a34kOdlZ(;Ŧ=A,ȅ"hN"o"bJɄދ3z"fgJ9x{G9}mŞﭳ,Ҁ@-6 HД^}(C r|cnyH)=EbUZ@#4T04Q*Q<ʹaClp? ލ__:$d<TKjqTFC$IqoIoJ&L(ͦ{{fY\BmwA_ `@h@Ye;+r x#zlZ]އ<\/ '.ǰ;U9(-//(<oY9[`2,v ۤE 5B >&pX<.DlDEk :mBߨ /2Ux2~], /abh 3#-,\ @m>rro'BmVeMb{;-ya_x1Z#;Fȶ,'ƃɑsEŷY$3!"!œ[Yo[L^b*^udë*nռh?ⅴ}Й4܏`TlصycɀFN6T/T[k_CVV`I]5,*t8QH/x8tU;M4_ޣW\@r#!u04UA`L(r _JpPm_'.XozeShn$쾐fa֐@Z^H4Nj̈́q3R4[(*|6$*%=+y\aiKG)Q}y\}H= b{DsWD sW(/t7 2),{9-t8㚰OYd ^E(pkw?#4Y$Z{Mx)]^ZTEbF*[yRXo!ء .Ź%9Q F9 kA&8WX:"='΢ɧrz2%X|W;$'=,N3*^rn=U(?NϽ ks<|;+3GAhXwWVNd>zg;Ҹ uV8!7m&2fڙ*WgG@?Y1J2NuD[d+_(纼ПHCaݰYz\d0,KM B |rXVSK,7HTaLHopxz 8zNg1ج47n4^5Dč[\qퟮ½֦/<{+v>xgQKR)TrġZ#r6SG'w>o?vSoO_<6%&2):x"]"`,0Ն 48lTlQ` ,U {Qd+sV8YY˜T+"뫀 r9`[0E媨b D4AtQ&R[9@ 8f&0 ޵++nef1i%[JRKdrQ`U\fy5r̗sb׋^- \sC6Į,[܉AF*K&-^#مG-PŠaǵy bc:l_>_;  R>o %I%6%ǶV@JSnCPkCa|x_<b >yYDmSAe[ TX+$\EaLʞ@x!ChSz%gAdUabs4 a頥  na*A%kLUT ʐVXDEswt^t^^}jːO?vh(C/8OkxkXUT| "s DE[Z'|i]W |ХBe)&vmWCS?Ŝˬynn!,! JA *>oI1~ rX#mArP`qOUYҢ m^ֺfyPѵyY6W3״6ӑ/tdY^O-U˥@)>QT1'(_*_|/Rc?X^F6H_]}kѕd#(d]Ai`țiƄUGX&ݤ\yܔ%-m{KM>xHרҏ_2i* YB<¡ qArp6nd:p5ӽD𔯠1]6 khщ%k`9X7quNo7갠FGungcw5-7>:C\"hh| qG24-ܪ )ö=b+Yhn.AV^p&S`2cY} pkDY@rr6 N7X, ._jE5O5DITEGCP`OM svi/Qw,01faZ֙cʪm 7 +ƈ@zޅG]?<_sf*h$YaŰ?; L)xUqL3%!SHjJ[&rf=ˌ**9xY2TbtW:Py55()j$j⎪|l4NDCN!B+iX:@nNDբ}qc06٢jgzi +p`t"cXV, ",b@B*a9֟_n'1չ\KFqY5.'zYۥdPъjs=&FV:dыA:۹Ӊ8|9c4P(hk,vS牞/s^`%A)X )^/x3Rn 'QWǠ\sUR誜E>ueR/?T[{i7/}˚kArK_gФΕs[ҧ?m!,[eB^Dg$ u+׭#gC؉$L]p&e{G)'Ok~o*L7uU7u}"p!tnlWk&M]pSW??HOri|~3Βofo)nͳ!l>l(fWpq0,Pu;Ա+zcpL#fi|p_i Is,ŒcK.Xl OQ>Tu6q~ƸJ 9 ;z8aۭh {UU&,)"e-ssj}-f4/8{P,T[;̭)aQWr>14Ixy~|o;ά'/TC>Q&2-ss;.ܝ՛2?)(nv dEB=o'R Wx᫸t1w+$0j.nD9?Fӥk_"Ejeg1l5qv2_B>[Fm لz,̛ "a2[ln"MgNaр81{l>DmdG;;F͍-rIЬqh8߁LxGJGV]Z@~kln4]KW|'Lyk?TZӻQvt^,Ř|auS (Z^x8r_#Hs/DAm^|?S {WmO`x~^lق%[ŕ 6mj(jqo8M|đؔ'=WźP S"Tq'?vY?Oൄ{ft;Pӂy{fg(BDǐEF,4;<7%/-EJY\ٽ\ Rx/ ,{TG Y~Bw"svl8! JŕcFؕCDr槗AZj# tǽUD> W7X,')ʬacrJu'/Dsf/_bNvъE%tE!%QHw֖ R9Mu<Jc)zo ͘m0&,E^(DZ\ZKџY'zO-R'y9XրbXl*:w&Y69[c^8k?Z?g)?cq [f9%Z!,uY=ug_C@0zaTm  k[Ez*rTcMr^<|)K;8 /kKE,^Si0Xq|,4e:;mr.p+ l{;LΛEЊyÇA qnWq5>7ƭ}<ҕa$1F$DbѢHR#M;lj)^ IٱYZ4O'\tݤpQ pE,:_/XTKѢ-xVCpR(9\dQS(z\Oi}υY#ҫr7u œM‚.x?:(ϛwۢF@A~SdD9!z'sS]pw^"%˿G ~1G%yfJyӡ{1o Bz yA{ɋm4#$kOdm&nⅭyM\EjTSZ-=Hg4ގp .֘Tc"N>T Hg1wƤ]?*9&ON@C]b$<1IE5}=3-v+1RZ?ܗ#Z#Zh1yVшs/ǻ 2xw5q/2L4w 3d7.0yt?u~ў$ꊛΣy-5yer$ĉ?[E9X܉s\Q^͔Sz3rm!1^RB6B ?+nhR2~4'wLHMu;|Hf'^h3a-O_?zWлD+ḯxZ y2](~rƿS> McL]f?* [{2tƎ5n:f{V5[5rx="ޥ)e}qV#ya5s<*,Ë}(7 'fwo@`%妳I-feC?oZo UZ6Z{j$L4z6w,B; E |tF,a4F\8XdE;Dy~K󏣆sp9e/ȩz4Z@4ߧV_ ]KL;Okyi/5)}񿝗Skr-"z'}K__|)wxϹIM> elԩYQD` 9dj \̍0#BRE{d7w1;gD|?& %-힕,7<re7Zq9)w h8 yZ q"VLƓwB\l„NGUo{Oo=+Aě N5QwLAEa@>uf] ywGؗjմUV\rK 熯Ֆg>a `s7_O8c!t`\pX_Ű>%bOkX~oJG<`wjX[ņߜD12nQSHM3zvm5%[.t[\ܮį@!Ib{8bod2/,ח*}h[*_ݽ4ZÄ?@MI87dM*=IXȍ3T:qFl9X:`-/i0Da!NaT0WDK qƗr'/`.vV_,E;#2}q5$PG@7`.a=hm}lrX^m]$)6Io+vꊻtS44Mm;Z6U!TvX5K{ۀ-qd'(B{]j"px@_(B6 ϦoyN)*OѦ%~rTewb˦jK0jhBjyTCaѡPKx \1\)'[[#+:ojgIhWZ3Uvq\M [KaMa¸ǁq TMa\ֱMa_m}nu,3\tsi<ܵrۉ5 nY]xx»)»|'[_/og-OSQ ?C_3~_^\>i5Bgp ,Et3Y%ϸ$7W8[2)Ȝ)z@W8N}z0)ljw7\࿇)m xC=L1M1Ud8lɦ/ɦs:aRjS6jS6}PȇZmtV}k5"ݘ`{ 9xP2 xyX58ƫ˯, _sE%{ A>HN)3>Č;'</P-%D:* Dj7y㪎@D෠W1M ztMO-^1G3zW/>Xsi1nr9GB8mNi]aJs4XWNC q!Kc~2R7st?*w4eԌ+33<IUeSLEӬD+D,f oUt**ѭ&GDjQ"^p5*G)#)[(^"W?zYicw5M|`Ezd7{Sإw+NJå6qz [վ OS{vEyMoҖխ-[X2[pp'5mݴElB*9n{t= Vt38pSw;݅|7_yx ʗWW|*>(׋/&u`E*Zͱv0{jǡwxOr{x* 7Fۇ_ *]our'(Mqn/??㔯}TjG Uc)! A\5HɊn$l;g.t&+ |sK 2|p[A߰ML[HcQT]&k\tdxӲ;G㼝ʩB')Mnlfs(nKn.1TB mˠ Bc6 E` [w^95,-im8:<_"5Ik΅ fyRx t@ p)3(?I$}0zRc[pV;LFEN[|@hשVI[g:m%?P[4=\|Y;1vfOu _&0Hi*$RU|.H;SEBwh^3JZ 4F|4,EU1څܰbH W[qUdi՜#2Zf|PEǽ,jGcaaSDlVx `X O6:R*c`R!PU)eBRLeɴ/XOn%/`jބïj;-=@yO]Moal W)J'vKz׻1ߗB2p\Yh\$4+/Y|4KT|0uqZ7X(`Gt[{%2S0]VkR\351\h݀S a(R2E.(f ˄8˺L\Ʃ#-W8R-XΧ:{u@20 /%ҫu*Ya0Ru{}b3(n)W *?hTV?VY;)dY )++Ú9™QxX~7(&Ͼd>_xh1oR=>^^Pn!nv'sw,ͳrԕvߕ埈˪qOiI F`^ۈ(okE${Cd,aY(;pyVBP~IPK6C7V w1)6"EY"H!#RίF}_z 8H@^ }lSdao0P 4v)Ʀ0+1D'6v%'?_,'6†_y)*^`qX&/n ETRO 85Dt,O=៧i/ƒB5:[nۼ޴W6mnem!8u6O@b~6zͧ@K_cm-Zk_\~ @q?1hkVQKAQS(*^ D>BVTv:1"N9N `E҄z Q='o)jF1ň^x#2's>g/Kӊ(?^?Dh_Cbܱ8А }I/)'HC,ůeK`5I6g&\q3hpG%.Rt'Ew^ "G#mI-,+rीQ JEUh!"ŋRy?.gObR1H&?_q܀ P!W~Ma sAyy㩥8̃IhƞjշDJDP=0(v RզFceasP W1A$j`7h[ ?*Y<[p̓D_ʝ #; XZ(c*V RΫ:oB{J6i֭W_ꍣyT4]C Ã..o.6kH@%n6a[uRp6B1 <tQf_|8͸x;Dr#g5^fW¶57w4-F:.eP7>TT˶ jmTȚ LUKgFLSuw>wjpDUE%wuԵl!a*,Yf~_^K[eRuiĒ9~kZjnaWz=d݌^N90U7wLRƅ%`.*H".rD$$d`2™x! *soia= ZDmF!E%h KI7x4=KIj N :b/ G­}Ж1qXaD]0_مҲ]Bw컱8m|cwE~9 `wr JEmpUF !.~4FFM " 0&By &0-5AfLCZ0D,8D;L]; 4٠7~3.*# &`{Bjg ڄlzUW.>~;"X8 '_YiZ6a?)~=TB\~~ĩs5q)mԌHc磏ż ?d3ՔXz ]],\+Ջ K[H֌,WB! b@lRl)Quގaye??Dy |QA+?͹$.J!ћ99;}=nߚl젥rjtS9r!-o36䪹ZYQq蕃w TbYxg(tD҈]P'G!Ѐ<5B~QXڡwEl@|}PE3^jiLbxW7X-Zw-OUSo_/!K 1r:a$:au:fv: Xx:!+R-P@j$f F8@" tM`jɮ`O `Z %hr`cSmpS +݌öXs@M+ŕe%`:"ae_#\Acÿ}"Tp8Z'gGb#8Y1zףhI)K4Rdq",.e,.98 }%NHɸ>?K@u ߑTE$\1|%E<*:tw]waLӶflT6l0{-zֶd]Y1Uو2ŀflтfU6()Ln>8h' nˌ^1F}Nw\>x)!fbWkoIܭ$h͂'d4QbG}uNF\$(l(u[ʧh"uR$!5D9AaIv_qkYsi~_uf#ԾOgW[rܘGHbCKAݨ^R0ZO֑`F~Ώ - ?:'Cg;@R?%"(@z梖w3qTKr܊RV|n<<1HDrA}!;w:L*aPi-c>YΜLhNB*Dbw9@b[4$Ƿߪ i獤'xR?t(bc'nH>5uz#@ +CʈЭW7g⮦hBW.jH5_Ǿ^tmFv16 E뼏ƥICڨƎl*+:4eLq"H} #g먪(ƂL5kF# OjG1Tp M&.i#4me΃okvBk4Zo+菱.msw9+QKT[O] Y=f"5O^2or@7n@#ĩ5 ]nqݯ#v̚աh/A+{ \~ wD4U_XOoYsX8:fYY ׃wӻ9ʂҦE)4-lD>'Ga\#WuA®+nXbRf+C)KaMi!hihZ$NZ3s?yzXn>/oy&ܪ 0ns,}8ڥ*UK~H};r3ɒuEƤ9Vo͡~>#|&9i5Յէ݈uЈ3ƖNy޸4յW +ْLD@PK@grHdK=Krw  ,K62|#lһf5f,g*s֎ߴ>b<ȢMF5M7y*k> *Uq$آy PT5dTLxCdPEPŗq,G.R/d _XΕB?/R50Uy5WP/X|VjPN j`1Ux鳞ǩ}\RoO}L%|02rcEŗ\(vt%jfJC뾞@ c_ Տ>I$-;NKMx)wjtW7ByYɆ*b8*H<" ˗.n6Gu)*IWQJ|cyZi)Qlm "_Z8Ӛ:?ie2/΁D_"1B6v $wL,7<]r!r=yw,ď98 md7[2]c9 ʆ#KސJTPw̔Z/BR?}(tcpvwzPE _ džy6y!9Y#SO?=?')?)$R'I,'q]?tl(C?)?y,"|/<|c?؊IvWd ri1Ag?xzdO<|^(G9;V3qa:hƫ_T,%ck6s(MibI$4cJJ($Jz)&sMB54ȉ){ʛt^P~O&PYf"0KXH"L$646 @ e> gm%hhĸl*q.HS}֭[EtfPa}>髪f+ t\YFSu)cgM7RcG9NS|_knj'ZCmo.I+QWJS-Ekx"ҸHwخ&oē\dڟr{0Sj6ktT[gZA KVR,{ꔿ4)Aǩצ~ htk/^j+X:sV79wNe/-N9j;NOhcQ~&q'visgo[d/^e~09u8~竲hHwy=p҉TOs[;q9$(-F//N=;\Kshhy4fxA?LyU / { ݐT:{Q=jA.СJBu\%wJqg ky,k𚻒%k^LnqtL 1*4QNM`Z0'խ6Zfdnf=wg+>{ʱ /a?.wtxfhw[Io4]86+<"^cjdXkhXvJTS?_-ZiZ@?OGS/I# yBFZQ"lX7;+ p>nŋC*'3p?ͭv9y IZ w*X HYS@8jgYL 9s1Xֹmsbm:mhaI%`W 8HFP&Hf ~~C%DWsXs"\-J@- Xְ ^=n,[Wm:M-26=G}sy1Desz1/Ѕ{J-Xӕ Xj ס?V؞>jN(#'V5awXDLrH&y,-"M._"V]!#P6ÁJ-T#{;/g"w|xĜV _'䦶ǥk)b?L_nOy??.>boc;[l]EQZ)Ϭ ;M>bF\UvlD~7dWz-ro (@CGnGsK'1; 'DC_. 7%),_|3ft$ }b>)Y }V 9U͊K5HA{ekthuUQw'!F _K+Z){a$ ϻgzG{qI-Sg,#M&V#;il7*ojN#XY#"F5K,94Iĥ*&e}w ]s' $9tJ l'qZ`&@66tB668K7^>ik#S$\LKNjy%Sٍ$u7LglTPʼhu~`3Y ,K4h2ޔcl5..crA&vۘ)%\)4=DJE!5R*5 _ʎb߃ü FeV(0zrmݥ*D_族~:w= 1}u<k#1Q4oTC,չK\Pk:1T؝3@H4p,aH&qlBf X!\3XtI#1W:jF̻nuY#mWU?.R,9!T 5NZ;YTa^/-#T>d3? gwX-I/py?3CvJk6lS@:##䒣jÖ5ϝkvgoCr[6icI]/t`& x,8A,6h)F>')H#_KUorzDe'm2̐uQ_5qp`c_漍N@@6{aw6$_ 0a(+A%78Dn+0?sC )r Lt (+)Op}A"LӺW:&6Dzit5C*/%PuQX ~, Ys eyKhS ٹn [Qv`~nDVZ ֍|2^6C"8X50w˴;8TH΁ YfDV-#kDxH `yS''t0Tz4vf؆-` *%l6k%o*/`艕7/I&~VV>lV5et i[eεA(`kB -W_'Mt~Pb ހ 77> @\%Ɓ] u+>A=xX`_;<-b˦婰5\d?aj/a S鳖ib fk˘#Di"",Xf+ { {6r׵ yu_-O^Vjv"SުMx[ߓD{zt^ٞjf/ٲ7Z9,s=1ByG,[0G-sЎ \0`_%?xʫHV䓲3dwE%W8= ^ׇ2sѪ?N9!wTnd"VdKXg@" DŽ k [Hb yF8 p^7پI}zR6$l_;.2Zg.8YZ-Vߺ`.U_~,W949o}?m)īJDh5#k]IӞmLt'>@|IY/{d 7(mk,wNS>ۜeݸe48>Yq@~ ԈD@d|@7θ$qdG!+4 -='+eZE|8ПfVnBs]a7XWV~S;?Ш0j- X3{R>7Y*+Y?sX9ZGy 8 Q5)>`\sĒ?76N= {u{WZ\L+FГ )GoTa-TС$Ql)]ߩ;T]FqNs퓏 ֟>ޭm}Th݌,=lj6G#|n׻=LQ9s%-wGgN;lnjA;,\Nw12T\<+ˊ"YYK5=zbUnDeɈde_CfVt+,J]yd|?=q %dO{MKZۋ&oK; U?zYb O&"Vg^7pxSmlφ+8۽eM0 ݆1g([WJzǎTwkwKy?4/Q=O/5j<G~P(.ƀ]Xk7!,eYc >^X_4H8C.TG #QSIFv! aP[MBUвG%+XVza0!`# *΁}QWT+Vf((Ѯ= NoJoYKVW#o[/ C<%2p@LT^$f&My.,Y"U^Q[f]ckxK2xs#l-ǛǞBauwqy!L9 \2ynώw$nb6,3&<4p&MTIPnƸ+u:ed6Tqv :.?Q095 \=au cjjuQ)ۅ罙G~bRyŐ [gn1TJu<sdp.g8Io@N=$&pZf 39H1YyQCɺ"ͪu w|d9 +Vr. 8zޯbY;B])E)BG.v)BZǎ {@:i4zSowgohޞ]Ž͓RrNLz씋,{zΊNj Ɩ 0^ͭYI|U5A|gY`bsr^S'/G;S-kk )?4ĀމwnX-7^pv;??ρV%zZoڹQ!:7й(t 2EϬgHg8ѡk-dD ](`D.{(`rS2iq@xX=) /QbM4ロ9p?H /)xaMmS~ ' PH ($XKX/+ @&;fd!Y`M#2s?M?w?ڣȁȶѸ; .k[;_Ms#eX8ϗSdgyK|N$ :޾%s+;).o,hR\p @"~DM*D:wUC2bcSIŒVyWy^ؠЭ2kjkDF~/=mdl~ncv/ˏ1GA#pOԉ!;X:kvb<]ǾoZ%ThNlȿ 񝃐dwvBK>ک%evZj~e]cA0pMjA-:mknM۰Rj9 s#&j"PUK2wNJMno^T2 d=4lȢ_2ʨģ&Pb/ XLHPت̈́ `^Ab$0x6C_t f㖺0o~z¬V=bG[ƻjoԤ}K":*ERcXre{=mL`JڂǸȮ/'q}@g%B?F1HJzc pWDDX{iAa jj \} 5Do)D(lקG]vm)G⿯ K'I?#HRg9V|µe}|_GΥFUQA.JĘ>:~\;DpQ TVUUk y4FXWӏ󁂆݆U Ph8g,Kͻ|EWyǽ_JE LΣM9f6זBJv-#V_GWbfh h!YyGy{Bt5(,XEth݅B7q9qrv8GQdZG[iUef))4k-O S?_NF?O< jWhTH5u?NRO z?G%He{<l_]M< +sp9툜N紓ͮC -+fl<4(K]e?p[%$=,DDX/VT[I,WV/R>>sXuiSQNTITDpdU~|L,P;bQ7ל>Q.:\'oN`0j3҉Iv>mW"y|0$LM1FGY\TCɑ69RH WEjf[L'_(_Hp=(kfW8쌨 *VީNGƟc8*ם&D R_I:@r>-C=[GTۅZZꕔ'Jdde_]!Z,).ԥ~y׼#Uq\pI D=.wFw@ϴbqdC7ԹZ,~йe]q4=UxWBGn]7#'kʲ_>'Bf{ϓI(hS;dJFêҡ}t.֮▁P0+ ]q~:sR0[.{PAno:66`yk獓 )ϟJo5iϛثi%9[9AwϳB'*Q|TiΪ`Q*,wʦnZ⊚^hz)8MXn.&.7h:UuxħS J(OBcrmICbßGԶ_Xljck܄r:=3;W*g@]ߚD WnDu%7chuihX]/* }һQeW*o<'*"+1zF5 L.WyO_< o"/"~6,+@M5`E$"S? *6դzoƳ/R_Fo8UMh.4Y6QZJ2{OjXv=1uʭyX.qC3`xF8˯ = wVA_A\O\%+p U~ i\*c#JEE]a;bODU1hңnu[QӝgEnpnӭ~7̢.,WW HE @)=3cB_],hXZ j"*h+S(\+&`*rYbuk 0Ou<w) s7%mo^q>2 uv >Rd/EF0Uo{o<] vx"Q4Q'Xcw')k5)7׋&fn\L?OW.+0\pŀR`1_`"oO,wkE>2X5œYLś")dѢL.,6^ 8IqET*h0>>Lh{[^:[(Yg~R379QW17r@YNMlA uVf9 [vj~[ro{+:B,"ч9mkQ(kx:_3\G6= \w-Neh7 )_PlD%",]O1 Rwۛ دbB;*;(Cf$/?#?V缶 )Ye6/iQ}/ wicFZ&$|vwkm`68=,N.<0n `⴫PCܺTImZ( )Hv! nEy[Sѭ% r0I5#j4png\ >pPuEq&KVvNYLRmuɮJ:*eړOdZFNrQFA؈!JY8B4_O,;N){1e|N. Jf 08"~P[z.j&=EKڥS&ejP_u_ђc?_5柑XMb T]J GMܖqAbRc W5>pB'OE$a' YcSָ'Q+eFn̻Ggg,BL3\J_+xnֶww=o%|RB_/B__;ڛ|W#[RpUt~\ޭ諧vD?YMs~?@Gnt+~]DJ_.u!Y7vw pf8;B)36p^Vd-ğb KQ1.cb"l Oq"I;GDy>ǵW( ?_ <|$2Z}La?H2AQ|Zs>_is-(/9Şe ("bj${(Bהjk bXK<V=o>Z<~Vi~g@Zۅ}C;E\mvJ -|?=cO=DXk0ŽGS}Ir? nud@$bc @XIqJ.U.>hHoO`~OY,j=>V/qy٪ʐ KB߮>4fHr?= 0d`b3DR~ >%Ag=Wꕖh&Gݤ=>{[xD^'hR*_);%=}s\뿵82㿨m5ک3kqXayZ9^h{ YR篗e/e~?؆rgqb~_|^?B>_Q;>4Wou<1f[yfC˿5V7wsw8}; KG5]ë\wzÿםӜwؿzh*oc۠n.Hfb]LG4[/gS߃w/jKO2, JÉ]f}7NS$?M`0_d`8h2׬ 2s2h8ߥ°@'l#џdyi >VN#4.\1QFpH {qy;Bʳh73 >hR;y1Gj]>d`X8M6yW!cm F;4_nA*ïAc70|rȒ1/Yg8!C / ~'9Y@"Ӏ}aM3 ,w8jŁ BT>?= m%W\F[eT`g(@ ,'YMa/6p)KvLn%; pDToqFL a%pMœN^t+yJlɂ<›8(> *фaӁ7Øx9u[:hF - Rb OQ0(WI%Q cvXfIV<@]J7˛x6 =ߓ_FJJ(h UsKG)^2,=J^CI`] Ӿxs'7d m5Zı#;y=Aa2L!*D5Nfc18lRsH+a`7Cs߿fʁw{\p`m3HL;q5=@] T}B-xA$ C2d*r>tz2fm0UrC+c`}1kjbb0g)) \9sxGYv;&2lg7ft,ޱ:?Jr&mF7xrty%[ _k}IX/&r|zp՛Mxj!2b*(`li`9 ibx=Q;5*[[;voHx5[ӑO8[Sygva-O,Ѡr$unP*#zg;-lJȆyD|T @֣ AyJ00nAz!`qR@PBf4f aZڎYwU,&Y`3+[Hhtsc/`Hy?OcO$*}v;ڑ=89  1@ Bx8 NW#d Hd{k8 hOiAb#>%':P.R?S'ӌ kL9j,x0K7UvLCX[џFcemjbύ!j}fƹÍ; U)jHF"w1ѿw2A[z?&XlJخIyW@mtg BUԚxR>ICe̦+NK6\rc712 鸓''8'CIgP9YU)1vP U~b7MH1M&` ϐVTl98q}؃`SGc8(e&>͸/d\?r!C[%#eZXvr0Fdp6pI:Ͳb6L46{3jtd aLGE Fu6$,pW(!(b)+m5&#Fe:Uͽ1H:qC4q\<akVB'mF|1#9.& go 㼻I(Qh2$2@  t&B&Jd"#K?nH*hDx ~!' #gqDcA2fx LYHQ3zZP/Jd{+Ch0f!)4 8p C nŢ 3eHSǦNhwy?5TI!Ia&LL3Vr@vp 4w oO(ec/Sz?0:p0}bVhg97+5t96jQkl~DC~;̊2\>xz4 3?jb5-#&$*}.XݴMі;,oO}88ny3J6*XoxR{+a(nWwOaB(SAIٍBv5nعNh ,Qi3]'$(r DK7|>/Lw}Wȍհ\gd3QdaGb,w~NVG hˢ`42rA_Va3BX<ew~*?]v&LE|gw.V~F5(zxw?C`L6[RO̮tLcxZ6([D-1wD>8#i^k8?@{h$T@?Xi!{"3@^ p(.q3D{-$G4p'Gi ݐ-J]3@}&uq\~>2{B'y\)*[%*<^l&R&3( a}fɜOI6Qd3cըlJpP}nuK[~bdڞ{#,k&J{VN@8Z4=*_>f-UKg[t pS$k#І޻fw_%E5f˰}Xv%2{S !w d`;l+D2UV 20H&+MeL)En{]\ hV GJ^}2ݲ)G,bspGg" 't}SiA{;}r˺&ny -,6yQ{9dkN UDq agiݥ?|CjLX ƻ!=픊7?hýƂo@[8hйAѨX hU |2v=0gAx a"{,#!"[c `~K;Bv Q!|BplU=P'z`CfFV&xpyEKHu3Fu &:$83UB{˝o^ܨ8d:vÏҝR9m\RD2L'v OA䵖\٠n/NNlãJ[0^y%5sXlMJKѩD'Aͧ0HxMN`fxoWyڪTTZ;'kcr)q>t]oއwc"U&]gtÇpm 20?\lPCq=~V~Џ4fy0Ŏۨ0 @-*La>t(`GA$ T@X"NiۛH: 0"Mz75l,}'^&>207BWy0Q|A>?p.促`넩Dߤ4CZy#R3frFYNO;+h_k 7ƽtɬ2ܟGΒgF"+>)(AǛ g&cȼԌAt6D bks/:Q **lb-FCt2]>ȊsPZ!(MW_7J]j >N)N\`HlS)|DED5t"z&"cs6:M,O ũnI? Ž}wP,v1^~7{Ҩҝt0_Ηَ0q`= E}tH]8)w ޒ/R {<rΪ`dRZʦSpsNTE~I(Y)2ߣأ1?ҚZ2U<9oףMQMF(ԇAñ>0Ut?)Տ^HU| ^}B+'宗&t{^7mK0r9(,.+Qol=9xПۙlOXR3Y0Ή;̅ 2֦aJr!Ux{}{ nOesW4dC^F,B($ uab9yYтMp*"` D 4cf> c FL47 VjN _<U#c8@VByQՇ}m yb98:a^w߾ߓߓ5yMSlt\pċYtTےttSxrbJEa߈2sR"ȥ,m9*<EzyV)P*AZN}+q*0v5%C, ! ä},S[OGo0c00;Ȧ5e$c^y2 mH,ȹvĖKyzv0ɰq6& y<'&,Kz"Hx:|aaED0 /T3҉GSP-`4fB+ T*<gض$Du(@f 6=\;bg:\Q*)9nrUr01z}Pɜ2756TBl4Iu|*;-X4'4LY -oU9>.@m vz2/J&jxCrlBU A0E0CS2QbŦ_hj=В߇I0tdz7>DiiɩΘXdzf {q$Lv߁w/pc)pT VIP1?`vj;`J2AC=/{fkV{+ʮUluW:Hn#ƞcc3m<̡__`^Qm&i,&D%jj5՚={'Ojm{H|rtG&!F ߨpGd*2- z?mvZqjj뉙k3X8+\:FB$`0 DݱR 6DczzGFwZ[ 0B}3^Rʦ]X:/:/VZ'Kw5pM[ ?c?84  SfW53#,-e u.&u_hg}@i[g^xg|lǂKJEtVf'J>}g6ִy]OmVD/.VSC4 úǪ'^ r<5DХ@GeF4Pkw >}L[h9CGf;v0'k0I0S_kr³=a#F@~41ea/$dA@xUEBGl̬M;f*z'ibF1k!%jkļX6sBPN6x9'|mܒ +~3MUHYL5>rfb=TsDxaxaπQqKB,F*hU(z',Tc`1OlZ{I;χ}$Ab ` %d/}4DUgI븫e{ gUI?8#1 ccpaK1TvIc pǷ9AmJh3 apD˞e豺JX^'rV1sسU0]]ƽ n.5MtlC"xC;=#\3U2(97U}-9\E&>mlֆjZ>"A 53%WsjVc8)$E9' ^a֊fE芌nŬY~Fw w>U6.e0f[e2MV1ض#&v}Ðd]Ŀu͊4˽/Ln eL@h ~3٪<3a[.ZHfZk 3NzwL oQlYϗ8Bmŵ {h&MwZFaZƢkMJD@Wp+5&z<{>[Kx?=lѐ 5i}QNih=) kН҆x=LiżZ0xI>ENJnܔ%pVgރk-->Sԏ+MP}I- k1#ѥVD}ଛ}YPV+Lx3a8Fm.b4IŚOgK{FJv.2.뢗3;uͬG@\V9x z#x5=s ߴq$^e˹Jh"I_a`h)Ȁ4bTd'Z5=udOlԃ(j֌oonWQ0U0ڥP7+ :/Qnѵm 33jRit\!ύE[-A֭t6@/5wL蚞 G .Qmxd ]Xk{Y(Nn_5}kqLꈴڪv1] XbfJyE)\zc'Es?)pt*ckzW[.,5f =*^]rx흹$ /] 5d^\\̬l>"װޣ;n6|Z1jcb.K%bPgyG\34AC20XKG}0@SLdΘI ^zue pK|ڳn^aE55ߚA>_+ Ţ縰"fg-Ls`WphTP:R"&ͫTJ :ۈ7MȜWVxʟtG#L:mrIm$꠿RXmUUٹ֝}w<&&9A9AEvGj/fF %4G]? {wD8¬Q_DϴSooGř$pU ؔx5͗ _20P;fT1,QHmLQpm3=jW W#dۘK0svdtLNsK< h9+{z5Inm*s<"܀2@\hSQ=Kj,lD_ jI+s/`LYg; {Q$~k'祚K5d j7اfO`:T)l7@cL}JfO9x,%< q`$2kh-SMUX'84wCcG0Q]}-^fQmjkõ-+Yo(Wrѕ!G=!YY'aeq,`];2U^W呑}`U$\<(J/Ȅ)֦\M+nX%ܙs{RGROkN555ZSa{­|Ӛٚ=)rhlRh2w 5tx6xFX=/zY Tmmimi,$n%ZycL [" bJ&ZBKzi߫ Ŏ3|)s (fw|J Iљk>C*z%ewIj''8iLHQXiRӤ?iѹ0\̥3g#ټynvn^7@bRWR\#R%0,kde; b& ɗr^awwJdv-gGe);oIB/F *2ߓٰMt{NEֵYW]&nXE2œ? A:}RcaD0VS $[)6l\-?A ;t𜜖kK\RG{QZ$_?vP Ah}Z1O۞eY7Ilќ4*IcG1o:flbfh.g^&iܰnq7#Lw/`<jW#vS=ÓQo ?o^_fDFW=Ug蟷[l? LjaySrʉ0ZI+}r; K#4G );4Xdt3or_{۠ݣrЛd4wI_ ]7)3/[=Q`nzY 'X)y6 hq$peJ9RTGx2 9AXbQWp}A.5 eI2"wЫ&I};3lB-y^HSvwl>35\rMp'Q'`Yx$OVW&FuJw=4AL+|4|LրЃ=^Ni¶Y!I{m/8GPpcn \&! w?TۮT!гvOfn@C7t a{dʹskjfEk(#+d2#{YP˱+յ7_$fc} >02^XjKwTwm>>_#رG™#J狅bPGPOu4(?*5ЈwKC@t̗!6rPLjߡaa-ݣY!+|v)fLv3 mYj64 z{&S~KbVmnzXZu2q|]\9OMٙ_iGMۥ|J\G0n_,dt*fRk^'.T[93sδʾ6?sl#Rư*K/g2PM v&_s~$ !6,k޴>]>)9\9) 2 N1-U9~y!W5%^h[ݺ&+@;f:[Lscͺc5}z~i.vEf O#!p|.ŐQJHў_\‘oV\G08n`)JѪ{އlpn伓Sw?gsߖ[ G/:hzjʪek~R/#XZjvkAVw>/X$^[!N>@;tmјӸc~,1ݓMRK9(R8x՞]Hȹ1|7D-C%["CLlOh[n8,)Ťޔy\0<ԆdiH(ꨐ{oGh"W CF4Ύ'r[gA+$>jj1|͜0NYTT8i}Þ6Zn@j;gI W}ڭ4~iD9]R#ޱR0`x^W>(ה a|r:4-n u\`)";N}ϝhQ3hh0_;$f=ӹH3s2 \}{=zo <~_ ѭXR,~?!F\S3M 5Jr`B3(',buxy3Ҁ-1#𕣇^7뭳d[:Oqߣ)Wꝭ15NkPgfB@{ > u AMp,9i P Ho;l#]6}2j[dѸ: U]eJ$AIv5]XG}~dfê ^_J}^"3J3HT='N&M짧%_>.W8W(ɲ~]~*J^#sUG{hΤ6-ܕC\y{.D,g+}Fs'[ l҇C7~#0AxfޓhHf!9/D9'!0lkn!+{N3[̱_*ަh |qDDI/ *}]ܬ++hB,f=']XC XhU"=Ě G퇵-j~wQX4#~KSav8hW/*6jB{°{;Zof5s%^ FrN6.w2zkPMi&7gǧ5hp$҅ P dqN9u! pM()o !솟|\3Fї72_b?pt K-"Sa{. zT*0.[2,IṲ̊DՂ,,k0- leG&D(8L(LoE_ ~8])T;M`Oqw4-R8l3GhltS1t<UNީExls~Ns'_W{xڷdvjv!iTeaz ZRnbVɷǣ,a a`'9h gf)˻; Z#[2i*${rQkUwor^y}| m,(m,k TLN,{Tz}*MH0!Ψ $>9@60vai/3GuެwWUDf}xܲ0n__t5X`=uN ǣ $l_wZ*'nQΦB~ܩjG[?q=M;rМl# m'C҅``rzξRuUbړ{<G8;lnx DPigJZzKX`B˘( ;z;ӳFpܪ[P5  M&/['38n\ac 9 ̂f,oϭ](GvU/p)SGU >tU5 D6AGrQ*k;r&؉]J?D"{ D@) awNlSLe5RsLSUE+x=iq<9 IPF6"&pѮi~#V; sf=`͛ tԂ.@t×gҍeaPo ;|CԅmVLAqzTa6aJ3Z&_ ݠO> > 1wܬQ !|礮qOXC(4V&/%Ha%lks_z89mm1[SQP-N;Gg;pa#;P%B@Y?LS Hg:/sGbj1fqPGnaF$wsXkA"o-l+l##oC[ ~d 㖲'VmMOQ#Ϗ9Џ7^^F獏y<ZFVG/'*xRQAAɄEصqkm*ai.Y}({PgCɒ<Z*Lnq?y'ťA13KJ&jkR'6B(AQf@fڔ'')h('.,^](ԝҡI/E~삛,OE*돿s/]T앯PP"s 2(4 Eaf-_W_D6)+W2 R4˳!#_j("ῂ6~t<6[)^w J+^ЋzE/Ũlip05?_u w,ȪQv\{Y Z_gu^[ȱd2x7vv}`!'Dn2V OIY-΃Yl%=xmHd]uK&+5F+OFGG7c7m8{$GcĄ$Oj4 I _=ҜZƫ4mYsʝq呒AW$od^lx9*L\ɘ-{U|Vmz*W<, ; ЃScxe0_[$bU)is Zf[5xn {uU2\ ]nQgCOj$:Lԏ8oÉϗ S"ܧXxc2̌I}/v g]1~ORA1N HX4S7DNv8ͩ,`]ARߓCUȀ,b@dA0H@[P}l>@L& hեP,ZurD5կRrApJ ]A{e V,3N /;MnSsC,~\A,ʓIښ҉LMl95 Q~#޿Ä4Y ?y1ӦnR_fh-5X(㎍ $r ؞cg|xPz.Ufh~$Ql3`Co(orއy!YzJ@X5%$pC ^S''rLU;gT3 ZE܊TΤΡ)*x_ ezٹ&'Z2M7B?7{}SpB$h7B'g3N -%h#(yO%i}MQxKhF_ (.[[ \Vv!RD !l%h%Hn䶸Źu ?K`x Kn7 %h8%Ph&y""DT'Q|n֒[38t)E3pKQ(`efaY,K/q2 ߌ7B 8;2i7:)ˁl>fJʌ`rafw=3n<~ʡ/*q0j!tꩣ@i*&)^4i˓'Mjg03w1BtOΘ!Xx#LEYpO$P8qM^5(y@z~٭9{aƀSn߰:| 1oMaT$ݰd,^!vYvT/v!*'؈5˷%6oxas]U* [LfW_-ndô̥_\+c s>Ì3~̝7hk|՛9=mKU%ͪy䯖U񒪰zw )'o42KL)ZܝM͹?αbMDp" f6#Tt|-%c,YMx.l (v'}\wzV;'>#5" koBٻ,MbRjY7yÃB)#g9c<9w9g)l$ݎ&ۿ d*OMgD^?eĉ V;ʇs^y?d>lJӠصfGmWvY7G39{"",-79K@N{oJBKju=9ēGp _'n67 *S#}kdl`^R&5L Jdd_R\L|K>dOd!_HgDB¹sJ#E { )B{6@ ;0W_$VSxn_E(1YTߖڬ#9tIeuǼlᄋ>sGJ塒CUr%r !3쑅dzTUspn IL_?"*\lIJx͒ VP,G=M!gar$MXP*%,l2 I{G_=AiM@29Mkוl2ٞdTВ0IF蕝 h(c sFoxΣ D%9t"aTB.- I%= L yB?w/`xabY-"'_yڌc|Cܰ-Zxp%3 2s5 ;ӡjP|b)᧳r{̂ LP@&A<1oNĒ$D ZN>\<Q22 c 28R$ 3LS!ò,8w74jMt`pXwh5 \a&f Xޟ7,mx[@#9s"X$K` Z<XB6`${/ڗ-ޚK4ҧ16?5SSelY ~@R˗+ZrEXc&?kR_v]>gгy$5tY-x =KMC쏵8 a'QORU^)e#riY.qj?|7՟C ݸ)\SuF8"}܆Fj-R1…ͭͥʑapT&5f`( e|ĢH\(Xy&KM3h s Z0w]?IC₩&dgiePH,P%zHaң)RZ&vE$IW^5TC6TNёeQ.ѮA%=NkudJJ|J0E*):wcVT0O(^,_l'Ն<˴XG0#76W(HE..-K2 ZԱhP3Yڤ?{= 9or~W`}yP]#B(BC&7dQ7."8F)ߒ0DU5B>7 5g4m>54oZ`u10^#)WA:$ui":ڼR Hd=1!3Ռ=²iGBWkW-K Hg{Ts1fxc3fZ=+JxU9?IclzuRxnP+n`M&gΆ4xL+U$+'WNbwk{P}[V~GͣMbLqȏ#ju;a&> oS504FŶi.s> ,4EOUeuNCVipfL &;D6aPz)ؗO=i"khW[FU_sU!Š6׽%S ^li+X% %1>U1Sǒ2^Jlถdu4:J/ N{zl!f#7On2XrgE~Ê#vn'Nۢ Sc0_sGv~U"ިd wp{dId;;&qU.]Cޮ e^3[\́љ;tf'iXd 0ާw)=n߿-. ؿ`zݶJ;+VY@[N)Sm5n׹S"M6fVTϑ 1/n?XH^􉞷(r=pMw")"C-+1퍲ܰ_U%k)Cn_%ӗ{Vxv~,;$@XŇBS.nJ O,3܇V~vamye݁; $Quqid eݔǗ璚|%kb6e1DoC15qӸwPcњd"|ucѕHEy&9O\KVP6q9PM4ҥDdw)5+kc\W"LYm4~n|YMNz Gž 8'odz1Q_1L7)%/1Jtru94qޥ`kO!gjdvY_k E К/87I_%Aochzru"#\A9q|0ݘ4^^wHN& `IsYt@Ciח%>KPI@-SA z],1|ndnz?')<ǘ sԸ0Zo [ji.n2>"AE ų7 M5GMF .ƾ-,}285[O@DߦBZѧ˨tS :R>= h_}{$~w>#C᛭@Ï}E""(^S֕aYc;9B}$(<3;礴"t̻w\ߛ^!۝y f هz)+w{zi!CDWܽ&$NׅWUr=( j( COm|.xٛ/~3f 95&0~80/r4!7Ds< Kv >"俅,p#~/ ?(;h@o n!NϧFY BhJv6Q R<c9mfM͜PшL%{[\7= =b#&Ʒ Pl ֗P%ԊIY4"9pv단]w : uq5J;~ng}vX:< C|Q7RGhq%k-'b=N%[GN ;SNd9DZ_D-Q+&:"jg䚲2j/v#` l[жزuR]бe9Y_-PYŔVny%E6Az 8Y";W G6V|yDZUa l;Z[kow+Yw/yO*&IraPwMM5'Ԑu>D@_O^!9;EVhŽbН!#8ݹ?VsG;?G;0627՗,qCۓ';9z֓ o" ?,Rj}݆mS,rBN-bxx9XDwGݼJs*Թ{rEqF Ȫ=NS t9FηDgnK1%`.B }7sbz\g^ݐE$B`C9&Nc|x6Xo:X q0*עۅ:n֦pϊR]sw+MAD_Zct󶗃VSz4|e `1+ $.-̴J/^0bB.oT|Ul0%shm!Jx]P T]"9f=og)~'gA,){ܕGl\C $O30}C46 "$ʭ,L D/f0uNH^6:7 vN27|J78GЪ#]{ݮ[Z)oi;:+ ޖM+.k&]L RA }dwK8H,leB\L S]j>êOHM K-^1w}Eu/<ȸ]7xxA ͺU n?8E ^sq5Ft+'nM׃h̝F.!nOaK*nH^Ñ^#Kz p<0r{@b Yͽp[vBT;=g= 2SPjS={0'OU)g{JYf1BM^оrQlu<;OuS΄.++ /3%'*hjWzb0[_w 7b%Y$滵rq +ޣ#OlvUtt6(zУPd^OLgн-b5S&d/ck^%iW%|Ax:%PK:+ܮ~ ~iLYKˉ̖snT 'K[qbFo]޴w0Gp_JXg e,旗 l0E .乬j$C@x_ wi3U5)2Z3Jl&kyl0GK/<>e[ry|-O<h+6D730tV+0cV- ADIS2jTT*U8(׷|?1+ʟHzE*f dy^TAע+玅%z4Ҕ31h8Qamzx/]UPy֪OѪ{,(M''l^^4 "~2ѳJƂx~^UԹ QN-ǝ'2ˬ6Aֳ&Ȍ4 jEC; jEC; zk3AEC[Amh9={7(`ӽI%s7(ה5j䁧|Fk VpJpCMGsYx:bzEذ??; hɟ,TP۱:Pl!aP bS EJ0(|B > fy" ?S ="g&N&?rtpزt!.E,CKJ2{-oȴi•\uLsLVlS4Kj~ ſ+~ɻu{AT HRAT HCԫOHE z'@q,+IJ/k v>Y[#6܂u6@M[.Q\3TyRyrw,{% uiĤrZCUsYvM6w ٦b|UʼjI?&a xA]@-j;yR7qV$To1?NSLA¬Wgk*fm1߲jYJ+hv:tKD&R&3B99)MS鑑\Bys׎Nƨ?4H`>'4XXMP)c GܮQUՌMA*y JYMՉPwk*V|UA͢TUOV%9Apߑ%ʦ%m@_{V'|L8\KKkt^Q$SrUWI>mQb5 Pvh~\U^v0jFnY_輮U"IT63Q̓-Ԑb#ȁq)8&@2FYG3|NH7 Rԧ0iaEg6.3tkbuz49ow0o(*9Nd RD.Tg$~jAAwe j$ AN" =RBq~\C(yD1P2tN $XP8<,NKM~+e5)~YǓj?!n)~xL#OzR侀45?ǦAꓪg+4DXJcZ5HZZE%Hw|q mfBukad<>",1G'TO2PwTHkTʠhR ܖZP>BB͌ Ya9:mn>w-@ *zC; ]5ȪC𤤎 (,gGYtR`fIR`\lgfё0$ ߳0݉#_U^ OD=Xe } CGDSYc 4EI*DF|&0oGX"i|!,kfC6O9 Q z q+EU p4̲8ʵ&0}Uxja,C{B9iqY1hgUND&mVn WF I^L2<(J%mXKrRڠ\I!QyV+ЈG6JvWRTl6ICcY=^~ 0t8TZQ|/X!1ӇDr[`i[;k잷J/$o}1 8P,_zO|aya0$q O.!%gndV_@ӣ}[!wDU,[TA쿤ݓy]7C_ڹ殠00b2ovs3-1zs;Qtpj # (Sqig|x*\āb":REYC q(xKE}0WY 8ȯ&Cjrz+c%JbK[T=ܕ똓J_?ݠ\3SƄԄ1KdqMfz)ƫpX3@ ]p[&u]U&њc\ލd16Zy6Ln׬6K_0`i<cXQW рU *'Z?}.edպ(Z2{|•YV9 ^,\aUW*¾0W#r|v~[\\5AY[dU- .<* ..W .CNupq +.sq+e+h\\u%BGj,7Y ֏)þ~ư͌AVp}Ga:/&5[}Rg$"˟E rg_Hi!֢SyoTݻ.g86~UXJ@?R7$Dt~ƟP% N`ڈ.ͽdRB͆cD ֺj=vgiE(x{'t{G.A|WHfevA!i|0&Xc|/4=H£ wSGկC'%TM S2n`YkǓcsxNhf5O1|[r>IKz3dyg'$;JhG9q(ggK^S#zzF&ugId%bMU_/ GU)[ԊR]OҊW ԟ9h}| 274fy.>t`AW\9F╃}٨)iU[=*o"d~1X p`(P 5 Ԇ-tkCJ5Sơ%VU{.bq {XSe)Ů+Q׉{Pc% 'WD1xqo{>:0SkޗHC8hEQgbCX- [)}ؽۻ^~~ /[oFYK`xn,i ? n,/5tL(jY'hV&nث/ˉL|ߒGN k#TF tUCC0B/H 9Y$A?]Ǯ~ .rr~~*.3o0gʥEQ'#q뷈|{=u *t/WUZ`]ӷhZcLA"\tyd %Ԝ`ML<0)O&l8; e,Z+s޹w%jdN/O}] 4H+v_KsIF6`o>"z*z䠣\p ;rUmb{_ =,)@< @r* fHXDc7/ʴsur KTҡw_pfΎSe6| <ϫG<)?bs?R _OJ)E!4U $__O0E#pG@py;¹ & `|?b2+fEȳPՀ$$JT;xΖyԝ~z@Gϙ_%Z҈_emJۺT !!*-̂< zl5vZ=$>ĭ 1!rn]k57VWa WV.rEZ9W4֫H+Wv^wT U8񃁾9ܪm̗UnN%=O4Zqk)=~@Wg)'.(tt: ZgytY UTVDǮVmYؼtar]D*8fm-ueʰoF e@%WA{u,ܼҦu]Bչ!" ڽA&NYVUَ-=̎_l݌+σG1 9O/!|=}UOTF@Hg;E-yC)& }}15ۍv0:q]>N1o\{!ˡFXL.'9.ݵ_DWtG.Ǫo]N}ۇ:KGzؗ@_+W\Ehvm~e0ŭJ oݵ ׿_07r* ae0+ngKS+Uz @Tվ%~*ұ9(a=HCЍ~/C>9T}`.8N3LktaD,aD&у-..:2y[8 &frD6G&MR[]6estbq?dj,~e&0~r騇Jo:h>%KJV7x\5䞟.P1ގc.&H8 "畫4u<[8WqV1z>MCQ t3{zŕ102Ug/g3iU-s(zN9vW~0-*/c c:x}rGe]4ЏPˇE/1pz6kF ~rW.2XCÝ@K %܋qT->XiG3jEU :?"~:#M=@ tUL1y>&z`g~<`.%6aΣJ(nK}r C'>t*7kڢI1(dBrRiЫQknYU#󃵟[f޾VuɧوZS\Qq/aeh[U+*jk>|DH|s*Q ԝ27ÙϨQzq9CmHuUY CQpWIa*L"wbu*7oGS0?6LC;&w؛#6L@_s`?RҼ4P1;(t24lHXɲ'Q,1'ޢ(Vϯ c =R?|!cԆՖ!9 I9JĎDޣޏ=R կƖtؔk%Q9\; RXb XHpzH}76mrskCKUI{nc@G^9˪w 4_S>Ku ):4~?ZG?|n O`q"zcPVMZ(z@.@|k_Sܼl;j  pΣw㕳rrQ9e{ua$VOngP))mr;EJ7 rV]C^}@?@ք&iQ;9F9 u#R"=hv܈v%Jג@DͺE ͥZf/dZGױWRo.Y9 NN)tSb7Cb34܊ND2#}6G Pn  S)N$r*sҰCZ(.Uw?h;1rT2CC)ːC*#x)P:l ι2s(v2i S%b_JNJ/( oI&WwO_ϻqtW33"J СQyD3շugpw ;Vű,'vi Mna=zaMkj8tm :p͘X=BB|9Ѻe5IR{V߇׭?(5g9p3c2FGPVht-wtuv48;d/ YEj &0r,L}b p}KKrEj!:,"66 F\_.cOvvzy-:Pp?BUs9a;7vR2SMVX~$'Txo0?R4G/(<Պ NToq- x |VWٶ0u ̖)2 ޑ G.c=DF"A@@ |~66\/U/k) SfrK׻ zE_x]ciPc)9._&K\Ii nᖍj{ڨv6{{ý~{O{2.k]fĝ')fƊ(\ERAkpA'U2[ۉv㭳ta 5]ި;>L_MϫIQ\= )a N]7u(wSP;dsŞ>R*akʈ`uc5׍6p3{p5"*"f`8:k1$QW';b $e\`$"Q7:F'~ @/h0# 649nQ+\itl)4ǯz~=go;ScHAƒ&= .V8B8JMjN G6K/6| o/6i B 'm5o^75j 7kD~A>BL~t[oTPgq `AEs*EgclVhr.TB$ldN:At*WT\wssED{o'W*W}y>m:}R>ƋsdaSM9 1Ogřpq&8rh1G'I9ڙsb1t!H#ү4> <#T>_*=ioͦHsOݍ-GOu{pO;O4Ukt:Wky|QWB[wT!vتc+T։AE$1dySbrn_R5*=ѯV}co.Qq?Gt?xGt=P'2yw+VHn>R:  n'Zͼ2 3/VRtcAeMbvRtObDP_a_zUM ZҪd&.F]ɯ:4Z,L(".gV_Y> LaƋtBrQeaL@}R,hlo` Kм^Lg=@I[VA,D-GQZ5XPD!ɶeе+ uGa[Dz)Tv-MVŝ #VJYu*ZtjpXa44nkvG/ۇ @Dj!jP{h(}%5wU^1$ܪw1Y+$#vËȈb=Vqq}qnJA>On% ?X EZ$qIb ktÊ Eʸ;#S]%RmcS=7k V _+XH'#R~_#xOx9b5?|1}km$WpMWIA>OqE(a5i2ox+zXkqKމk}9χ n4HDʠW&ʙ}YL[=qծbL` ˎ> uO#t؉󬭃7X${l~a']ơdXRKHT/M"*sMz~K. d.B*,hg<'"?a!n1Fun=YŲ1܃?%FP +]u՗8XVݼ<M)#0|UHޮ ɛ F 3SHDK?ےd<{ġ~b/<sD\ ۾3T "7dl0, x'ȯlfZ QG8nQHvw>֣!#Xt{a (7Z'MĢLk1lB!S 5׸<9*J+'bŐO&HRp=1ڄ1^iNVao`Ϩ= ZvZw5bH QcSye/<Ūv-EʴF19*9TJmv3QۈFIJ%J/mvnKd02ZIZSJXiƂygώ2}E>{tύ?Q>ƋŎ|?{NGA4l~((Ah"4 P_,j)0FTS  AHV#ª-@^v<')G4@{lA}"{C e|f VzQ_(_aTa{)R E8<;ǟuHRM'.͍7~'u$%.;1xd`p1I422ZK i>f-m^Il”'ʼn-z9'%=Icއɉ\NpELbkE!,=¹9odPҭWR1 yCBW,F'ONâPF]'Y)8iȱXNn|JA?{r̻vu'!/,)_ F E9 8;FBefrӣq9R)枣quhsfts[S oJm2%ƾq7nGTWL`fWWD豱٩h3] c ,FgAc*R0Gzg*^WdB` ߉ [Nx͍v]%e5Q|aԩsE8ozxr VM5S"J0QC%TpVA+h)_3Vd7i&-EeA?&#fI+x['ƕ,nAw*]9q͌v4Kn)t/Ʋ]aƩرt4.<2kE%ՃQ2%G\[Vz+i<Ob'4L>OWSP|AJP[h߼S /F>֟vwYF<&ƋdAs4Kb-Лr ֶf3EMM/ʴ0Fp9e/&b` H_RÙ~狛sN5Kj~P/iWѦeUqbxU!nQL MK3@g×hAN(poN|kƓk]vRRƬiFr@Ǯۄy;Vma%P{j3{I3A'͓oqi^0P{bu'ͦDׇvTȦ^QD^aò}ݍBVDL/b`Pg) dgRZ$LU8$pcRpNP}&w,?TJqsJ{ P# F45yį)E#MV(G $#]nY>. '._LpxQEȯ:cg:KT ]޲}f ȫmav^9,fZ=zB1[6ó@_eU"+cn;P퉋P5rWJb 7G~;܉$C1N貾>תUD󷓫rCԆ1gHgK)WR'pֶ̮I)Pk( Z6,4S1-ed[(0=yu3y1YV#Z5-]%>#.XH:)S0lw7X!lA#ocݙ٦-w>aY5&Z0E5#5XO7[>.?%1?߈07EhZaN9E~ԟ9c~f ̐F<,=ի{6*FRqq{y?N:qo87ĉBEQn(AW[7+o)4*'34MZ"4*uP%oJqraCe0資=1RkG^Mo+}7_ pV&+>;7N0u_q߈x72ޔm~~qo";%;ԗ;}sS ?}sj~jT?]ی< (5'Mjp{&%58#MzjFqCDRcz}67e&-Tf%#L%LkWLjvXje"S/*jḥE!o\#@]T׃c>yċݩώ'+Q pG m0.nS-gŸ~dqr5.b5M(03s"b&i -&ut=:WB^+-p*(iKOQ{vm+V X))y.-Odz 6Ĩӫ)hkb&70 &n͊muKhL*z ނ.hrn+kUyD#;|)b]nx DJ{ ~. *ZU2Ux΄]Ѫ=ceax:uTT.OTS&7pMg_VEDΫխ*ˈµm>q!8XUL n \e)q`ZmRA^cGK4jUm3m)7ujKNhr: Ybѐe%|Cx/hP9Dn (V?p&rS>1EjHW[NDcܛdQ=Nǵ:nR]踁긻Xkkq3.E.M|ӏƋS|tVy^_" !ci޼y._KqE]AƯkQ񯀸 ? { ή%n툋Lldl )Ƒ ?pd~,0o'pjde=&F5i_wan ^<A'eG>`yYgIdt9Sr_N5P[5pOJl~/'ebYm 㢐"KvW.qaq8.l-2ɞ;C`OҜ%6q.n x2<~ve>\,ofU4C3,9~DHٸR.% uw`5IohY}D VJj2jv=x(~r < `XܴmW7Irr5~5~&9|Z嗧^[R`dm: juhOC< &a|V5 F2ȍ(׃k!ZWyKKR`c!`DZ2Kea\vv Qe'œJ-ǭ4yFyb_> _A= ž8I«[oW{`. JHCÔ5 M"WH FqM,/6{i[.|8:ʻ7aq&^J&kh@pi?@hx9n@+~,t7dğZ=Q xݪT^S )Oܾ@ڢnl̸`/H8~?+axy>z"\s[tCPҧ]7ݞ<k7[u]]/Mt=l=n}ӌ{8֌%g7NXU/eSq%YeBe$iI>dz9Tj֪hE7{=:Uo@Uŧ= 祈De|T+YR!f0G}*?!(Öl6*S4-<YF!Je ($F#+Æ._ ^)Cx덨#j,]rk悛} |"m: e՝[DLxTVGvNzm;hߪۈ`FjQ ,-e3ۉh;f|ix= 4迱!8my C۶@.6l9߉z=3vVGxcx?PEF'z&H zwra/l+^1+c9ȝW,:#<^=e8EdƂ5c.)o_/(5F˧;w(#FNFfኊ#>U㟞ߜq_jNWdP[g~)VbX@=1LH-1XoTI7GK|% F#,1!yxKA7H7iP! ^ֱʅt$&TeR6E2mWn]nWYч}ig&G Lv/RPR~씽dviٖV#] ))lbۛz/d 5n^ /Z/zٷIԓ|V %l꽳Z2%tux[W2 N۩FJ/N+@,ɦO ?)SH ,tJ/=]Bdlpk%ƶKGG%S摽[:ՍFho6'oJtC|]ǿ]S1 %xX|t2$/#W>1^<(\Vwܧ2вOW]Lmy[A54Isr +G,j1JlNT'IF܈=c#i@xԫ6C-E=ЍPB1=Eط5|iS:c bOn&Ƨp`Pfn2uë&4Zm FsWi_^)-c r)D(3SJvcq2>gh4p`ʼn/yJA 8_̯|&<[׈,–ƳM`B$<;\$#0+X#P: Shca!Ӛ8a^Ex9TQbxB4!7T%%O!T;\IWI&3BMkTp|w$f&xɅbvaZ,,VsN/f |)Yٗ-'5y,KS3hsUDMPwe`@* _&Y^Уǽޠ'8(2%KwfpJ"馪yT1F8A):sBt1@  6B vW)BmmJU/ٺ\jdN0z=~!2h<ڇ b }nx `p>GI!'!q>E yB AvJ ڈ5ҘcѮ'nhZD,o ) o -Ź,4t=rHSOYw4<ҫuۀE AKRS&°{HA^N}4 xl>%zW5Pfqc#u*$1YWt3zP PG62!7J>elōa8e:6^ ^%pSojM qv#Ɏ~>DGIL#ϼ2ĵ')l~QS/.G%@ٛbճv?Z ;/O6E >3"cmgbR" #}Mo}giVwfk+=-p,m:aڰ}z6G\qx~|oYVfDQ9\s| ,зLi--|GdAڂh*JֺH1&"~U$'=7I!%&]j"#& n&IVWJ2^1jLdQB^UV oمdTx?Kl2H2Ni#ྃ!{~$^|v{! ]h`%{[c`wJ;B4bf߿ppt,4"KŗtJ'DkoGȲkB*6ԦnP¶"*jyyT7J M׳ 3Otr-їU pЃu<APvD0"{C8A&xu$`hTJ2˨[,ro,d8 Rʜ߉74siOrhSWgd*.C$X;W,xsOm:p蟘Ώ}SC|P&#{quv˚#;:AgYhffe\"Նؑ0`MF@-kqcw D.:ӟ.;@kfxf蒥1Oc44jXD:Z֚ sL΁A4ֹ=gj#M v6Mي e="D4>5K>n'({G8\pwUڤq)zWЬn8\cʮ3!+S-7;ԗ[CkêMöC P HjaOp/v~O}-E#ls϶M5^|ŋ_>ÛG}Z?<b#?QO b`ђ5I2 &b95S*&7D$Q0I$tN_lJi K<42X>F-re@=׶_"{kxT-x ' Z-ì\EtL o'KtkUB 4eJSheopRij5D"`0N!K%nօM` jhU{!tT0ZqaFk  CStI9]JF{}i% !B^F']5܋5IJg}tPV@p³G})>˗1oȺ~18]FuEDHr!? 0j)RAn2 )DPk 60)t%FZiyF"l>C3oXJ:E"$*$o9jE2EUm} xzjOh : Y])|>O<W;[|.<^˅}b /MCՉbjJT9tD RVtY+(Ɂ..[_Uk?FxUТkE^r6;NʋFU!*W#6TwFBe`$V>cW^|kp4ۇfWNdm_F(рRެ&?˛u\8l.oasX%$SnW"[&[K%ݼ,Wͬy=^XEIfެ@2˒̼'L7? pZ& RGؼhDjsg&vń(6o6׮^u銔e t/M*@&zڊ*-$cd+W=vME(e=l⴯jwt|'eon:8 |9gF8O(Ru-P^[Xu- 6߯Ķrb.-q]!}pNkqRHKs&{dKp5b17v ؠNv`'Yf<=wf? AM-wG>6b9鰼w 0W,xPX[9vTppNČ$Τ+D:м,Qw98;eMAG3&JC%E^XIP<{P y+V"'->7{ &v6ِe6,A?u$NX{Q~c{Y.20 |ɵ&7?G-<~y5cMTbRqE Z6Aw: Mu$Eɠt T1!!Cp=J_RľqqEPq̛dp: :Rvo"N3Ф|[w}ޞ{|G;7Q.wYsN _pKDr"F;$>9y8Aril|v7 cbKfN1ff̠xļ<Ǯ@ qm"N8}C(~F svZhc$>" nn3k.B8Ui2c6S9I(MkbXo:x5?XrO`nf|K ÙiK0|Q`}h\-^I6Al@Jd/#5ɲ/uϘ JtfSn(uHE=x;y8֌qm6NaN.@$w.6gp IDO\1\McSs;0(.{:w9tSE+k .%MԚ`Tfe1A,M@p\߄G0-(Sh<(ZܢSVm,["T;*EJTuw1n"X4;ZHAd0C|7Mi sWD~IL._&>c$eb]7F孩)xIA{|9FaQ!J^_23n$Ƀw3a[M؋lw4c WTu;ǀ0`Z M y]^+HvR>)tzY?j_,XK[V5'_ZXBF+ʨ&:2`o!ơ3]O Flbj f7<x)Y$A8Ah?S+f6&ȄЎ_1e%esZm.WͲmoV oTdk<+^w[=r g[ooҋ*jlBlWT,8m#)I:4*#D =%ꥣzYf/={h^zB/zW:r>Kmb0zK#[˒n4B[lj>@ySG<튟ahr`0Q܂  vA5_./#~m?-#@ц5ԋ(= "ݹ|G}Q7e9}g_c0X&[T[j{Q~!O?dĺ۷`E=,F0Q#9Â<څb>˩9jROjͱ[ ވ$xh0DŽQ]lp, Ò%"5h#0LLXKL]4vo}SDD,:< /B4X<6!RW9U:Sw7v C㑃ŞoNA1CsϮև"ڔ>CܴdoŎ ={^|z1t.<$]Gkc{~LkBz56E$MBS֗c,byKPbsؔw]wj/rzn\釩ZXp/L)#)1=sZ0M._D'lo&w2VvG+~y!SH7u3Pдe*-.9V(yc9ߎ,e@csa*£n?vhu}M%a'?%$ %aǡ$CI( 1) a  LF'>rT?5u2 3B:<~HbcB9acfH$%CK{1j- j_۫\Ӛ F1;6T`صp`=3|@RݞGk d5A92MĶ'v.Yhs!J&jJ&hmt8Ĉw|qflOgLU[O<-6QkE̎MOCH6-6/S5?S^>KL>O.d&>pD竃dCݔ>FzCA:ڢۢInɉR%В^YʂIXƹ }Ш_cf?UOH )7  4ZjGa.Uut2YcF1WPߺL.>zк]Z"d/5flQKI'[dN9( ITsBLwmh5!4<xLz[#f̗731Nl݅;`jvJ/} VbKrVl+L/*<nloi}Co(h:yT)n~Of;}鵏GUX ̰ D;W74ͭdoS$MLZ\ >rY&7b4/"&5qǟ3,9ދ f+C2n&ﯦk1*HCj0lz9i0{1k+ lo%/Nj1i2LЕN"klR֝adq}9/MG}ЛЕuOSh:i"UnqB{:Q?a M`Kvj5b23Aw'BZ@VŪA1}z0Ҵ2R4LJ6_h"x$CmCw/2NLI7mڜ{YvVOS4y8AF ]coË_U |8/:7ѯ\u$.w-.8IgV/"vSℓw"}C.xI9z9r>0[n7t:=Z2lJr3NJ0ۡ^JĽ>%c`ٽ^x2zC'ΊwIBwYBwi\J=Rh_rʼnfB=pg<,02XiYX侘~ivlԓ!METuxQ%I{ fpߦ΍&쳽S\=նfbKrY ZD\K .b:~7ǩR'T2U7&ՇJI#C\ȨAq#ۜV 7G7sCI/ (X+` <#v]lG 9` ,5;P'5*Eu@eֆ_p~t(cV;/@ :PiC*~"f줨:|ɽ{=/O r kiR>232S6 B5-oikpTdԃf@F=0cdԃf@F= u/^ǯ:~'{I#m0Ն>a;>bLy'=hr:_FQaZ}.̕Fh<x9U{R2$ޤ jrTZ0o+X=TͯOQ#gLkLӇNLImev[tl"/j3*+e՘K ov,/r[v2%VRuM*V5 W|l]з fPb ˨TNIR Γ|Q5=t !wD$V1HInMYF|bD`/rקDsOYN 3- Z><3ʉtfjuh7$0XGz ڀ9Os1Beӿ`nS&;d^85QFA<ꡙ* W!N *5*:\q4Pf̮ Im.xlFpx{ur5 HܲbԅSIDgXe\نI*ޝVю[? @R`R Ũ.=.3{iQJzu%qR4LJ'eQ |uZW$f`DGu&paP8Xf><|ho,4~ O֭r<ֶŤ6,rJD.;` 0Ewl4z!T2%;I_嚊՞OFwqQ@i=f&9[nDLضcPdɦ+zR" ]a0Dhr5}enҶb:֒kbX<ńИ]1CK9g9XnPWiA'M ,!zA9)&+U,(Gu{x_r1R׭3*J<%t Jv9a#ư[:VIRBj@s7Uoe?M5 Kۜb92{+"j|<y5 EE9L#ӎ) 4q"&N^l#B!o١Q禜N"M3GI;#8n) o<®XW:X9=KYp-v5 +Q_![q ?:g|tձq dtIs|yT,8 qh !K6@CU;A"H P Y@82͚,nno7=tޥѠY8}ѯc Bݙ(TOB0.ʳt)/3P[F$2¶ Q ~²H.C`u :u u,hWAHױj, Ƃjܡ;yGF-Κhtf7vP0n ]"άAXabb&ֿr)ADmj+] J*]$a=̓lt7ܼ7 hWU[%% |?,C%b,8* oRZ`J,,D&ηttn)V~.ǗŤm]ExgyO0|%tlq{tI aIt9&JRV̓lȣm;F61d l4|yОvlIFɃ&|-!V~BĐdCWd"HZMk5eSwoo/icT n uUgNc4O5lo%/Nj1A hI G~(x|T2Dgv}[7Ct&Cb&O;='ǻ(v?QLV=""mg'Do$v>]GpU'A nHkvg{tfL$;d{Q6@.SˎBcCƹ>U=pz`'ǐIލ0@ߜӑUH ^ӛfO8chdAʏh-)"(lTW绠)lu0\krC$.~44K YD$u v9lހG%ЄF]3w fNҬtp1g|"O%ot(Pt1AK?q=Jƀ0ِtc &2$T<uP|XV& u ^sAX, or":% ZRvƔt"RQ,fw=]RMSl)h?ju )k!IOF]ID[YVQyi*DtC{{6a -BXIGö:;~d瓧ۍS?Ū?"^7xKmP-{* *6CqYFE!P3NL ;kxnV,AM令W8v ' Rm߶-~Êᩨ&{ =)`~ͿynB-@ PQcçsK=\#@Z V jX-yRsWcf'uoc@M8^_3>%r&;[NePLݐ˩%JK@]@m͌n@nv_ˉR^(Ý\`dz2@ A(_̭b"Irr5SGl(O.nq\ߥZRwo!]E~)?W1s{RHOey n,߹FxZ ۂy𻁼 }2/=17*NZVA<  QX<22HbXI,onEeUQf!P!Uꦯ1λQ 9](:4_U{*>ߣyUqwyW8=8f~cz=/O kr2djbX 4LK:Jit[nV`ؤqrTZip+X=TͯOQu G|dqevKKX+؇*Ig[6M"<)|N%v/,#0,oj|;/ݨ-)Ҕ35{ިW*Qc삾E5a%VbTVgqD0<'4_T~96Cȍ >%8r+~SV-t, *y\ :wYLhd nS1sH'vxYGOFz!O/^:/`( -ј~ڜ*~%:⼵h1)oas #+2  FȬBya% ٱ%@O+v!(0IقwOT5fO8ObnZo͕^RK_w |#igݰ9Wa/3W ,w` MsŲiI%?$z*H ?FdӠ-@>luFFj绬|"Wӟ8.+GEw=~L!lFA5nta瓥ol/oK&ގró~&7qm)At)M Yk[OTSX79'' 徕?q1or5}|{eקc7*l;\M!WT[O,!AN߰ocA|T5kH͔ dF]jx/hGؕ͢a,#{bKEĄO wq2"T QY뀭xd۟?2aJ<oݜ~1wC7t=I~ȟbV]1VzT{08B+0->*4{U0<Մ :cK/$Cx95>-[m^qu: ,Ɉ2I*UAy X#k{x Lcԧ z:xdA:hj1F&u=F돥N= -U,˛}0|_\SđQHF ߐ.9^3TΡmLnV| 1,X V <|+-`_8h9׭1c=2hces\T3XN< 'ahT 7>}RaJiq'ZP?-ʞsjjeu(yt*V 5K%kA Gc&|gݭC'buZ9mf{phFSꑶ;鎇luW7Uڈ9&2ބ Aޣ_)HaFZ(1'ӫVzZ/ ^jz:ǣ;>TD~#i 7/bgH!N(>zCD'}Q}IvH3G.=q_/ydݟ=n/[4'#@܉r잙K-// _X2P'P?+(J4P"'OnDx %،%fЌt)q3$RR&^ aSQd|`a9~. a{d *E;0ˡ5!8ިy6H=䔣eR@iʝ6eq;H^չ띂,!:zf_[ /8 >}QR/( JqGE)^:ȹDB ]_9w8s;܀qV50~lr|[SF"Rߌ+T$l68Wo*l'b;k7k%`\ {P=`9+Qs}:.ƾH9 qɷ;%M&EpC2OΙ95CGqA_׳gɏ`4g3I8Ɲ!⥤.Y2-XaؼVBvmˤ5b|y3~Ow͇H Nl𫚿1TE+۰+۰SV٦6|/Y,҆H/Ɯnt~s@L/ǟJ]. I Uǿ.>qN v}[r#XM"1w{`)e4:<#enq&7( Ñ&<X:\Uf}borۯO[nu[Rcջ3)v>2_$lt((E獑,>$ $2Q-&jPlTEq-2j1%ҟ^D{ d#qw+9 uMh\o@իƈ|ؤ<J#9o"Ki6`X+J/6~kO")+x'qCx^3Pr "h4&a vfz+:rGh( %rw.gD,iՒ=<68"â>=gG8vO:%-(R06d1Si扮GqjbjsX(ZM)hju˞tR2WʖrU$ʁݳWNɱ4v{׏}>Ƌ\Y? w?u c0 TA`0\;|W_adG0@\qY .@\ ĥ ctKp C sGXl  _j,tӫ3LKalF~A(-k `46!,3`50cP+X(0m0VSVz_0Vիc}=XqM2FFNg@hr:_i2\j 9.rO_/'&pI:)RwŧnMUNwJx3bfP$TMcnjE.f$Sf J" uþl? BԑRcX^_ rrl>O7% ,P>l+)5 ?tI"vTO~Mdf["2ͼjHmI};"]o=(nyho K^BIcۺۤpPhXi'):PIښ򶪯MCQެ&Zb|Tؐj3Gu2 ucxaß!)$Nʼnv8i/aYn}fv VOCЄMu]vp`Q%԰*/(79Qџ ȗDJ?ބ{Je?>𠆉HD44} k忒+xu^ v@oo+r{58{Fk*O$/x ]9>+J!+d"<:4ƾ8E95Ktkj5¬L.v#A;VZO2g) ~jWA/\EO-/P\j n4Ml|qT_U⣺B 0]Vlݠ|)gs8,[[WN]lk߬ٮJ~JJJW;Ewmz8mШ(4!W+0%o娟㾃(hyVʴ^L-S]6ޅDm"Q,s F"s3/:].hedUg^`txVY)@ ^ ]jdUfAm|PۯHU[)yݣæeTt>h7v`8Pg`A,W "FzhU 4W]աQYi 9#8TcxC nK]/Zr-7>SI\MtGrʵC"f6ŖQ3_ls;Sl=vΓ^Wcz+Dpأh.Xnyc\g[ĒdWS|e`@!S3#!؍ltΚz?!뀵UY tlzk2;'ه=$2)LjGu(sÊ]}O-{n-"umH]Ss^qBշWVqLMPŽln~_l.ʒqiXs\ݹ3 4ePP\YN)YCbScwN1a#3ӲZVHz?n,]N1FynEZ4F՝&|#`un:9~Myp/ngS^$p pE#O8|v{1m7ͅN)F 4a]G&*F4/=}1u;w场MzS0DXBɰ~H71b%mez)hj "q(l"vNLq܍.[-oߺޖyT[`̕)&O n(vUnv_ Kݓ2u=6L/|BqMǍy( / UKë-$AIpv"ya'39̽=y| rSXFlyaSX,3ɯe2LXs{cԸ$6S@d8M.]nb e^埔p}f_;Y`W0icy'Ke 4*\x?<ϒ*s=5"NJ]0*q&9.νMJ~Y<Ⱥ1ևO¥H H*rOubT{.r1`#Zb~-hd '[&[Ӌ %mqI'%)=Ju.O7,ES\HzX8124wJPl&żt[& K)E!EœނeSuZz*;O*irP;X5 ͭMhTtI:Y.e pQ B8C̦1q2 LRvl)0d"mXfp;_ ; 3.:zjMfxX:gf ںoޭzǛue#A}QҶ2=Ɗq4<](`ARZ̭63sVUkUd5QB0bZn?5)BF #-#@gpoooQxbr0,[MUs6s<u| $Tc?0Nj[J."e2jvFQ|qr\ϭd*QM儈?`צ7yI+%~qavN{Gg_j :~-m- LKՃTs- % Q5U=~q7WҮfa1q0K&?6'd0LJ4mZݶ(J I1R͑$*,ʕFWBXH?op(t؅<"#I=Mg5_$dܑUT)FSY8NRڬ^YEEH1El*.JbD #0qY\)PX,16bc2bjdx03KSzٶfMflSrٴCb:'gI>QKi1#zaΡXU"^RDpFQd TTę/`͗H/Pv/=$rlmb-&99vq xM.~eQAC:5/jϩͧ'_zV.#I(*Ma'''o+xi+aH3pJzSl]H(z/v҉sP8v%w|iZTaR 1o)t}=c%T%ɽr`+X /3xrXeŎwefjS]n'rI2i&)H"brx <ەfʋ `?<17#VnE;%w'rAMkq}B;XIfm|lN jn4عmm?;TVPɁI؜x1iz Ƣ ֥zo\s}+r̭ȊSPTcN5.c6Gbܝ&TXdSЖ(U`Yyu*Ҝ;iHzQ zqT/3DíN7f vB szxn|FYܔ&'xb+C3&$sip¨SSLDE!~3%{z>De_L7>wRRo vRR|`ge܅fkO/U]o1~U4\e@x'v~Bw<ɼsNPcy[eڗXƺ@cz*{zA*?GPꠧw7DL9$Wuc>իGgȞh XfH--+a7nDst$"|_)9wx\aIAO@yT@+w+GgC?H>b걃^e=qw}=|O l$HFѧ>7_6okru犄H9IH -oe0uE Id누CNq(١CXTY[VwKڎ/WпٷIRya>U J"$aMp6lPWN=Ԩk̟g\gSEa暿=ql3uL~)W"\Wz v V2#-+ Jf "PiT 4ca?}n*sjc̗pb<]oRA9zu43[[[8e'|z=.ksdiyooOJ Օa喓 WBW=dO6Hpd$@ņצ6f 3f}n e]^NϧNEhG,ema˺f{S:0}鵏GUtg}&1Ѡeos+ٛ%-,c[IkkA3`IibUF %M 6m2RjŷFl皰*.>gL#$H!ԮzmNm>ƦM 6)J | Wa4=2_8̱l6[+E@RJWvQٮewLԋKŬ׷FGؼ}؂P]PܜjȢ)?|+"vQDC*RDx< }E=ݸCސ[ puzʵ WgTd=%)զы ׷ [@#O H;yjVnUT5PT*nUkc|Lx6./݂C[ele!A9ӸCuelTt+!-l K EW 49 yMkPt7r-ĭrUxہaf]S10@{@9=㬚:.q3{EHtqP=^鱛L& ) Tn%JRI? s_l* E>}-JtmrtX2D]x:TL4_uyw>ӿaͶhH<4ԨX1α?<))m햹>FE%줛G`*XdH]p"β5>Kvf~B_yqJq6_\57*8cnf6`M.W||U}qKoc~[v8D6{S\(n+/e\-Vݨ eB 3 ִs0D*OǎI4e2]; "}޺ sZ2|a$gaW04yf &vrS5 0Zf hXbO{x׾,QE:p)ݿjtxQe@=I@iW~jR0=G+xS|]׏w`ٿv'|ɝz{l~#+l>uX)]%ؠchݪO>G')u\|Xq$`sσ>s *57lsV^4S|I͗meȶ/ewSyV'i1VdP)ib%ML~j'+Fn#AȠClnnoER [ 8^@HCWc1E]H:HSI1E|c1E"uxc1E"u̚XYcjw4i4ڢُFkvcgnlqE = @E KOY-W*r#kM~O,AR2 {-7kpV4EB"מ)[U}>o:uPz#.zRJ"9ɤ+]cOvKMZymer8`ܮIM!xNɝ-2/2.Ub,4Y8M=g*o k5)$O/ZU+8{.o4JŇI H3D*',JvXՂOJ +V,Î;g%W!s*U+f?5qMQoԴl˨Nc&-9,=togS^!F~?.`އ|yWۋ%#u*U.4pi \=dJOܗ-`qOwҝ*g=rq~ɍ\dOn19OE`S}b<2vS8+Lqcؑw er"RwWg o%wRWkv6?iOs9|kq猜>)H!pm^)HʼCGR}djt5Mt'pH7p~j2V[qj4NKbur͔E"^aȰWd2D7fgس۷n?e!Gf6*z֢!(|]"4gGj睡~YWΙdr[.|h^;#zgZj%u7ɥU]rw=Nq_.5L|wVz%%i}&#%M q ӦҴEЉ8no-_;ʖMlG 'to :<,4r_CN r@s-Mw )0âuim QS0mTk1ͫ<@:nka8N5֨1*sUY/,:PB Q-G:p^+qαH́?ZbLIOo(A[xf0Ky"a!1r& i'X<9Ҝl}FGfaaYTEpJ xbr}r.  ATE2YwDPCZD -.2fm q}#&~bvL(lVY,W8{_HSƁ}|i:ZKɪFgsx~ o >"-Rg W*  Hr$QrӅZ@bϓiNORLDrz>@wK,!iU4":R+9OM쩿C2JL7;OtRR\ySuagOQ$eAg0N>s2xv\D _ )nחR܋hnf<{v Xh]ܬ =@Y0M`G-1CwCdSyMN$r:Écޥipwn&T&TnuDFH[M?BvIҶ#_c#g1La[.NKr,,HKuk@fb)gLFtĔ(q=LaxⓃÇ)h HC9B -'u0c roL}t0;s :iLcg򲭄JrNz45=-rO^imH{~qT/J@m>gELɸُ5u0R{l~aHE^-Hq A #GV!:m. UUK#: %| qVB)2??42=H^q'!NJ߬GJ_үt~dH2R$)IF$#dzcK!콸}(F5D۶фC&_F^:_'6TT7AF]*7ǏXILJtnG{q~{]e[\@wגuwMa}-2( [|4& z<4+,GM!{Ms0_MBQ@HQ$~sWq~n"5KFj9؁`]&QeІu\AEg/m&ٲ ӅC?'J|3"9 hrťLlvʼnAp=Mo=~ΖŎ'n 8 2ym/"q&q7ȑɸטI,J Pazdut͊\!Y>.[4H#_UKՈ׫cJ512oBQcnDG|,YQD]if8+FD ubDO<9spή&H<ħLK $Qc #L>܄-00Hj7!k}sSjk{=/K:(NupY{x~UPwQ&L[r9o홟*,UxfAj FRya % ٱE hzBIM}W"АPEɨapf80+CS 8oT-y[28B5ߢ滞DDtWȣ^2Z PQ'\a~y(vU&磤4ꫴjܫm_C L>!:ƳOc|$Z e)@`8آ7 (?7v䴞6]:q,=8\룽oD칸>N$>rr̵' *zRONxv3wrq;gqQ/H'G3Zx B5Hqw/6#>eV :UaVѸ}WyO%֩G1Si(Y,K>ѕݔEtG&M4$*(NהoLUP/Gtq^6R4uǐx~#I/<5O#QJ5{ $*Qؒ4)վr4|,GS@*|;2F.'w%9j0':2[HΒ&QLr($׊5KlZ%c Y&蒛&@蒛&&&3Bh0́&!8.QO#vLf~N>bFGF|y|}{5h%^լx/ EL4#QLn(WdqoZÓĄ]KO(cul$L~B0ټ$»lO7 Oaadd1 cz\|(x@rf9n+ҽ#*IԎ SjG*qfb@'=C1Zgb╊ >Mjio{Axأ֚ LZn pן0{GZz as|Hԍ_r h3GtPN0|޸n%Nd} X|>df@h eWertIi?T57Cٚ.nm #4b?>sVY4!RH}Tᇋ t]qpص[b"faw,%Sv-Z-mJ6vEy>rXހedªz Bx/23Zuwz+M{&P423 iv POQخcO/ߒ:f3]4b"Qf 7apZml"6h rX2vDFIϋvGqq)PZzZ!3"9F˛bSb(ljye_J}aA{*׉ i'I}=H6Ĺw4)!OM_.GT|e~xB~p`>?u Gy4Y#2h3ޏWiìF;_5^9ՠub _x]9G#Fbbe$;RMxO4oF;`.'5}dsDXA fU-IRlhۮ{T ͔;O υ ȤnݘiݝXiOy?1fcQt?\%%'6*%* g)'&::`- X%ޕەw} bۘ9$. wEkբw (̙ V<_zi}{w cx;n L0t=xiIHJiFSgəP 7ůvJ!t;@t'l_M S(l_MOJӉF|VDeM@@R=f(Y9}9\0}7;]h$#A0($*6>\˸OjlL.b¼<yEE)ѠYҡZ+uFN!x6W:(RZ7#bWV8ssqNry4;}uJ|J?an *lEtz5=$ăZ.>'㿧p6p]or>]&ie%H^q(+BcMJ],$6~±95$E~>8K''۞TΪ~t"c:x'ky+=F҆xc?{!''4tO (u.n6Bw07֯I$Ż#=)Fj^b1/Im,AP?aYIwtJ/i|uc  A:^立: hwr y"SW$=ꑕt)Gr!vdRb-s+*a qrGsoU4U7:DJ.xNʓ#ݥyv^DMncۮ%9,(a.,{ 74'&7 eDoy>w&u};M]t8-_Z' -Yb(\yI?34VϦocŚ>Mn[]6eDnq!Pg^ a[K0k;lbz k#N`$=!HF3͜FGx9UN)?\ - ݰ}L|oOlVҜ-y"O]2k9:yD *Z bXC?Rf0NFl DW# tEnyBmf SR ^gwҍ5u,nyqqEOt~n7CȢգbN|O-14471N̏o"g(٥.&Bk!{;Fqd;7%ŸH}|KՓx@[[b쟈c$gK})& @\%83 Og>JG0nW\ErUEz)f.jZK㫿&.Hɰ[Lhˣ`Tի q +/<*V`p`yp4ۇ 4qP2:.A!Ju9ޯL(M\.b|XGpuD:;?fߺnMk@-oiTi9G# F,)o JhJ-@'Ic4ZgZuK8%ң8D3-jݮKaqQoL^kFu:XkNu;%5S/H|Dr/n/&TUhVvs8pސ[^dz{_v1\2i/՘cS"pfu^*{NpCЪkީFRQ?$}FWD81N0+l;^7$sx?N9 S@b=:ڲ2oz=lƫ#8Sb4Y?XƩS,;(Y{|Vj1e6PB|ފ5luv={^|z1@<t <\]kc{~\s~ `=F s~\o4:^i٭VaS": ֆcNi:uNûg+mEu" ߻SvN+QZ f/\ai@A(]q>Eqxw/s]aF糈;gYh=Ŵ3w S糴Asp0hZg޽ :v!`kيc&쵤@:Z_[oUu}o}\cߌDr1쵤@:^_ 0*N|oo;*'+2ݼ ;:Ξ;uЍΚYQ7"R)=28g.oߺGv9;PFOFd&ȧF%`S]nHQ7》9q!9hXq `q]7<GPxU:1?_I |znoSK)6)Fk "I"Yn0dE|U]s)5U,Tf+J@pͭ37\L.Ƿ i"r6Ɍ\Jbv'>G >}w5_0$U+)1R9#DkqM1ο.RW6bzX֮[5RؠՓ9O;{6< {ܫ|P/h0 N{~=ugij |k#XBl\-)x,Iا؛v2jtd,Z#,F5hh k+=r5B"DrGHG!*Un YnΩq*CR`mNC;?Jnϑ/}8?;F|#5x䫣q!ۃYdˉ[*tZݩ eZx fLP4K!P) KQތI#`w*NBJ5>iHFy%]FT043]^ʨw9(i\ 48Pʑh!} )&Q\A d^ӋVCPw8g3|. QoQI@9YMqG>"M~7Wc=ϸg޴jyw|*RmzY!l 3˒9)5Bt#2A  ,Q܉DK,!=7Vv^JBG.QeƤ,,9"3u_,&'IbR!{/oW a. ?0[\6-Ҍ-a}O(QO Վ %tiF*{PSƁj U0<A&P>d}`0Ѩ<ǟ"v!V@Fgl%往N~H,||~` LT u(eѕɁmŬOT/Ԡ[֫Tׄ|!O7aQEb neURXEil o %]He )E!Eœт2RuJ -#’ƺ`nAw4doϫn@=n ={I-tأ}̬dgW%5]YYYYYYUYa:mJkfdKɇ+SEyg',8W3x`Yul0`" ʕ xylC;vV*I8qNXYU"mquNKF)j*Zj%ƌ+ieNTUQ\F.!ARZ}PiqK0 Oi;y`iC 2I2ͣ}VY,{lNO೟E MD,GֆX\ğ)WHKm+ |4-dZr@qXGPnAi863Boz (z<9=Wo9BYh^U6ksVu5c!(+g$DxQ .DAS䰈hqtDq(a ֱB!-`;h!6|xZ~ؗm@,NOk1쀧߇|>K*÷o~+i%kb߮ x}/bSR3|>9 !זWPi4)z>37TXC4Y VՠsO@;gwHѬ:Lh)An&%w[ uUgXjY\*YC:}Pk'BRQTk6ᘂD:D"Z{LAt{ѭW4_Mh:$&:%^SOjItXy W|;32<5Ew`*x~@ %.Yi`t1fCSwX[;Eqo6X.1j]֞Q+QTb;LwfrOà#q1rfA}Sե f)&&uNQ9V<@@` oԣ|4 E iSINV^i_OEp(X]Cِd9\/hseŠw8<5~,Y sZl f7ffxoKXJ*m B&I2o'ɼv""IZȗ B񆪗_2]^2yP2 x} ,ˡǏC:@=bIFRYjoQ;AE1Hk@ "SdWpv(a [4(Nbm")k !Z%n(ʂ/Id huL}/jǚ0(IO>{}%bMK`sQs>o왊ĥz.6(Xhn<ʋ&8){ 4_&ISMkhJ&M5qWiviq.}NC:w֕[z OZJxJ%;)T1)TNsIVH9,qd_ 3c< 20]p#i3}YmryOt,=U{p%\ EJn;xF(_|s9>c:Ëk˖59>Op:3~IrD*Ռq.kk-: ~xS |͗w31, cE,FDGDL0zx.CK3t/<7,;9 %둚:YɎ=AS!bH\J52D 8b)Ny95wP)}Vz83Ft]uugUKJ,$diؚ` ZWGJyъu2>g:!ɋH!^z<ϴ?_tT !&Pޓ_qÄm ΀:,h\h!"O7l7Q!Zgua`W/C;;1>tVZƨ\߇puGe24***'E7rd HUxi҆ I兹@aC .{hX>(R(K$îU;0:RVd['ټ>y]eZ0G*b@Lц~e- _ٖ~>筤XP2[Dac,+J_ ( gR|Vݱ"=&OH7^?Tvp&qi8-5i[zuͯWهO $HYw,n!Ri[c>꨻ފM!;;[X]$VtV3(d&2\CpVsc—uiwAnz-(}@@ y[պcM\k[qz:/z:ӹxRo1\sMPn=IX6Ra}u WӌӺ h0d=gyCqUU Vkx/S,)"EzuX~~V`xafk)g[?¬_Vf'N*1I9"e›(j'uO5]qmƧ®9EykE#Cm31BPMfm(nY\s(`c  f/9右:7r>Rd0Y#>^aqUœSX@0%Y]Hfx7e |(kX9 N !_XA+NXNP\¹CfS\H=2PJ'KB7Xcw'~O&hoWٰj* z[i?J#6R2W_iJYAV[{*y[r; 7k.\v;FsgF^o ?0'F"@nbXP:߇)#&3X@-"%Ζ[ݟˇ_|)~ 8E&jvɯ|<H26}Wl&PNNţjT:ţ|RU_$c_Xū=ϗbde9p$'2NQizSE>*ADI)I*f|oOv\I#Jw/ߕ.M A=VhaP M6OJ).rD9f,Ѽf.0;g"?R8ЮT1L#KZ dZ1,8 fK(~Diz!}@PULG> P]eJSf%i XZGH&^%f%0'u0ōu1m&^@?d!TstS= Ž%pŸ8XR͊/|WZ̼)HjiĢ4liHmwMbŸBֶMI̦C!gfQBA_:0+}3 g^<2V7Vn.wHJ_iA~_9͡v "\wy%2V j(u]U~1m yvv dd+'hʊT^ۂfBDdyq򥄆F i%7y cʂ?9\¡d]bk =,b {>JC7!eಎ',r1;}5SE+OsgUֆ{,ݡЋ{Z()mӋ#Uemnl?ʷX+r;F?wzhP:tq,ɶ* 6P-|2gprR8vH86Uu b`Q0 ^9"b~>P015FyEĵla^P/)3Eos&/vjoU>ڝfhEoi .EǚeR݄՗&z>Jqܻ渠~udbSKy_ofQP`}J$N#2ylbGƠ"mCa42OuPXvhPa)/ekYlў-8'MLݔۄusޠ]*(:U4} x*p;]o@?s fo 7͡0^ښ=w)(Aok`_Fl~_rpyaf\O?ѡrVN^ƄGŮg;7P'G'?xC t~?,bS)Ÿ?5'cظoGRi&Lt77ӷ:A nD`o.SBܾ4-d*;*Jj$yXsA%WM~9xGL~~|[*֣2CMRee"}RQLC2x\DS/Fl{|me pvp 3JnYSꉓ%oٞ6O?-%x\"@8_~t**֍_3(o AR(]'9 f|/)}!0l}XH hѩZq]}8tLvy) [+2=YΗBy)N!&0#@h;rĦ"X O'+dCC jkwAވ- 5YeZ.2}+z fPhPk×/o RMl.߽&,MAllᆪCo\U2! R T*|U@"J-ndũMY? A qv0Re}tf r&y#j ,8_ |u*/g{~F/.%^3eI{!jXZZ+Jgw[?->kw nW爝!HjRRIMlU@ O#㊠ghyա^7Nt%}~^`E=&#B. ?*kU˕볭*>n c*&iꞯ q)&*S{ `v0"Ms õKuZk@y`gyHP|f-7$JF8>>-mmmc 5m+,\s=!jP2 jևQNGb+)3rۙ@gfv1: ]Zt(ƁpڑCFz<П?jqI,-|oF/0ௌ9N7dמ)Na#V L_9"ԉΏP38!7 i?A7t?_-?@~s)вx`q5 t( AL{(=kfcJCOͶj}p$B7k\_QjIyh,o_rإ<`33L#xW(E)qe),GGW}#I6hP1% Zz8uВ89 y OfSZ1:8.'ԣJ6X "N+'"&#-`{T>V!n%t 8"Ǎ7ց?[oN'&p6A0]* !IxL`/(PMvoFj_vվUվ-YH>zXd(ZZ %mR&ZjT _)XhwԮGI7|4gk2H6qi0R&|`fyP r,0p ]/ѹѯ/JQpU4.gzHV, kyKTAa0m򍹐$0"ks )*D򊞻w1h+Fxߴu8ءWysy üR ֟lk'st܎::I Lbc{{p| bN ^SZe8Ϗ& \azY⍖-,Ӑa_8+30#͇g /1ׇ^z/37!⿤i5T!NХNH 2Iu?"3p3p3p3alxGHt` xx:qwD_6nE<؀ QZ&xzXU)47IcS;c zͧݷUmIۮԥ`Om5RJW"82 7(X1=33MM ;Y'5D[+x2JLK2;d1Y0d`? A_ò]͠XQtM a'_uq=۠PX UCYI,NPrñIRz!u-f|\Bw~CG'))(^G x~/GGHaF6߀M~LǸ?HR{2|MlǼ {\C7IOyƚ6aQ? ~(1GU@f,X sX҃t5ƞt,,$:X5)xƩ@7px z6Yݫ*}80V!tjCJ64o,"-rb6>Sy8H#|DoOvhh+Ym:Y_pvODs $vJ+z}`Y4:k;%$o+uضSr{ScDY{6rT Xxtk{OI,PYYj섩NoS*Ýtcn Ӎ P3dZeN#Fe`0nig ֽU\D"UxAknxA 6PJm -;Q\W^ zu^nmzlo_ۮkw"$rVoM;M׷m,է;_VVv}_߾끾oM,è=LnҠ<wg:u8íաm9= ]u4u^Fè:Q{8x2n^ݴk{m[3 8S{m~mSڠkC36^v졙]׷z[v}}îWIuN {T!~GE 㛀C;3!'##F9&r;EE(D.b45`AQ@V:+r7x3!w !w3 yj˸[21Sq'xKfq "a :ɵ_y /4{r]^Ą  ge|$,R9@+F>MZ|]Jw5d`[wK*t!7A(*emn]'jOn{f+^]ެ3ƙjUYI3po:H[nh,()*]* !f,WTr*Jk9:"AۃDu;axoZ>y M RйS劕B\ ?m` )N` O5C&3TacN-mDoYQ^I!ZzPͧ3jCH`mvavy!0ʯ 2!&!tVjB,bbcZ>Bm4%\*`: $th3l>v/J89 x!, Ȅ/)%Lºq<>'R( (Ȥ@< Cc'J<lDS@yIbuSEy| 2A)itꀇC~RP<~4h@x ! ZJA )إ `vA_PWz }l$CiUKCLU=M#ef)G&&u1<,C (p6˴m3ak] O܌a舺Elu&Ќ^mu :|65$<#=HCI4 DvR_O%Z@4!EԚa@GUSV= tT-(҈:JhzYGQ@vݬ2y`9?>=,b34E(+xfȜO Knw΄+Y'Fx M|N1+?N1kAf!&0;-:㘕쒐*軡V+ K)q/<fF6@:vLle: _} S[{cH)rz\9s>uL"/ÿYHc_m+Na\P8g+jgڋYdv0j:] JF9X$/vdEzׄMXIEK@\!+uw+W7BNn,O*0#i'aChpD~@Bfp]LC$ӲB-sf#lHBJP{hY [*B2fW tQK v~/_\PcR\{eK[r)3욶3Hbq\:P+!@ֻ]9@% x*"7/( 0wi4a㇩is>Qi 8iϐw" 3%d. ƔPrF{/\//-II@> NhE7׌nExG^'ռnrB`݃AD;U9e#Oh$zzqv|YL|&<\pq|VP h.^,b<(>ÄKd7%gBPG(no..m`ƻnHj]&H15;jbJAsӑܝX7qԓT۝l]"OHbu+5[fL{aj5AI< -w̉+?輋Y!:$'*A980|nTfq<|] (jBl ?L;bKKҗBTؗoO\ 0q=%:{J 8`qXt8 b"Z`ik f/3yͱW-q!5+N)ֻܽxH&f,aeZoĭ( gw4+w{sh=њ]PVx 2__2f9:(JBYAx{GiC/8:kW CkywXX)g;I$n'ߛQm6$W~whyID2nrԭ___BrklY  (}|HFC1_5 *)+Yٲ`4юIo&Eſ'R2] J+xY>^0ē-<ԝ4K+,1vhҮp g9waT/^½ w{0ݭ=cWFP%o>km۾q/m_2=Ю5MQЦ-6}kΦoB@Stb< kC?FvYai+7_oӖ^n3 =z-}zm&nĵh7Q_?,VQ(6nw#v8PCv?Uv6= ' ӿpv+aoc.LxM\[36+u򟁽Za?~rOn&Ħ7ijNȔ0 )1~n ';F_VUq"\!3lߏ>_aTxd4vI$*=$ ҧYg-Czj̰eUηFqz )8v xW_s-"*)%=˔z_t39_o5H!l98`l|kdb2-_'>gc 燥WGG?JWׯ^pX:*`OGZ,Gs~A^{6?uڽGfŀ & |e|WtEAP;ܣ Ȼހ.rfr+Vp]>7*{Y4ᑃ1GPQP賸h1|i>Ue1]~axsr =KQР\Ux5^/)O7:+"||O1S9M'IOp`=YA1|?g"+ VXNP(%hM@gS~dFNn8w7{y(hdVv5.%φ;"ȠvS|3|}̳SJ?#;(U6ϛؒfEU0HY<w۹5r4Z)2G7~FIĀT-ޡ0gLNtFLZ,e2bXr˗/OUq6t0hDCuňA@BydryTGyTjSxai*j! u#AA _hxR rL)WTw+dQ:/w~jRO72!ӹJ٘^XBJ[ȖY xl @[ d%MGkHB?. O"\~=-,>g<kEk΅e Tb,D}r0;frS2w0E`SGH`Oy$ mѡыr@*쟘)4IKӦ?=W1KgP|o:9}nPěJ xvr6(IN<*2u0ađ y!!;]f6&s ZJoj6A\p#žQ^`i-wW^ēxڊdL:Eɴz$ bH ~|DO$m#/2A_pTs=mO\BŸ7$|İ pZ#{ZvhrP$>Oŧ3U&2:\H|ٌ2wtEyUt8Ģ4lir"$q%5HP0mљ.|-H0:rZ#~Indڝ2ަtYd}yJ!ɎxoD21јFaf }dF Is,`qxDVmFo5jm0z[[^nYPmpk!pitč^nߋ"'EIi^emm>p7ح|~mߏ"'cЏDe}~n4:uoٍ^Xv6tQ{ܑl~61&n6Gzzbl͞KV[pA=pii9h{ ŀ!gbf'])7٭(JB'M5-tV%3(gzNS<=ՍV[TyYֶ7-h|hQM-t@U{F[Mk }M޺s4͡ :] Y oQUOdXc%?;k}@G7zƎXgkz~è=\gIvHw7Lcon>: ')0 wRJz"g+7 ΞCA-ôzl=2f;VT7n[ houSf[ިo+Mm \3AkÐOo݉nsL6p ooz=] :3[wM;yē'3h\Bנ' J;%_9- 3Vૺ(FJݰ'Éu5n(D` M7@R82~FަQVͽ=ʃtbgv-:@J։cR\\`ht7Ÿ?"##WC#Fи&SH:xv,׈ 1eVaHI7t$Bc!I2`a=3!| $q s1#25j~K61M O^VHko9!KZH měPvlwC)x;S:!xq'\z.h%A GO>{gŭ]Nhxk 0A+쫒#{*JEHJ~pH⼥YO;׷D_$s}X e=f h0L]- >%ݕ+DS}N 4I}a/n5l `R zQz1܋>TZb/ژilzڌb5>Lmz7}؂[/ZԾ>vt(M4KM&7"Pրƈz>6ʵ_ʁǼhl CBa7POQ/X4\˛@4!!_F&aGs)r-K[% QP5HSWhCl,℃ra A`um}q X։ƣ\2 gc!HEޓhNzIwZFR;ta ,06$^~!oWAIV6A*80.Fp@qbɊLX]òlqДO-=\ ײ0[`dJ=>CÅ R4Z:߸ `T'v"\@x}psF|T/y=1,'Ec}`*y PM 7ң?&N$56/> v쫿|yD2?HàI0|(2Pj陸ҵԠ{DY0< %5>µgHRx8C^*>EE&+'^ER49p}Қ QI7e`s[1#HXEjPn4&OԃaV%kW*lǐgXU6Np^onݝk˯x߳4W &?%MZu LoBڐ.o ?=Og Fev-E,fxoz? B>ց4Q()vGGMfn~38/#>'k:_+rpBV7񷃛ezZ*\Ë/JRnbu5<."~!RВ>tѕ?| \H #Z \YHP3U>s-7sTBvP~br'Ct Pp>ʻ%SbQ9>- ͙EũΌNr.FRZmy(-l<fC+DnX]LN"/O/ )eV9SJ:w*2Csn`jΠ5|YoU> \ f´٧a[dKQEfX}A_Wwjt9:MjNP4`oh)vz5]p oPw14ÿhe%}7J*\C\\-7lଉ&z@r)+OV[,3Uf tELl#/0mJEGƀ"qvnp |1$$u^ 0gCk >C⣦fR!A]P%EYXت|6@]kV ۭ4TRcJ>4!"'&`D<\}mjב sS{>J5~?>🨅d_9=|].-yVK:y??4x_DDקkj (䚍W|5T"HAPW4@sjǞ~G`wazAO3{MB+]/9H(YϱJiqfDj*9L`|(9JJj^xN ;sS%Ip` m`$B67NeDa3%'aS.xhgô ".Hӱѡfptb궊~+"ƑnZc1f Uɍ n,b'^%G-xI«Ge==B-8h"OSaS@".Oë]|פqA HB"D۲5C2.T !N 8*JXNG5ױ|a9F2k^ORLwhPB/)$5Uirif| ^az7nVC@gMO*:HiN pfEjHV\P&sM:L":)y~8m-J' l {YVzXe-\zWX%.'t!M-)Df p-(҈_O%Z@4!ETx%SfUM%Z@4QTVZUO%Z@(z a++c9 aY3]C6fJPk*WN*I .Gpxx7N3m~S{0Xl`bhHz‘w߯2qxaX5͞rIk,16Au|_H7GxZL@1ĎhUa?(Pa'UFX k~V\FT&|u-!f 4+:}7O'pr?– ^D6т]/$b9ct7 Ao41(!m&x9iiYV:D:f|jς WJ삶@3X;xA%g_3EhY G„&4I+@$73I0#bmuy9|4o⛷^oYWn8"ƠaLEۣ| v>ȸ!~VWkK!Z{RrCW @wls{vO_mS aX# gC{[Ț(=ejZ,P֯W̽ >yn(ڃsLΆ6EO,ʑDԴ/ GŸ*r냀^d_Aǩ4fa^NDMZU{oRnVfM ۗ͢swjJ|_ 6_}?سk 8 [{wƷr;BYfrMmQ‘|X%V>, 6(6I>oN'@Ռ e{7h3aJ4~jl 1 q2'x%ܙ>8DN 7vNI*ZO-g RveN7&uD,&^ތbD.6L@{9M^2 sVxc_@2B^:uF og>ct*{5d|FxNs>? ?b )_}b-\ꦵ` ѪkAeSC:K-uOåM2=-O=u Ʒs>IfU *iS_9BE~o؍/t "S6^NZ,q=Nч8 FZIز2_%oQ+0[P`p]3D$l~.ǝ+w;? qOY9Щp H{Ś:'! gΚi 5PP`I/M,╶Tۯ{~9/յS?7R,SH5wi"<6p}5ԋؠIp$]2:$tKFݠ256!Q'3Y첄i'\RjUDANF.=: 灨|?p']}*9 كn-=VN#<~v373 \(06sB* C̋ט_U;R9 ҫ,31D*M&Y,ur[g=Kh2ʖsdV+Q-ζnT1h #;c-mB]YOytV>יv,B-_B>g.[3۔%143f&J-X0 `:>zk}GJX# l3Ii-f(eؓ":boAF\Qy DR,Dyۆao#CG7ín/ZMK* wn rtC9n6y:WK/_&'7>G(pv3Ĥ/y=6xǔ |dCP/}Kʋ]3}+kJ&l;NU?ՙCѣGL` Ѫ6>&jLg0kWMnZMhTg7\#<߰#_g7aƳ 7^BfF+Z? /l8 LCpB Ooe];NoWL35~o2|e;}xq Oor Oo7C~2fH+j{Ficl'4ʶO&Df#~z:DCW=_o}u'VOwSx; w|g ?Uy|G;>Z d~Y/y\.oX" ϗ%/Kky,|Yy}/K<_>#ſO}Y]>ߖ;-~{WvYxm8OKs/MW{jZ^Tx mvB%C@sȒnWDP%m[yv>Z,o% s]I:͖?Y*>qy}x?K_O?=^K(G˯_tT:>>1 I0?|^G)g[?|.݋~0O _ڻ3NJ69/l+0>OݽshhyeP%,wʇBHgqq_X|tOהqMqA3^,+tO`rCg7G|!{r8%b> whk'IOpNf@{ā1ݤ[eFrrEn&EGpt$to$3 m2LU +v5 φ;PNVidJ[i?7s̩aġ}tjtkTE}rWsAa2HuP[B`0nWSΟ=%2`AdsQا10{b_ݠjQXe|rm`z|j+V'M:#xWv'wnotf=P7:W;5h:`RM&/ GzP+D JB=SUZ$@ZLJXuGt9Q0@nѐjMSƶ|i*n$&&)/G4>i>E7u!fEYPnPB|3XEJ;T}@:Jơ)&h(36Y} fW[Us cb!k>xiTo@ 1tln )s#"rp[sF%Yg{f#Yrɳ MhSl@-h쑿!btmv (F[pY<;$ ͫ0yyuZ׼h3\tdzf <-Rӱb=HARB&>i:EN~U4ixsG`L7G^,HʮĿ )b}6 jf"=r+8Y9CXodМz jQ"/w0xYru\Rɏxq-FҜ47ub/\ݴ{y"~/wg7 P:15{.uUd9U;r5Eq &&n$ UwXU>Ws{-¢S~el쬴R:5 ċꚵmP_߯|uς|Z$}}`f12`m?Xo'mԝ-&WXZ')gݙЛFzSϤ7*^bf=d @yxu dBͤ}\n>,` >&+Wy{8}9oi<hw ;"w'岿%Uv0+cs n ՚KW{dIom yʬ  1[\VNЩO #X:ˈWKp}ClfP /ˑȒ[kS i+[Z c w Fǒݍnhg`2?yE!#0X-9̺KRs9'oG <qo;kH-el2=N> œ? {_{%}'9qa*2j PLL Ai fmI%|N.eC j S8Ѧ.<?g`;b7}%5 w`?\|}T$]WY.0P_+2Ll}0,6$GiͰ qjU"״n$ ^o\ꍰFE]O=Oo)- CcD bDw4= [ߠj*k H~ѳPd1 /ݶ*TĬ(4U 2f k40'c Ӊmv\X @f7D\zot}gr^+\%֨l;r+o : 0XOoS:ݚ 6"PTs~o -J1ۀ:SjToS!6i4Qkayim{1y ?ve ┌E^պnZy_ YR @ H>!]f簀7Б3P3s4)I2~#͠@-^reDao|U}꒍?a IˉO-_oAbV]?ۧ諶IM_}{ P>Yeȝ6ZыDYk`ް?}D+.UxzX˜V+&8b|cgv̵$P~ֱg|AM $'M>Tcx5F@C#Tkn,'iJycB+bICc@VUzM1y^2gQ˺ .wOg70Q0"+|b[ "h&̦+dQȡL}V:U? %$&,!)t[IxI$֐T*V4(HylD_w3H/Wo>` ҼD4܋7KI-&)M/=qGO, ƓKdԠR%VBr{(_iSq-?eO>e%ZZD rT߉FzmQɢ=PIʄ9rq#xޠDn^r_Cc‡b1hQ!; F0[S;HT6 Z&]Gݰy-eaCD&x$' *<ϥ1{1nOI9ѻ<)9z=F|E`1Cx0"͟ XKG)amD357o:X lHq#ғì/(D1:Cޞ9"aX |]6 g Vr-&Y}O $2H (\Nacpm'n̔sR$̞ѭAaԄ᝜f' r]YD{#eMHgXᴚ|I5¡4Fa4HmyF(+:|tmj4j[5)+) ,IJ K"VȆ1-^۰ilsu_~)fښ<|Y0 ܑLhZAqbHa`JHι~YgV;%4)BI JaGr;b0O1ȽĹl tLW5u[9l'r$ڴOh 0@S]JX;JIuvu ,]$.J** e5jX<ƫ "*ԦO0ʄn Z,xhV>LJ2%{zXş!$ӷ|1; ~#}:S0s;cf sO/ɺgBcDf|OuhA:*JL:blKCxo4' ox*;Wicp3N_4 {:m Җ'u 4cܤ3ci{YȄDcȾ|"4=YDt |̼f#׊MhPdŒM<}:Ou%~zgc %qa?JG`OGZ,Gs~ߏRkϦ]V&F"J5F*\[6&x~OۗT\ 鬮`5"Rny"wW$ǸbQmXJu:{,'(;&EҬ}MFK]:Y7kn 6 _Ɠ j"fx wȆnoQX y?L@ XM)Bi5wPRm7%'~뱓.`~vy^esk19XlJ9fdy9O4!x!5htF=lk#e|/_l`©-~ѼiaF)YU{Q{v~{AzOt;ܗya6,ٽA(Uբ>rF`,ԇ IH8ZN XDF?ǓG= X˼p}FEA, yHņw|L*&dͣƔhґ@-81u\[u@FɲU!0@c Y}Bq#Mӽ\a w”KO,WFWhnb#wz/4Vo; s3C0f{ý &E#R„sJ{hE{u=SU"f@ZLJ\ˉ g i"[4"Z-_bus+ 5r7:TBSL[D4 %>54%WPdQ;F'auoTz? 깙q0,:􉠥/8sZE.7gg:$RFEk=g<pOBrZ^Zkp ahKT3qXk*n 8qtq{̾BFKQ&ؤy-yG)2! W k9 o}uuNjm&yuhRDtۈZr=ݺ$y5Bꭨ5:OGJ;*Wy!}Ƈ"uO[0E _,H44"'TImXKL1XckZ/D V3\M̵"'b%o:6;ێ8YgOwR|=Gh^m5 .ǩC":NS|(S껩SȉթbyəIQ{Ѭi$P{^GlnCvC śN!_IҦnJ < -)Oc(IR^;URZ[^7~-1޾7C/ ݜ(iChhi׳9nhBGQf5JbUgkGm;m҄[M#hƾdu1 ;Fq6gg7z>~0<u-Rӱb7bLAsrJn>i:E|U4ixsG`L7G^,HʮĿU)b}6 jf"=r+8Y9CX8odRaԪ%1(A75Rv]~e^|χR#h`: 0O֕WeT=5ybI1jFRuUs{5in0ײ/,:WbR.wVZIAk2o\5\;P׬jH0~ړ{{4ooK…Pm$SLCie lo1K%UizL*)x:J]R dз_Q}nJi34y+uO>QDoO.Lv?Xj),r|r:[~w;:)/j 2yρ_ӯ&nX;Nb1,ICuO fr=t -/؀2Ӱ =y◞>fw~= KƻqSfJKb*caiLM wmzDr2$tt]MH]Ҫ]}\ntC+$Ň`L0.˜Va|;OIऎLJ]DZMo /ƫ˵s\QY8$ɥa(Dma w#Ղ_߅]?A|އ 6ʌxqa/7{}%5 Oh?\|}T$]WY.0P_+2Ll}0,6$GiͰ nBjU"״n$ ^o\8FE]O=h), Cc8 bRqvH#,I<3Qd1B%U<9FOЎ*Y*ZӲ /UVH"phj/BA30;V]Gra:a/2J`Ω#DOQWTo$3Q"xwW|)P F˥8itZCG^ b::;hbO$߫$%]h0Eψ \ óx. 73 /k@|9?VyFn?o8GZ,)Wq&rƙq~hp""-^g٤ȎaqPdW?.^yқ7/V۬UYiԌ S'Vnvy1ƣɧ|3C۬^/v(U4Sxz7" jJ ԋrtLWx0xuu}h+hS**3e"o0x=V7"'5y6ƀ;65z|]aڊ3hwaJ`5Y?$+(W`rLsHFL>%/<:xSVit`;4yY PP]ЋXE,Je ER]urkLp-RTom\:H9Ku[~W^ V7etk*<%EYy*B&Fޓ b Oa!r3qKQD %Rw̻"=1 *6BuƟ0(DD|i{0.%W?j"'Q|~k$1uI簷6el#$ ##9x"+c' 1WKCyE3b<]Crl5O="܏?wzhՐ @xgz$'W>Trwc*oAk{_#3j}|]y=&-+mMq$94^pMpF/ ըeݒhsMnm`Op>*+hLoZ7mEB`?"Ѳϊ]ݽ!=5ERv2JOMI4T㢭h*$.v<@L}+N=~~ZS[,s%#/)T''cc֗$~(\* *qJ&tKJ;MY!IL0ǰFu]&#¿ AN;qRIg@&HIN/_XLtb:;gV3;] \$QYj|Af^xI [CL%;~I?_M4/E*-rXJۍ T}UW3a{lGEPIBHsDS m<+ϕ2%-VJnܔA(E`1#;e@ miS 9emD3>$=LTZ>=AB0W_yF_x0>TPb<^L29|n"4H\<=7g 'ƛ%.pTY&&԰om-ؚ{|;HJ"DOAE+7]$SB"z$m!(ǚ7@K&'Q6C[BϬ ɒ҂p.t mζ=W@at}e?TgXR2^OA'pWfʩPR҆8sj'6O1̏6)CG!;@1@ ƥȧ,SLiTNKkB+z#fu<[7.؇:I,=*V&C'a1ڪ3nԥ>:"qg0^JY L vl3`h3;7dq܇;fAtt!;<^E`MreO-IŤ4i~J!MemԹE3N;ND 'cOXl#zլ9#eh!<3 u{ʾuQ(ynI(af%ɬ,xw% JNf}f;[1nl;&w(A4jIQ 7W\cysnH'^%px1SE”ݢ0UsdW},px-cǓ޾oxV_`l o+]o-_U,E"}OG_`(Ja(ٛΦtȰ<ԥo391 SIO+jf2J%5i4, FC4vپlWh}Lđ莾 >~ XxZ{x!B=&OCXAt6hRp6rjJCn EzJsP~4Ư棸޺ tͰ^Oc,Z|t՜Si߫kAlŋ%RK%|UM w0swȕ*7VdZm9yb(4)e^ L,9mr58MAu0XWFL{hǚ3`Vc$m lfM7Som+[O^^j%;Ý߳ 4_zIڙ~:a\"'٨6%._<]'.aء&(0c숟DEbGLz=GtH^Cf6f !N>0&>0X.io{2!5Ifl04ӧ=em,;U[ƹ[9p:y ?BB Gebj#>=Sz!K ѿu4`g𐴙pE;1OC5f벑+)>lހ#' Ų8< #b:~>YDph{+$IU\K->Yo#6l,W啡1 c̗z1 Mu y7cj4*=m*5Fh*f$9^8^;WOKc]x#1>a6Uv>Z,d$>\W_?<b2-~&[}:^<z~xX>,>T:.__tT:.gXy1מMo7ܻv/.M0*I aHy=eWG >hMa#t$to$hAV@['ăZ-D5>6@X +nD7oϱDR jtkTvxrUP}'qI⤮9Aj$\rGal K]X@mi{u^Lj:<5`F~X,#F^4w 7u;z*s1ijoH)ќfEb$'z L<h"xnVcO Լ\tZШ/Ώ+uPQtau(Nq439װ$(FG5&f_[}Wru#⑫)ɣ~&t6O"~|t(PאF x ۞NS@| RVO)Z<qvbr3yILOMK<4"u6_\W{t|FIHJ'qюG!̚@[d~b;bG͛~Gj;=ck_"SLJ $x3[PjǦ`6BB&I%l,Dlx'kކUZ*6h |=_~-7tD%%}C7=b# vY {~8>A)cBp(5*z#XbA72( D*%sɝ&ʥ&]tB b{XNr"QHa=[@C__6` :8=5GÏտmO\>J?#̏sVب|E9l4OaN|<M5y`@ƣ'ua*r_7d** V7Fu M!0jh"7][V:p:TsX鶟(q1 O" OX26}yz31Snv:nYrբ>*$Omxz-z8԰jP{Ȼ0Дϱ#]F *z18|p:/h 7"ш*ҿ=j 2vJgPsu­BU'̂`NJKE$7WPjd=Eu j\i4sޣL(0&)l} w LzFӅ4d_.6tiBՁ[c{J>c-ux<g8F,է;ݣuN>4'vVCDPՔgPJv@B*l*$ D&Chщ aE BFNu!M*dBSw z+,z;xtOYGn P=3Eε)rn64_҃_p5@x`a]P] \YjzqoyseL . Aܘh?P 0"u`@#h$ܤC]zTf`ghaAFXB2ja T`)]`px|s%'<*iwia13 ^lZ('*ٚcM84]cHpsp!5f9˞5I.@t) mp,gu:.EbsT|}AZFEf+NT:,X|7alOsFZD;D&b)?r/MaP/s|bNid&"$FL""}:okoenXyҭy"=;.)0 _a`TiEkgo~ o85_ɝRNɫ)y5mvPֿeX2'ԶnzJ[ymMyk[KnN+qjkP};կ׷Trqz {d{r6 ;~k&_t̠\pPDoklD}ˣ$v8ee OYiXQ2Ub%X ~w':"?09vMٔs9.IoA|C"]܎g(%KnϚP¤tvq2".$@Z3\n*ķdFz8N4cHpVxf/>]gV)XoL3~1[5gfP]OsZ - 37%#}*PB%=zT2, ]`VcW$&Bw^9ӉN)SSct/:hbtÈbm](Vfcͫmi`9߉ l%6bah9qzmJ%5 `}i!0*6myVP<͛X){Ϥ-͙~Z޹'b,H 7,QB2{Dn|Qnp6j(JpA>x-48# iPc4Y tFˊ!0:Wkmhg1>#5\ۧIC{Ds\߆cH< >^WS/o7L9h rhPX"e,wtb*7XX>)$4{2s!kuZre-#p0h) u+1I\3`u$"cVΫ ܑ7w)ka.NDV*T\ʬ.&T*n-I$lK͖[%Lٟ܅UBeJtMޢqsA#YwFfaf4L!+"ZOrRT-EfË^ ZZj+XX75%g$w'i)?TSj%|ҮD<90.JPhš͎dxm plh"&ajbN9EP;%d/YeiTK  :ʂP]/F_l^m"Ù˚%{Qz8|y\`MFk1vt٣ubj O?7,N+HaR~ؖZe?H.ÙDNp-tfF4H`Ngt u6ڵsGX)]gX/^{q'Dizm)5XW{Yu0k泇j?E w}n{c{_9*zCp\.[.!UzF*Mm= 2r ^GנF;aD * H|}7CmϑZcc+Gmp&V9C?n'<_a>`C٠D)4d` @Ub[l@N՘Xz)IvQ!J*!Pi]HCfeX"*xY 9FO~pU!^7x4Cwz'ܚ^4MȒJəև F)5'N#9bDIp,Go&Y`[7JG@<=& 8G-x8]H̷O!T(gY  xФЂK 4P$ }oMR|:!fVF ?ڀ_?߇kC](#EP+АTV.:}-p>Ӂ>EXFzWOܚ{-- ~fb"Ŵ4fhW|Dց^o^JH䠜BoaK.D&dFvy-Z l4ztT(ԠAkE GI;uxB:ﯩõ Kc6EJ:Mv +Az^az߸w/]N 4469rG@#{Z"֤t!]ȑ6bdGH1e9f.8f4?f-\zf,]3=H#d5h5рkDF4 z*z -bT2o4j*j߶Қz*z^G*R jNƾeKt#q~Bar15}5A(W^ W4ݵ}MJ2k2NzZO-00Ϛ׵1[qKj4ga@ ESJu|RQ~i*[oV[M U (:v˓^$B/n !Yc鉣5 ^ڷx6|պ|Dl¸҄K-@ΜX:C{,vLZbV t춃gx¾@Wr6}2٥Z:0exig _P`gDmS]*ډԐb@,o Z0|s\KE#|y7@ÊOrjHqH##a F][%ǖA}g4o⛷\rt+4HJT={Q.Yabs) #nO@;O0l.>+nZqwvO_=;mSan gCTiԣY5FG!j Wd4ߠjyU %s9,:c9ң!zVjt(amCPlPnDvSWC6 %>;Q\b性ȇ}SczЕήlשKqz?;ꫴQ־8)zb/lF"Vg6堆K ktŻ3uq7hȷvɒwf\̃"U͊\VɵFpIFy}E-"If1%bVh6-雐|K6P1xݮ@c_' >2+&DYgjӹ{u^ڸwZ96$Sݼm]^ 1yyrثdY[JTF؄3;jE+;p'^Ù ;`|XR;mz?S9c?|^j'l ~G؞jl7RgbIل)̧I3 N%is u:a(,<'i{ >F`/wm31>\(ڳ6i7,.̻e 74Yȁ>%]ēSu\G.u҉}Qݻd.oYX6Oe}1$)3n&5x^^)Mel$dS&>~K?z>!NΝT|XH la+/Hd_^m*^kvW}s< E^ɗ5Jr73{]4 ykOֲWR:a # &el= LJXfu)6i::7k(xCMn- @,D:e p5 N$;tnH@V|:K,U/ddץIXjUu,,#9sc .8C`9t@8իDQ6^MVz7 ܸg7^y>m|Q6Kh:-b?-0 mc vJ[Tik;(mmw#1 fZS߯v2XWmyz&ֶnzA$<)xΖo62`cYuW˄;}ͭvN":[_߲v~ehþn@7 l~be;hn>DRO +ô)6~u}Kr`r/|uu=xV㴺VwSZ"V7UJ[ȶ _m+/XmH*mmak`jg 6UG3e ;u~}ί:e7|?M&.ӥxOcHWnwxMщ]hOٍ +/|ߵgs}Br .5HO T!Ja|%ڦ$ݖ'\3D8ecJ'BϦ*vd +LB@d7|~ˎ~wgCx;RKOUo=bj<coaϬ6f<]G{=wl$_s}2y`]!_a UL/T rYE(h+T40D#)<ԁTLd8Xb^2@NRnDNb/B)fks>nSޫDG5zG]?kX݉=*$7pI0_Q2TlQ⛒ I$ bAĢ&i {A[6 p4?i2C/w.]]V/V˅NzVPGal,0 ;lK0l= 8aiH0D/O2 $*et[d4x f|]Id$%$T9(])\{@:&jL@xPݍpRaGυ U?m@?X~` 7 ֢`=_% dt;[%DBz2+Kzj ĕu`:7ηA\kT$%jd մI))(p%3P%s0C!af( a3Pig 0Cf(Q4׃u8fa ( h:3S60$JQ@ &` ^2ȿq 쉦"QoWNA=# W4tdL`h#Z>J.oZQC>xQF*ڜxLS'ikdJx&Ne8vhJ:Yv+2|~-㫤hhBc D_ /ZEl_C  Ö짯ۖڶ8HW _G;v׎oG[jqxcP< x 5bBT¶>L| ,׆oWNA= qhB(vb|̈́̾nB qNo8!fBQpJ[&oՇ 1 W[ھZ$zL[ˏK)IDf}d|FzʁB! V&9 xjS:gdL):E/cIz׃<׊u ]` ;ןȱaxcrltZ:<4F]gC-q(~)۬cp,Eؠv.e66z kTonvpaxt ՞R6) M 5)g&&BMî mc80d@S>seop l5;èvtMKVZI P̩3 leE fXhKl$EJ^6f 6+ XhZnmͲ\Lt[:ڬ|]m'6nLVҸO -Tnl1aL-U4Z;v0Pke7M]R7MNQ_ 'IF4iK)vM>(_m=Wɹ/Eeܣjf(k3-H1WpqE `!]ky֍ձ%س[lSr(7;=ttc4zܨ= 0ڽ7T.u57+2m_ƋdC;Ӗ'ߟv"T&XM{5i?1WzBv[9ꭵ;`9ʋPKp;qcGk1AAI#ہߐo0Xfٸh?΅g7߹ baa Eʋ%L67Yln0I~Z`So͍_bd=FW$zWw ojb&c h纒AߍO`1_ϖ2۪oC><ğ/'óJѫW8,ʯ~`OGZ,Gs~ߏRkϦR.݋~ׁyyc[5ΥQ=.L/wiԤ(݋ػ bsˏc+ E?qGHZ9܇xިe-S=(ʠ Eڍ>RA;1ShE({v=bNP0_tv#>^MՓP ?MV2O>ANzv2#u"sF9+iqeʪ- sJ9ߏl2Zɒ HHn~S/3jol cG׭ҭQ"4SDZnTGlInz*߬]W:FRcF6xbr-8RBy|?c2!v Z?d6$j)t"t\>=8KtU?L8/7P_3=9I0u <%<Σ|_fOUt$P6F}Ez/t¡wYf2iq5v"W1?_M1c1d xq$M 3>@2.)S^' KOi%`@Om!uLk:wcmH$C'ddĉ,J9\ z><:]'H\bS5xRC4%|>I'(UTó x[C0'{*s!d]MrUҋVe[78n SbbOcbf0Ш%vh|%xmj[4伇ɾ N0PTbaBZYe{R5yxpQ:4{Ln{g%@m_hc¶3d al_HƘupb]4._y\Fn}8ҩ[SB^Gn?F֩WV&1! 3 IpҾ7%YTbE w-ir'I;%P!q5wf3uE0#1q:_/ L!А`4 s.W?]M_P͛YsgדMlIPAi+m4%$|4Ƶ4 *m}P8-I}b²!+r˰UAc+mQ՚sgV؛⛇lP^nߋ"'EIi+XaWvcLE<,E_ņ^A])$vR!Z҂.F`f@>+.l[frN9(]Ж-1Ϛ%4n`)1{>^SlցOAӐ3?^|Fyσ7$Y^ً6_ʞM"W&$50A!HX`W;|o&?bSlG,,iȴɝ/HemNw=pAogX3. W~&DMD>5/$"xs[6Deږz0R/QOR4遹yIBʓp{ĖJr/$X u) 69z2[XQ N,8rcAz@q19r``4_yiOkfUwJd,^fȝL$|'(D>CXή}^w\SJm:%BGӟɣB\:xz Qƭ1'dxwU݈lStiBIM=<-SUT]EWPl,]FօBSErߛ&KWç%MhU4w >C IDU?*`D3۵.5r!\i/չcTؒHBNlR a415Zqv hh] 9#YԿHOk{El@u_Fcij-hlٴf("|s,_.b٤Ȏ_EGW:*)׺Y(B N ;u%!T7T8٪z͓JVߋ`=9r5⯕޼)Y؍E֘luSd| OaB1,׸Yj7\8~el n7^G׏,Z]w>G!.xKCXNf#1 ֆH3 "'т: 2|=4Z=_'|[)o{z÷{*ϝ Fsq|m(l> 02*QCJB#j&OEz~i~$uxȟW ^9H\ _U">BoIŀSnT"_EyH_i?'!FD2t^ k~i&Iw$JYk?l a(I %װ{vIwHTmu6BK򎕋'vۣ^kϳt15&kiu>(b{훜-tBq;?{'{O1:h7Wu MQ4mazzҠp NV+oC@%!X7.k 'F^be2 G4U4IB"xCo\6tzl;O{6]~9̍$o~4MͶAbE u99( @%'֪<1S #̂Q:)`|# 8i<[-[ËĸQ;\}?_lƯȋ'}#_ͼ:j*vk*uy$7;Vz}`ҬcN&{ƍS^&JU֨N0zi \f S0jXԅ[%E,Ь g:&-aB* `JZK/g'CmO}v !/x^TgM9|3դ?Ns&ɫr:0[:IЂ> >*$hP]#coΦ \p:'D}eʐgP=ʷӑԨ%(O&F'! Q"dFjg|Y+mv1)5nb_ ;W"e:Ӫg:i/G_=N"s?y`cm` <ƟkF^ZɃ))39QReMIҜ!żzT9,+z"TȒgr>zSX0e9t5w5i.=]v9sڥovS}o%-IzKe%`¨L-0EywٜPxX3I*YH/d6cx>lIH^ZUah̴8LIUfRꉜUpB2!7KJfmBjr/tɞ==E$+)(L^RFv2F'$')tv PNQ[::,O?}Aw]/\%r9pZ(L%@e&z9S8Yrea>Ŋ-IZ-<$F3ɠr~y%Sf:rFd{K<=H_kR-S}fzf7L; ߕXl WaxhF$!|܍>A//1B71%_#ǿtџPnRvj:^ -X, ٽϷsʯ֩loFi1ýFAboqrk/Ar'b"`dKp¤ƍU ]^%|ac'n\֒$kلzҌP>p0J?G|n2=xܹ.ΦkOu6] ,bb ~MFULwZW;2.8]C8^y%Vcu2]|m_dٙ-0フKhITޤQDb1?ebm$ᕼYzS( =Vߚ{~+<+{t]7@=Wat}UVڕ=ivڄFKCjcgl)^\/_i)`EQǓ5urxU~ġ5T௸͇Q6ˊB+{}>KGF{Oῗ| K`/αgiy$2!N[dB ]cMQ~,3v⋴{DGtx5b i\qn{O bM[L[` 1fYu o}ܶ'h1%i+!|CMJ YIRcFjN8$^kzP]z}ekt-#UAm zgsGAXx:*~MUAV$a>91Kai}!%=G}z޿eI|%Fk~wY"J.!ve]$b~0rзڭIϋ CvWj R~;91\zxt ?{2y3I#քyRkBڼ5!m^ddd賿(L}ĎncNITɺl.^ҶWO>ӊrC9YwylȏOkH\3W 3IeNS*ci-Ðb=q>Ă t$WsCqf?<@K1L{s9!4^t8KOm)CAJUI:Q*"A*I A;PFt7ếmTFtvD hiw88y7WYM-g2mIɋr{%lޡH]9 ݔd'g,ݍP( Zx>8O!qt=9@2ך騳C :n:ƏzCT2Bu[@D܉3Hg %9fLhԥt>{+[\z+pzBkk.]C%S*%!yS3h+- x#]-Y  Þ[lfLl1 :@'"/}2b;P)ݛʚr Ę8Ѥ2<J DFGSsX/!fz~9[Ƕ8kQ!?꛲0H?e2 mSPSgw֩ vzDd?xP5ٿL9ǿ. -t0Ipcb IoؗrNځ:%DMwvzi~Ev/Em_4YebRPx'@}ycY',\a\.7=BV)>i_Nj^nYgP8+URڠ[ǗBί]F5Z{p1sh]'س*/˕ dDCPC8彦Z BO"[W{Q:e}[k:oˆf$hcFbX{8'X c5J`\B_Wx:n'r Z+{6,g^*ͷ2K3`g)A|${е:^=4\Bud(eG|Ak5p_ 4˙mlPpƮ]7yi@ J8-N{ O؄ /aDŽ$F[p|ɶ>҅Hz7+\9E4 Iz@@{/5e~ x #ϩczFmd<= shmF~xzN9P+:Ц-L3B"Pa:Y+Y+01VA~; qJ(1zt 8N>q}ns zQ8deñriD#~ibG6HT@L=ulތmUZt6<(Jl8>R6 qbᢟr\k3>|[תfAzNU7~kWwR9>l#ɇ3}7&uLQWQ_n#\ԝsf&R ''}dFv=ɏ6 sRNt$,5(EWzr S+6M4^^oLgo+U;dAY/8A`Y ^N\B*y!B9З{^ß?!ݑaP.,qI"m*>[?/xz 5c9PO b_ǥ5H)e'k%^lwr r`Q$HW(֫;MO`/]qn(4tn)dt Jļ"̜b zQi!\pHNsP*7Z~ w:? \O94.Ccp1!=fstg/Iƅ[$pw.W҅yF&@>:9lnA`d]=}wpG胤`%b)@~+(YoqKk.qi{P4>tըWaQT=wXFFiX4ߓ]~7G|Xp Ӡħv*4>ID[Hd0w?TuSG^v[vpT$5ԥ!ò5nq&,>bި(|x_K+9Y27ؗ W++%N;! hmy57llձoFGD"6s?@@!S"< W+\#Okx4)dwkl`^YcaD)2L6ItG?aTc_ K/l{`<n:]O1tm+ɨCц0ŘA0Uv^v(—ٝ;;7KSGǃ)>2ij5>sv;K5Цǡ3 s)R߆I쏴m+lw5e%zx:3myuo<{)I[aYeEXh %THǷDrouf/^&ʪq7x8DHʞiM,nVp ö#m-aΨp(J&Z,Q_+ -]W2S"`[oKbc bw_ 4ɇpjd71Z%P!8Ÿg(sx?Jjk_ 0!t5rm7AS|n1=nfƟbNQcIR!f 54T0i6 c|?D-OR&0bnwRT>:5m>:3tFmYFsѥ2_AϫmKƼ/S6B Pcp+.rfRf' .>qa=*1DVj\װ'#D| {<ʘ`~ֵv'1;a{!42Ts%5fǩ"zw$y n@(싢¿PqiC" q-s-u&]m!INEHn>2 I?MaE+x[: v1-M~>vW-'|p廨^‘ݏ`Z}mE}xz ΁7Iy洷 h2|YlGt#mXc˙O_``W l]ΖO ~,Lt6x)GzPaDJ rPK '%-~xOYs hFiji̕2MgjRhgprΤ?o0XZ@tQɱ9Q/eIai4,֛%"~NiT|=#;˘1y:άlb5|((A"S}^ Ǝ&F>a-\Y!ԽBk72ML`pc*%PqT pnSπ]rg@ RȐ,Ba?a'loo7' yT3ܯ׃aڰurbhV^~m~15I#F`›c8)hlo=S..5Dzc=eN:X8}/0Sp/f +)2P T̞ o֓.7Cڞ)6V6䵭jߡy:T1ͪo~k gAvW8{m{xۺbV?gejiG=k^PoGn2u{AV7$ge/L^ ښ_b,Qu޷Q X-ÕB"(7v kfh7[03GۡtZ2+!:_E8E BҺ "љhٱa !O*^6OրPJ:k7:u~pٳ/WcgqOZ3>oh #.9Yt{ 3P_?C}eQ^/Ev* K_MWWF2«?ńzf^V:|zsq%LJ~U㋼a=ڱ/w-o^.v:ެu˘o@8Vj4uϫt'%`r"S` a [nTH08F2TV* gȁSIVTnͷ Ʊuϗ_׿xA xqXaohK ֣-9ERCX"aqm9@9;憁*>2D톶Vwnnd毰@ 0Alv!/@Ukqh@$u#%t %)+o$W̤)Bc:y7hoTnFx>7: Oe^`D[M,v15ؤ. Tya`HT;\`8rrň?ԁ#o\hb%J'09kqwsAģs3 X';$EVTHBQjb|=LJUA޸Arb.n/<2;p AD޺ 7^P1Vs֘)t (jR3yx GF+6#.oorcqv5 N(P bq2ez%ڋN=ik\`y32Xd*|J!86$]?Z_40>5[]IMޘhZ=¬d0LFflk#zǝ2:?WŌ萀x2V7;z֎Ԭ8gm'4k6KQ!BiXbn! ;!]b (^p5xk.+S/p- ˸X_Pt}$G-7b~oDT^A0I?9`nղt' )^.WE 2Jr8+1 B)/z =ʇ'xaUF$(eTנa,-iޔh\AK Z4 Lr|W۷fHa]cH_c8pvE#D% ۻLvX-lgNcme(Ч4']Yc%ۍX|_!qd֬e4)j`! OIblj,;&} %Xis @~Lz&K60P:o^%n~Bb\e$D@*b@yIs=9v-_UWCD0YTQ =Ǝ$zѶrˑWԗ` MѾBL|X$}y5 8]߄4SQ{1;\(Xx6QR5 ϴT[ $_* r 13ghq|oT=l!rP#R\f驼K#zK1_0V̮Wխa< ׏M~PCjkJ$)Jܴ.Id _gA;6 }-+Ci?r Aw‡$轂T~$䯌E#Z5vLPv3=&hDŽ=EN j*6ΰ;5}IV|e$i=i(?1/6kpgeɎE];kdJT3A!!0(i 󵥓ݍ&͗>aL'>va q866͐e糁0ej*?`A~ܔ9 _C&lMh}9LsmWdD:o1#eǢq2s`[M'i9$9#Ns9y2-RꞦH3Ͻ NwfVX)GJX(O& 8[:Zh n0$*_t61h&DQ"ΈK@tT"^x+PN@y'^+%Wp5tTEf` 2b2r(I&Dٕ^6H/)m]fr,ION+U ]9yTM9ysHy霐 QpX""|ܑ nTɮ_ B$氳#eHbSg)x(~ۦmiv~@6Q$Ĩeѱ(8_FX',< &!<@sP@ßU&wL ~knmTM p~-ʩ? ӽ0z8z'l)Dd_(V"gIooL*eƒ`ш[b%K1PRՎAgq .?z) M8ޮgNW&û=LO⧢؟̱ţʒ>/)-.DXb$Eǐ,j)F%Bhf_l %)K@/)Դ Y$iZfǔNj{iK)(*P2-Pԕ)k}eJFtYϮD9~J߄M )yd2zn=7!c'ftECA鎘.5E L9s"Z\85Ks 0kEͱ%"ryň9TRc;:q*k XEp 3\Ox6ƲWRH-J`JYMj7H8Q&Wў Zՙ fӭ %iet"q60 w-H M3}X ㆙)qWHu KL/3y+y9.%O3͜aV뉻Jd[ 6eݞ@򷎵pU3bEi M2:t*BtVLWz..' xW8*rjl ls( 1"l,@$HO⋧I`\D2>pjο KN;\"- Y{n%xkVpUcN 7>WEk'"dj^Z&{P U7SٺZg"KzKQe |CeT㥸{cM@6)>2K78̒/eKkBk0fLQQN7 zܧA [ze# 9Ģ5ޅDX6O*$=FeY[E0AuPSAIj/dn@Jk ќӓH})hxzSzCH8 ȣޭiUune{Ye#gԳ٣ f/s0k1ygY=n B,H!A]IqRM3Z$HLaBz ~!'⋫%bD΂jg뇵nr[ b^#,%XzڊxS]}w"h =x2Ar/<ng \&>R<7 ]@,~rU>6tyֳHǕ{PAS~ Ry \%8(eC3\RaU^45?j"0O2PoN)]7`K]%:A"_Od@+2=>(M@~z A9 !He#u YIjuՂ&΂?XFOO KNsYK֩^mIs4Ӹؙ,~npJơb:O$;t3=PslUlԨ wbH͉aWQ;16ҠbC+iq#*MwovGiٯu=6NN(fT`{Jx>|.byu7y^*:BKf]|`9a@%+.N@E'mKv&T:EX0*3qNl/(Ve(j+?"dOdc4U;8X/G=r6gb[ln.)܉`ّXBԦ"~ys8t%v f `+^Y|@z{є֨Eԃc)$b5s Ś` Y⎌@r?o5P":0p,S3Ndh>aGw $?mqb2#뉋X꬝_.qՋp@XwP,|YP,\`[zd!64! \JXiƯB P2kxT>`Ep"rX0ۉ*19i0EO0/#=̾㰄k]d䎔>3f[yAuC^a %5:U3V])J*4.Dkp 8U2ަT(3o|ՒdlS& +~c)$@Tp],b'ruߟҌY 5%AwP3#HXՉ:b^p$[or/E4y[3%Ɓ+z&B|',-0 K[s1H΋Q-ä.`/5{l#K\:C<_'8m+rvKMVK5Q1É!n -Қ+ipv,HQblX7ŚU2&fgA4P͍/ (}珹]\b2XpLr%>Ô Qgz]Vw++7W0h@9>a'loA ǽ˓N!Pn4,t iDDBhEf%'2ɟ ,zcFs/wԣAGq^nxS;teDSSKzIżt=SԴ&rHiim2n*m~j7*:" .uT E!<~R+% ӵϥqƶ ߝFoBmޛ (`dx;<b2q7N00tEgW.I+hҎ.脚}a[<-O6 7˫ԟ77S%Eo׭l't,Od!G6@ne&<+SZ㐄J6^T[nߤN!<QӇGШBpk1y u%gn,弜.$C<~;]6f6,Bf5|bݻ-J+v/ g' [xT<)muzo9f[`(%e&N'M: :h[[QLZD^&(Kk *&:Cl%F%$#Mm#8"p' kM|8qa 8GG>IK6! HJR8] T̯Й iw0 e fG}o= `vw2 RL.$.D`+$Uʷ̀!:3Z{;Bŏ4*" $'^[xj!v;Ȋ"p;BjmIH[4jTv&=zQG={t_.J@Q>r _IQE=^?xi$EYRc? j4~hw ztn%q% nQj`J^+fGx;fS0JfYFKqBF(]b݋RɠZprc3p'_]nV][`jE@ܷ_e[jTtoF'3jp0vFs+hPy;~Ik]k⁼m=JL&~r@'m;x{ [_j0L>l.qK)ج'6- |T-Fv4mkhHxk({kÝ&=Ԧ~~F8 l[u6рP&@# \VѸ#smz9_AɛɿLȌCGtfIC&?/ec5C'{r&'&Qprš|Y#Q ~dVܯ A.6ꆞύڐvא5/cj>(%9s.&cmTOA>12sQv3@O1r6r&a_۠ iFFdL e9?!>p'@X=rȫ`nlՋ0Q6 R'eWg 2;BX,m<6g9<_-> SL"_$=( â?jED;Dя9Y,YGX!b[l J~r+RaQYoix2W4?5̯e osUHJefzؕ 2l}TP!"5aQMK_\*e@_5 (&>mAíjy`8W{^1/D+fv>3RCum:L| _?)_o?!Ui=i9U<_ &@ᅼ6+`\OQ񠍪[Zqا_vUɻc[qH)MUT!8VR~(!<|JEjYz͜JĔ1Yk֌i$%GUd gsd(suNC ^n dV&k>cQ`@ <ȷcSpB@/s4}>/KTiz &tqSe,~7jYqΧnu!2A)7. >ׁp]@TxjhRRn)뒕6ngZ,:5DO^~@6o5x/4kBďȭqm`5ȰJn+CH%٩Nѿ>2dj3?OԤ.Ihuḛ>9 rC k@tYqvpӍ/ޔj#;' =l#ȝnrfI+>ب/jR87d iA;k/¦=(lykLnЗD=D(R7#]u $R+GwFx?3qb7,'j  (p"oXV |}#ǀs*C!!] v=cy? .5$TGcvG@퇿D{ى aCB5آ'=Fv34ltuk  2jfXblLT:K`Oz w([O-po-BCK aKBT3C|\Djd5Iױѡޠ 4*ȕwq:܊oWv o<Ew9QV>3gtе蕕Q2.g LщLQ<]ñ_LDZNvyZjʎ *,Xʑ &tSӁDQ1d,>W@;}t"KԊ34DELϐ?C ex )Ȑ2dV^2\8_$|{ e=N?݁5A39Vj ;){2I؉==EV^vOhG DyOz^l0U%wby)xXӎdN^󄳸?Y۬RR@A{X[:p_WykK)-d;׏]~=݅>~dwxvvd?l8ݯ/4rKYeqݛNٰ} _e߼HRLOJ8#=d3.}q(}ƥ \&}S>=&_vv!a{ym5yJeҨ78]!/2잲t~9gVS~qכSmyѫjv l$.WFiS`VH:gRб׬?L]T~gV{ -} , CX: _w42(6 |t E!17.3ot8&t-8PW @fwsy0'g97hOSÀ7|ˁ7ݍAw~K5[~#et؝L˓1kQs|kc6:N&2 iί#/|q35 {Uzξ*oo叧;u4hAYfsӧ_~Y>=ӿ궉ZZ[xF©}ᜭ 0ywKEwkuqr5m7w \Dhg,13o%_)s%Ӱa0u) uJЃ&4 L88 Tے(\vJ$CSK~V[@;ðHPo€Aj*+pF .6 yn 4"j@tb4`ܖTv 0 hD rJ׷K0>[ 4޴̬F~Mk 7/!TV:NANlT?%: I>>P3qJ>%3a:vB6j dsX~`hOzTՂA/.ѻo8[,]wq#@\uv9?L1C 8@@{4.}ϝm̻ۻ)Cx9%:0jYt!Ԥ˰aSN@;1OO6#DC4ˠwNO $Fw_QN.рO(l0kh{@I룁0SKNgI;_r$=!\l)VǞ.q0u4Wg%qɂqY}#n=O5MC1 ~fk'6fU*X[-7˵Dn݈tNl5|ػٔuM0Pkf^m G!u`ojgV(| sqg%Ukz}@b5Y :1+g_~h0O/W0@yD@`pqKJj;b'Yl ZI썎[3q3Ϝ, 3> f;o>_J<лNlZןj=)1%iXriƛo-*U;E[3N)\&x5')> t]s2EjL)Wh "`jZvav"xov,jێjn asڦ`%s] ޛ MA=kV ҽRa! A$mŕ>W21"6! \O#bP! # MN֔)ڑ!57.(l%>nfV{ND* i R+zLq:uCu}JgΙf>ʄ^̹j- qm3{0_y96AoP`R+Rj&b*gǐ}[C%5_B򒃖1&G}3[\ G{jL ܯUJ_^d LfrNFvF3Pcv X߃ZI m9ud)b ?uj`0v56}V'>9Qǜ bh`%oq'|I|N T&^Gfrw!ݞ@VG &y?tǭ>D'x9Dj|ɳz '=can'\Ϩ`x85U"L \7j7S5[u( ,/h(ߴiE d?X@:6b8ϙrMv{1! < pv~$ Qc=pI0NYsl&uqϲ%hc|0 {h+1ޢ+j5 Y9-{!Z=I Qr2? v*ki CS } E-O.ɶg\ ʃv}JVf\L=j:2{@jB*0!T`#=RD/Nw-1e~?}_:>x7)$nݑ"a'x#,9jVeS[4L6 \D >׷O*P4լ\o. %R4/#&Fd8:te Gz蓄Y pVSn꽰Mwhmn ';V2Iq,+ˑ}pID"8 \bnO VyY\7|# ; h/@c{1y@rj*EدC9|N| cY@w8MTC ʜ}Ogl03 Dֹ㊨3x- g'nQ]ڇglXePP#H}8G͵2 E(SMUg#}sܹ3'q _ݗqlom|"thtzpc4O I zE3HUqi״NAQ^ʚG=PIr}~~^^ɳg^dgq$'g\@2K?y_czǯjQLr- SLg05'Z omRďurdA2`L!6i̤$jidﳵ {M? h) _!(Q[P2 ^x \߆U:Lu9x(f{qws F75㘔T}zd .^p±ZLEݭ)&}{w9]͘Niƚ,.e$bF''g_D>kl^[Z|HE 9"pI#KLA6 gDW+f)n$@䨦L} v>4&F1 :pjZ񦁋 qnmRpˀysN˩Qd+nzyy^~#Fɀnc;ddm<ܬ%Xf>1Aw4ΖAVdevJr_T_FC" OK? j+(u{^H$wpC.B%b?Wlswe8 {=Ym]<]|Ķ7B*Cp- 3w7q2_0vl {j};Rz!J9E/&,T{b?( ! ]ǿE:buA2l &< @T@P'&ړAX/YV* B\N&*&2UXѴ=C)e2AOcu:QSq'0',_v1Ir4fE o= U KJ]TE/$j\dJ#J̿XeME/HH|&kڛOd{KO6d %':S 'f`~^P(q`f z,Ϳ#`|0;\"&^2C;clPd %7I/.|ote \ޒ 0*8_|) cR^Uޭ#QWwH>CV7z_vah7.7$?;p7Nw+07 AbS62Yݤ:A )vPc;A/#?YkT{ 8̅f5}8o sſ-%>Cs;Kwco8HCob,&MO7JŵhvRѭVr<@o۴ migJ`[q14O8vs1 Ͽ-7` ;u~^t&]xU>s`7x -<&\KDP!|g+m)WcZ5 z)֬՛tۈ#J R9>?(| 0N^.̩o|Vgo)+'kO.L;CbD5c:A&2PEwt*=cX!f@8~}GE<3y9/NuQ}&K*ob;hM /Wp' }ߏg-zArx8t>OgOw0B%W1/zLg.#29 > X"~kZb`n;yRlOysyͯ|}2fqWxqa+ ߁KnK\t۶tzo!fG.{&qcOgzvsuqY9QGf!xA$",n]Io͒h!P?JWsOnͅčI jr60j6>~i 6Ak&@4x\ռG6usL79( 4 Bؿt>( ҥTkpɄ? StY8BsU;|H8%AV-,L/4%ĬicR+r=4_pJrw!^16B(CzyHM I@U xPA:,O=R2'DJr s˓k(aZga±#yQ.hCF#u &`t v* MtƆ6(@WhCh"vг3sy/^c/w~cҶouO5}+:t(]_fm}nک+DLܕ^Dy:(9rN Z˩B_dˆ1׊?  ??xASǠ7i=a#%-t3T-aPNO7a@H:mI@$ Ke*$ 6IW3<_ 8;hT:x4Y-sp@i.0ԑ8Sf:TfcΙix)/܊\`s#ƿ6/ 6L;`u_koj2υWa @gstҌj `K"d(o8 >vR#]JY7Q(fBk@6.<.GIL)sVY@5Xc !W6aπIO!_B?}J!E$S,.2!EatAqd [j `m tU.!PJC7JP,]\흪 WRb]ee#9+XMa|y;0[oOvLy:?/UB%\' rR6kK6\NkgsNf&i`d2jSB3!v MQ36XT %q`g׵60K]|æ_j΋i)}]G5".p1;}Shܷ!ސ6\j#ӥkSߛ ?4閠}vǝIItϋZa9h>}=@x9S@{#ĽIA]X%h׸#ҫ5~u{^VUja|IV./a%Hxм]CBCX.5OWy R{0HOOi>`7# rw'Т>X7-I37foTh{TD]%te" $DW0ߊ(J)_ fH7'՝@ :@AogD67XgCW P=NH<+ "tAi3H[oGyr!)&t;@>q,-Xm}  ENa k,e CIwD@|]{sizPKz8rF͸cyM+%1,hY̍Qiu* dGMj@ P)593%pzaVt6\rGE @XDH*!D0,c7n *"8 #G_鯣!yF?w;?w~1ai$Ɛba2^FKÄGY|?wKPSEƌ#O5 Dǘ }mن N¾ߍ-$?/9ow/S*pN9Z6ӏ#oPcaR ƗcMdO΁?3}iazw=ɃєJ#6{ YXo wLW`6̀Cpc;$Ύ@}"." C/o^ly&yha~wK'(=yXl탲t.RqJn%W˔)[U:sb _IOC8Ȱ㔏%~!ovXwGwpPxD|=~$8?(dH8W0Ӕך B,opNmVIx8_"7e:Bǘ1 X~@f$vԪ܂H#l!i0:tWNۥPS&o 7qjox ^"Mq>T}dF=A|siFN~ҩ߂#&5h& 1֊_@́a1*,x#bQ N廫P'[ac,S* uvIje䯞ٰ`Do#EeDX["Ήh_ ]>X 3BX1 r=l7<'kT<\)W1X SJӛU8)z6~A#_(@ȁΊqxVA[kD(qDFS8*`2${{F֚ LYա]FfT5b(f6R.]Ia7Cc^{kϝ?\ɡ>'!3xja.B=]+9G[DOO|xEӄ(ȳzdqe![>}(ʪbJ`K6%nN9JrExk,C 2X^QS3^s7%CDKpySc ;2,Q띶9k |Wқ[%@06!շfviɪnКf56K~5_!%8q'S3 4 #!kZgTKbN:02I?ǥqjF{: ^g;A7ocbl&,A>P l8Io7)n &5n1OH K!ezWKhls'gc_BJ!~̨e,d^Uj]_Y堝Ol0}w${0HIPf+B ڕ~B+լ6y`!gg<Y oqx8<8z82! -~ßsA#$7-Ap~&kJ/Lf@@Y?m m ˚21ֶGAx}79q~>ϡs1t:G s eI"9b1t:G #Ys?C爡sk.r??-?S& >':ӗy>_2x(}_]×?6[mx5<\aң7>M1cΫ{'逸\w?&f@9l|PN4߬s(9? )zN& e>E* r'c>uNNk0P}WOew 2QpyloN $eu9H{\"s?P03DþC3Ʒl/ۜ7|ϓc3j0,Aʉ62Q[Tus,=a;1 (%9 }qD,PI$&. IVI2@Nl>Fwod-?Rqd Hg=Mb5(~TQ',쟃s7fA ѵaJzc26*۪JdLm+`N;Mp,M7G1I7Z& b@:VEAB$ ^ɧ_,D;ȥP(Az{l{GAU2!Vp [,c+!xb@|R<s 񩎍 d=eĖDVHC--^B69Q'iM:1\w0b3qހ8 wM,^5bRƂ'E' _jhi/ :1Z=c( #5a|0I&,!|?C$:<*# %UYFOLr^Ԉ `zNi*:fts$S]оڸvik whܭ ^{xTn1"Lݧ{̌3{hC8ޭ U !PȧQrvn'x*GOB}<(~!=:ַߍ} u]nxmPNcgmhknuo8uQޣ^51jsMNs79M Su&{{&{? i^?s:?rӌ:G4;霦9N'=oMsL8!=p~F3t ͞sg9㖠6:9dݧ7 :;ot (_`,/hVkmcnؼ< yz\O݈'/5#(--E7[B4T }+SC$YD["3a^9WxC`G:".GPcyg kKTՀ R" ̻f=I{&Р=j#g 8#0:W-C½w_ t~H7z`S{9Qm:; 17 k02 ūҷ[Tw0ļpnx ڽo1a_rUbH_ 1M. "*Acez DDž6TYaŗ1o8Cgft1\%G_TKhbGEZEǞJm)y&}$e|*?/ g"GָYJX~zEcO !A%ɬ. ",)8l9D\M`sOqan܀h3^]2d/ , U G(Wl2ˤ !ǎg4a":K#-Cb7/^p]VxO1R;u7C[)tf1O > Grr_dTg# ,pG쯩UlNJ*C2 8Vܑ.x-{::Ls  juzAGs(R ^U CK{촫\ɜ\ r;R:()lt(m~O@Ӆ]zw_3$ BIM.0[j4*S=+ҝȠ8,֠3Cqt83T(z Cx؍UkUdk$1AhU4T F\ ſ WђД2~"s6x^73g"pW\tfbmJyovݠ`h6x>+a(RIYպV7ia`sfDB5V]NN=$'1t DmH)T#Bl|sn6|(z| Y8xaݞUyf,BE.*'qFʾ+/ev+a<_A-C2^h^C0ADEJ%^KejnjzUJmPf%٬hT[{-Z!\"zRg/a*={վ\ ^wF}0{A?Zh:솳DuHٳ 9ЍgV8qQQ\=\p޺}l㩫 ď2V-Kn{)|ZP:EmlSson&PZ` Thl\R{ !7a:CBYݕj`ՔJvqXwìڏ3K:XfKO )\x9#j7p/k_U,&>%3fk0\R9R;<`c"YR3s"}$ww4=Rۋ)|BHB ~h/t& : ]djK {!X^_"x<:xbg_Xi4 QEۑa]r_淼p $@ǯH{e/l3Cg!PD1M,Ş8V{kP FVPEVܝ5!@ (} :|끈Tf_wwB2$lBʹѪ\\a,{Ն™ ( V&dZ&5L  @L('Lg1YoڤR[5 Q`Lqeָ'nA^I4N]%{1P9_㏡y(@;ޤZɭ)_<{O?N@ϧ7W Y´Z]IDWQX';"e9 [tkSUfCc> jݢ4֤6!]/QYҌB1N3咭nυL=Ðs SM 2 (P) +t7[-aљ`C pɺS-uufTZ[[z]>;,>^{-If}ɐgBN3O#T\5t"gDyи"Q^7Tט$N28ک/O=>]#gZThE6 aDG ؏~XˎN̴Pʣ?(o7<t}4T%;0iHӐR]GRp!Ӑݐ]LWYb"rgS~eQQfQΦ_dYy{e,+-+f?Wt|ina|QO'noe}<|mZoy_l}^ByītMEY0QQ1UqAi#u!0btR/ {v0҇ڟ&.rIŌ]hRQyڻٌ'k6،ZU>/|7))zTBr= N&qTNIyC~2xѫ?ϖ |6+oTEn.B|}TPD-Yc=^OBn4]mO!Fg%˖ExEry4{&fH)@LH@Pk{d$ ԥ$E'A{%TNN]A7rqk2!حWm//͓Q>!qlH'0N&F*1 )E҈A f{$ILle=5iF*&4Iۅt 4 s&,tf<|{xpMT9 h^l}=K׈jIg Iǧ $yO;¶Weϳ3 L$/S{ٕ>ms҇LEqD(M"L?sǹ&H\ImS#Oxx]2eڢ1J q<1,̐ ۘ" N#ddkSí FE!}GH *<`\XIJ?K *m\*G)Ic>hh P-(,sH0 1EGx99}r .3,.Fn &-y(WԳڍh=d5A=8 ;>Jԟ\̇$ɳu?B?զjm댿}N-CrZ~ӛ\Zyy`<ƈwS5vrO&l+ t6e nZZڳUիf `{&)οmfb p[\\)zv ol}3ݑFFDGeÁMffmf&ݜHX C{flf*{d:@<:bXY<] P 4Ņ}0BJJSHy/3 &zԆwc+#.9[^d/y}#"d5Tdϳ's xsD6$plmD[67V!um64qa4®0o6Po՟sWC [VeK:ًAUkqZ(%PPTiԢ4^ 6j*[ͦ=ՈPAF/H6RPh*SSƘ i&fɂ3X( hl&! _Aю=X5b{Y!eŨ3GS=&j?pˢǹ,-sY41jI̯$ǍeI=B ۞e>@'!F=FHQ(9HŚ0]@Mm(IuZGz^( blhA-غHq6|v*15(sW3L\wm}-wf~uʅ_NM1f?8L|Bt0Ѥ&؆ևut,g4'?ʧ\"ڳv>aI3ξ3}۹ˍY< Qܘ~Ɔ=,P^)ٝdmKd>y=6"'}6%?%"UqPU 3{p?{ Ckt&jH+.b?Qձo>);j ECCH?H 4݅?;Sy„Ì>Uy0bYRpSMot16;+rqA,FEQ(`th*4^j| 38{ {1A G[^3˞|Qcz_yVn5!hV8aS:,aZ/ɊQQ&CA%Q1p6y nrdy%t lU*֟5[ޠŸ'~<]giu4ps}]~=݅>~޳g$~cpn^wt|Yn G_HZ3N]F4Aj D'&\Fw8aEs=7a<"SS9Ws-SmON6']vVO7tYfFI7v,y_><[jz۫4et¾-tVlY.K6lz\ 7˫7}JW#n2t5?LM-_N7,Z2-a/| јj|~KZ߬@\c+M7Ѕ[B2o76nt8&t;pП΁~]5N_qbG97o>/KJf7.6t7q/lӏГaw2a/OƬFi}ol%^tO02p~݀V*LgG>kb(q/ Ϫ3'ez:XOX[=ȞqA> 75?r0p+o Ӊ[p݆є$[C٢Xl;v}[WLW<]`*ba 9p`s#(E@ҋ1' .6o5 6X0K~g >9_A0g ݦ+O8*h ,S|B.]P,9HE$E^94ûMEMٗϑ٧)' >|1븦YeqݛN b:pʁj5[_q.>{o] ^sě\fW9},p! zu3[n\&\\N#N˙&X)I*]7^g8Nj賧 B̧`~$ o5pN( 8sh`aӕ;(7wH)H;ѠrCvC\ZQ=aep9?yb 55!Z<.Pۭ9`0֕lI KT'X/Wo^P2x& ڨ5OQƥ@F/~.gKVY#sHʃ'n%P/A֟ߐDd-P!yF zYR{Ҩ6c=WK'ꂣ:Jmߠ'/o-Ψz1` 9.$wtI}t m`ȏdAUH Zpxzdjz/>qqqFv% Ρy/I;nc]N;݀Tː'#N]%g9RÿK3 :'?>pwH+Knt$z;lwfoV˔&=yB& ߁ʯ'4|8s/Cl,osMx}'ԷBM##މ*?<>9eaaRo5κ7ӛY}8M\cw= w56Ʃw%KKbec ?njlwew#Ek|i5Nd7kZw+ #"'XQ~@hO?snjFݸdDך 3Լ]aG:p> A%G>G's 3,iUpK U_ Ύđ &x8j) Uhy۩rOJɓ X'fGPJ[A.6IR祊 pO˿E&ii@ /_P-/9J^O ;o>zp29>y69z 4а֛7{^K9Fqv7fg Vl_Mf;inĚx]N>r,|Q#Lo_礛??=dg1}v :ep {$ҩnC! )ڗC8 y\Qra $L$Cd8Bnݩ&ǧ?D! kbRXZVd?d'-iaV\d~}3D>[:B[0}+(+(r5D'Qryejwʊ Mqy$pᙹD|fuo^b09VpYjڸ^rz>Oo;&D:{Q ԛ| p9X7lFN,Ӷ/Z.'5Q{l_ u &9](]b(C,E2tE='HVo36xxVmt[|}n~^<~ȩBFTNʎ!Zi f̟d[p%{<[\ISӹ4.Z^`cqbbɕ@Y[bC//PG qCJ/ `Q/RWpfP4'DRHuAz$S4KYݒJF*,<]2ˈ7_c~X7Ս8{<23Höp(RB&6Tl$&)". 3;9m:v'2h]+D3νhuK]Z,8Qrw8wx"F*Ƽm5`ȳ |UXbkNSU%wq$:аRaE'ņ.ZE_{Tr6'SM&$~m$xpVv :E<N{N)zett_ m/e2|!>9=k AVWXFeu (;<W`͸wd;g G̱cv}v89'bot`e!+".jR_k:_ڋb"שR'R!3rh%^D"K%c4*  Vװ̑{ s(<ɹ8l ]E;2B ey蝭hV%BODmqB'rA$QӓAk7TEϲH󯂦A/©@%ZAo9C3z*Mh" RB:Z` $p " m- g9[OOAH *OR.MZsG p:C<~L%E$jv0C6qY^XFd H) > ިP@AMBǴuX^%a? ێwŲM(gUjOX:6Njna#(Gtᅿw\im0y&{%G'vZ#j1xLm.;Vh4C7C{3ÏH%խ(Md5օOO>YCo~mfWϰ?> }^xB#RsV鬻ZkVkjY?H6:[wUjV]>3~<(i9nOJȷrv=KIy*]lfY_|e_f8CVqDGY[8b=.]]Å `!8yḺ>ll~9Prd۽'r6ȥ= *@ḵC@/mv6gܗ3T jCM{( tN6 K4izZ},)! A4{?mتCG֌9F]Ad 2g`$/F%4s Nw6q_?2K@޲\|yI{84{.=390{ LL`1ft4:]{t4:Na N7::{NXKƸث6CҢ!iCҢ!i=pHZV`HZ!ikHڹfp,یJF 'v`$$h?l$ڽ% _f3Zbg;=o;!w" Z0螾:Xj <QQȄ" 5_7wVSW v~p~7g7H;CwDʬاQ6f{`=Z$l|;/Y[cujZ68 "lMo@Rəb%S Azil ?&y{ U[78Lk8t%4ostu{=N``0IF|I9X#!N=Y`RĻGz>4d(||>2wWP @]c<|s<.͍D7{a-c,K6nvd"~2 &x# ^l;Y y(y>{=XOpm.PW^[{#RAւˣ''ڡe ONwz阿DyMH]Kcs=tN/wF<rNP6S1]UAm ,\8ƞjf*)6C}#1?of\" .kha.R:a9( ġ\ /s ܭ)1be:{ΑPD<5DHgiM@JoIˊ @q#}8r,d`I;> o]zLfk;6|5oԿ#\}[Lofks|L\"F<2MA3~t1 X>e{JSSǺ@t ؉fO/c|Qi[ԤS6 )6;&xP oЋ%7gq;}F*`уӈ*iqL`Gvt_ثPl$)#YF_y7nMt,(Oe=˒בiavIDCf6v FkA9mkIM U*B gj|yGإR+I4\fj7!D Kވ~}uàFؓ|ТiքJ =5u@_Vl$If p)(K7YIEV#Tgb1ռ(KAhr?w딏6 _^x ̔F=Ё1Lj&'hK0ǩ +qz8 JЩŴ[F[6@tDv"2T+4BɸT}~Dy_ax\~*_&ؗ;i L4Փ5\~Ii ųQE$8:I'X/ P\LT !cgH*BϹ0VceHi>Fu Y+;h*);[kSv)'7` `_8AY{G(:]P.  EN; C6ڐqatvLA%?.uN@ Mz86ມ=O" V}F.U=zt* F/BfTw_gUqWէ6p|vٻ[ѫdX y*Kjn{5>V?yWy y{ͣٵ@DD( ڮ4-k׍HJAyg.-|aN?Gy_D!2%k2ߏts_î&:~&hs&bYRT,?AJ-BbM ',eOlka!2&D'690ud6WSHjK%_hcNp#MuvZUȤ iU獤<ì ̽P{ohU=c$<[)AigN9gkpqB.G$MLEi~lf;w PXwƒo)&U=G$~\Vz[빝R*-/2 H.WO(\}P7'0Vcwpuu‰LXGeb Cf2x=6VXIQC ۥ0+]jMEQJ3ݛdYeN&Y%'Z}JF_Bd߆H0 :!bp(59g33h;gRbu;w</'MmjT-8g&s!GN5s2P||6Z1{k7ǻIS|<؃Ñvn[>,"7 |c$` <ÿ-T~WO&Lyx\tՒݱ>ebkIų\"y/v ,wJMR,!F2+OoȥSC88ly].gA5'1zz۫TL>b ǮӄC ,-4uG3+)xl,x!>q1l䥷EҋvvK&/`Hhyizj$P 0P^V },p{cXn[zV‰ ԯ-?6^6< ʾE/aV'BTLdQyu6ٟQ<էOxPzYa)U8$#=#z3ez~,W"9elyhsv45衈wI6ʼnYYx|;m$X;=fط˺ӽ DGo":X0ӭJe+ m1mR]kȰM7pkȌlOZeMtTF!EK;K`b8*Z ۓwr&v|UZ^Z5]67 ]%}0P` I0w+HiڀteV_k сE2=Q1[2}Rk2VU|%YsN6RD?ڬlxK4Q^CPR EJL#Ӣw סkPCheq4҄WfzVM9ꕢ2~pi[ ϥ7@z!t2]S()z4wFMS(}+@2U?RȊb BA6!$ /fxҢ jiD2j٪7:Katc&npHei5@Mw&;ԜwDYk%FP=򾍤u,d8b_{hM=BUA]lxH/5;F_Wx~L8LR1K[sKAӨ hX^%\*>M".`rpB3vNo,gW`/, Ӝ9a f-ǰ r8).r]\=  !z|9l\yS~ )1}gw0(wXpNatN0]'DŽTgcL!AJB i9h[!)dt0MI7 X%p[rQftC m:2@b{ ei, ó-/!eœ#W*/V"'";%]h3Ђ 9 }.7GnHKPҲdrZ:V|XcJ F|&"A^3#ta 6xggqx;aK1G)}SLsȇ[H2 3CEld9^XaIMM$f,BЎ11J Ay̔" ;R.)~;DrMс0RG rGXd'ckpci}eͬ%#W7?v??fH/{ɩq.2қ@ F({υ FhLַb]3z?7U$zsihV1-%=Goi舺)gP̍3gi8ƪ2P' U,o1;-:8߹3 n>7@b*Bcw0yY` fT 2nsB~ApSa!‚< u0nDW ҜUXGKV֛p3~ +y{?Ɨd`y;NX{l!:.8NMGQVLPn_ܐH+\f !"!YB9"2+9^bi?J [c=3ӸƒW;P2N),c!@#G7v_iác#BT@)TnjL?4L hjjd%_)C_=@ìSVvTګ NR/JJδ\kׂ(2k yxo: rK\&3nDUSC5xvXٯ>Z /ڎx8^}@B; 8Ah.(8u۱e" L فBȐe2ٕ+jy1`C+r y"]B* K:]ʭ赁QGqp=PvbE#*t.yC[ 6weK8G:[)׍ibjW2bLdC3DAEV MHRFjhк?AVѿ(&˅q%ҁ7-80]tΉ܍FSvK4R+3ɮ)nV(’OY,4KIm:G=&+L *h9FT6[xV5 t2RKW3 x0o$/""<#艾ׄ @Va"-ZB¾-{FoF~(ZUɔ"f`rE1 #⟐.a;?J| ~]_bE_ >S?.W Z&snɸ7~t@ݭb0npn#wX~] 韬 6SEq]?'UR"Q ?.+[4M̶Pb>*uMYcdVASt`z6ǰ^P‰]7+9axS'}"HJ/][HFnh c#fkVTQD<D|g7_}y[c~;6E@Z-1ou&@<Ĥ`f^ Tl9M$*%$]W0],Qrf"Ըj `NĈ61mڨZpcyU~@iF [l8>;Y{|'{ %5ثUyPϻ.V+s3oiGoxj?@;[&p St~g'Η$e̿{g3!"NTzbu %lL}l#Ny@Zbʡ{ .Pgd`%9 2 qC@KߵrmKT?tlseՅ"=z:$Xpm@.`ŀ6$D1rnT> &۫%z\vnϟr]Jkǫ:_ɜ󏉃)o#oY_Ts'xsn2V懴50emP> ę'5An/Ǫ/Ҝ[1 D A]ؼnj1cY܁ˉMVYBY_''7PMcD{qȌ+0H掋{kFS#ursnE9cp@BB_; سċ"TSD'uPH+pR$ -encZ,\HraFIBa׍J͠{ek"I'cE.\  #/6jH4ᭅ: >6ٝnpqW4^[@Vqv{qj8RzSxMy8}kHRo\ iIFnl8T^g]yh? m8p9'q noW): 08R0P1eMiu6Ooiz um5ŨęaW|v3ې5lf4޸]M X=)*.=V(DC*#Gnͩ!f>3eo) Ą6 .Bf wvt\)<)!|]YПT|T%v,nm{y'-~#p:Y6L{/W57+ Zؗ4eCΎ^;)T[(Rɨ&;y{Su.mW˼e|[ؠmwZHA#ujnppObppV]k*IQ@:.=5r{S7E HЯ:bw:}ZP$]EFX"#6t~ߎnQO,by/McF+$.3$~DؙۣH% g(ySB{:0Dop"Q_V0<&fZJЩŴ[]M߷b;pf21D.QETVeоpM罶?x=%H|p(yz_c ")9iP]`5f_&ݑsёlx4D?w'b#33qDQY5 J,Ū#0$\{{5xk]4 aa) '7 gz9T n̹ r|<kå+3#Ȇoy)A4 74|=c$4 Q/ȺYI;~V +/rD҄cߏmx{,QΏ#fYRʲ @Z]UyT( _0U0< b31T| a~ώ-Od@0 S#h[*!*LTu"AY(%f^w;uSH2@DCʤ@~QSAaa\4aEZU/ȗ5bWY1# Eǯ ǂXM]CڀFK|!ODk7ǻIS|fA< )9;?=g\s4f $<+/?@f;MT('LpnIZXkzU(b:UkP>/`tp-*a& Lf!.Lw@^οl"3LP4,aNUC3_: pii]gϠj%10ԣW?SENI"mP~*c+8E9)*0̱'[#(M'. \2@+ḍv \1P:p#ψÁX? Z1tQ> վ*=>V{Ygޣ8X^(s<)D^6lddBrB sN{%LDȒI> 0٪ӖSaF JF&N#5>Ped>3U,i X!WiQEQFѴ(b{aw~SRS왕ÞlxJiY[NQyuId%$D$Τ*eb/n븝?(#3 z=[fyؐ*+Xߒ D醼(nvy% \^Ǭ;:n>ˢ7IUMjmHG6 <|vO0yAD+S fLr&^qa/Wˋt1[JHAf 6?h0gqX3IG Jl3:h6u_jp|-9{}tk%8 bz{3ƾQQO\ ai0{!_`w<ǵC>[ Q*"rCJؕWH_r0GE5CטN]%5 9 Vi ⥩:D+Ee6RֶTS*ѕRE }iMI0-H1Ty2͏F1rPV:x|Nd6P%9<+X~;QkfԆC1-o'6kie Ռ- n Ʋ8x]9Ե27]uӥ&2  Tqw^IFҜKF?ԂG}x|G*(-#8yr uCfXDx̍Kn.9/>Z?OXZUX^%$*>.up3CB+[TmʂeѯL ^ cϠ3JPo_^~׬(/8EFȋ_sVtRaQUdDRB鶢u #(p O,EJ*R UZbB>6ðM#~)(d8S >rxo86$oTr?[2ux\Z GBkϊ=+ܽY ĈOۊ$[d4Hѫ ;:o덆 Zx[rXp1+ KDxˁ֊Ȋb _-0ܞAE@<y}էótt{'WM1&niZ2m&H7sQ)#3418DC3`0+BF+aM-ݵICp=V=[NRD#k!sYgs钋\i ׍n9Dd4!:3Mq/+Q\*= M I{߻ObcFlű^hhc1g L9-3S"SBG-&@(6}e- 3XD9.ضI.>98+gwy(%#`hq4R3k }oCϊedS@*GV), D ~mZ"5<| k!+ΏEXJ˾Z4!)O`_[h8_|eVQESB@R((;e-A=Cb\5_s"|ME@9ibP_.RP:=p]Tg^v2KtCrGx6Αp[ckŔP5x~:HMHAF"-ɰ, ܉1{0?Ì /'7lt37w3hYIi,S}JA3~21!_ېFv?w3z7\Ew4j;3TDmEY Ur- X|\f .ԉ`dT.:Y;x8+pK%{(.&Ɣ>ŃS~$ Q]Os>(fv`3&1tWٓA]b_m`L^*Pi@"En @ u:njU ytQOR'LUsv -.;Gqu`49gV qÓ !>'4_n#^~6馦bW|!ŀN;,o1?-:f߹3 wz>7@bk*$cw0y٦qgT qTnsB!!Aѩ"YOs{}Ѿ$7-XyKᶿ.΋3y ,˼=$|S ZfYj6 `y3KB859S ^D[1B}B"2XȀrI)88(rd " e(xZ$:+1dn ,J+SУDkh,%cě,9xQ?:TaDR/ i8ulD(^#fq@i3ZX W&q0ߔiő*)ij{5Rԋ3 W``=0oL7eۄA-b!Շ:n%rb;i5O$#-K-#F!<+VW9wмΖ1E@x:ew1gN׬뛡0yC ہBPp2ܕ+dyqC+v y‘]j K[ 赁QH=PvbE#*.yC Q jB%G)L;=l G_gk1uO,FAYh٫]W"ᷭ+$c"ci!I“d \g(*ETa\.uU>`K3,NG> |+3s"wCbjrNj+T r;*HSL D=D#xh2*RO $,j ?{!3BPPm7޺m}Q_!#y %(%о FO&uº4W=Euh 6uDn33Z LGB [dpHv"Y%X?h@!9'd+LNO?0ؔqQW?EᶸOOmJ+ lz=]sG>uRiFɚ/`gXE '!E &܏Z j6#9+CC>kGu{02\3a& 7غ$>m5@hgoS2 / tK0qaל5T޸ N ㄦɄS-LЁ# '>`8^ߓ_!FFzod@(7OxIxx9!ɘ%> R¯S,==͘ҼQm QѦ2kx!4COҝxzAj.|OAkO=柣)~_g pzl7O|&#Ae j>S$NDjNoǧ&6qgUTǒʹB[`T)ȓE@(MZ~g/4,"chjRPPd j ڋM Fʊ! fHgHcI8*^Fqq /MC/dFC7xΤ,$gGgVWvطcpE, xw~ZhVYw[o;Ƭh.>E5sz[LJ|lY+DQ&w@w-286z7h[}|Q8vnX mH$ HWGOeL+4Jmq+bIsޮgs榨6/u3C?'nbЍLPѤ?zLUMGi֬4>my3׃όћ<@m|a`@g;H[- |<1o' -\CE{){_z5 i"r^ _nnY$X`7.BIN=2ȟSR " U.Z b /Aj>LG=@8 Tbbn@`Ŭ|;IMT'GT*[@{K:FG!qwͦ(1a_Őуrw{N >RZJ^-Juf0`ySҟ0ysҚ18''O[us3ι1eMFeY!KkrwVvٞߝfjΊ/F8blH_To BK)ufyv:ƔOIsz5\ .cu^}“EUrjx܄GF8񸚓ϔ4TC hpjDcbPNxwUMF9&c%seǶweQ3,Y%"L@ `KF%$V8@2( 9Z$ ŒɔŠѕCn1oTt(co_aM,qeABl !ɥsEhO51NŮ2}g;+i?.]xvܵU^pC!{>C|"PGx mr7цYNA `IcNjmpl)! ܽ-fϸE4.֔PeሏNIv֯R#B`pwʎlF0ڃk a3Ůf!K7Jiq ,rd |夗St!ZfCgɗ6FUFvNθ 1#O@%8/4IL{n+hrgyGGS2p\՞]}.AGU`IiGڪ7<-mrYbJSh'F 6wԬU|ɮ7gܸKk.(w堢"̀y0ڛa" 'TI<d ȅt9x z.Ulo2 %<9_pF9bဳ&+4Nh ږԓH(ds`@]kV;p3 öf)ǞYFONI:'J{y7c]^?1|s("s4D x8ͼޣ7r6PM͔Vlbz<#Ed:|Ё#fB3!#fkRV:Ȃxd%,G&$h{d%+ha; F"du}"]&HZt*R^ P#:B*5EGΫ^;)uT\!,LtJsI5RkWT#ꁍZF6n][YڟT_ѻ{-],0WQ/Viy-OԆ'uT)NX? ȿ;Q< a>>v.UWKˁķ% We2kaL,g\_ [ bשQÙ! (*X@~]1iǼC}"rp*,gCPNvz1ESӶV_~TܻśTFŽ ş6rdoxϽ$Rx"۴%"e[J*YզH gwLEj{Kb( H$tyc@6EoTeSVJHA=v\XGӯfS d~,m U߶8p:K;X,"ݠė̮7nW :bS90N%TuaDCś]_hW--9+n4 gPU6ĎF_zեo*'"I&vv2m}#'<_Yeᨈ~8$;IP$u-jTT1iZ7f \{qF8r]efl֏0 k%Soh炥9D=d@YİJ)Kd`bs]T^jm?W𡥨Ƚ٩AD6$=-ie>*g^O)Oi vĭQ3_WxrF,eJ:E4폿{l@ DŽs`&]V|יv;%)DœY%6|+z'Ԓz|QQo6JC>BۜÑ@|(rDuO{uLt7 +MH %iaLĘ(.xK\nhN'hW`vExB!\ Yo4OKCWjdP$|׭5aQ*\P5 \Ew z_lV*ݘ `dQѓy 9O0R2y +lCjdL9Cwx4o 7Vow.q:U[+H{67G3!2]B_ M ,o❆'V\Җ/YAŦyFU*a\aQ37g6p;PR+Sk1J2؞c<Ƙ/S_ZP_/_V;n`WPT!L+n 1ΕB pY)MzT}?C_.-\5{+*үf:6P TwrU(zDGvt tygBN"!I&FR[טIfC>C4Rq/5iUVd12x;f0b"X<|q įZXO:zXȧ$qfvn=kX0HNRdM< fGTj S'Gp!ʏt6mkG9;4Թ8&P YmBDx\9gF`<&/_+xUl0j,FŜֵۻb:v2egu3^3&wCj]Գ ] Ȣg0p%k&Ed? FR \,AEg\1CQ> byF+F7 ư.O.USݒ&>ҖD?-)ϞtO:U{Rړ>.'UrOY`O:}=i׿'<9}D0i>K-]}JR,!u I3)08TꐿXY AL)."5nmk`t .!8ޖ{Q^'‰OPYh|~z57ttKopg'"ϽۈF*@ݑ"]Z@ZP{[&jp,%KbQi$Se}\VeV͹u."" [;ES8T364`LMD hp"r'#ɩ3qĻLÇc1Cgܸp f5x\)Hk0H| gOnFc*Rt Jf!9:Se9iYS}5S'C&.ʯxп"ur|a}%.!qH:X^O97LM:5}YMгk!Z,wD&l78;w}ym_[Dyjʼn_޸Ff&O9/Pk-hʀ' {^W|[sm‾|&ǹwZ+sv Pv$H4fh6:ASP7_ kg~S:MV5Rd}I !QSFǒFΜz)+ vxe]˔pxT;:i˓^L&#m0Ev [4h{jж1iBkI2/<)2H3+oMXudAoHّ6 &FCW +RMI:*'`T.&UbM75XC׵ZB{lo5mR.&'_[r2u񽏭j[50&bO7w{N8+&nG?K)95?>DJl]$i AzÒbLG񡫛+Oi]tOEo+c^0W6B4uxV)ӌUYVa5m. OsB{[8EwEޭ]iMgh+mXi\i+mYiNNSsVڹ(*u^[g֩8BJ# J),1U&+}iFW Nv%b 朣 N{PѠ[ҥRmLH0'o6>5>͚)\Ħ`@SyS_36KMI:! 6]x4Dv ,i(Ƥ%oI>8x0>;>ڭSVbĀv EC濍!P̕n3…hO0閪 W(w2:9=Fu'v_vۍ$WV\zKh8EJq^ ?I= mcG(. F6888("kjJ0PkDYT1tj[n4N7ہ 02Ÿ%r#%U_5:JvQd[upXdq.v[\[!eйž O SYty3H4o!M_̎#`z;-ҟ{e ?dhLJ]4zÆq9B_켸SqgگoaBa),ŦEH}=cʅP+/ GkY1I, #(@avL̆WkDU fy{ 8֋g1kJMhD\*7'Y줛7+ƸLh/ݝ"-d48H7F/P@h}B%iiFP$$[咂.zsMy6KؿUK&TY3.ʬM''6Zx EzGƃ?rYf*h?Fm' Z1KZ\KTMȹY;>tNwn RRnnc! ?o¸oĸw 4JP vݝAh@|Z{u=f5XNДJ!J!ԑ:trUWzjdX5):mkxð5& a$'0{3xXOzN{-/GmOjѿn9[ |[#>w~txu)JN|m@B ';_ Q#a/6ʷᯪ됟 ώV&Zݴi5QTp'SmhrU1hfKi4yX?lszlHsL6sTTCI} )L{V-Bf\mb BCGMb..mnLgJ>37yrͫfqm;lr&M -pKs~πڀ0 <-6A?Ab'aY` %%Vٖ2RZM+7SdE"+۞zU/Tlib5Pe* C qgU=xFuԿ4wrtS-嵁IRz$UFU5|o 4K\S{-.Ҥ#vw@U|܇+zUiGDյ-#_s>?q9^F㢈P.͆ 8}%T@.f)M6^rQ)֏Ǘ>8M|O U2Ԯ` =G0J~$:rt؏hU_P;L[8PP_% =ZPbp4ۯA_BX_4L$?vz =ºvґǾ&IiF{kxm}hW(z-FZo!!/VIfv{ߔp#DPU&gM$SC4{/(=S0g+/ 9YJbk5mh:ʷ\]Nw yڗTqL2o F誄o/r<@5t@&Q?ۥmޫu +bpCSv=M!_M}b/ OW>΃0#t+5ā/w΢Bu'uжL@_ \to/5|0~n"Zq rPpH2)n4({=Չ IJC< bXhЂ%) $;?D;P pki`Et|mZAI) e>)j ^[I̴͵u1ȫ QYW+ߩUv!u^ᛣ_׼Qa6؏uh*NQ OIotVN _f_FM%zb!)Og+Vf {ޠyuiϏYCޅ) 7R|4nWJ%{q 6R $6gdú*̳x*Zߟ52t:d9;a{dV2+٪Z ێ4Db=UVq׮(}!juvmg'=anyN#uL`teu.Xؼwgsq%<|ֿ>H+Rd7\q퍂t IeinNɂX'bLVIDHy!#:eOQ*BT(U*ft-D0mPMZmI_tYW9*S"ʕ7So5u^oRtUN.MuY+Eܲ̄BX ܯO B_}Shto$Ǥ&%r^c[\i>bMU%*J+PdpKj|Ci6_D]_l.ti/Eq?Dv|'!+e!x@o b+(?k$*׊ʟ+|kP7xUXo#Sڔ{'`n l[ ,O:Bg54prѫ\knWS{,lR%\h,aXoqyfF+-ie搅DtQIJ7%)\B.Ǜ5 :/hR]tThSX9؎9cg#? \K.Q+; }S!HwhYO>\ wKKJtS˪MgU[{&]M7kAH)]V!n|Q7}JG($( j$*(5.Rʑh~ GP lCJ1QXwV\kqioZMYU /CI*'kh'gh}+i6XܮW 邿>lxL#Pm\[rg=?UQ$b39-"qc#4RKWdnk稍ʿ/ah = rR\ zSJJ)@ mbD^vU(M\Ȳe"gѩCs/}מ#sc\pwx{TrrmQ\i3sU¼򭖮h3&׬9r(P)VhQ7h>JlN.3_ČTբ`#VYFN{M-?ݜ/iY=U]:)h7푐W]y_6̑j}mی-Ɔ^nދue*bQe6|o_ݞ50;q=H^ Emn$/+RqVVޅj\(Tׄaj**-:/c/<#Pm3YZJVGL}mjCU1uv{r=&(65ٓq]Jʭ)Ʀ% =:R;S] 7˚mCmS13oW½{o-6qR@m$޶v>*æ_a {8̨Vڑ<#rCo4W獀 bx vд |VtGzk<4ҼdoCV^@7O%băy5_Z+l 2orlyX±ҴE#nvBTlPDbu_|w&xV)ÝTIOz?G{RaSy'Ow%͒9VW_x.]3nqj̽|nmco-+2G/CsP,:sHrl?&'ڂD,T-V2u1n`l2]$dg;'?=3ӻ&bv!>W\>у-A۽J \'A+<-֬^yddd=Lى,a/`j4uKTL5 ؐ9Vb_al%\ m?Fx$AtyQےI_Sn4J"EK犽%j575C6(q=s11'`THڮe''BU|D0ߣZ{Zrx$7(*6i HM:`>@ָ.Nī] 8|Y)sP(!P|zS=Q#=>0_3MRǑes.<͢J $4)=T!LkE演H Q'NK2MFSgS% >}l0h}o/dQ&g(4qT ]Ty. .b>ig#ǒB2# aXBHS(ľ&ZK_C2NSڧTTE Ieۏ֍OQ(K JܤQⰫETj'ހ^ 1r&<tA{qr&SGyx9XsK;9`'_x3rQnvL&"V( /ճӬ/󬤽L5so:]/]YCq6nԘKv*%=@yǨi]ʼn]f9(i/k5t򱇺ѕ"[tйpϋW$dC ɃL:S;KAU yf<?HaژxsbQ?56_ 1&4,*S;4v7].P;aaaꋪP&9tʺl*gXP yfu=Ԋ ~s(N:Jg]测 %{Ә/!VOe2YDJ MeHRPX;ӻc:[0=+F=f@xh^rwO桿>7RPŖl뵐e~/?I!p:9m5^oޞg\ٯtqRuzRrD(UFsK՞ fVu aM6"/d ukd0n`٬ e]dxRz1~W/Z.K~:׉d( P7зyj֓8 (]XщzAR/A+َ.SuԘԘӹjLEő%ڐTE-s9eй:O *)7N"#A>[pƠf/_¾̸/o!7us[-'7![=Ҥj.cO^ZMͧ"}ʳ<{=.a.6nlqqm܃ FN l{:]zqi.\س!+mT<5SF0.Y\%3iWMD tLur9n,pcǎD|-vNC^[e]dd{dz!z/_zaK.뜜>mNd枬&zz*,|/R~`JpH Xu߆o+oowUិ}s ?%ϋ}Ci<愒ї.ޘTV7slr}wӏ; H͎t0?KI{[ʧ5ėd|kf:ކN wݿA5n{{*̶l2I|( 3Czݓ:vH*8)chH 3ҤG4)^l&]O ړB\KIy,| Gm!E!/@ݏ!a"+\Ê K!gCUڇg,*H #xyܿ8dt=G/h.p_()ڷFcf廇gëhi4?^߳03ːqm8;~rCP'z^x'17z kD#PO\d1+01Au{6OH|%7;0RFXAɋ׳AQ˳7X}u٧7#4QkrC~Q8>6Zzu Fu>ث.Yn7֋Ђ"Ƞ9eRDx0IhOrpn_ ;d]̄3sf/f $dmG̞o:+t:X?`M~S] ?GZfoqFsiqbK:KS>2,t]XE(9jr>Nx:{)hBoK: v !) < w[})u 4LR].:4 )/ܓ85(|5gsJ3 Yh6s ~}ZT-~2-bPӼCbzl| ѐrbY`߄nLJxtVrqԭ5֋IhHPH Z\c 5L\^lx Ulm^ i *B:2k,6RI}Z71#-ffMA2-l LjKXrv_d*3,%#,&>v_:7,TJY]hvUoj(%TXDBeT86#Jk 4![dw1cB۬69z2PQosM$'/ "-nۇ1@ 2kcE#T(?8u+ƂIj[C?BNUxl5B_g͓C6ZIU͛P1I!2WHǜDw/ MM pbM➆EwRkj~pbXWv#lͪ TۡrꥂbP6$fJ*yȪzɷce7pj !n6^sx쐴oi#ˍM))U KtL?Ɗ3'C|pmKBrg*($NZR\4DŜ@ oiI:%Xy+Frj'>ZUk(kZ:ɁϮ]}fpA82 x )5i*)kDI{'Ɩ2$}ˎgOD:Վ\̾vUx=+y)vJ'itZm)(L\&RG\/A}Si5$n1w:*W"&n%Z34қ:䧰#R蝏©7~:yc/` =guJ&{$2* ɪ֋=i(ffCd>Ӕ' HCA-̡.a/߇1t5 sY߇Kl_~ӌVnTh]+j=G/ݗ_2ph#au;~w_M}N5W}h^n1E?a\Pf!.nRUE$lQD bۓ-9j(_QpϽ<`ěpcX}d߁]'c+٥k +mTU^?FUkO٨vب7jZUw}T]>}ӿcv}ZZ~IXB? )ey9lQ{RtXR(耱:thK 5E(HȲ> 8 6}aAE&zN!flUW@ca͹o qۦF"D}M0}׼`˷%ȋOum;;bdLp~N^7|V E3۴M~NIw> <ٝshmՠYX%U<p_y0\Ep}~bHf`r% uT܁Ao%Y澆a8F԰e8`ϩ۝V*a0Z*}i0祶1DFskcBӼku: Pmxn;K^),& @ߜ!eJL+c]Ry  Y,۫B Ok[<,XWgIZ|}^Ϸ~?o\SeWv"r?J2aߤwD=ȫa|pR 2Cb_vjjFlD~BW>\lwQ3#:Djej/Y[.Ez&WM !FSFH#thTsRB1=TEZ/S&UeQ2j0SU6'Mao(Nm,OF$M.A¢$km7%y;jnJahژJ_BS8{ybw=l:ΟDv(wɔ)D[Ẽ1 eº3Zՠ_ R6ŢM WYXRl4ZtpW:AJۊ {z.z$x̏\_C i&G( مB ;g?qV<&?"w3hfYJ]6qQX.gZ)830iXXj63xe_kxϷST_%f/dvyM&[H_lDq?70.]`W?ޑPEXKzm_ӗ~[A3412zc$ZKzL0 <"T(8S(({\;Pn,U3/&T!gp|>Bn7CJ >U/ @ܣ@`JNta̘t]%YMZ:xǰxǀx80wf1FwfP,n(u3z!ll8gX J @1-5^HVX}ġ(tRpG˜"e :o~@g1iTTRuFYriݤ^?ǐ',ª_U9WxG2iEph _hY'!W`Kx5^^ɭZx3MEbτZ~Tw9!"R0?fXdE-~riv{#]՚R[#82Gg~ 4IjZJ7z&( =R^vN\fĶ[Ɩ^ H j-^ժ?yp :Ww= w;=uV~ ͒i# @#7B>Kv2_'Nz8輗p4Lԕ9'(cQ3xoM8rn?=FP8Mb:?L.g[#r2(BO"!YrM~VP+!=?aP?10$bZ͠/Ko+Ah 5T.po4z5Ь`qSOf7D+9؇9]̓.8aZ:V!2V55=DHO(ay\}.N;zOb#{l?c~ҙr ~  >~_敄%r#qۿH\@4<Ҩ'%iwm )6Lg>?aCBE=R;.}"w#49P8wD_0O,͆I4G8A" ZbPS{DxSW1>?TtK$/Iu"-ȅ &6+oYɛHi6sw:XlyӰ'%K˝-7,[GR,:F,U;$s ;'Hd$%ɍNPjg.jS[UQoԏF;TJC,nʔ%֚Ry>n*O)[UD|JZl+K5Yh8L(nx5jBԨ+ԮvqfwAHfor;M):i9StO4e }?E+6U<0:0AWNc@M֗RƓ3pw2d.3'##==4"Ls>`ϙtn{J] I;Yi%Sۺᢽ Mr; zOKZ5Ez#yxy r{]ݷJv3ǥ'NƳg5_{󳁽OO$W(yi[z= C6τUiv3һd$(l[=>v͟3Eb!xjσ"j{0=*fS㊆PJToJjjj]x xN)uWM"!oPx{އztCۂw]E>L JV[D!e+.TUMoY8N t#MnSIۛ"_wUotΛah;cwaavA9}z yK ,Ŧxrė }q%87 Jex-2 |\ 9n@ *Zݕ>bS%cm %c㫓&"枊NiWkb?cـi[k&%e/Za4׀⵫^o*~1)fNfN`kq̲r\Kf{QVsqM{xViOѼV'>$rXc4–+`00T]cܧޗս5$zi%;D\" z 0rH9RT?ecn޴d^"CX, OT㼾ӴMX-a0+f7`^jo:v0ifd:W=_ E\0_7؆x+fu+85\qpݪRVPVq/9r^R|Qހ16 9ZߎVY`'"/'f>t'ئ\k/.hW\\;YO]ir=v{0zVъ&l)#Q=Osޖvhrp?48\f\I)יhC(}y/kb]OLqK{k>R|݌Tbxe!wI ߥEW|EX8)D:/+s*\`,hR\DA&uבnRkYn|Nӧ4}:OL)=  Mo}Dny>(޹^L_ƽn'3tMMmdf'RdqzזC9R`6yԋ`D%c\n."Eh5 ry=eOGWbMaHE}/=3p0!ΐ!g!9 MhYDoZQ iUd!^UQ_uϬ$,xrt9Nk9*g3KXzjh9Xir@F*Z=vCrO^ïOa;0UcĐ_XOxMwІF02;vjv3;8FtZ 6X^3ކ_u bXf4&_jhn(os\H@nemh&A|IsC ^CëK|*;i1 f|"t]@,hH'`aPhQ!q^^u kgzwLmi2zD{éŹP[@:%xgJȇ&0A]wb[zC smtr/r|~a^yD!ڭ+׉~@4yP$j-(UcIXm )iU{n䥥75< N!m P 'Bj(u_$ j$̘M~u/r9y4Vw9`(g=Lk 3mi׻#kj!+55^VRtyq4UTӹKEő#ڐTE-o9]3E%~ZēXk=@sz_ulyXaBx<&!3V,em@yww=3so6Ε*iApw2c!T%9iі_iR5e&3GWVnd)wp]g1qc6lUwwZ`Z5i4[h'W;l62<@E'L! VrKd^4pcǞ꫄0ة.NC^[EIFD|A~R-E{Hv9uNȻHn.7Y]iWL,|/R~`?p(xB9ŒoCU﷔BAZិ}$5\nc9eA6א Y0&|),=CmPX;Ǐf`ֱ@h:0;@5\Ig&r4ݚ/x*fNi{3۩O~] w+ jXvTG3Lcu3ʵG9z=gCF<@w.V E9 JnX}6"aBjE)+\ K!g:Uڇg,*0ƣ-$พ~돣~4T\ !)F2*1I"v"3Onga4Xgv;Zp%~ W.+IO]PCjH꼞h0f; ٠?MjS"#y3(e(x0Sl]g[go8GZXvkO#4*ķw7 s 1hxkꭣ'ɫYcNg#.;ﻝHZzQ̠9ގ0& >`挛W0]FWȃ.9W͟ON6BV5E6d5|ʣ6׈}>LxW |]#(b!_DtUy ?( X&׺o(Abͺ*)(P-XhG~l$}e4 }ys|{OK4{3H#OrA1{wi=ԂPvWi)c$K%%0T僰V=`!De_߀&,4/P)aTE3 $vhN|&*P%j>dBG>\IJkSL;B6Ev!Q̞hH,\Nc򧙳9d@Ǽ _Z"V{LVD/Hǽ$nZ? }O0V"P\IڳvƠIXXꊼMZʑ -AiJژh6Y3=0ƿFWٯo/kuּ :_-WꬩHcfbN89D[وt !9[%bVfoXYp2eȋڣq)Z?:BAV&b$'f$4pH?UPAƑ6 >WKvOWƃxNv{iޯi'[BY@MAC̵5&!k:OO5?,'gÂj5tr$wÈScϮ{:}_+-?HMQSęG7ad8j+v鑉mWJEP7zHZ҃=HtDc,Y9Z9G&zmPY i\v]=լ7# ߙ}`B'E6!mb61\D25"n[Ӈ[[~25`RtT֗n={n]n}C4O5珟[K >}0RVnb۶ )2:ĺpu $7c[O6|B/T,wCY.xϓ}#(PD6ˑݜzWB|I dhS,UBcp̵A@BGtnҤ)udCv I逸sSfL0I:dt/~<ٍjGo3^ xSj];sa^^簡z<3t> S;YOd} &;&! oSLBMYRt|`'~;F"#HBں˺{x&J,]d̬ R3뙙PbrOwy"2M"= #[6#'nyaηI|(\`vnz`S xuJٝ&_&g+ :=s}B5}Cɕ!"{y9;;9?WĄrZ/yݞ5'gwNKeCg? N/X%>w>S=,Cjh I3ifĚ.-Igyݲ/D5%@*`̔ix"]*@.v"ôbk˃5 /2/ "k(`"A-l~AIpP VlG}(vj ]4HO96Y"ZҁS ܆>Ù kvBnK6'N#CV&q֝y>C`"' #?M!urT"JN%.Ǜ\Q8C jޖZ@Xv@zHxE'2ҏرh,DXk-[GdޖG'u_ZoKn"~0bo}j2}q*".mß~-?Zv?`-T!i |## Tܞ־-䥟`"8 HR2pNOe, ꛪÇO×D9K2Fhz+%U^?ZxSF?"گ/W'ZA$nlh7ӖeWzc썺Wf:^NK{RC=UIH 5àzvOrT&z{U O&IB$:7ysKs\x/Kse)Ÿ0y?-8<ҍ(qKrVT5QQpYJe-ܙ5XkY);(hU F9GG)xRL{V`Œ@ 9 {ib̻hjA@\?n>ۢs v![:R ǭv=C8m%z>{ι@*]ֺwAПO}laAbCY|^i8?5@!,OsBYV?+ gBYwV?+ gBYV?+^s!̕0WW!̫f=Y;>d _ _DFtI~lGIٱU@*Z]Q[ӽҥB+O՗D+gA`qTS+|+QĻP'Yp#8upF R w6[C~̚5J,ڠnT-ܠm%ׅ7a۾`O:Ɖ#V'?Ϗq{1N$} RL%m-Vu!K , kx-Oi)Qv7lA$s(՟ /1_sN W/զ <2lۀ&l1_ e mT_XNY~ؿnr?F&J0|Ⱦh _6Y/F{*ҐEfX)ņr!Ӏ?:Xs7ksN|{1@I>#I}<2q SLJfI8xb `$9BKy|Bh.RKgP D $BQJA6~D("B$Ht7 j%EV._{ PZ$1<v ?6m~P}ˆj/'8ۋx0b/q/[~ [%> \޽AkW`ҿGs?,$++VC+c"02? TX) IB¸MI \3F*;SYӦŴurvN=XkQ4' Rt 4j)AжcZ&a9;z_t4kAGW˦{PB\ۡbIC ˴@ $MUCYA<ͲX/s{`hÕM,6Fv0 }(S|pٳy6"*`##&SDsy6ԀI\XR,&d1;xA3#آ/x6oca" $,M%,ʤrKDah0ԣҍ  r5Muԣ<52\A?BMud:3J 05:NM@PM<( X5Uρ JP vݝAp2(ti77sF%PT$J`l ɫ!!Qjg{ctZmNz🍰}{y55]- yU4H5My.P#`9.Ƿ&X Ҷ'}zYCz[jPVh)t [?IC7@.C=ŝWws`fw;%Oyr&/\s Oi6]LW\K/ʏy"=X<JP!ը5+_aʫ :@6<Gt)1n $uę'X?_S;ww̩}62WO?h8W^xȿEݘ 0ʈw-6ca +Yc'1:Xb.s{;I91l~8b⇟vck_h:-k9/Dy$~1*s8űYq޼Yӹ7B}F &6sbg@}_)9N)LS<ո #.+"0pyq5ݲQ<3VGgcx F"{~P8^݃ 5:Ύ4b^@L0l| `]sHDM|9p&xbey կs>ʴӪ+ +g,+fGl.`$EMD{ncoT \F b "%jk=ğyC:7t: >w/'GMpukE 9. Qʀ1i@=tkM}u }p ?WT6IfK$`b tPg6q!QcLO"¨]c獯G9_4Nz:$uaXlѷw/k| gyMCNY|N#,{gwb\ =TwGyV[M TNj* ST\ xl.Xm7*Oy̫xOOthHsՖz۟˕@ޮ[d9˛;xےsҚK!sXxj7}7?@h _< soh(VI&-bmkP6axj=5jWpЬgyM(1֚)nWdDg0Fy{ ?Y-P.|520ܘ~BY~ t_7W Fd$F~aHeT$YUb> }F@9ۙm(4yǓ6wCj'a&(4аJs{] v*Td;;nbS!lS qUvvdJT1җqBh(igjgWE*:yk vJiaCiZxyӂ|b96T %Xyjlb TFy^B1KԼ/[ K;/erٿ°x\U٠^nChZW؞'Seؒ#+9.GKP^jڕFTǼZ#|5y܄O~Vrt~77.k_=3ۻ`0G[5! 11Ln;vCaO+wVJ۪T*^K҆t%Oj-ykI֒gx]]rXuΓXKAk\?o2/b6yĴ;6& #NA aF.P 0t=[ e<Xq7+zJ3f9߮zkml8'cF9\IŊUb'lV=u<'pww7G^?WU}ߒC7,k2zX׹{Gž_p 6!#ğo.b]^Ε퉂r+oP yNU~%PC.Z\Wz+M sm\NHs 谢Q76{^[!{t_E<38Ǽ^wSv=}cӎh??ͩWY" Wks e׃@)ɋ]Y)`&9'H<Z".i?42Oܒwsqjw}ݵ)qfI~XG-WZǣ)_q-tÆ(wtӜu=]}J{fEᣳԽ>}αUot\[;"F e =-e:5U-eUm%G%]Y4ЊVaxu78} "gRv(ao44z.~)/ sn]W"a(CegAU*Onڤ`fDr{gR+vY1";ێFZI0Meq_""de%?Bck0-46'~ٔu)EO)S߮>e9|ܻ?6gP{X=k8v/^m#{EWW ɶ/k?jJs3yKA{lQ䖱jl>:+SM]tߖpio=OGy^kS{M:x`u9©v3a*%NTC/CEmLC6j97Ҍ^\V9-|-evZ/a3fىNqTy|+єʷڢ]~*ߘ]~N{ǀuא]jխUa>Y.6uSvwrReSF*mlPWyL.z//ћZSc 8ڻ+CcKc|oi{H+/ T#s81s/>is[]Q,4ڻK8s64@/R) %軘1V0O}~7.yU:YJfynDB`i<-\|k 6&_FW>Wϧh?0b*;ٺ|E6dN^lm}y8+ƟdZ:lh2_#9Bed􌌐1'">hKieLJ5Wl|~%F }72/7 rP"`Lʯ!y8I9=)7- ou{ ڂ6RP;! 2vd>2qt~ ~Ւcw_?>lk)GW0JyYkΊ{]אi %#}|;ѓ~q UtA4;d\"N @D(PyymSdENS~z}ifQ"2 ͔ֆ$"rIb.єu4s VtːT[8` R 'y4]}:;h pOj fӭ̦cvWN-4nvN^mrg\! 4@ky$4gl^O^h\[55i%ΜMШMT;VJj}jLL: :SFC#e4LDdΒYB֑♭|з1XK:zdqJ4bv W@ˤCLa"L%g<$ՕP@ ,VH+ .Mi?xS{d7z .`A`l;Ͼv(RuM}mߟtY PH^%qY8{70܍Y_Dr25m,|%\`44;p%*60|j온S8G+>-ߊ3&tV]._E:|@ l=@~R'. IἷeH">3'7"D=zob65}HEVݙ7#UubkUOFy^͆$a7\Xj(=qSz辩7WzYr#&lz(&MY)̑)ES'QҀO "G9?IĜ:[8:]Φxy`Z*jҙP'Š@61SȃUS \KW,|8PL^f$$:bս9AďN7ITm*ثURKIdpkB{q[ZNJLφ7Y> B'c lWG*0\3x.H ?qRA6(G9:kKZ+╙3J:ByֺRlcOp Wg9@M8%8UCcz嗛(G(+}JY?BxjKOup lqAy}y+)»woT zS y^/z7d {873xk.S$8YO*NfSD5}C YUYߝ3ZnR"XIUAzhYC*\zCSR_ dOYaIGM=q~ OK ގ1i^R 腙3Ǔ7[8ۨ4r4bp~ ``1>ܓ?"2/A ҺYRKu9_Ažp\ݝ{3wy `E<= |_Ld*]2!@%m>$mWθ<ⴻeЩ|N7mocQKA(ڌ?SαYyBCf_7mզ#8, ko F9gu0@Y1݈"+e>"w/{?Q4{,Wxv[d Dؓ'l3,oE0So pf8Uˊ/Gkh2,eiSDS:0Ǡqub[F~7WE>?j.XI˩s;*Flev-qv3oBƻ?-n!xj¾}U' V[KO: ZlkX<azUQC֣"dfOXh؟8)Nd|7agAx7M3њ~U`hF麔0Zo֙mOme6\ˆN;p>[ƫU0eP7+}u}ZoB'tI`W[}z Ѐϳaa(U5puR\t6(h($n-iSZA]3l);y!q@|Ӽ8ls rQO& aux 3Ԑ\f'o۪w3K9 (ـ1BȖ)EVE'5OXe|:FC\RE`i!@/q7FDcF;s]aReJYu;C{vVo@{5u}ƙ{n:Uf!u56Hy{ a)GX{HF Sܫh{^?^BP}\pt:L! uRS*kİ X ?x~x4pc0PT% N(7K .ޔirWu 69[:y>m:mVhbm蛷mzɥswp)Sn̿WQ렍dF uTk]a=#\LjEDz% _tǶή#bp{f`E7C&{z4"b˼8A# h߁n4ѓi<[_Bz%'p4beh\MTiqXgDSgE w;73@rFg'J/yZe-/; ΑkgY_iN:Mܤ-~M{(@&Хk6Eۢo;Pk1yzl^ܥ{<ϱv>ciwzZ $;:wW-R1; _ /qPF|޿6ں5[h'eyQ`] 2_R4o{h˦FotVFĂ`]uL #~|yӿWc\.[1TI#Z`_Mᙂaz` ܘVّAC79L}0,BMh~" n5TUR# ;Cz/e.bB?ɽ}LDÙ;, 1yqy٫.0{U'HT,ҌmGND1tΚvRf9g `9i{yeMnE%<עصjrI^q^d~\|߫hp9Npz/yX|8fq{uC]]u~?+0iRX_]ڵ ))+)1cs|ynT,JՍ V9>`+rqId 8do{ a\-]w,R\j ՌI3]czr(<2 YˡVzlɧFeGK~fV<}72$ p1gw^/\@L !#r7r ѩ30,׀rמ\cu61$/(֋r~kk衢I2kc^/ W֒Wȓ2{[E\h w\1-)0\ĐT97dҙ =(h-bxq)0^_%',V{JnLU+B E}c#+?".)9eVk>ޔ`pÞ^܋6m deռL",kX:D;-d|IM:4/|+1o /Y7*K[KuK_)B[}IH*毇(/c6"ee|>[u70I=\SF +4J_ojydI+Yb%|x/`.(|r#_}p|­q7i@.R'?YçKD$kWJXl3eI_L'tH$\Xr4}8aG Ip_ &|a$|&a81Rb3/:հch9*-~ eYX5!V2|L`,>SHWҢ m>(KCi?>t.i#n%/]K)x"k`mo.*g[V/k|y]SAgy(Y]LO=(F}4BzYEh,=~,g,d${mKSk.TH5,muM}APdKs-5#4!c?״$kN%,UX#v$3 -\8dޑMh#QMHQ?4iu,*i!DA2\Gq\?OVgwZ$K?]gQ-?2V^q\Ke|`[EV3[yDAhF6t@jJ4kyW38]<йcIE,{]c]%AGyh6/9@SX y9ŪՊɼNP4*Z`qKwEbn߭2ҸY2Z~hLf)F^b/$t}vq4Ex1РY& ٠o\Gk7 pnm@?ᕪǼ<]\߷LS1˛js+}|^ML[ቤo[cjBSK0v[NQNZ2g BsזHr!pԔF*,?oF( (Q\KFQ٧# KS[e@y Y3y27I.M";l%HD0/|S~O?$e[x~]F=cE̘Np~˞uã:-s&O/.pKJFݫtzk&Eϕ&rwe&7kUO￵ܲނDG3O2ɺ.>IJƂT%'Pnuv>_GIH=ΒKdp8A3VY K.t9Iu=g#rtV6]蝛Ίq$R鹦q]Ʒ"ð]6nj#qAc]- ʕ܂i6 1|`T)]_%<2.;\Qu2>E ?ҿZ xl$=n۴F?a^-7r;鏭 .SKp9٢*v9jW;Dg:%ZDKpDue6%ml6vA ]t}4H$Au7h8fI$B JL"wlnɟ(ۚVBTПwWw?a7uTVgW ,جo&&]#րѸúO,Ha5r99үj sҵ/+#eDZ+co!2,9ųu#?B(ȫ"05*khrB -my?N'ϿB69A~閩ÌONN& j c (g?@~$jB 8,;}J>­sUp8'$@~_.6!:U@"x,EvN/fDwe PbWxh2"jBz@@օ: @,ɯU2 Xܡ7;h/).)w5o˗Jz)"NJ^%=IGNu=دjD;zڹ #ljO(;Zi>)K[ hε//G"bT*T3 8OrmJ&!ىZR ߫Sr8{TRD湣KZY{Z]n%@M8n%;, -K9Ǹcx:´JH(;h eю1|H5,nsb:x{EWjyVU3p ˷kݦIYt 8Lf־EhE[.닦4c@I%I(lL =yt\&Aec,DHX6 FHbA͜>^<[i(!HnI&{H4U{ rg\%B`YNJJH4쯢 c8&<5T:ȽT]L_u4Ay2џ ~ϓ)ɼ9ǵS\҆S጖Hr\\&]岽eCWYnnh|r\XeeGkoYO|z_;aCWjӡBz4&6Tv$/`%="3+–x+U6g-h rP6k3JB̠Q7kUzFLv- 8XZQrM3NZY˨V+y3zu~9<{G*g`5iWA/zR\7pj=P|Oѽa]|h_N7K ({0α 1";3#;aɬ.Zۙ_8V_YOtϸ& 8JgoH6<޳Wνpi6&ˤX Z I DT0uCf? o@9}G|N)x2IOǎi,M/O D(Ad́0͛j ZMl=]7,#jajytޯY|t.砣!gl~ = 6#!#\ @TmZ0pU4,鮪|ĜVW~b>|^,˯9$/3m:@ɥ\zptK\ߞG>W971eU{RTIL zNeތ`zV}p]+WlB@| _G#`{9nyȋ;,wNNg0;/գ y}[8#ЩtM3dOA!rRd%~^uѦF hsoȝ-5 $['' j#atNSv 3.i"ݪc4Bi?;\7? ӣ5NzŎ=8YrG-iOek@}vUxNй7UA~sW^;*ZLZi?&sX:h4v@Sq_5 ]Nv:ŗ_D㠧ݍH[|HDtK,+wqb_ZG\u./@ ;Abt|{LBWkr-c|Ѕ\M]n }!Jr#AaӻA7E5OakL"2,=\kTW2JuG(p|%HihtB|lud$򜯍hI} {1@d6&QuχɔL䟳d`dR£GiJ{"tX]9?I?8 G~Dt7!2wnB(d V&va/% e짋^r֊L'xRf=22 (gophߖ0K5{U` Af |O 7H']5$ك4 )~5lţl17fvB0飀'V֝2bgTCn,JlzJ$/^ջ/j% ŽK(&dad=#L٦Da}#8$~)l-"n ]yp;g]$dEo( ˞zRs8{$ uB)B=QK-@eM1{N՞{U;)iO> .RwX W𖻨On(WqAeN,'Q 􅠚7p?9B\RYI@*WHl #g'~Np3 N)Ҥ JL)Ī-E)# R, 1"4IH? EAx{.? S No@0Z}.%5L$ffJe>bh( SPV~+?w7@8N}D F}qMpUCCYth⏁L#?>j{.QM8L/r ENg+n17O?#<pRw>6DCkqc×+.dBطXau') >Wso7U.T]n\&݅J[6,o<[}mU+z;QUALlf+ ;;xٝN5ٌC?!Ϙeb'K4NZ TݶKsvh8WCm|lK5:Sq[ =;E}cC /$"=ԅe[8%)p[JHTfr_\LˆISn)ZL~A}yn1[,cY)u 3#u3r9^Rmv]r&awRon5RLw]KM8 fQ/ &㊝Df<,~Μ-J&_A'L;p6hEftb͟ݟ5a}UN[ !vk>h/wsNV&(5Ev ? _f7?g'GM 5ǑG+{\`:)7%-?ƨriZXx*rXP?=]p:b"hE.w6 aG#0vbH$Z(r>fpn.#M p/ţ/1^XV3Xsٻ,&w` q"&yfK!"gw6v(D c\֛TFioPW!\^u"ߌ eu9" "Odl?R=}FFASIDPZImRB_W)o(:X&Fꂢ"z'a47/ lL,.G7[QF`RL 9b]q v=hgю izڙӞE@]̼3 _~.]ܗ b+-L jNgM0q3D/9b\Jް.IL\mnbcN~#V{s-0g?㫚KܻpG8/@\8O"0"$ ·y!(yL{ ^s̝[π Eo|6IS1xb|e4e}{ U3P[~jej;ef^<;sg5}hᇂأ&qС> Xjej;&aO0?=%kYdώim(}]s#ik s 6׹ 'Ę"(pNf`or5(BxV ,P`A-?@rʹ6X LnMɩMhM-uy>CD`Ysmo[kJxM(æT]Pȉ2(Sj:[ȋe.o)3YHi}\Fch:҂fL^sc(܏D *ݼmO>ǡ<"b^Cn3<)HZ|25]|D;wM -hpYn&#Npa^Սy-d6e,mH3q4> Ղgi &1Gl՜J@ڗܥNNeֻ.k%<|p-L<5k X16\T- bлhqa4 y T1pHt|3w `b.!*?WsvYCP6WT{sWyd94wvʔkBoDYNWh\O~-g^i_Ec/  AH{&8YqHHp˽k }ݟ L%aú&lvzEEXXܜs;e% 1 oL vTdr_[Hգqkǃۤo1ܮ   H;\dċгa!Fk8otFI皢+HSrl+?AqD J0]X!><1y܃#VJF^ 7:{{x3,;R z=G3 {v+_J*^ nֹlD\7zF|u`&EpK,2vGU&{C^c(ІU\5,`D`f owrJY8f (Xf.C|m2:ܗˎ;$uhahPtz Jeծ:}~fgRBkA&GQ翜:}cf3 8Xv?XAgBgP\&SQBU% 87\'9!!9ז L#ˡB0X.;ƿKV:*zִtA"%V ꄮM$W1lZץ T;é&?>_śKxq7&odJ gQc e8|Mq%A}NCh:g "6Ә͈nF+>`Ow?H Qs>r|B~ǣјޖ?z+5% , Ev8g29ӺPSA{;/[kM Jy7I.lD˩,P#E+uo tkT[hƱqzSV.|bwdaR wva^4gzϥ(mAFKx`v4$iI 'mκ}I@MF\!~!%ENK\kf9ݳp*< _ەdTydֿJUفSŒ%rךD+e@P#Tz~eS9aB!R1좓J~I P6SKGk `)w^@SQd]ׄz\f#ajL"miE˥R3O|}xtFy=q\!Y=?˿)GN*f rIt{D~*L*SqRB"u,d:Hɞ@=uT]Ν@A`mU8|..cjx"8e=JmNJ}N!?-P'%&!(tXI0q'Zܕ=t{7 LgiaA=Am F' ?˥ve* #uħ'tMHBHXO贺^yiD#w5;ZfA >k8gz0θ8 O;2x1]~GX4ʺ : ]ʞ}sr36#]z`CAKder/࿉ÁT5^I׃{9 u TD/pJt,6< c_*`GC< oGT%TēO)4y$ፘ[ןp+Zg0JhW7r:rN< $#|W1Wv 0؉R~?P·uT;l('Sp=q6zNBEpp'::XI#ho랚e]/5׎~il{X c(Ny^dW8VBȏd]n_nb n$IbMqMT1!.Vc~7g4N$ۤ6` R4 [EIwP @6!,Zh%(U" U}&HÌTHdQ%L}dd M(#R% t>{OX15`,KY~ ")b?"6Cr _S%E-]>$ifOfL`U'.R}km+ n e,7/I+a@0d( :_8HN< +pU(ŘZe%4X]sP=>u*jҶZ^/WQdS6l>%6u zi0aH8aqؚpk,X2ɨ'YY4mVy^gy}vJ5pV?!+ gp$ 'jQĸYI륲Z%th Zp@v(>ΆE jBT\[ڤ$b5!]"vu^{ 2?+T *(KO@ۜ Axe@ҷHE}xvme Nli67N Eh"MP(B+!0$x<P Eh"d<~!V B+!8~-3*BQZM~,тXD(%Z$WA"2{C/8D &4Z_J]N (S; ZKޅ˗ ߕ=!ſwLRR~GF<,=g\J1Dʁ`,( ӭF@LXԟ[*1L.p)ZKQ7_-HL IG)lRo{1']e(c Wv*oJY+@gĚ<.(?TLLV~[SbXŤTPůd(>-9I8ZD^A+v -/Ud/ώ8A,2 ~|063q?> ^kjL@[ՙ]AnyL[Džj(ȭC!RS8?FFAWfck~]KSg>JalW.p9hSTۦ^/K_=ƿU1?jE9V:u/)E4.<S:> Rg /h’kބ(fo0<5Rew{xQ"W &tH$wmim2E )bp;:Vg<2V4ِ\p{"X8A=fjGC 0ǧ[rſ oSlIozoSvm0Ε=jp_d_Q)0 1 Ye09a/W5_PsA.<!UGKݎVB3zM 7wtG-p`0G{̋Ҋe EG@+qެ[[K?':lд4:, E2t2 mid+fQ{tȳoZݮvwGKۡ623{;DCbҏpO4/fծBZoh.2Pא:+ #kTgeBK tEŵ:?@duz۸ڞ> -F?Aӵ Aq~1m|[ 9jރ#9 &i@pj?܂^427'ŝQuur*uSc8-Y:3RJ[Jr-S;{`9GOt% ʖ ֯7q/0\臰V@t` nsFtCGƞ/?G e$EA{,FgYEF qstz &sjO?Lj(đ{!N)'C9ĝÔg R!0ˤ#9-t}pJMّ$0 ORgxsܶ []oV7;ڌ2&ϱN noV6Xv.@/*Vy_9.Y׶ˉQ 2bb_;t{06u^Q͢@0kZq6SFC{j_SkH _!(Tf2{JCn3S[<_CF /cNF&^$uO{n(V ʫ#t~i\G'Vsu]&0Gt#,cdσq JhX 0t@S4WPS{¶Q*X ]RT A;nЮSf{PN.q3zYR%~T/Yicl b'_S~΂~(WV0Ow\xG8\LeXDOy!<. e-@//rS)3);pR,Q^?5ݓbd(O~$e'w>M@e ͎ݕ?X8W>, 2u*]OFO8vYX\@3n&Ds?|YB᷷l31>]i@U!s|n|?,>vp!>>CH?B!Z B:i(!Qy.3=ANK7l}4Z[m.<3 $S #YʄvHtrhW`:P^}Y ڹC]Z_O:ZuxGO6ZC=Z5!>_VK`ЊemXSʝheߓ8yx?D#6̵ pќYb\p1$8Ĥz=9u`m`*`k0 ۛ? X޲-c̅#(xR}:>9 f`Lf);2#d@ޭuYSNPCq|vmyu8ȎЁ<;40Qt{r>&noV??Զ{rEyAƴ "(TyXO0+< *԰JEC.M&V&Dρ⼝iG$;7ĖϜD/qa,P|̿ސkՂ =vaC5|, ftPzpBCf"DŽ]l Δ:Kw\Pp`)"iJ 9e5;طDbx0^a#Ѕ̷A IfNoch`AELfo_<9A2--a=)l& GVf򁜧\[ V-* X"w9)N} ,H\LtX[yCNtDAH`5G[=-7G՝ym`@ [QC1 GSЖ \ߟPB% B* "@[v*$&O^R||UB&Qlx ܯKPLz³;š7W}GӍ)Ai!a>A^fȀB0:B%l)#Za RnLc @܄* x̗!.',bD2(1wn(@ɠnŔc~.gFZqH_vѧxp}dVsD`N#pݖx}QH~ L &jh땉D?*vm/3uMvfi=2$hdsR"ӟg"ӷ]B_`kH `;,SOiEs~|p6?{n=~f࿧㾓1' o]'W+wlzv oxs//5:4@\x4D-Ok+T_ {Bм {߭мA1Cav QsoOIՐ8, jY};8nO6%D>&vx 9T)q7f~-kMg[e1?Ae #)}  |_+x< |g+x< |_ۛP] 8sxo~1⊯S>bÍ <|;<|AԆ3<7oW7lkis9!jee~|=e9J%QB۳熗_Y T A8Ce v%-;^vzqU,%eDJ vK;߷p&ϊ=HAhV~]S! 7Rոb.|9MQ#B͗P e?`~jt IVz=cQxpSQxO/g, r2J9#l=>d>G0nB-!/pAw ;sD\{nZs1yxL{`{ޡ^{X^ NL:+1lYV? ~+jB]?Z۱1Y8G n/_g6]o7].WVX3Iz|_ _kU4,_.Wk-dY V3oL,^^Qm|Z 1Bz^ PsoA¢ބ]J@>7^_d]_.'(\rŜcv!PWL$h=+_NPsPU8.%)o ?`4[OxT*!gdk $<4O/0~ǿ ʉ?C& n_s] v\:Vo+I0BTW64`ݯj##$K!%H߰&'T);zknЁJ%,SMT=f3"V{TnZ-.'ݙ~msv8mAͅ'Qb=IKA}$ $4Ix49<$xEvɒx(tJ?VgVB7I+ |͢:Vd(}TΥ7ررag;7+1_!^} Oe@0&$V%/ŹZVz)4^>cd?Ij-b?cB~τ߅N-`x7؉OAOԳ MBWc0H}.ʜZmXPƚP!*`[i|p~BOn9&VjG4FWne*(+To)NC+X<67h6 Kʦ2 ?ef|̀Aԯ/O}fOf-=&Q^<秢Ao,O~]HGW^OڼhWq'11enՊr#GDOoD{?% ]? ZFrnɥa;ZP ##/|LfrL_/h3ؕ[PfX`Waxnz]CN)I )g3\ 25oD]aV{?Ox)g<>wxp5w(SIoйX;~6i:wejD,6H@/Z`#Qq.Ӕ|^!ލŦ Z NjeBib-Xsb6Hأ#?^HxXfzD~`mЭšTS5TweAyԣfehs~!e9P _ֿ]1_k_#s#hwƤUݾF%\4ңM[.!, E\^-/ʥgn+@Tzi{>oBʞQ~O@ m6»P4F/sn}@~5֘. d iQ%?߫6!'eq0yab w}nz.Y}rMI4zgg焏0sr} zttBc}MBF>2Rr9;s`8A*7A)2f*4X# ve,wc#&`#ޮ^y]iAX!9fUuB7 ]A0R)YB+I\}e4WW.y;jWegBA4My[4]Uq:mJ:wzM<3h)rb@ EHYkm{y|2*J;xp+8oĿ8]LEuLyo~nҮSIgYHbQX` 5+V?M . g`Ǻ$;]OWB0P f` ~hi2@G` dvP{0t+C&qyO._5Ȋk=]Q DֺvU*ogMFRHypNx MnaOߪ|87PK، >}g LM[2}&<cxߊqc.9BrQe`!W.F|`_z;ࠫѓ/(^0V75nr>BaiD\D \4ݩ8s upq:A;) AF:hn¸*X-4Gs4EB] o4/ֈ*En^EbwBNn\.o~] ɰͫjؘ.RMjChrU+v]jXT(0RQrG|oaXh'ڝl<o;4.4`Ĥv.vF$ȠM 7ՠ@qJa^~"׭;V3&SRNØ+L$ ϶F:t>qVw\{_1 >j(q%8RD 'wȞIh+zqޫQ ,Jʈ+B.PR=%IJԽ>fI|EDN( 7dY%-TH2Vzj7o4&Wz,rBB{r j3g[XRXϓ%W\+ƣo==̠0>t}PouKtT{0>0GY#T׊J! ʿ&kd-[J + k/X8xGc{]\ S`HSWgB OftI%j^P@9UBW:}:CjlE gtf˜>a-SgjKR\kr5llXF_|;ҬiB̉YϳTrbaPˠX.GEs\;lD3P\*Lo tz 旣HeVGz?/%{n~2g/Pj s&QSѽ+h⢺moKrQziȨQPL2j;llBN/ZH/e5銴I0sO)\fP2/8횮Fh8^t)` $DJ-X_aGvNnZF)ҹ-I=Zv2!g>{Pav=RLf5TR_|dis &HCҐWo6Z)NE3K[wrp0! ψ"-:'g,eh>'bLNW_-i.EkuAަ)4BE[No 4KtDGyxY|/{.))87X͸l&[ڇƉ7|Bb \)~N_7+6wtW;0$8 8gE*wP?"㗊3nJ1.1^Zȁ7oCܰg^x+Z9k6Л2Ɂ6x|IS׈G|-&=\.4ȼِ@>G#a4O[kRN1zT٦ ðVv:g{}"E y㺏jݳ׹SCkuNiL <,&`"VO⡤JzFV; ᰥr,qZ_ouz]k,bn9YDEF*k$=deJ^ v//MFҢqUy+aQT 䫘Op]߿B PBW|îR[U|xRTЕ.L~%Z aIhApR"K1PfI9vmcB[3-x_0?4JƟQw3Xɉ2 e]l$^K؂Q [;A|-;A:xB^h̉$3k5TCI-, I#yO_W'zͬ#Ĺ.:[ػ @kϡ  TMA $TU#`5A)*PTc1RI'-FDBV}-m~#9b="ERk`^)EJЗZdU53j};H̭1#^ 7j~V{{N_,ZtZ@v#oO"A dj 5N]MރB=!6 ~~d"PaNbOr阽\ 8AlKEK2.哰 ˯L'M׉!!"Eb!^\+eѿ'+J&xp_f/4yPBp( RC {w| 삐+x5QxD 8AY1w|r0.6t"Mh6ћギ5RE8 z_28"-VK{4{8DUw8OWNDpd˳@>M`\f̋&jE\,m*hT1P\cӸ,a11l(Nh'lv+>L+BH mNQ4W|n(?R%r|jHRwQ|Mu76~~F7Q/ W#\$ɦos3Ե,ԋ$k-1g>8iL[%u).͠]h 5Ef*\?4>#*uxP$?yB!txIS6c+^R%G⺁I2 g8b7U\{oZ䫕l1tKR{MBƢϚ u&h1Mj:yL3C 8'{5kxr\# Y˳bOcOejD̹gIH R ;\wi 8#AZPXDԕ (9P=D{54ТBYy7.ä&Z|̐Վ_㥙m9"4,e^+L3!2@ gbT'N+O׊ihr,4V;Yf 构v ĎX9Y"-;FWiEGv$-}iKOb16DEҲ Ū!՜#ʓ_LkRPW6y}m$/=B&EsFÙAuE4\%܀K\sȎ 82q>F˶lO>ew"ҷT"mp_f^*t!_̓V pvJBaQ5ypi/!1V-VdT'濫-~ !+'=5뚜G>\jLx(j15Ԯ+ AeZ'?޽;#ϧ5]K mN8BBr 9ʓ-u>u{F=soUSNfF 1A؋&uKO3b=Evu&Z1 Wi/~v6\n|N:PבP6QYӛlCyTx A0[LJm?V{h_#^_;v|-d%3c؞T9z&[ 0FdɅj)OGMf%(C2g..5Mg2P b|w ^ *k/L1^NRh@{*27jpa/)FĚUpc R3d]A0S*n'cBځb=+Z}l9 ̰7q)*#n26=5+HN&h6bG݇Nm/muYyYdĔ%IW`-7QoYq NV랱])qNe\ :-zП08O׺0M~ykD6tޭ<*cꯉ?x\ף{r1Y5anJG]%y ׀O8NxG+'Z(.O:,G)8XyͥrO.`Kp>"<\W>EBgb{42{Zs(&2ST?@=ř2zP-O{ϩ{n#Nx~+{۞gYqXlARnBmř2=u|(>k2gJ!o]TJkf_I9{4f"] w.Y_טM혎wܥ=R9IdSvQX !qRcFD Xf6Rٙ5*ߝktw= !ހ VX΋I#vZ[ExRFȬpRA ik$1NA` :K0Zzl"@puJjIxO/YPr,!x+`d0ްyި|ɮ/Xklr>,XG8-<:Kx<EeMMܛEe#SJ{+/2یY;jD<[|l㸐<vrRrA~ ;&G~X1 ;2SNDhrת2n2D4.ş^ۙڗGuFx#:?_oo״ѝm!"Yb@DkTڵ/W jyy?'kDy':^pgb{Au4=5 R֪n쀓4KC[b7\B\ Pr@P#?'R)u¨|'.xJۏ[?2;B|C'툉`YX^B#t`*_Q@l.yF6sLGO fbm^cUGu_`B"!1Q0>5 ;zׁCL>p8jGgsǤ\ք%\0 LQ2JxݢIƟZ8 p>]1IP2/͙0׷)fI`ycZ}=&^ҝFKu ox G,7>x*2{~`m2erEhI&jk0.M;ܗinMC S4Qw>4诂j4RVU`c/8"}5O;mt~;Lo 0Z*kcD3f"ڎ>)I(p̊W"R=Gk ڋUe9M@1jo^Ujn.Xݿ #OM)^syOCޮE s~en%%FdX춻'i˷ b^Vctɀ: Dݒj9Ca">&U3ͪ5Zv˂/Жr;m̨SN?@ajӅa?D[S,g#y,]x_kWq ULS܂d~re.peo){C(DٯBQ{ [j_7cl 17]Rh<|vtu5&۞[YFc *^IQO-PQYb]oDnOn6{O'9]ՙ^fGCƯ"&rMџ0p/q~̱ߐ@]p1PP- )asP4ʉ !eᩚc7fP{2yK1B9U3VঽeI)\,'3:sc`TٰɈZR_bCĢ[J)6i gtsga{IBl-9@YTU]&zԱ`]:7sbڗ܉&ՙX<a(8"!FH;av &J) .9:gRPȂns|eFzeq. >L]Qc觝sc VK}H#p=Y;t8B][yw-MGfՎ3'ԨkwζNExG5Kd+7^` ^N`ׅLliLَ 祓LB+KB`2@?lZI'B?άz?0}֪A9pZxL*H\݉=tYXi;T 4?yGb^4IY h<ZE7xg!n5 Q##""Gm%MNs#,@Cͅ5&G}DD, mCP)b7P#E$Ed=\.̍.P=nt)nUշ[zyJ+!1F=4 L8Y,f_ȱYG׳Kw|aI?-&=c%^W8~6bVI6ߋbJpMSx&NP(5Vuv8\~l.b}0e¢uju5jV/-[`z\ +  Pno":k6AmGtM5-#("ns±c,.r#QV{Ѳ}nxY q6Iv{:0]K`:ze"݀CP+LoSt{wH:/]w$U8)#e Y#P *++˷s +E:Y5!ll-wrJI`t،!3p+W]_r'2J-V̖V1j%q`X@J%>p:rSjZOZ7z  D4qa Y,+7 A2-؂E(^HEW_6 !0tWA܀NUr1;4DAXn>L&1ah;-"2@꥝H^W}j75^={omE Lm&M#?.9wO ?C>Bÿ m}k =wo4848TJ>`W, I# S.ɝ\7V{gc[0ѩ&z,z$!~,BdKWukR'7[!A#!^HPcz$c+&I~: /kE'b4-ÄNGGo0qS=HTg[9$8iAr@2 2kRxP2@u(|-H0j[7#yg*{VBd@.%Q}|E( a-b-l14#MB >+"RP4!2ckX1ܱkte/.;v؝3kX(Җ/E LY|m)*WG+MȣEV =3FvthDr]0ld-N#!P\<N.B&$ cu8o\j)C1va`YIDo{{Q<_/9;.`iP@ՁZ8FKKEf-}=*NGD}@ bB3ǝp6 FG#tE)4$@kx0[ bj -蟧w<4dxUY٢#`++G !DZ8)Vy#HN5瀦st3إ ^#x~\,ݥ+W.$zf)Q9p~8m ߁')i $Pu'/3 ShLF>]O`-Rئ{e ,kmg QRF uL9qlc"\?JnqҜIhl4=/x[5}0kSIxaQ>˚8k5N13Eo 󟌫gWk6YSCs\Eu.C\矱s? _Ȏ {@nr2^Nx)v.*07[KdC<3B8-fA g@ͮBwiE >j[:onIv7smӦ<8E# "S9٭掚xԜ7\Wv㟾%ǥO܍1nP1ưzg:7 rs0e'.ff3lQ~W}%H MqScاt?(:0PYsPTR,Q ydhQ’TEx 1@<cxŢrN^k֊"7df G3 "i{?{]=f̺`Ή'PX osY)9͗MXlfJw } B~It_DA5u4jS}=BrȾ×&H W-Z"g=)G&qk _?9OJFPN-tY7mKbF nZvuN؞{d#"hN1/ {iv)/ a`)=."x[v Ln#P2\Us mboǽ2= q?!774g!?V2d <29Wȧ-JHN-n~Q$?Q9PnI%8jK &$r,p KScQi= 6|v4~9h}mgm%6L2doMaDh=Jr'eE׺P"obNKi@E|~_` KIym6Xeldx9*t!U? Ձ5j $C NcGl"ps}4T8kW{_66j=Yl0"k5kDz;ѠBpX 5H_\1,]O$Ϻ*f ^p ŬhJAȑrcX"Yl \/GJkcրqE9">`;ʻ1_D0Po.07h!kl^ otf\hލ5Z4 fbq7L8g䴏]LmzxV +kܙC6 bHަ@Oݛ I1BagZܹDhuyVGv 1 V%C{ekqX0P v>7pWx'F/X1R!&@ z r` .h:$sy9PFj2^!"^'_jzSerӉ T+X|$a#/SoU\6֭ıސ,c^u7]_:EF%|*a*cLyWi "!,ǗQx6j)0^@(Uɳx˜pCqZ j\ .0:;/x&٠8U^A)6"}͗ԇS4" ~~pBVa I"}7ܸe׏&hwhz#!CD:䧃tr3^1찅J(#ĂrG MT)W_+QטCfr^(x'pq4 !&s"BKV$T6lBO3;$E"ssL+QBZy] כZJf{Χ[3 Z6AW2/"wiJ\Zg l >?JC1C >@8R%@ ]`57pۚ?aާTûK 3jQZZځA"KSwxL)w&DyI(lHxK: EbM1`TsBt!kZ{:K$e:bVM2z1>R|ܱQ$bX"DZsy t"_{*w%5M0J0~tka%B b /sqIwzwXӬ 4brniߔ++Chvi8pC&g4g5ddCJn80ytB0T-@ F:i <6x!APP/a .a^G nBJ6BʓikC9m(J s`|vEn$̦G7ԺҁNdd?!50Gz=R=h|H4?{GpC5Jp9xn1_ iU'Gg {$n)=wG pO_%._x0|#$6|#"<6GEȡFR$""8߻O*ܓ ؊." ?<(րV!VӶEET&5DP1\6e|ԗ^GvWU0H9d#M`-[1j-܉]7t͞l"RDfBOOH5!2'aROCEgC-"xEU٭f|12爐{<"$qK|'fſU1VJJUt%!x5l!ykaD+-GN2*.˧^@kN-ZN4$H7^P3+wXPC=4A\unm~H64m,?ÿowG(}qiv+FAM:a'M͸V91l[g/ 92?ǏOxgY P%m{ij>}%-3ERh m) JZ |u>e`(%YOV#Vڵxŏ_oGګ]|֒ .F{¤}wΪW< ?1[^\mD,=+3dDZ=G*<Jq)5J9).y{-O9y-2$[`4)Y-sE%H3Vr 2:wyDbA~="TrGuЃ& ;;8= ;U9cf .ts-DM)C:ܔϧI KkX)tz?LWń-^`RD 4Sg_0E1}ZAx4A@^xJ1r-uvd `zj)|4B$ [~x[7O}e`7sunQ|;S7܃PB=^_YcJy!?§5M?rwyhIzG.~C!AA$bNS9r89tg;0 }!Ռ䤦xJ,r/-K e˸&L )㢍yګ+.4^WẺa*.⫢ygv.E)zTElFu==뀄.7ȏM=yyw(\CֻկKAa`oXk|(lެki ̞f74rToEGCv OkG˟:>b>M9$3g't s[KU=p5{)vt8#*,F Bu)4u3pkn(F:x&#Q';Rwe~֣!B!B qqRܸDz-!qt:]RL5x~'XC[QA4O/x>uRReSaF ؾX"5*:@ G P Y>h$ Ȇ*2V3J֕^)D %;ݠs~ΰy:$>>Dƒ:wHCM V}"m| 9=̒fkl\陥3=5 rf.^?ܯNʖqV!1ۻ7`,s6z:5S֕$ixR6$1a᜸,Qf<kX=%/>[}B gFU-V~cv \D{]?ԝInn%gM0Zxn`-W?]7sįjp(3%*_^e”jԴԭot%IocwWѢ4@9PZѺ9VrT>Y*>` |~h_/NzR¥eVҴzJpBc%] %v#7{1Ie8(\)N8axT~ToKMPT1+mJ8hM$z$BOº$ JWvN\N)(2/a:S>|tXW[$$ QTEoFy=6=ZS=kR&nR/sU >` ZUYeۿؕR^@%vHf0*D4zE[&wce`ECI`a9*bH7fȉL%tAFva[+yTẗO٠Er?3LR^!J"1cZƞ \9Va2krT0]'9J\| mK*Q waVlGs-mY뻰Pr}n(On8(v@;}J+,r:|gr9*#0U"9R@qXD6Ɨd_q{4ٳj3 QjA (r2@?^#|j+g4k}\Ua|B鷨bX $? ufa-fd1(k "@@6Wkx{6mv}c)5E'?o'#oebL2$j\? n(D_d %W1P5>D — R;<2 *>a*ŦVI(%TgށџR@Q~3"AvJgoN@.F:vZ]\ʛyP+श/~L!Yҽ&`=~~۽D:}qr﯇vv hoLcNi:5vo)epu[48"fҳ)VmԶRoL_ŰAsh,xΆ7h>ةS*zûي\zM/sK$TdhÅN&X<L:mx6P& Kw|kf+VWMB\>[-[ہJ$Ô~BAW6:>v3mpFb<1 Ud5gGdqt16AϬ]\Q#UCM'HGt-_iaGjuEX2"ٮ&,Fgy>}Tg54Mv:z~e慼Y 7A2pddlH N(X\*HLSs!ܴ=A!5z&0"&w4H8؄ `C6.a]G1Q+ a.LقAlnA'fGf0 Yx7gxrl s&Ҹg Glqk=c@3v">̆f X({"El2*w6(:S|$)GYh8Sbz1aazIlܴ 7R=ڠ18fqdZ}Iy7q6mkPYm*?dEJÆm$/8?x]C%L3lL]3_Ld 59HHAkBP!~R|3{gXEәY/;s'u}$sFxKh] X6L/2~psbJ'Y ޤ|Le-T$m1JsGx8o.3ODEbj ), nCngcx1+|{h]1[?~~s{=pH۟eqwv S}=L($x2Z!*\Aưu"jMcWl+-+m3;=I}h uFE])kvHWl&I)uv8 w8Ւay",7 5D#qP,e,sEt}Yw:|9CQs.hX@}@n?I.kgaZʡQF˲*zG8>&=;;8= 'Ry$g[n6O^$s?at ћC?O`2zGęa8lyg]._xtUo^LmQ ¤D8{hDLNGrVrbq8#)E`: ~TU{&Hr$i{ u D,=wc qVN5),T88dbggE[GYo8cC$$(E"֘tފMzy.{?!4v6Iά{"t Uàڹ"~aA g4[~8-) aiX91أҫ„ZLīƣ^9:2VΒM9L5lsUH`D Deʘ :VrMy4zgSYΦl*A= }3 &R*%$U {qD1'k kX0}O c'ȐovDG-Ԙo .L@z,7\LH_LR!mRj^e!OW0wV -e$JmTӟiH9eXV_aY95"54?´3kÈ'MtOh/lpw(`LL26pxu: 5*7ԶCXrd.Te^bRQjNC]U#d[![/>!g]%]ְT"40f4U'?4bosQŲ\%-*[Za*`г.`yA$m1 Sחn1?s8=6??si 1ǘf+Ge^\k0eOFMh$rSADU0\ݠd-Kib&`*U]Ĉy2˃kÚR3mgp~"CbizAϣq?~`ا;zT q&e<">-{ K5\L 3^)SExݣpaF>+dmۢn}|< f_ƴ$NQt0 *m ֣)R{dFwRszQ`7ן?:U MpS:ؔ' @'p2L)^2'=)SVs DZQ^mt9&\ P G |qL%}  Oæzx75zL`sTJ muXISܐ6= ;vÞؠNЖ,ZS݃=k4wÁ6{TrWd>rG=j-"9ђm+H܅Oێ2Jx\\N1xQ)@w0բӴMȍJSbPj52T({‚7^­PP*>:M6d\0Mwm*Z8)o%haӢ$FxE3Aa[9 Wqܫo;@?ҋ9l%ȟI9_[TQ FJ>[D=5up"Cφ_|c|k4 䴴NOΰ&\`twmaH@u5]EL=:wMxJEBI}"fUIjՁNTl4@5z#J)Q+S bk 1lP)w Nnf#= z"|^c yHмu[@Dh % %"wۆ"H7ɠsA>5J7ZzFtQVmWvo7Vԏȏ;X;5;%]]B/qP碲QvlU>D@.; V !x! #,r8HW!J5q #@!5+doD*r.C (bGYͷR/#2pR"Z`.фPN-U,UNU7(yIٔkQ6*Rvzl:[r-[1'a9tcF8z"oaqWqe@SIL {/%^dK ++aD$W槆2]e_0 7#RO~s?zF?$o%l*[Ú9UH}lcw#􊌬Ȝ6NИyaCKJQvm{(<1Av"C65 _Vod# _dk4UvB|7ō4DBOݚ)0H9U/(G%L蛡)[ꘙ \ 3VYGvWƾB;)I+w;jǡc%ڐ 9dɸޡ?k+ 6`1d<5@^B(_~PrBe)B4.~" $b_u['@}ϕbbĜ 9Ig Ba#Ʒfo{GܗK;kjS5B<ttv+ρnH[)ժ4N~wX6^~,!vD.߷  &pޠJGB6-ϔ#d RSE1,GtpW:)gk/ SH, BUE)WK" @PDס뀺>:U]xG+pQ=rsgoJ`xWTtMʶTYpxĎ(L#Gc]}G?ER_x9N[]jl2, '?<4ʰrFƄ^wNLPaNd-NZKNMwYK,L^zA\ѫ=ؖ\ *Ez-RR)(̩chs J`'T n~t]k&FG2Jp\}ɳmqߗ;z-M~U<;y:7?K\,5jf.t66@IعuIƋwJ:v 2fp,+z%OG2ώej_p1`~!d$3kzKPaG~*A.k؅OF gĠDpb c9'|-c{L n7vL/6 g5t R۰h7v+W»f*험i-7^R0%Y%d-U_ʁϵ(^3ۗ4p똞{=C/U 3P['IT**gY?mkp=' ۖ޶a "Do|<}Ν\wU>UjfIm c6AL:op&Xk4<84<;8V+l؈Z-gj%/иoP Qѣ&% 01]0b/9TiDAUvh&EMUDç3"DQ`uSoW*p/ #}?w)NG'd1t.j cSj7,-˜erCR#*V!d-`nkG"8`q5?<8$06E;Z!Qo2{6<;rء\Cr8n Ɇ 2W.<gXFm[-l9a"cwac-n33>XڇGk\[CV );V=vZݎaǠ/{O;͙}ce78uJm*BGKҳPeO|؍`[_']{8=_OGh1kYO}wRM!cYzx QM6\<>T]^Soj,{Cg3H22RM5[WkSKNm[mZ7Ntmpt2.6(Zg6\_}^V'ɥ[on}LOЏ7} f z zY||B7& F޾IөLz^pD>I8_~eͣRDNZ/r&>XBc|06vIbi{8w!ؙi´=as`r͗Dq؇*kH:hza<}Ã(ɭ|=FT,Y rŏuu/x*:5$6};83ZkQ3%-Ctc8(b6}# ~JMLRvG?by f̢Dα)kOYAV,爣׫gZE<%H?g*y">m` Aرo w,vujCӅ{hHCQ~ +\W}˯x}BzE]Cٮ< -(8LX;]Lm޹"bil7FVP1 ؋X7֛-@l3+ {/3n`~sl lo_~mԟcm4rh#Ϧv,{mmpVb;oIQw^gJ4څq׌vͱQܫ18]|,̣ג؄q l!1decWxm3TCM6Q @`Gw}D+TVm /6Nƙy3IqyF%A\ FL3 e'FvJr'LAlU Vc.Ow$ߞ3)^+Ѵ?]p!<)RfeMyY/0 TV&=Vt7gWH~9N"H9۽O׉8ma).uJ:eMgRAgY2O/hQF*Ra%'u].RԺgu_2A]Pڹ"׊X$S TEoT v^@wZ}Mσ{k'22AN/OT\ǩҬ=NfH?uO(~4/RJ@:ꃡD2J-$o# Wxi8`Jn&78F2bjPNܨ&|S%Bx[(:N(OA6$I\( l`欨30ATK`$O@h0W1!{.\yq s_fNc+a"fxA7jEskɾ!Wb]NP]D#)ݟ ~+3֥ MOH:3r.#Jwqf8ORo=:4kbb>YU>c&>s̲nK|19EݓV`GRxzΰ^ 2ϸ'z$]RB9Ŵö!; m:T 牺DxcLK̨,wF99LVu5aVw5tuWϗQhȨ&z%Hv 3 [1AeRD0Y $=,|g2 U]2q_z;XTGS5ڢc j9V=KGO}ָ#kW-HFޤrLWT,5&NN5Oǯ2/Nd@VA xamtvv7]Ԟ#>ړث Xb}q1ocO{ ]fu{ς`VVc;ɂ r$b4=gM(FJSR|[yaԠo[\o ;>GswOTcv(!)N|sWb§ fLJ]kE^gE^Eu益>>_$`#cz6&圿gDwO]˹et١&d<^@ߛb1fU]z W{.j/kV/w^nQgnGZ,s!i!WRs4/Zxɹx5XQ /?kw}qz?=U!x,r\fq8Xajr+q Z<ct!ְFtL֩vϟ7Uu6y1!j?qG|L\c Oi=5_=v ~i<4Һ*r%%O2Wrr DuGC| }`ƣ{= 7U*Nu^ 2 ?6óvӽh|=[U+zBkƳk&g*CjR _: N!*|.'WZlte$I ;wd] wp2 piOInhĤ#ɐqEFsyLCY\ZC» COma٢ hjН -?a##%!zcۋ0E)42̈́ y\\$5>k?m4\<.DPIE_As_OdwΫϖԀ]rI ;UE1*==VUhdhs3OcB@RҚFFs݂Ȳ2?^hۼdkg}b9:Vsw0]PTaǣf,0E59#ȘU^e{MO?SKw;Ԓ(uVE_oognn :YԒ"YZBhBe_:b=ǿ9U"QDb$2w\7=}qiUI3 #<= SS* 6WzX>t|?_jvހJJ?'WS{7͛sWtY)HZ+Dxx#)p96:Ua=-I"v_7*zMo.RwawESԇXME`67XޮE&77/ ]RNjxDv|d N7Ogy(@[\-grIɖ$lRmZÞU^ann !F)2N9ey"*զ N2z`9FjEnWoA!{2d|&Jn=@i$= %NuWשd,q i:9z`RY#ZX02r0d4*0ugjonͲןwfG4G/;`r_y:DBezjf Wcm5Y92zMJ7t8U'DWuk̾3JX-՗{EygǟEY\Of!)Lh;gI*{9ϳ8#12-Rt'wi so@k(Tp$m{ի:˯8@Lsz3Hޭ&t"W I `z.!eȵm9_8L"ێ! Q4%O2usY$pNВm?IU֍K9-i'Nz*xoJHY!vaP#,M֋ܸȲ ~@hЙa˟@==5KvlGFj 6Qs͚o9.Z=J- +ʪN%:\gв?Fl0K>٥Œ+^v2P"=+P 9rKGJu2R ] 4 MdDN,FivTg^bmNd%.o/™EkhپJǗS"[Sl߆n~Pf9{DLg"׳vکyE`-pcv z$]^JmZ%2xf>7  &,'FA\_Z&y|=fL:hZWh]r__>NfM:h+*T=AJ*Q *x ?j~L*<|\-~k?d𙺹6err.\8ɭb1CGBZe T?V9apCXYJtWPRA7&]'@1R: 3Av9R*s[B KW?g_ѯ5#+,Irɖ|%xxQtCkE^ ='{{z3F~6}7S 쨡L4>Zf.Pӄjn͟:jxS6TBWj6DIi߆Zbe|^;K=c?#'#K#o7;!gƨtkPlAT֞F޸s8@uɶPnfT$!1II:I@ ]0B:vG:.]3E՜jy!X>onЗsR4#u+꽮:V/ؤS4Z]8DґjHVRw#b}Lf܅FPnH&u`z1U. q|t;ޤ|Ax+b% !nC |IP!j(}8~*_. CzD:=:@non/63YnlHeR-yG*||7]]II8WEHtAjĠ1v'U/XF_sJ4~t&(;'M1 8+A Ot)`g[PЂKg\Vɀ`q9sKAqY9^M AA(7NA( lx=Q T-: &c]J Eik/͖/ h\Ǯ|݅ګ=|ww_jjr_|ZV}vD_+orsI-k+s)r{wrb,Rhc!Ya6a9ߔOF|tq&K98U Epv0RFeOWꒁDDZh>|xy*7p.lRl_0`J ^Mr (;X흋N(.؂[BBВD<6t >aS5d9@Np ]MA\:{$L5(QITJqR>/~j(C4{B^;#gY`6?t`=(K5ڝ}; I_jSY /uRsPP]JA-@/t/nQԄtϧ5KkX"ʼnXo/^|z3]UgxiwLj3 @ykZUM[eq3l a#о%%DRp$7 >tw) ][gJye|6N3a{=Y`]4{)P>(g`')Z(t(5}*% |]~y5U#{¿}H5Dm'A  ͖Ǝ~h%#d# dn#^@0No5V'I*T1:OR@BĖyl/8!~ QT2MYېU0al6ls.ؤQ@76i"} zJcTb`J1Oh7tL #P8QvmIGN* F>A|p< w+Zdo@gm/ |nܔ0͎y:Q Q0%(Yr"gl?r/_+3E',k'b9 \ID ;OIL_q.V`L) MMך#H9i5B?,fe&RYM`M9Rtq-x-dTrKzUBk8Ub&\*+,2{ ol/Vn';[wD1Mkr3RMiPS譶MAvS3afj4A o85xB\2q4ݍ=kjViЁ<ȾϤ@6b( ve<&խ0Bn [|K7g؎YpLsVGȆ[I% Qdn"SP_ @KU: WCzjamm,yyp8#;ɜ}UCǰ`!%;32U-PZp2)@c&-) Bt)ysW.QMacF|ƌW1 G)&K3e ݃ǴYCX)ljdZJ lW#B@̏n|O gKHN%PG4kaYzSֵ9W2hq %cR%-]R_{AƪQO;tz7]> ,h~Ap߮ ߤ*_lW^t|IKҴӛ孻*"LJnnw?KTƌٻvg_l)d=^>Svf6R6Kz>r 7/6ےFC)׋tf͔\*\`f5ROLRS$;9Krm"Tr펟S6\0RNIeEU\ YOT@c{dFVK4]_<熇ȩ,A =D>18@=>d1B ^\1Lқ@! pM+w_ͮ;,+k{v=<5P'^bTۙ CZ ?=Ē+ CHGts2[Э^\%H|joY*RBk^7kMY!d!D- I%2gzG"گc:7nZJS[eܞLD۹y)jqWX%jQX,^!"wHĻ7M #4;VtYPj.D/q_7P Uo˿m؝kќ'qD OVvo"M~eÆFf.5z/Q@4n{Bm~0łqcto`'&Ey 8&\-gp q66DfejeYD~ٓݒR.G)2N9ew`W+զ } *~8SU`9] FjmQ[~FЯ ;:Ց-[Ko&by_gId>8?;>VyBrܮr/%&=PrVWer* ηffP*H&Wk.(?2.䡠ec75w"!wU5'4jպ^)= 8cӜ$??R-~ShGfQ L ڥoD@q?rCWdԖMh@#d5g'E[W(٪>[\Z{i[ŚF2xbqQ~b.cj젉$>"ku͟iJ?Zހo*%ݤ&w y-8̮,Dv/vqݥu=@3h~|osE<%'133fϻqcWџr JL#RC4Hk:r&<}i2?ϒ{}=a: W6v`.ZMsc=D Gp$$4 yH&քw8szkd=/q(6PRG! t9MSv^ :#$aG09 $NLWO#:GPU4ډ;[}AN?w>59,1WVv܋Ga [͖kx!_LoҿKk1/S|z)w& ,K&-ת6s:(屁k8&|F;'Y0uBI QGı`9S&rи˰? \Me6G[zCStZư@nCXhw  bvqQɔj=aGmSKƵEd [`HSbB*~4X;C0B#73TƖ=*OR]YS^ ȸm GPN(2{IEՁ+ʮn 4|=fKe)3[VBJ}*#BC_qNl^a|/C<da,!%EAr8+B#hyΛ a>i<U( Nz~9e~(Jp8Opw9Ab8BN€'F\5z9YFt<*ޫ_<&ߌF W@TjB Ʒ{& _tR43~Xs:5wxt*pRWʳ b77Zy-8I]QxGuvhGf?f"ٍlJnXTr)U,@.;[>4(eNŀpځ|HJ،]O1XFZ$:oFXO[;g@6ta~X݊1QUA2MoqfSPMTtuߩ%胟O랉ԯݮoP>)]7#'U5lً 9/\r֕NFy$0Ɨ0,_:Hʼn_ql:RH޿nƾsXD Rqd`'wij]$wi8WEH6ܶxԈ:s+t]+UF W/{[s(ra8 Ye .LH[^ܙdW܊ Օ-yoO"rUƲs˯UN X}L$'V"$$ӣ{B.Vih{G~oݟa7<Rox;h0Fh4I 첞@_@QB#՜'q"ȺKq(CYgf6]}N(,ɿ>;e ^!")X? ?nxKQ+I0;xeplJZ_ȁ)VQN*+Bn9DԴ5Y(QKڣGse""/9'AݲS>q^WT28Xyg7O-֒Gmά㪲e 2Bוu66%#7T7]^PLV[ (7K^Lgf9)9Pr'NĬUO/\vHACnluj%x㰈D?Q8nN"TV#@P~n03(\rd1$p$vܳ%ꁙP0`kP MZdI%nU~ʘI_wZcH$hCm4CۀӤb)W~{_y!Z )KX Z9Q$]|ì5"W^im,P4 B-2x j,蕩Rys|mFN`j;jBbyn"b:u\i60+!玝)*n ӹO2} q /n[sa ?f^fMMo2qb]}eZW٤N|j#,FPK+9n4q/06 mCoE{ M͹O*?$a=S"k}.o] S5>_=SKo^̇9ڱ.oQ߳S@#;]^ֶ%LY֑1 IqG VF x$\9gӈMA,v01[wa258=mػ9#d*  @Oϱ Sб pA>%Vevy~ҢFcտƋ6ó~G!?vH4! oB3,u2jΦmKX81A Qc o9P`C`t1k /RYRt<_DH#i'LOݭ*!N/Db"G[@o??d1pkBY1nq|#GhaXOgP(l%ŢTոp F8pZ_PC1HG=5 ){(59 y[JVq8|/F4:-Of!/?U_c;*+AX?Vp2&H+ < [đW'8bS0THgW`GXs+׆GLz|>bN7ϱ爊]Lг Y}l9 ̰7):x/| = 1״T`nhXx ? ONYdD{wt0*FK(>&V}DmZw}<1PjE!kˈ~lR&`O]/8Al9RvJrARK90%_s: .7x!ߺhozn4N^04rՋ'~BSœ9dgmW&ɅiM6f2#S ]q_\hYh8Hbw&k7\kc.lp 1B<8%Ւ`j|=mKY6K Rhͺ=gBe zcsV2Qnj#>]aeɊR oȦwΪ8ZԿ܇v'dAŒ90<&ϬienJgR_xIntųĽ|2:H&sPĀ/h跮YzY)<=k#e_FdMjIFAT9<M/+0.{.1(D[+xI#(Ĩ;*0_4I,.ȕP.B -Ojז׾7Ƌ8ѿHvGWru߿뾡]3] |0A ˔X}l 0c 0]~M粱^ҟ?gG%^*|)3qg09ceYEfq*joʢ Fp6% 7Н(|G/({Қ3^nt)FeqHP)#Q扳yC;5+,o,li/f$OD8 WcR8&.:P4.*y!ztd kWT\ͭ;iP]Zp#3Fk4^j2 & E0*cް9wύBʮ(-,/EV|"fL^!o3 RݯjBSY.q "Fzshpt)x-8*ʬ@-)y@w~GRd *v8yYt 2<"^P*ଖu/Xls/Ual@7_:4ǵ4FKc0ys)wHE֭|]'u}(M u`}'t`F<v iͨ׆*N9ԽvCš5)".` :7QC6^37(rcX }af hR:tﰎz/ţ3]CwIuvg\o0ZP9V28%7Ag(~gfԴxQs@:MaDMͰʓDVI3>#mSLΘGƺ h #nE o!3y4أuz=4T[GO'„S8&u!@=(d Zmp!ă{Il&?vF6yzǓaqH(T%`ol"H~A,E2V"qAzZLVjl,q:jm%.7T:NO;+W\6J(NrT={̆ޢ=({#Wa?DᎩHx0z kHM.o lkt_dᑗ-Bu K~s}y7V0+ ͦe.$,%qv"#yѼ Y w&4ްG Er⧞,wmZĿ5 Ŝ^Sd<>l|p0\?йW]?9瀟*^6PPXJ] 7lcY},$I ]"JV#b!•Oc%,CUg=PN?M[VΛ[tiZ+y6smӦ<܁)ϜVdsGM?E,r!֣bF3@ڟ=W>9'~=X. ;<Je.}#t K  Y9^X$)< bS+d_ DMGE1) x=24Џ ( uLp&@^`O"d;]%7k~BOέHC"">KDV^5S gN|P&X)toiJb7F H5ng DXoC0m=c+6 =%RoS.'v;ݺŌXHSqcH SP9~p)C?LĠE?wi($\[aI "d4J)};³RuiQ;ILpYroSjDj>/gG(nB\\t<4NHU0hs8 s1[n,{ǣzNtsuQuBp1g,CHʷ0b}[/Mo}83H4DSeOHkt}\wR;.%`LT7P%nח+M;/C UR~m đBџF+)k67Y5/E R3/GT6H9`ON6xGxgP[Y1x8A=g5w h܁07Хގ7yD |(ʖ8~׊xTZF6wS m]T{58^Bxv὜.yM}P9$UMT\^PX k `گj ,qW{-<lO8LCWA,/X? gVL 3y_|}CxGb jT%Le! 3'$?D[ŵʄƃ,:C,d;_P%njn{QH0I[3)Om)4P63a&w|>WR&U8f~m[#ҷ؄yX8G3y6_Yty.4*0\$Jb^vh"sLv4ΥL5Cy*?Ry*c42/E']!A:ǩp`<3*4Sh3 -t2*pN_܁uzU54 )-l SwxLw}I$XdQP.⣌L2qĭ%fӝC_g# %b댚n !9Q4 ܴTP,60(ΦӽA CkrXrA ndz[eN@:B10qb}0NG\r(z1l Qe$JVmV'&XM1,A##}qޤRxyMbHz҉G=Is_VD3U>9Qe+OTE6{xD' )i@zw=f}ܗE8%'HcHq2 f%5CRs/Y +cD$`V/PbJ.bdӫr2$fCcĶ1b?Q>f.iqRn%p.9aaɏ93:Y@7xB:7}A[͟Bn~dC҃@=`>|o?{O7JJȮoFt,ƕtJ^dgm=>tK^$H^}, @Hx?i(~H{`Z pRb'䟍qiy])キ9yltpɩG.}c-u98S:w?qpkp`oCw~Cܭ7[ nߍsAA;kd$YI]tQJsyy7*#"|(/oEoe?~yyeyTv`6\&|KTXY?ַITB=sϮU ƅC1jɎ.УFu`?1\Ye|ԗV@S4ޏX2A#n$}42Q[$$O ֠ 6| eYd/J}T]'iK54!*Pa/5k̳V&ѰCɓNmRc$>4zyLb>bɫ8`SnUD]n! y jZa]We3KM5o둉s9=qiF1V+\ V{vTlc%(kx4 Q\7).];;湟 ;&UlE(>eC~6.!CH ``Į'?  l[RR}5KˁthVkd1Wa'x3ۣPw޶5wt~x bHITz+U)i%oՎ])cd}[IX3n}5Dodu~0|3gp0vXCq*)aIB$x]PGG IG&Nח|跾_$Qjri4Rmy2qf?aNvh8~7Fh h{_!bUvwrK#lGNX2WTϛ\BS2X2{:VCFxذK~.Yq(Ԁv(lV::+`TZKb|,(mD "2 J)7QS T c*Kc5=ofy <ƻpZv\ݛ`&nKOum _7lCz϶lLxT: YVєl-v`{TA$h|W FJ*ǟfKkڙQ}xN1 "T2V+Qoݐ'C8 t!;cOU>L\4~xJ|r$5YAFNk3ǽEâpd12!8^M&f/Ѕ- odM31Ԋ˼%[9[:q"޹nc嚂X N(Q` \@%n3 n%kR_w@4>jR/ : @b͔+ײF)y2DCdZe*w+3|ͦr+ױ~B !1!x%s.Y4~ 26)xo~K,p8Gv"'Y=%߳6jHo+.Æ&tpq/}t@C%gQb~jZ'ZIm{a$"r) yskqF(TD0t,2 խ$x?ӣ|J䃎ܫAdcHؾaHqU9Gr^pvMp1#M;0psNĶ'N ;|YfllDK~fc!5v@&9TPwؔӑ' \ x+Fp,@ʳp썽P=F&}~|gx Dž(` ^O,<S}<&; Af}#x˅ڠ7Pl_ҁ,GvXP_b czn #jh0M!n:oJNsxW\lѭ}lhpjFi :n{)!KϵVA7rZښ(¬љ!CV4s2A@p>DrϒʃEn F<=2FhZK͈ڠ ҩ_ӊBd"6'la#b^.hh+ CC`- LGF[־{FY>FI,!S5]C'>LSUj=ΏW&d^[RWMֱ}Ώ_h'CSObuL҃w}:#S;:-tB^ ( ^f'umqȮqyn+C{JpD<.VZi 4FG'v0^|=-lo t6&i':ՇNlb9 iXvx7#כt1gyO;dq ]qek2?oޱjOMwZ7X ]TwC$tPL @] [7vK$ˤ,kwֹj1cs]+>H9Y( zَ=;(gZs<e_=v2]$ "{&>o`^>S2g:2>zDۙvHt|gjG8/.Gw=_-露|)')&fLQUS܎CfࣕNO]F]ZS[wڞU6-_0;$\IB>[ kd|UTNY90*8"d'[W(VΪ\3|ߙر}t&h6Jp3 rӐV dqxp}1DXKrs +nC^D[3' bݱG_/{`' 4ݹۖM==YUKK.Zű"mAs0 \e˶J24$>{VOeK3Kpa"R Z/߽ )֧ܡ٭Vj>C*'Тvs5DvyG"ɛ^gG]j[LX&@h}#mV"~%s VFػ ,N3Dd?Q=Nhjimuo] gR#8gD ]CtWㇵW[~ SFq.wMsrt78ΓU7܅%}^eVT /VZPP!!P`T {{FBOUjFJsb&EV)M_DA\˸+H?ם<gb͇R YPiE5(fEͷ=iV_fm5(r܄W Ay|6Dl݀MCvˈqT!8o|#xx5𪲺r61_Qzke2d;UМC{ gT/bL)#y̽^R7}]AZAER(hxdB+:(Y"7Ow ّ6(Q-z3VQsL[EIRsApr'+lTr7JAjV,cB5.P}~ԑ!E6o~_ŘRcW5L|/f$j3 T <.^ӻׄL+ iMSr5v!ع[o&P<<:(tIo?ALCJfƻ5@7vPZ+qpԦCa-JRCʚ%2nisA=Pu,C-$<'uk+mslc+KtG>"mb"#Z{w5"ɐJpNݣ)Es$5=_57pDy!K+uɱ'DZh&f.{zzY*ݯl%FC˓N}%jzDw.Dե\3Syfg{~qK7@PZ2㙤=$*C'͕;cX. sv#a:}>og|s/y:&[gLb vU,ay8p5,uPz,l737m%@~.w$za%}/8UI=X:)!Fnz}WNzlx-, 䉃Sx86hYYCם_+:ˇJ:#.8x*{H7%v(/z6Տd8ߜ}/:BTU,*u~\FPCS2`N 'X3/lZ~Hz_9֔Ҍٛ/3.V5,er{:ins9Q2ʭRj T=dÂTóv[W{y|;:-T'HzaF¹8 WL\mF62(` F3@mؤ^`KlXӹ'`99z{*7߸O]T  #pG:1mGXD5 nfS|UjbCCi ,~-L 'M֮Mx+mM=WΑ8b yʸ GJ_Ǧ^'SNs } :+'2n;aw+fSm^C⑪Yp3=n섐dO]P p9^~єVSKo5֣.N϶òyUu@jPH͂/2sռJYD+s/#> .ahWӪ;kϺ4(J$MnMytXr9EsdF̚=;O9N6^T%&HRw2WN^C1-g]=KsS'88:ON^;!7XiF[aEcS=E(R ԫ9jB0{5zIY;Ykhk=*Ǐ*QF!'|3]`L= /<, e41wUTҶ9z2^*.s{3ohq l\ySY-%`G&`, 8?;NƩ+S&В.I cO"͈-'2X| B:Hb%z萢NnJD\z\[\0nmyjB'k<;8jj[ۀCzۤy!m=mHP=%=}9lYƾ$c. )DZT9Yg;%?LU*^@ٝvrV0ԡߒer/׌-'88Y׆3m;ޭ @umI' 7[O*2a&RLDXT7ٕ %E ͖'%p:E[h ͛9-/!|@h\{-OnB:G 5]ӓ\B0kX S|IQ3N]cp/ƓIzhz!Y㣳OZBQ)LA_T8"kҪfSU͡jFpq_\K sL l֎G#sKW1YCJjǓ+ߧ2.I{h_>pcdG-XObICD&)3dutYPJl})c﫢VUVIXۺ/u?3'`uݦ'Iّ<vUVy%NL;R0 \ 8]k3ЉFD|M ٕެZگ|Y}kD/h&wՊhq/A'hVmU*@b1ˠ2Sv~a88AHrAنCy?Rq>2/E']}Џtr3^%8B[Q}кIdÜw͚T R3k; ݆1ʑ[8.(zRc2Q8L=^k{k:"owԠQJ ƪM&?njD)ɥX6k;aKW {iHz,צi~Z)/c?B OczwK'dO%2B ?!ObM邔3i?w,^*Cx,|Uc:AT"ΩgWك"kP߲PI)n_R 5:gѧeםs'9tg,%(LɁ?|EIb+߹T=B$ ò oB\$h ¬K@ 5B-Y97N+㆕jg`pE1vC_/Ϝ/??^V_l?<~#>4 L+E$T0i:(<&WUdI'wvt YGEvt O@ҁ8@*e&&ՎmScjqx`T{'NW`ۧ(HAN)Ȁ6USʃ*e 7Yl 5&fVO@9 氋oM\J %?M0N!='dT el(hAɫzA&I0b^aj PLϩLb^թ֧@HʴD$[;!FFЙL?1N+R82QF<)Gp }g*BUWD^'JlwLj /EZ%H dTB)W"WRIHB,d˟9m+C%yO^ 9Jj@fSJZr#,az^aL:U\WD0/WvF.my UeL)ص0W¥\\SzSL5R;0Á\ҵ[pfјa*RLAG}Ҏ_-v!?lvbļȢH6.-HBKq5f@NP+?4ۥ Dh5DL,&A$I1nZxc #9<+OyuC&! ildR!b=3IJʅјzqfQ RQid+TBnǼ#ڞ` ^1irYHͬGA<є2̏uBBQἈ$iA;/ ]7#{^YiXEgY0˴w]?ӀY-wEmR @;pSxTj¢[YbJY5TRt*$NJ7f@Lbcq ,3A@vܳ2GHNԚ`yDf^{I#KR(=U,%.{C&k?)5Kv:G!uϰeeZ&Պ֗b0V4ϛT" X*n>/!kVeZefi zss~~L9u^FZ|7ATq14Άqr5[e-Ȓ MKXGdk* d'Ĭ^%{*< Ӓv,6wÛ֣C NF^H9SlaW}c>` "| !=.HhR<(4]|j8YB)'k9RD{1tZRD-ÄEͮM+e(ZJ[Y3 &jd6'c-+e{8 $rMt䄆%őlB'w35z>vD I6*)wr%_Q6|UU&s5I5}+Wd4_$rM |lApcs*{Nƃ޿i5@7dDn|+3p'ʕAh=`Wk6MFQ?éSVFav,0|SH8(NuW% R HЄ~!Jn]9;DzCs2[ȁc'#fg&EHg_!p f7)Hm7ya@QKL0G-*:MGA;hগ1Z)CsFP>g~~_&AÂ$0Y}}r3R鐗Hd^:LM^Ly׭[z3KkP=Tu|-%aΝڭJVt@9|=[Y2 S?*MRza}f?deܮDf70R ͰyntrB5&LΉiPRJ ə{{X,w=XF5~MydS =9ڰZ &jW5L\8h{1mT@Hu)J~g"HpY1 * Uh-j-4,Su͎3>*"]VP:3k4aTFZ]r?$:3-˦æҿX6ɗiS蜐+Qlk%-(Y\X7ק&H3atLT (s&쥟R:\Nromtt:f\63XSLp.’3%Gs9l͍uQx-,4%'JRl,Q U-ܿLFr1bPgo~vw`ObC?V, flIЯnH;|ua}poCn'NJʽXܦDQ,N =h:;n,G7,W)ťQNM \K+&>KNMM\JYs fHL{NbJx*cR v}D_ꦀ5أN?22(EWQL7dr%#A$oqMI>|uH) FlCAŚ^ABS>+k\Lc,٥YnVFmV*m1OO's:Nf﫞ܶ T`AzPdԅ0f)g 8Hko?ڪR{!F/{,wZvL*Th &TTJ5 /H0퀊I8+L?\-]#}*ґś8"Z-_YB=lAA:>< }s޷N.BDZ4~J^/z4ӟd[rwN!g{G1n.%:BFA U$gK".6[Oo RjZyy:Ӛ  #T\L HpwZ4T.Bsqכt q,~rt;VJl;  1[gY5C Y*60 SǦDNY& V"v%Vsۢ7T-ם{81.(erl7p{o}@8Ho;otpziJi'Z֋̪$ H:'DmLUUJ:JKS0؀ PÛބ8^YPv͠\t׷,5oM7d;ʙp`jJGi$qȫԽ~5s^n#?EŌO% Cd$ d/`.~c̲v^ejMrxxr^>FP^G]J** Q 8=DJ!j x=#7`P"Ը Gɟn~DiK Y M^HeL 덇(d abhZ!E'-VOx9L\s TΒ"a>a>@0tNER0t@|П$d~ez%@g[e @V-L>P[nُ  7pQ+ط} d w=|;QRhS' ӝK(F8S>[;ņN1:d .'Yςֲ43hL{p( $R뮷h/xB}z3Ygx?v<Ĩ{hJXwDgN\~<+alN {tlrѓ*$[p~&3p"~1 ; g܄1D>zdY$ $o/GuHj*-0T ĽV/ ;tG5:]u y$M@BMot-ɏC"$#ow앧Y̒ArD$1 jj㇝Bu2̔,$RSfۅ?.`vϳlXm4]}ixC\>L`jzPwjSY~Zn6FTo؟ubKu DFl,8@MxD(l]dR8a*GW Ö{X"o'xNGuK| xbW䂮f ҏ]!BP4%FTX@Ξ$ OoS""8Se),WOJnx M_*DrL\ബUya4KQp`sY5(x-Q, OgJTN}R+AJБ7l;/Ƈ| lŏUw'snjZ%n,n5h Oۈ57mUkB.:ԤA,\7 `04Յ~WP*I>jYǷVZT[(d^rAtxmj'Kᓤ=)/^u~Miڶ:H:I~&,J^`%ۋJiN!%뭠gor;ΰy;dU'Lv)dWXrCAgTZj^ 9W?~TϿSt:Nƕ-Q81B)8Ȝ~2Fe2PYPsCgjuUy11t~W#AxR>ha>CAQ#zƣ41XZ1Ӈ ƈ\$\]kh.L~n Q7z oPWY5i49RJdl|ʎ~>WeϲLbRyTujC @Nd' 1TUl 1`l3'H,3$V* (C@(!w wH<3ɑ0T8A8p*?>^MDSKȉ61N)K/.ma"& ~n v;rfge h-m8Ӄ6},<] M-!3Y&tFA /fo=:P!ƔUNպs/kso>m_h FY3M X)8Y0zPd? ]hquAg.J=`$+XBc[rkBבG6kX!*š6{E~xȁi:%BTr H6|!wk/ݞOQP0۬1A.#C4~|= 5 ZL{2K숓IE-tuĿ?Y5?U D俨,mzʖDI idbL.m7j'Cr!Q{ >+eϟ,w`XV#-ITTsYa͒ yRzfyi3ʇ t,:']LĖ\wETδ3fM'LewZ%\hGM.$eHZrDNdBV?ACdtŊ=pP^>`S 0="3$=`,"O_dVaÿmٽyj4gS 8|TKz-Fc56B r ]Mr+u^*h3NН rfAwn'hFhΚ ف*fBcqʥXKc Ӡe@8k.:{М ]9Sk7<[uJs}% Mį<ؙU_ v?C ~rho|mvyv_}E}A:py_&AB,8;9'_rχ4n#'12g_L#E ! (\KkEU`,<.`yPPi*8^8ztONIT]Q@r{gBvvwCK!"|RG"Tj;X ::o]ИɳtGJ4)yaA@ ~1.=\xŸ\M#I@2 "q2Ppՠ1Q?-׵FqF~[ #55(\\5!;^c]rj['|wRF*+*x{R?r JE _* DQI"רftڀzqSt[;{fc=!1In{HY;;r,$_1 d120<œ{O1! 3G*tuw'5?lVsm\Pp!Oa oŁ  Qy<@jiC^`AWFG;78K[4ߙhe~2CԄW~6ǧ;ԭ[!m?Ϥ~doY}Pt#4:= \)xBÏ.7vh'b.̂!`H"H.%Eh|@T"tI*S ٽUyp H>лqpmm} Y#LD$ DMp>15}h:ktMB(eBg<Ƚ< +ف—Pmx_oxsnliX R`$OvqpHCuaqkEt؅%g%d6gc!m.t4 6dC"$V=#iS?ms!XybS͢TQ , r%Mn+Wʳ>mj@uJl4\(ZmjXhA,,(EJ($5U{ m{THWEZd'C8+q:}iG#4؇DnT.$dGwfTj=_ʶ"Nހu#zd@P@\B]U36NU~=Ӟ੓:K :813a+cP_fZ[/֛˷5.hyYu}C|d⪼!u|벬ĩsd4ޢmT6+0Jp|Ógp%BAmKqv힚 r7b@wXZT*J wedm9@*Bl$UVrkVvN8rr [V^:왻pC96f )~Q #gݰT}cVP2D`:|Jaг89IJ|}E[>'W߷T܋7^&%U'nRIoxHUyh,Hyȹivk%x-%(KJ\$M2 2w*~hee󑖹rl}9P0iLeZkww{Ε2XGU{ο}H9OZ}s-ޣ S}c\s̊OhI(j-i.(՞\DB+[eןbdL2 Q*>![ qBi+-֙`(W."9",7k-5EtMYJ-C#5s] "T|lP䛹m7HRhyg`0S0ߣs4T Eedr5.~o6cᴪlNv&P8xk8I,Z'o,jQS\TD"dPI"NHr"])̜%;,)FKt2g*9AxBjꇰo8{(ާ|IunyL–Q9;`Y%4ޗfYTj>Yl-SjrDa54[ز(Kٷ}gl6IR6k^PpC3rVA) 46g, 2s!S^d^dm0ȧqQ(15Ww&Tr\P'mK<GkӒJP^=d "bvmZUmγL[meb#-w+{m3bX$uOh[i]ѥʵXk.T?ڦRN 5~&!')͋V3! f/o,hsCd79F87vi~ #piɶ5BkbZ}<&OC]y'J]`"p]xHz71:MU!4_ IC>aHei]9dĘaB yH`%GH ^|eM+حd IV,M|DzY}Lơ6x "Ղ#Pro3I9J>hty*Kuo#q$i=MĕC Yv+L/Z7">5Z\I?< 6Z~^+F}rZ؊J׼ZqIB:U9Oe,6%R*N%j(! pdj:u2&tn nRzدԊ5܊9;(1VPrjrxn F_M?P*T̜_WGњeǵ)yy*y4:R'R:v"jnx'"4++gAbĒ9k/`RoT*;[՗/sJ_##Ky"_LBdG3gGgFo+N* X*/c G^ّsy0 [)o׺yݓ/zXݬJmY*0fM#&X& \;J}൸1\SfEþ_|tـ޶['Or栟qH BP.D%m<U)cjBoM`03{4X#݌ʺ,>!|h#%j !GO.ŧ?#op(g 5|}RM3ZwTh6N/%~+;87ݳf#N:'2l$}vn!Yo0>͐7p !dxzr_7ԌXj$3 p0J%RO#8h6*?If&_Fncwqf߳>p`>lTvDDvlӐ['F1&ƦӍ1o_ז`u^{ط6L739W/e*at$SU,">:5bf&mk FpAFֿYVQ~aߊ oBٍMZAvۦoxE#4 3L3{dP@%h^:{{uf-mEbz|WX.JUG&R ]\\t\ta.V"Bf1E<`^p·kq.8ㄽ-a2(;8=&ۯH3UwabOseTyPIV*uYaF0R%#QEzk ֚S¦'#>I&6ǑLt'̻_oS J ɑ'ٸL o Sz*}55";KK~ycDtu="r$_@=J}0I"Q LDz)SbNɝ" e7|8Ox0J%:0]:!p<˃O-[?) {"x_|2N9F) d#.Vqqon(%v@dN14{CʆJ}=)|z|C{eϲ1>1w`+W\6n)/Ձ}!8O)r!="t U/_jat^v1k%M05@C~}-iCRjhНz~[ Dj KeB9AYTԭ+ܟLGځrGi7|HJh%%:=VnV\Bx6>*w\tG\GB[FQTrP" MbT+7x(рQ){^--+_]Щ0G:xcaHnP&٪)*t.6~΀4s'Ӹt5L(FƩg:{!JT5aQDfJ~ؔ1/Żш>kX夬^~EFyS~go`H&7Z6UcRJfWw,wߤ0@{^[+55ebw\B@`u[(xrWӿ~\z.%\t7sNriGt*/o#׼fGKwun)Z~i:q:kwuOwSv @(N )ldcQcCO;qGP]):ND*L  -(K>߀ܒ{ݤ %[H}VOHꋣ O{72ӟSb'ܸ%q?sg&U.[/>od^{~W6IS &[2 %r?|؆'mԛr>9 dߌJD4@9N=׊ALV2ç{My)ΊkAP}k,bՎn5rk 4s H-.}Cd=bX6I_` MKjt6!5<RD/w /. ޺@a\4&ph#8>gpk_9a>䗬g4 i7~;} 08& R#7?"N γȜ{/JY[%A.#l3l $%Uۻ8isOvM5ǩyW7냓DY$` Jq+{}NAf3.c)Z+I!(tm;)JUͨVuc sB{JYئ'(q,CƸ'q(qKpܜd%^={5,0U3eXe+ԅ6TJB@> 8HԁRA9>δJyS8"!f S AL-ٍ TѬzWxhZ.mDO1D@ߎdi2[_XpF3EdߛܓH`d"&{Slɯ``YՇKu13M*NtLCgZ`&a̮k% cQ>,xmNH4m`iאm =wפ!ҡZӛ "sxtbË܇,/ :: 3y-kLO,p2jS: έ5Z!L))k{uRKlVDjB)1\\12t*TJT$.Sz,#=i!u9405,8&p>qsmVoXvl!(;Rv bdnrX~ΉI*~>"`'YI^ V߿yR,I7 f'tF$h8'oBeAHK3oְ'dDөh(Ϋv8ѥ&u34KKG=V$APnz Y+|UVa>&Ő0  @|sJo1t`gJ`w'<)僜A~楡€SHE\? 5C.] ]LjŇ ƫ'01i\H ڪA79?&2G;ʣQ{'U/_ݞa< myBw@ъL dcD֣DR) 8g-U}.i\p:_6.}T'lֈRoYtbxFxdtf:7UF&S9J8]կ nSwHЅ3PdpUP,*S 萯0M A0@Di)rLgj[I>K]>tZ.5+ os%5\y2>-{M0jj2uҁ,JnNYrŒC,ô2!|e0OXd5ekb Tb#?^`}E@ :RS@pP7穊-q 35%r َ},'&%:Lؚו4Pte@ϾQ?-=.yGfyђd_d;WW܂c6'ˠ}gN.*~9 :[P EtZWWlN:Ъ1o-^cz&X'bu?dw%pyvIixm?Uw?NLghy&}1HhL伸v-_**jS[6眲"}'JSMOL- 7ޏϾUԣI=w?}'9.'ZIe1Jϣnl^|>T~w>C(m8e'sK /:ټݰ+v.UyrmQ|/Um-EV9¢[H[@-Q/XEbB8qA\(Ę'0O״3qI|9s}^}pEBaK@sEqY;)vm\$@e!J~:#ooဳfo8Xx |~gp_]b#,o֐&ދ&%CMcQJ>v֋V G|c\mS:ZmItO;hppmmt5N%[0oߟt09E'rHa\A\pppqBA<4x}Me4oLapmk;=WΡdDia׬6aTz՛˙QsrJ~_+r+ oBϡݛ0~7(k՗8R[ge;^$ˌ{S[V1ܺDԹ0On#Мzb(dCWxSY fdrbUБWYn$&jR$dA>ت.(f^<(8`*KN FDOi5SPg az]pem*KoN=P,\p B'Dmz.&Gp:>CvIUהp ZWs"U{U4+t4 ()\q7k bZc[Es/˲V^|Jk%wyԋO(iFo>Ct0#5ZkHq}1 ' |X{ƔYؾ[v@}ԏBkQD#8,HYD\Nf5s.h]HRb6QH5Q+!}X+D^M@)P12\]#Bl S h*12D "WU0Ѧ!KJ^0Ajۃ)ӛi+YaTl@Xw3On{ftZ-WТR $&͵ ^E]}h˚K ;MLF?Sjld0C2=*C'`a\>i͇}.8hR P<'LU 亂sWRǧL{W<&) 8f99Юomg a1a"·3U^6(2YqƂoh6"Jw^XC ޥ" Ȇ5_LVV{ ig xy.[şT"*  {%l]}0$nܥ=t}za.O/>忚^OgNϞ 9IpҒ:*BsZDuum`q y E3|Wd^Zo:$ DylnJ7ַ*R 7mDsO:6[ca"7TCs=\RFE-A(;zF)L̮W7<µNf?bהd)k ulm{E.4nC)uNo g&s 5¬zHl<*bT恰>m̀ی5·=xꔅ o HyBv="ߥr?K&0p>^ {]xyqtU=fG-%[4\Gv|~t|L`SKYvu{G_$=M*;6(aM-$TLNMMC#mY>Dx9fUC9Zgt8$) fB`J2s+05|}細-.g$:Hxur@뛩$sL=|ROj0"*H.d VV1#嬹&3+u.y42qML=%;+\JEs)\0K\$FA6NutUt!OL=~ep@<)gOSqgC T]`G{ wTo0( ,\e & # s_ꬶ ,ei2+IQXMʔc~>K6R<2kxȕ簸&WgUZZ" ^F ϰ^PP7ɚ;o>;})bYKJ'@QҟuHt l}˞C(r9"^q7ӱo]B8wd7^fT[YMd}ioCv^Tc[Ri"I-`G;|mmuf-AEFs3z*u9KǶPpPTA(IDanWc]m]~MJ=z3"7"0."ªB %,EYuT*~n`SYGMgZ#Z= #TbS ^fV\ Oz )ex^Y ,'Y\s"gR:,"VcK< a[/{_&3U3B.-puFQ'=HF>WhN-w>(I X:qonjIG $qIW? beFfJb{{K`LlnE'n`Y5By8Hȶ=xG;mq0PهY@3S*7[!~~6zr+b!Z+M :5^.IBҴi9ޯ,c[ﶙVRa+GBڈ.L%N96tt( ) +p(!j3mys[~ØrC& - 35Җd!L\~siDKGο/) &(d{>p(~u 9u9r,%94KZ9!0£œAT^B㉂b8KbS۵2\0lLoxaD[|6VplJE2.Q upD i{/}R>nn0H}?U4+e-Wɣ>SHX=)@U %3V^ 1MP4}1UWQ /Fh *Trj}NQp\B.att#B/ [ 6f<'P*8mʪﶂIf-ah\3}iMXtv9rM]ncNP灣dcO{К"oc2ĸBUK.]'9ȃBut-Z%M`/xٍ: ,&h ȓ a`5eCN QdB\?. #W X/(Ɩ+EAvC Y\u*߻ƃR `/8}dƓD1i&N9V;JAvĉWtS0B;U- e`R2l-Ok][~ol4Q"&Yv|jKJ^tcKIdA 9Nd]'kܗn3g'7r{ n=Q8!3O?d/{W$%)7˭r " KLpEꈎ 4^F+ nG P7"s(ĔۿO,!eTN5';AZ Մo9`{mvE )E7o=GI&d~#mv4笶+ndEI9-R;˝FLn gʢ#G-B_C3GD) F1 |d<_߫Lnmr>&w+rDZAR>nGMR`Mb1Nߗ7b/;+6@,ӴUKQFU ՍjI25_sS 35$z+yeAU$SL&cc&U.[Y9_*29ǓZ&uw[{[PکqaPK\WțgV%eѴNY/a?[ӯ=_޺E~mU썦r8gpO&40 ivxT~v%qx .e4HV5:@zpX>f^TrqPaݾ@ :Pe]@o-Ln&IK]*k{DW?Ն&ˢ6QJ-@,2qj|݌=nuC2z"nك{zuͶJd@ZCN(8şSE ͨ<ج82LU[ϐ͹SSoSQųeNU$_V,1$J J] g*7?қKAbN#:~I)2'IVl2k8ij }"- sPX[<^Lo>6on3"uްhmWbА_Ȱ(;^F~AɎl !u??pBk|fR;,QzY͆䷌QlCW$Ͷ%g!]Eh6ɴy[kZW0kp ;XRfH˶^3e{Py!Wؑl*MJWXtD]s9v]9S+L98&ח/HXG飅'YI&TXvBO [NY3kah:vaFAjHYސ]\7p]0i)$g\ q\th Y ^EQ>{$~-X]f!pߠsccH3Z5roZD^^CO\*M;&]&We86el>en<gR[iHN)nb3:%Pc;80EWdkEЂ:?.½FvX2 m|ʔ"_7x7]{ w hAEl,|2U:Hc!kwm~U.UWj*~d"翃flZl=}lMM!0;N40[inCi^bf x7q>ľa\h\&"~t{Rf99h\ͼHl抛}O[cnEHދ>}K/:SXٛ&+dkJZG\y;B=RQqUo$SEQ^.7 TAՌ+H~5-gyz7ȩ'"CB>|SB>7!FZ:\!rSIM%РM#l1TCEG?U+*7buCʶuSRz:"V^`"L &0Գ\,[Mۮ[hȷ,2ڔ`Y^rB[.r.۬TO+w<(YHjs8n;@l󇞽ĠIB+sb ,6z)8f =(Nm&S>`sHvDLVZhN7s06&qv$55fP\lnT_B{7oqx.GA*Y얅e>FSʳJbEnQQԍ y-00Ԯy6S҇׍J=ʼnzR6u-e1dљ: )V"^n*oJ=),mN>J;m++sfC}}%[;@@%UIO:oi[!a#tB[稾3ŖN_KSAx# {lC1esAaC!C`̩6QPȰw,CexY"YqzZ3pS |x>mNQ)ܤ=qPk$eħ٬|ތOfc bΞ3-1t+El4(UEkuNLp^PRt4Po>q\Ike_.񙶑#d=^P2j<L$ʭpdQʲRJ|#K<_V`8F}/ג[ LÁF v`ehDгmclɦ߁Ou ]$"."vwבž\ f2y|C>b}-] 0boV"+CWI\aOؔKy>L$i<O+vdXKw:Ᵹt[.jk\SVݥY*kS1W^#} dc21~:HzX`K(X`)68l# RjR)kԛQ+3|u˻ɌMd8 SghqiuU0uV բ7AݶMPeK4^5a1OnhGn_J UH\6c-%],hn0 B' A+"Y2`*H 6huK7X'vB r`[ª}/i,c8<6&a"V&E(5Mєֻf"RA>oeߊVcp& gXWl0rVxˬ-Rk T"U@E =w = D B6;m;op&k@U=p^.R2YMKWkTQXkmyɿ3h_ґB͋>ڀ%K >|1  ^ 4Ș>L\E(D1Jiϧɼ?k^#hF릣w[J{$;/}祧kڮ^u*^6AEx*3ʨil)D@@+YFV9kdCG|c5ٲoU ]oͨ鎟e[M]sڨ[6 Cu#<[8ʏC,z-~4XBntф@lW-yߕw[oU+/wTv//_佭[\g>&Btpx=%?>?Cs{VIq/TT+ #KnPUd)& v ۍ[s7k}eA'뛙(cY(ڲH{T$6t .NR ROWݏ4I. m3e=ܞ z<&[m>o1P?ɩ(~2& (kj嚈M8" $GjlWDKP͠ v8,"`&2=a3ߌSV"P)LqN򙨵/N}zFxRo KGo!zځwvRz84Nݮ8xG6vϚ89wˠH~}c٩ɬ7NM\ff$dg=7㩔XKnfukƳLg^?{h^O Lݸf g hU*~ULO=X)pp":Jf" kOjGYqI_n$Y=riFBn-0hS[agm]^]>mؔ'M^=tUK_?*E!2rYUbY} VM g%A O=LuTVv!:csjn U1ip3n>PQ>ڜ.[şaOR* K/My6Ԁ2ځX/VR]) CاOᲩS}zQ&i}z>]߫ZpRZU ܨb2:Ngɹ&ȅk Oj7ddDTi.ۃdhZ,d7Ƭk(Q?1&*8)oaD-%[fM!^YIL4:b8 e/)_D'8M7"Vߝ"DR]d>?Fo"Йwp݇Q-wll#\'>% 01K4jzNݎ(Q dt2IHHPb}F>Qo`M=B$A58 Vf.)ͤfjx?M/TC]~4`DGI[vN9էwe0Ek`<\?߯wSP-WI6?≛x34_GAk S>(<߁dOHMTҞ[3!aEcH2D5k3D w:lp)Ȳh=/̎4ӷY{`<;jLF0w):uZH%{,f3LX6H 2HuW+ffvSv= 1klAO}>8*JAa%V8)t͐)F<_\ӟ2pVuě4 M">wZ#=ԎʊYWT.N$oUre ej_L߇)@~֋Ǘ) 6| K \'ڰGiINd /%]##bkf;"MoZ`vF6b6 MYƏ%gf:H٦ٹJ{+67qFȭ(#BquqMp~KCmUx)<ڬv֛*jr# Ц|R6Y) 21 msp7R@CXLqj*JmȠJoCOKăxx3Y~ 5osit__q?Pk];pB[g c6䦬v,2Cmd.p!)SsL>´>?I{ۉ( gܸLqz#vN]]b"r\^(,LYx ޞZ~Ϝ(7-6< PC+KRoLEϔ?d-JEnd8Mm(z,͹u"璬 粑͒c,bh0H2+9[`~UPѶ2'˱Kh("Zf;M"ޠ1a>jGimV'E7K༎>Qq@{<ᏺܙ #M3\qEy(3pEWKM}砶{%Ts%--M8^ HbZYy߻_D/rʟ{U,"ur/Z%ypRFZdЙ]ӡ*W;˦gvӕ+(NCJֱ G2[Я(>-]Q:gÏ閲{3\Gټ1`f!h-i2й="M!k?Rqd@b^6 &{)N$ K '=(zo9=J|X.'Ѝ.wRu&ے8*2lL֦\y|JU$XZMY $j$="UWtY?21M0$wrG"j櫭͗;%Q-A$9rܒz^[/S&%X!X.r kIpxim]ojoIDIb2va_kUV\T4';÷d"jk>ۢɷֹO?MF _AW?拒]jG YmEtфpkgĦ#5mV2 (5S`fEN8-ٗ}Ŷ\3~L6?$aZWK$=/)\b<\wweJ>߬T^@|eE;ZSԺ'Vjbmۤq,i/=p%w=B@31pۻ21W*a[?P%(P4nYK0K"2b G2Gե"%N~vz1,90맒x_Rycb`0HːWbK!%)ݤ̗'Gx!{`Q,l^PӚ]W Jj޽&U.[_^9p gt>w( 6{!{?(9)ܴ*J@ةȮDW9Xa. XT6Ղ,L%VKcNWR*gT]r5kq/:2/SPb P)SjPOQyM6])]NC Ϥ!دg/!cYސv"ނAl+{mIEc =kl=9u1~vۻDDu h0bM@[@~YU7߬e!0{1}RϝQ=uj0ͤUpO6m$Ih=Ge-v' M¶Em=6J]i($ۑ2X (lX7p_y{c77v[g}LA%.d-s=;[8nUr"rU'HswraJ*(t.@Gֹх? @= l*sSa6RqSl6 8,6T]v7÷ Q׿r66j`ddk4uvOiɘB0KS,)5SoJrε:5rBV~ Iw;L&qE)@ *ǩDjq!ߙeyR! ߩ7k} 8MX5`+69H )%^S !2҅-%&&J'fF t AiЈ(*qoHp(&GÝyz][)GTh#fWF]nư2u_Co3lV}y)ibL5`ПN'AxsN#j0lrv-2U6/Vel/DWS0{gP`+ksu|6aQ*C*7ih{&:[`οVpRYayRLrReE;lC6p(F(IۈUo>$D R٩"Y]oq L #ȧu[/ŽJԽJBIQ  x˄:a ,Rb]r<[c,]7H A,̪R⧷ɭ\87[Ycݸ:s` /԰!%Sc*NpeE~:[ C"ţLPC]g7Ab܍r̳D"Kd[I!G\'5Pw A]1W` IW$SDdvqn/oh,WE|psHMG^zܺzgA6v>LV]~.v~~cW] h+d&'mElHY`90B#rjpCyJѹav@k'R)qH 9S1Pd)M|jPmH/F~-'OW䵉5=>K AW뭒8evNeo*P.EÚFm鱬o{'#1ma*ƄNId`(Z@]@;oQ֥]oJ\A5XX)RM}3b|]r ذTNqڨXp()8%֌6iekkt~U@DvXs m|ʔG_!6ڧ pqat u;TMCi4 Zo? ~ ~S2Qf·oM /NًE~ާnލYI=BLw1ܛrԶUg8vgc*մOՊʯ\ݐCƷ[udݔTރºN碈WFmh;ȈB'fT g,\5XnngY2)캅|b.3%(4>|!^y6S-J&q6wq>[d -] v1_11bo_"KCȤ`aL0)zٚ:/I֞yfOFWBHXu<{-Y˹Xm ^4ָ,K=ގRHK_^O&ˇPinxYVXlι3o0#f'heʷ]REMflXE{p/1J)Q` C~zMvo[ғ*p޶!7([!d }RB;+W>} ,E^6R`wOߍTiJߏ3O / >JO(]a ї?/g:/4jX?Nt:/W'[Z,]l[y!b]RMaKl y{,{K<<uzuۖ~  #a0x8&KDeJ|zuXE4Rh-ڎB6U1opF#@U=pu$DlHA"$|kg 1/N61F\2nBM)Z2Z2.s%˺|YzG @d yq)q360e6.e@`e`JSN Lt~,@TCMT-CJ|s3^uF8릣Y& ]{Qw^`QKG7 ŀATSQ9t=ʝxnqަԳGcΣ X.T,dsi VTWK{o-S-Z| )Y]ݞo' P*+ȡm\yeQ[iߚmE6ԙNp!Ey1J!45Q]!qzOKt^Plbы&2$A}SMxl:?k0gUv?[rk +/?ޗ;;T*;[՗/sYl=r=t֛/m/xI9>Ba_Ĺ ):E2c0Xg_e |&뛙(Yc-ڲH{T$6dNr+_>_;&rͽY g9vrpu#cG'dr_og-u4=s74&]8Kڌ& \ᰫj,3DKz3h„}t 0StzOt7;N ֿZX[@ZBHQکO/~pA-MzٽiFkNqvqG贱{֬uY主_?sMNLfpjB7#s#p$'8,>x-OX RBխe̠0Jf6{ׯ_ףyy<~6$jg3u㆚+Pv7L139mj6X3g|MGHc2y$l/FA$SHX5cdot/ꔢx.\4`)W=k-~vLGD~ι 7$V5r=>:&u# p<*n3_o:l.mYtHZFOìFa@K41((ƒ>æ//KQv5;]d|+]@+ns||E$23,hg YOpiP[6@1#.R7˪Ydhm~]W% GVEFe=LDž @iw#*wðoU= t0z!_RF g% /4k':Us~:$ʓi 0$WG)xhۓ/܋9@F"H7] goaS /j7uS6MD<'7OG}"wӟ?zUzYy!?y wƼz ͛owIISޭAZwZ#i{=L^s}.}THV5No2ȳz1|٢L׿ 41E96ZɏhRQT 4I#oR ]!HgcwLףbQR Su- ~Jkzss is~.nji!/F-]&jUSnp h cxZ5.GJrT݂i5J*Ilל : w{u8yFWےhYIB8U߇ON14W:.O3V`/nDc -0W|\63yMUXc1Oc4cWе?vi Um=~će+fgSP hu|OF'#_h+;rG@`cƌ9e:fBhPQ$:^6z>;1嘾Da>|(7wYC QB u\i,;kTf/|a~ rJdSչLJ4JIN=k@Zw2#Qr[wL&3ZN}5̘ʲ(FױjpHd[=2<+2cL1@<|=Ch pBfKZv@ZYGb_yT.C4rx6ߞ1,Scfy>߻ub |ɧۛ^}몾uoͯo-W}KԷ] tlϮob)w'?U-LS'hh=Of YV\KʱM!kVco\k|ĶqrҤ{']W|\ J$N10n%VR#Wҧ_ވfd]χuȏ6M0j,zXο]=ֻ{"zjݲnG}@Cn4҄vh{;>F 7G4j4$7t W.7=OY~ckZ\2Ck3Y~g{&=1sj'$X"R+4 D.IՀ&֔p6#S~93:_g.߉QV':xsz/mɶ<>-4LRRm}FM2)ħy$l4G|3eLDQZM[X(% $g@gOk`BBlHr?~b],>U_ HClm9䲵YW":Ԭm|Vl?wu~|^c.C͆m9cZAǐUH٧#`( BO'Y} >^l/ܗ f_əyX,>kNXɰbJi䴷~{٫b6JwEN7o-cy_2l?ody<?O?ǭzœgSz@e=2<zc4&<įF_ˌFHѯOF?'/^ *Oȇgm5gO'ϓgA_Y2a@[9YO;!Iogf Q2vGͼ̼O m1Dr 0!m=:[UV,h xwlcoGěpIZӆ3JdvqRŖ6* iv!ֺ(x[fy $> y$@h)J wwr.GBp~$!!/!d , ]v^_[?Dݺ wxC5 fpĂeV7NN;YvS=9+%@Z^Ҳ9,Ԅ!Mũ&z|̹)%t wC>#\0pS [70. Yu{; $L  xV& 46*h;ߒZEޢ/I zbmMk/wVUV}VUJU n۪jVrЪg۪cJcKqfL3A!)|OiiW^<W_ i?w3D}3VG>S?NN ɓ dRl>/fO Vn' !JVe3?쨽 0HYdU &-$˶Dy|x}ҭ@/'k9[ep$,hyv0Q*ڈ^&MjegƧnq%?'j.nԙI-t_Aj-h;@2dS@D :T!] U[WJoIZj%&4.o+MڧCV-37`iYSLb; *,n٫CL S?'/#>4C=^7?Of쏻hYI wqXD-ҦJb_M@52c;h5o,be-7^7. /4:&P(iyN5{4E`. aRDΠm9 8>YhbbYgl$NYTٝygsv v^ښ]Y/23SJKiU}';{v;🷟_~ȇ߹sݻ%-IYyp|>mScB ROH6HV)b{į} xs/Ochݰ7$3洩TpK"^Kzb]|M1Kx_Y[EqSW؜ʧ% !k nw~+d8]LVSx4 SY&z |5!$4-|/tU)fmi+Ԋ; Ym v^[[ .VӀ;:n+Ճ`Ǒ:SKžβ^H}PY%]t)XDNNvkpi)DqCE59ޕ{:^+32Ml ^Y-tOhKY$*I2\[.[Y;;R pXsH9ch3iL1b[s(1)e`N+^dl<2JL_JMªB5oS GQuR\ h0'+ Qne,0;M2- #Qd^nH;sXsX{`!br^Fv6G[V7&?̾$CT.cm}EGxo4ǜ ihXL[R!س4D+#  gZyI\L6B2Rq4u]igI.xp) #ɏd RYe/AtgmgLS.{x HCC.s FR(XӨ m陶6$Bcge] ^li"h,qb =u@'*prqK\dczWIa/ʞxleBdҖxaNs?Ѓv4l gh#bkYƤ|Zl| ɣi5GHFhg2Gt[/۳OV拧Z2q>JoWhƂB"%R_"76!hVl h@%rtE=An/q:k")S,hyPv(5)[sy[)ՠr}qGL<`vigR/mw}Zd " Dzwю8mFF3)R~#/?|{'oQmf3?ߖOsO>-|d>~2Di+(|i) S} "ˠ}B|SU:||׻ gѠ@@+;Y s\y {ߐ^B~\^g,2ԙJߣ A:;ay@~XPS:PhCd9#@@.0@`vg gy߅cz,_z$.SmtpARՑWր׎6j*г+(J4FRes0ߊUү߿]Z艍ʒ}!*A%Q^|"U} 5O[L +8:/l* `R`t~q{lydX4|+eeg<;xdcxgZ7xmuD$Q~uc-LZ~;^ٜ(}BFMfVz2z+>_Gys1Ie@㔌m(G<3HoDC=,yj.<(~xA"'luYmrdXp"D&)dF/$Wğ[pRZnSV{&ݕdX~KnY%T5z@^ث% v+=a@(%FJ\I1G_4{X򬕼xe1LG mΠS}ZQt@N 7s vGR&k8YrԄe%WELFޫEB/WEf?LW9DuL kZpIwAIPQT?D8U*ST^Z:Ux[aYG(\;@k8i(k~E?NU$]* b0u3iA\K)ЖVр&L4ۛH&GJӖX@ 6u,Nwjcኀeƽqnͪn3\]SQ1inKVJFbIcJիZfJ+g9ɬTfҌm+T6=FV5~gݮnv~ć7pO N-'~WѦեd~ ˯'_'_'_/x?ؔ?|]qҨm|.$ t%GD }o8]yp SV6,yr.;Jveg59υi!p$I窟K~pt*N$L]+v}>x#B?\+uPruҫ =Nm轗:2MGauKʫTL%{%!!UCj,;'W׀.Z+V/+2frԛ20 j^fUUnr^]rqTMNg=Uc 2h@cEnS%ג$ϸ"/DsGYͽVPV+NrVYځ B&yIcq EwiI?8$K7;]7|TéWGm3U}J ߭\ DVPhF_n*ӭ,|Hh|]}SMq]bz0,?0]򠩾t,+_._p3R 8ȥ7ce1͖:>8Oc~j0|s?;Ϸ0˭/;p˧W轉bLa}HKKw Iܳ%^ߣ Ɵ~K3oP;BO>V{ 0M8?@LCo 0&.Yl m)+?bt/q9Rz%YEEU^"J薤 N8Sɪ_ʢmZ{g. %  zAU1USPEC8܃6S.K2TU1#Xmin ]7tZ!rHLǷ :eZҧ2%KJ RހT /AL!LvȢV_qw_p~r|Y׿u@Pշ*//vOz9>nKհR3ua89D>v@8Tw?ꂉpWUWԹ+SՆ8쑺RmH[X=:^_gTW;:DT7Vꩺ:zv.>8D>TWUW/:olbmuG5g[5g)Z}T~.O۝smmպB=!vBtGN;m}ʪ9.Յ';+vNOř.SE%z`烾POqQ3eG͔ g/su(IOp}Ww:~TՅ*{|Pbۭɶv\]X2.5uQWuq.  X uu頋HD.:ꢫ.u%rvՒ/ONlD~.T]C UXiIȮ]%BQ햾8ln>su]*}QUmUyw]%Ju|*fo:wՓ]ETt;uL]|TLdGuNpFg}"vNzD=ޭ{U&Փ;UdayjW](}.[&ީ-}d_i?3M頋uN]4š8rhMuq.ޫ誋SșA]|TW}qB/漨]} zˊ6$ I8SGuq. ۟J9Gꢩ.Zꢭ.Nԅ'?S|ꧏιpxewԝ}?Dvxqs"DyP׳}[f7!t} ;.v-Nr=.,28ԘOB*J'YVY.gF^WwՅ~r/m5pd0Dp[mo[n)~8rxHUH?*Z*ΩNW__V fm lQ/ZU_%}Jysr+6:Ԣ|US;O)/EEEڮ>O9>;mYI$ݻpTɻ-OkخA" z z dB3#4NooBc?gs k5kkbC[e^[kHi G00~cN뛖$Aˠ\aYT@#~WkC]Ner>둟#Ԇ9$[%g%*m :#Cqr*tmyӣՊh 8A(ӳ5$,j;GS8;JLXv<?!cOw $CT_08=a^_ꥣz <߇6CAr N#: sR+L..44h"/絡V8,5`0 pXVgk2VB4)FEro ~%NyacEHJ/xX!C,742R=2ީW|x=^\|x|x2^e{prd>VFȖ3jPx&s5gF1bL c,5uB @*Rɹ8 9W+KS41="`shRL4J!sFk~ x x H~Y<~>왝?eGCGm&j-%ޱ_JsNO/_s_S<h{~|r[k6#@|8CBrR(o}9:~пaH^A t9vdQC\|EbuOx"FtH֟ T鳤\5oE)}$m|qZb*Eg:jV1³sfuNdP!GaXnWP>{jȩnzTI"wUa sɥCȳxoeXGgF(6^єZðKKw3d|Yz{W~㡛2?÷,AW;[AtYTƣ_J ƒo=hOdb[ϡ3/H=L~ hy`| 'Z)gGkUW+&bp)8cd?;lk#@ K‘5 {ެA״p5L1W+E|)ѿr߄Jl2W>se6wߥwXNfGƕ/ŧnt}UvMn>LZq[D]YМe^@74 3S,}2 ީ3+H wX|4+[Bln8/eeA dzoĩRd#3seۻL#oNK ! FlI$/4a%Sv^.r6 1%~iTW[?7~*Ǧ?eϢVgkPMO:ء6_§$A,їKN9m<@2EflSޗ`hQdV"s5s΁z,ӛ[9x&dqw7HVM{Z2o?oRl}jCT/e'/#$Ӥ7#Mg\C:%Qoz3+L[®14~Xajg'{"qΤ ө'H<'~Hӂ`T)Qr"1'x:1rBUq_ZܜOw|*'RH k1vO.JvO)v*J(K,TKr'i5vDݝ9NgWz$~ȝsCtGFݵy\ph];= qRSiU}Zi2^eX0<8k~DmE8uJTG hbgH\s,2eȶ,0t{XTPH'N5FZ(!ڬ?0h-*`X7Ѥ_=*Ÿ⺒MU-?BڲaULrV6 v}Oe0F.ۻX]>9 كd.7+P!b"%$ $aD1^V`ųNP?HvbNCzw͔yl:O˟tp+701L_=ZC,z{!DoZ_{e3t zeP3H*<HR+TJ"@-QuQkd_.= L:$@'EPA4u+@82)ljiF <҇ÍQ#S a'Zp=i}v+x1J,%{ۋ7Z<^eݼy\q٪ ,> F࢈zpc9Z 9MɒL@6Ђd_ǒ&" f@1n#54"eVo>[<vy{&W#n ZWguÝՋ >#Kv.3m s{XdN=OJ;z9-=щ}LMl(mhFoZ pd[?-+Mw^6/JDT(k4ђkhs[)2y(KX_˿؇M]{AvS?AU[/!bWvć&vws%/.2|)))?g~6$zR))~L>BٻǛ*dr3g*#B=D|Xև T=DOqIhx)D#cbz W{lhLv(̹=1u΢-g0_CT{L"%TBp|'fiZ@MԋDZ! %ؐNtRDk%p#PS?/"(Ch pJR$R& ̕SGiXыA-X|n9|z,o \,.Qvx4vHMrH02bX1XBE^ֽź.VRI JbU)i VAjIh*CcVls6JvFhȋSڏVa3 L'6(O0V ͱbs1.碐#'BJoSÐд 9H~] :9YʋI24r/9!TIJk EѢσ -B3L*aC?bQ BUB 67 l;`2R*62G??agt;.q{EǻZh KZ|e*gkDǓ:)zS5A-`r j&xSD%|"L\T1C ;i?8TLgשΛb7]-ۋj|qnʯ83%ͺ՜TP=w; +<.Vv)I@RYFus򬠁;@xT$R#Ƚ& IA>Y?/Y[V0 f|75Bt@ʺ5}7O~h/8%fřvZϗ{V/EdP0]P)lUF38=ƫ!W3#pD*zh~U\9&\0Y1LyƆS'bC0e6zL7Hmgzl]] S* i.z޼> !]>Tjc{k "&S_UyU~ćՎi e$'''/σJg8hWo~ >_E \,'/#Wgw"( `z'IH\Ol&30Ə0xL.! jk?wqqTc|;,Çua}OaR0ၙ9O~RܬǬ%y~E}2=B_܎i?3k 1?Jajo;bc%?u d2x ۘs*CD7g=Cl4d -L+Rfu[nOZvCK>N5uٽN|y܋{ l" t=S_EnNDGsk SaÑY>rYE/6ퟳFXr?_)sRek@L HN~K/g?'?>ӋjœϏN {.Ӌ}&);+Z7vc<|Irzrzr(`@=]C 'Jn%tLk@W,9'\3Vi,Vq7ݗo2um[k]L.3<2vG!֌-[cdE,z ZBNaM§pK&SK/ I#Vݍ'0$2C|KmC?GM@rO)PwW!?^xv\̷ٕbGHNE{ʄZ!;5{rc\p,W$*p5gykct89pA"oe)rG;e?=~8rBh)RSDO4/N5S2$] W ydpz: B6H׸^qR]3e+pR5PXA%M5к` ܘe%eR+|ET£˗0Z<>UoQonUH0('w'Ge)8xb8tҜk FՅYibS|AnBN#tŢ:LYnIvhs}Z%i}#a;sq_j.RbeF(" |ZƩ݂쥍/RY[ ~a!r, jhL줎}= >#%wPgDQR\l0D1U'Hd,Rv$ܙ'id_>m5g-ސZ{f_pd-W/z[!7,=^Oo((kvKJ4Z~O`.6@t6H%ܐ{cGvs$q#q{N+qQ6(W=0UY Xf3t#qe/6hx jE=-_-wZhX t==Gx f%KBc AzR5KrL# {`-7ۚK2C ےhO?ri;`r D2Pc4 f`A¹NA_i}(5; 0r஠f9">fR^]ʂ6AoaQ~hsxEI+3y7nn "^eNT60Y_.LMڨYCQ|"okZ}8I^+m~g[ 3>z7J7y޿7${}>EŎI`Hv9O lm /ÿY몥 `Vݲ2ɝq#J.=u  ƏM7AxRul9^$Vv7^+/{+/g;|+-o&C1}}[Pbx@r6 &FEcMDY7Ž7*Et9y+!Yr 9 ΦΩ`_bOޗ3-puhF0i,zltlo|%XGav`os8Xq3z|D_5dǼ&$5>͝]]Z>߬OVjTRL{h\=+;%e,vsf,eIgf9Tj!H[܋CߧW/F,Rg{0R֐%޼n8n#媃ŋ57y=k*ի^\x |u'5{ZdK9p 7=6xGKg9oߡ'>UT4Jk<-k]9;A!즛ɿf;Z\L-1|G,YBײ1VW&a4hU+Sˊdc)v'bi xg  뢜7%k9iK%k&POG) W b-3s)߸-Yd,¥4-&MW.,qZbWWukT`AMt`2F}J4~Y2 u6 s;ۥ#9k,re~jWX%+Y;=jN]BFICNȵbKή6]#Z*s|Vڢf Pv\򑤜JI+8/H¢@7Mn{:tXʾb Bt@sJt|ng?u_aheNҺvg ILm2bn}/?o%pr \C$7ot6~m0M7t%{6D@@v]8A1cd_J,%~YL9u$ U 02t:ixwGk:!L5՞cГ 27 ţ–2ʾ .mUЋ؇d|(W4iT,nKbsMfd2&h40 G~#p(%Ϫ%3O%dʤCο mG*r$0'A\0!& b8-3-ތdS5<Mx̤Z*iqC"wS,c!q8η}ZO[C(E 绚1joyݘn}TϜ>mV2#Nޙm1bӆPALiZtֈ)%Vg̒5.^ ۃD$u[f7M<{Z'ifηALm6]9Ѳk _858|?x%Ŭ/:^)>\)5E~%zf 1pX?36X֎OZ_<`A9B@ ^8U1]!nq&f߫(wX3}c^7@'Eb[NAR4lh+`&E(H`AXΗb1S| fGMJ*Wj"v*VM4EnetЧrI'AANئg GrYYZ#ei[DIsf#:OTB?[AJJM}LQ` |ս)s}1Pv!z<j61ƨhEy _}ӆsBReQβ`uم߯fkJ$^|&  j"vDv0$1Lw8yMzkQ)qMw=@"=*hC!WQ bAVE&cR%vxv*~wި VءHŪ exJ]7Z6)K닥f]*;\ 4հ;0Ȅ.jh{ nXܟ`,rw&G ioa2¢m HuTu*:x# Z&ǔ /c [vQ |'k;j:\`gQŌ9>>_Łn)ٚ˨q#3zș܌9jdi1EZ~a7tɪz -zBc"o|\>>pd#oGPxOOvR{?/Lx< *QgSⶹ>Ԋ@M"Ka5`jpZ,s}X:[%s@JuxͮAGNkPM +xRRODTSZCA@=gL I8jYó_}sx+GʣK_(_گ~ϛܾX}9IܾW͊ XBh[C.pЇW 2Q ԭ;ݣK^wF+٭yܚW+f,+7*Lwl_k<łhנ4iFgok0Ld/XKT+9fާh4]l];'GmR;o(ӫK&@Via!z꾍yR7*hǽ=]Wzre5H2.]74&rn7~>/-lGVf +˿$]E)@qx_a8!a9i3@͙ sL:3 Jw\߽ 9<š)hNV%1L4|^' ~QNӸDˢs64lY W%|̐ {*[Գ:5&[Lc3,֮N?#/Ÿ8uhphS6قڐ~c[dԛ[Ea`zC mr56߾U7\o>]zrQWΙ.[}] ˼T(B-(^QܛDw2X/i}ī]Jv>ݟdӌ_ ?DgɼLC=e/㢬 8-/qY'ԢEAk3(*udhPQ1 IjmaV8p><D:`0_6de֖O9 91-%!g$A J?IV*"+I# ɡuH$,-Ei>>ەYYNoԘOgˬ57met;kZlvjlv(w6IDM %HH>!$/u`$@ LZmNx0@̔_<,y:U(,] Llv:@tb.|_^ճxK3=la }U?<*@ i pC CJrB?UՒxBi=Ϊ5β}䀦`AWhT /VՋC`hAv+Np }3_hO=r~"QC?"X ϣ\#(#Lj⽻{ļ!`lp1}cK2kӄQc7'Ua!r#ŞPqbtiq8[RƭzksE<MrVV.+#tc/ ת+5ט?x@>/-@T̛5T$[.7Gg=dBdbȤ$Uѫj)ޤ[I@Z(-Y /wxKxұ e ҽ\>r|[X rcs j!@?!>f9ҡجs Ȉ7V]lEQB-8G͇Pf8Y8jMYux6|Pų>{2|K .H7#mfEF @4H7atʳ4-%eo@%"wjTPܦ,L=pqJBf _ J#!6P䇆U9ttueHѴn78+ܮUD[U'u-Ua:kb]Kg6( ":l>ؕxɱX|Y{ٰD-qpw3]Gd _ 2 s7q7&y @%5l֒԰u,>"hph(~(c6P Ti&L3' PS q84=F"JBcJ:DIј'X;B4O/5i$[ffւ^컝K4tspgn,!>"j̆{B[Ab/ę[9ƌ=ɴtN$2" bG}E)4y{=mޮ&Y\~ > FB8fƵj#~#>O-Z7IDb5OJXpeXg0.::0K ޸Q'ɤ7tUYh|`h:rcod4EOl4b~VУLxLɥƞoqMa*I㹈&=c!$GӀݔ53--Lp*2> 8븱.lןYKRl(ƽ6ke,61'쾜i ݌4B JJ^˜a^qw^a9j6''?;9q,~"q披p jKO锻(|jw|睰-X`Z+Hk*>WzORV K- ㅺS:@O>RW~ ~;Ta2Ҷzc@ H3. ͭMBFĎ4-w v4= .[SӡU]N}R"eɪ5us5Y=Mvݼ5Lyq*Nz $t` -~X驇^H(njW1)Ÿ%Ars֣=)hZk>Vno9 ӁPcgtAI |/a~#B*5V(iP)eM i6'(7 \e2Bӈ\[I;Tl팓vQeᦹYm/RQ -ǵqH-BNTն5Fhf3U ,u֬CBfȍ(Qy a P!y\Ut X,[!9C2fDo!K wZG%GT*н_=(o)Հ rtcbċU"Ћ=cƨߒuLRUuH;ȿ)>#V$Ǹgp@ujʯQ|0͋uMpUAbLଁBTul) uϠ>#",9v_!DG0qve±85+n ^`ix`( 8(.=lr%n﬌DZ_?~wVxڷׇΎX/㨻. V Jbc&~S+Db X0ވ+LW4G efAu1Ο|Vv3)@3o&3;}:QY !nIs ;puAK/9KF 댛ی(|~I,ziWx/Ļ,+zNa'=kέ3j}"|Z&Dydi) Bh~ s6!(QFfm Ų3/<+NK䁪swPFgKы92~c 6q4Q2%K$ߌ:Øk0Bb @_UcPC:eEYх`HP5 ؇sw-@"=Qp ƳuqcyWtī%^"FmcpÉw95m';wWO0NqflX VndnK@.+nߤqqr r @{{#gWk7_0<^Cl7ۭZ|Oq0W<2;hDQW;E.!(ӒXYTsJ|U ^("°O8t׵W5wS~ .ݒ->:!ȪO`oR>}_#٠O+vy(١ww׿8DK{kٗ_S8^ầ-R׵C;{?ݛ'Jɴ?2h7Zͧ.*|oq"'ʴt'DN"GZCw}~#A$'qWn%++󸕠cw*+qc( ]DcM KQ?Or ؋bl[K9VBz4.YcVMOvxTyU w'MT_5Hsd9ݏ{A^8"\H$Ih].Z|o9MY<ȼIdn$2c!2rZ>(F0%9:ѵd_(݃37uR k)S5c;:F^Wd!4$u^v"^yI[>^$'Iq&&{;j.3Mf(B%ɛ S<6<`C%+GVу|XKI߁d򿒈sm8ɵ <nMR=KM$c]V'o4/qm.+'$֫|}D*}&+|Şffk)@Yzċ/>#6[-KΫ$m{/vge;Pm ~{9lgTQp8)o>WqIC~7's)w?7{BA30n')q? ֊y/lsPV[gZEw* Ⱦdu 갷X2v%ԉuPU- bd9<13UFˏ1̱3mV*mf"$# BNÝ{5+07HoNCxoՒsHA&|f*o[HٿK ZNcw6Zzv"`X1ZmEP &kj7t)[VR q]ƚ#'6|kZNV}qS,k5enҿnb}F7Kugak5BLޏi9ng^cDZx )p/ }}Ԫs4E7Er]$ާ}w8,_, ~7n_c(=O?!r~=) GLo\B*|qȔ\GY"nt- Q۷[oԥd&S0ʙQzZ"69T C ƃ>b[.UԻi{7=e坝ݤ&hoH_X9ST.*3z)]6+j"L?(y@!?/+a*IƀB:xإ9sUH~oanDCx(oܱwj/0Vv Uԃ#D*w& ns_$Jhq .31o#N8B ~u_V㛖v)Ae\cSF[8TRFJM*U˨dT[VNL $1{N }jzY{o<&K;ұI2w𤪟;yRAX̹@dEe+)dDw[T+igGm@g "?I8!bH8OR+APlA OM&sp}h*Z:Q1t]1 ֍EmGiÝϴ. /c[d&ݟ_AM4^7l#AFF^#܀{n꬘&ZvꢆP!T!PpDnbi\UaU)bO(ό.@ 4Q=Cs71^LRR, y#b](bWDjq?TV.Y*J |饟O^a.\h~g *4 ; 6T3e*2Auv&nVgg2AUcj [&gY[p mX+nj g&hmU>L2U cd[grH:7FӢ^kUj.k4֪iMbApÌJ@m[M~MS+|(X(ͣԫzR|S nwNڤv4 д;fI!8n}o{ՉV쐬Go{ ]U ۽m(lC[W>t?fg>ay˱U,U;)bv#*5L((^a_zc0M?$D?u(B&};]"Ğu8 φ TaC&h5_Y,,ϻއ1&*hȿ5'O'T/cH:毛>Tÿ* D 3jhVTәro5T8frGN^cɂjߠ w~j uP\o~hN}Vzk?9]ӯ򫯘~#̲P٪YkK\ˑ7:1DG}]pKwR5Vͨ5Tɛl(mjyFPg:T$6"| V߬p* 8ddD5~IΒSr<"\ˌ)?;i~߭?Qn+fzL?= dHn>P 䄞K9 -mĵ]E1[i\˒<(;R1-/=8 9pSvN=70Jr&Wh믄' +ƒue.;]aU8ig_ ϤAj7\}ct$˴ }6+wpJӘz 3愖f0Zd>ü|Vӫ_h`'aE] C~'f3zLn:{9ċfBGvŜv2N{%)NL2;sby\l3R\d3.HXX:PǞ v3XZZi1c  <<@XAh@ ,PbJd;Y)8ҏAVZ ,{ӃBV!+=?Y)8ҳᐕD{X(Yi1@d ҏDVJE"+-bF6dr?bJ`dFVJE#+-xdE $+-HV{RJ$+0ɜɲ`PYv%+-JVz)dTT`JφKVZ(0Yhd2J?.0Y)8h , q<˞dŀ2J/NVZ|1e r>dk?~&Mnx{+'ȓg'2j`9; ܘ%2vTYR҃mTR'2zMKIZ6Dvj>X`p?38yT*lƬeaÉu`q )<W=ӎ[`MxoD:zq6ymώ_SzNd`/r+,1szNdSg%xh+Azfr" Vfl,80N?ٛsŝfb~y<_Hv3,1sxШcK=ٛԳŝ,l,< 2qÒ4lj#&NdoSow ~3S↟ p"},`A2ֵ1lNdoSow~vY<`Yv ?,*S=M&NdoSOowr~;G~Oy<_)6XrcJ0SDVIWdɠ3o^?ܾ[pav^=Iwv*ʻ;ׯ{R_dg>iwL}ﻑZa)j.#x@"h¯HN迭"B]h<+qئo??;A[u8Po{g[~W=|?~:Hʍ-:oΧӈ~c}Z9߸;~Whk'TZo;H;-Iyj Tk׍J\\/ί)Os=^Gw%-UKt'[GB%7q}EV;E2wi:}ի_n>n_ XmWR}U5}>wl}?:F<)6 b6˰Dun.OpZm u>nsyݣy;C:t* .$ZtT)_S^} }˵KG:c [79J&CoQʝI:k_њ.H`LS tJW=Vm^}|!`nU@+&3 v )@}klzCǤ?@# [mc*^pޱ6Tej P[y>d 0HM ^Oզև[-/Y҃M=lq8{z,# \_M'N:w|O"0/sO9}V/hLՆ;5A NS=$Q&şa #H8mV/B&ex,Jxx/LV:k ѿ ܗpSz ݘ?k*ǔS'nݏawP$@>VGqⰜ@P颉 ъTSγ yE#~x\`x7]8PkQ8y}{[:[IuHѼлistL)4[&O*PduonF66*WdzcNHn6LdboBx j|dݲ5Wx7-WGLR3>%`ø[t_QnȪ'_9[ψ"9o z|$FT`;ww]?6wlдFI@V.R Hi2@cXOΤvWa=OyTS7vƓrCpcDĠU8?ťUv}tx]㽀_P9P蘾X$Wã0YQHNU)'y8a#ҷmq;uz@ʴ?i5ådܪq~y1{ԦQN TkA ZWu%aw8~Ք . RSo@5ʃo2;`aBBT(_N GKxCZB"{iճՅ(UW``^9T 3}ZB$ B>HB1FrBN[ wr: RVgWntw2>%P"eߺe+eKPɕ\X9(ơ;;7D؍{T~NPptQo+ow:Zg_>o>A%xQ.m-p?R-u B"_WL"\u ɇܛxG]yqVPˣ͘\[ lnON-V=©uͷ`xYE_~YTO}G<Y5)ۅY{ڢkxu"ˉI"}.;yad'kQgNJía&PqF߉C1g# سsvZwl^k mKyeLşEʅJK8eDys.6{Ѿ;G xfixxnԋ Vn/B ~m }_m^ƞ]7оO"߄O0ޚwݑ3Ž۹{;pc.nsAN/퇇}0,{ἙiO4JMFq1y.(i]Z%JՌŅ6]=$tLpF7-fcP2R(%i)eiiV?*iV2ɓqmvS(~qP;m{嶽rێmsrF65PAiH/k444G`v /I3iz7SJwh,Wc:ݰJ=]SL2?0:(\C+nK %3- dyIM6^XȎ.@Ɍ~@^v鎜NKi@G~R":S(Oj4<syvy38^!)^!*vk) {Zo g3_/LhJUfc-bRN.T?݃TǷ`Q]0嗶``6@7բ_f3yXNûP {d %eň yyшg.rdxۿ?o{a`ETouku[gu[2|W֢N OwW^~ȻH^z8<kV C#D e&JDō&n[!(7{H/ߡlES^W&cﵢEY:GD5/>opT蘬KqRp_^HJ%p^P(#m~_]Ѱky ǧ蓴d5 hS?\<@ =Sw*˱wpBtuM6fpP ܑ[·?: 4y9a/+倏Z[*t&ngP* ޤYso"Iguz?Q.{$bfMY-f,>8j~8-/,$tÑ!XXܐj[ /J;6u9Y98g[M@4 lȷI|lV|ksx?{wt<֓mrC5L137-v |AHWtOLY8kCt־<_cۼ֠Ydx?-&eBBqCDFrpDa#=0-h#7igAMt*A|½HqϠw7.31h:q^"Xb ,WT}FP$Q^T^Ek|3 QE-y:Lޮ} Z<;3yK(I.3P ,氽Ճagý ?V|@G4ySy| <ن_z47v0Oܡn ١X=7?4heY8Aժ%طZlbGAT@T0x,>hʏ8(YˎޟaYlwxpAvjKxގ="M:6qa+ev|,^'36NJyi>̄X j:M#nCsNbOs:JuT|%:$dL& z̍bb&6빶/ χw慵- p8ѝ,bt8g~[QZu U5Z5,>P@izrU:qx܁/pP*v :vB'6;n'zM(([s\V:b61#+ie0#*F EĻ^RΧ(+3ir9aE+R";1z[ћvE'1y0ndncꑊ^-e6@AyP3ö(ňC*q ldۓi4KI{ŕJ,UY:}P*}%LH4W@Fw^gi.1?uJ&<@! w ,| CI, P:lSqfٟ͸?=d?' |TO+fBoBSI!|}eԍc\2H%!YdFЍ]q\W}AxoSQnͦitfXίcfWQ-ZPƈ[aF|*1a#76M6Cu~4~mBN`6瑬<6³*i53L~=xљIhaTW'#{tWK&OYtQ#^sl{V(`] Bͪ Xo)*ܟI֩<,K)f2ZG`QXCNI166EI+L`)-6k8(-"rmLVx_MV,zwǰ6WttԙP2l?ܟyffnq.o#q0I2*4r7,=f,Sy[qKF[bB(j4,RpG/(FN-YB70v?X=N܇ `]aң4:2W!ف2tZP|Bb 58drQj i*}4jՎ} }Q u`2ƯhdNޠ1ETS"Ԏ^^i{7q6{<|w۷lL9j_Q8H 3 pأdڻ'pvwVD&XAamPrh]7ڈ6P8YPBpdM?,|zJvIYWM>%)abm >]e>%N:H/TSSH{ _0?}2qFf19}i]8j1'zIxMrh 2]ߪOdéHe*AIzZ_c>SbVdW%ϣ*P(iT2 ,Ǧ;+O]e/kE`ksa ^D3%L!f[daEvB,\ɼc%)[HuNL4 ޱ\TR_q 5- J8"A_zO+Ƹ 1HR_`%KܰvAM(ƻ5Gk4)!(_fiv>*{Ki UO쎑Px2ЎY ѳ 3k+XWS#ȆqD/C9M2[X-Mve6s T kqXm#Nh CƼqAt1O~o;/9Z88+ 67 N,K]Np5b9y.f#u<8NuF'5$:/QwZ+&l].v=B jzd4yC x{sgD`"aiU`8媯!QN`vi7[ n}`oi3yWbԠߛw:f˞Nv_]Wgn 53{&Zo:۞|3%qcQ<&W) +*aWetX2vU`pb IF7Ia oҧuxÁ RDe^-K=v'Һ5ȉyKlLn2Yz+I 0lGt9QY L²`TދHଅ[qJ1'FqMJdP2NEQK7ɛ6gE>oUZUVJy20t&jřsqoco},! ;\&@$ :fTOnϠYu'T,YVزUgtx#}"}Sռjβ6(yf3&Q &g2k[OmenCDL6f̬Ԃ43@3vv033Yvf%}mg֤Йۙ-,ײ(Sؙ̫Uj=gUnsGDvv2g2=?qFNeD#hf^J6>/5ȏ`|ayvy6d0zr!odXi}l"Oc|ذƤc']:YOdNu *5R-N;i{F;d^\vO9&> ħUlFBg[uUM,ٍ{ jN/ /VOO]* >akfT(k.䒪"@Z2F/Ոi@]a@ | 5*ky-4Kv\ jB)=U cQ]Uv% -vck'WߍԴ1꣘Ƈk1SpPpC_^}0mw$`i}SR&`|p^҂ #ע:CŴ! r`ɉ(XVn~ǗĎ\[CH/QzIRx}^X}-'biZ E2Awä/{ph0D?T ǡ(TYJ@%}sA8 nV:V`AX,#m["P;r&/5/+s*` t= sf JiעAKk­jJnV&[f֙FÞqqQW,Y!kZ0ͯo9☊ ^;m<6b_ .u6}NndL!C]L†:({TCHYy[nzTDRv>>G&GsCGl <6,9^1h,=4.6gQp㕰M\lѥh1ڣǛe$Z;lPPJ«ϓ#'!WFj~䵾x.2cAJIX!gw to fE!|Sgq>ow8Be0!fǏim.BB3¦lasl l_iT ܁|1/?zn\ ~c=\sĮ!'C.m*Z;7!e(=4YHJ~}x.<%tu3P5)NV*mwo+U.?d-qqR)zyԡހu -G: OE|$|i?Ўsب4k'1ڗV)qԝ׋+a=8>j\ea Q?cQB9?%r)v#̙TW* 1{bm1el!Rp %($DDQӒR 4>VdǡգiX~U :c P=Udy_d$p\-.Y <:CU|Q)I b_; KY†@ V渣)¿,lrzkbghLFr^:]NL2]Bwf&S5fx_1Q4d8TA_Ҍ~KJqƘFb.x5!CzM(EjO }&hf˹|y 8xPBP vL}ln =%@B +Z/L/jTYdw6[ euaĠoׁf/9~KwCVx1C1(Koz娡G7LǦ١Čx4Ul# 1ˬ=FK8WYowH~Lk:fFqh CkVÈa4a,,:޹b f(:@Td.+:nxZlY2׭yCjXW%\(7[^@:A%,F?/IMۮJYHHT~9yD4kMJXG,VӤe3-7FjT(6ڸ[r7;ٕ8 Jb+dtD ?'p7du%Cp{e eW5SDtPSB)yШ%uhߖZJ°d_ LΡV>,37ON(#6<; k+.)N}Eh[Ms3ūC~(dgpxpD c`yqЕUk6%nݩ ft8YyR觐SXt=~$1Glv"#j&_2-έhI}>ìmQ;3ؠuƙ^à{G;L>ĺJr}M񘜻m)MGuqnJdJGN=StBa܍Gp _|4k8'BPdkb-$.ic9}778|6"Kr&[Iv)@|/56^]1GWFD4n"VӸՊd,ClWc IqeĂEFرtxNX2REBƪSa:M1V^u?C]3.!عfEDHivw'4;6,bWa$ʌg"<8X,zbOl҄v)EzK~xck^Y̓ V[,.!}l_ԼF%w ZS3 8l\QmU8|V}р- egGd&h'×wR"7l{’P9]im֫n0*-F-h~cV$| a5"FXÄhcU11~^f&bn8NȐfb^tX"_*('6Qo$ɈE["[be"&K'&`p"qSJE͉d>6&`fmIX}+dopǵkR2xEӵ,!U򄉥rbi>'|%AJh[un]poY\![ՙٻ˱D\D$D-QK:QeϚKRV*piDekj8t|ClMH !3bW59rU\\*W5u/u|vfuXr˺A\^4,1υ|*kC>G/>m{|:li̚+IP}[>JjN%Y\( ċ C>Rbj乥8Vj?n|~U-i$˹*5N ڐ ty~5kq4}5߼bIk}^=IwvU*wvʯ_J"; yLcBˤߍ {Oџ'~⸺ϯ:≋e~Nv'Hv 2Q(X1Ve;,c%Uv%m"iO!}8P a[KGX=| )ܬcڼ-HlGZHCzۿiY!a<8bR̻qG& >zt-*O~S!5_j;|8ČvOӢ܏[Nj3BF7HW>OT= \w3*2mF˔k.F[NaT}P;X7)|+"?z?w8YCz WJ?9Xm{ zKB*F];*zFi]]wmRd{z*}q~uMypsbƠ ME:Snz}SU)FÏ^uRuH&=??Mzm_o|jF ʹTP%/&1'@{HQQ|! 9'u!9VGlB1lQ pd)WF)1=Nx"/VqLm=ϔLgyT9& 罓RWY^q3C R~'Hdql؀TJKS zmR.yDLmM0-836f%׳dnޕlN9!6,i* .ij/e;!9.]Hnuե=wդN nޚEh8ܪHǖ0IgtrE䕎+drmh)"XŪ97NG>m]<9d '=awxr؞G'C'cI1# 8%7}2ח,.qP*&OZl=%-߷4`B<`bF'g*I[භq7 oh"U.#$޳\̥=FUx*kвIlGwm,E4؊wSٺM_v>3V%vzqf꠴Lb=BYs{dUaKB%uv\l ѳ ~)3M͖G4Y=Mg`Q:!T|/]OyWMu2ǂT|Qr΍\rq9yqK:ڨUfХQXI{e`KEwjGewf̹q)~z{".ͧW}K*KkjUۘ4lAYI_LO+oVۚAOxvxL&K )# eT{AX$=:!M;;ڝU7$j~&Wn{^w|rdڟ ǛOt*XNr60d~>;jH%vd5+$PgԣS0ߘUmok#/xjAE-ҮPF=jR``ps߆0&TPkX:Z7+J& B.֙]32KcU,mT+vb` أ noF,~oPefBߏ䵡Ѷ15(C1'Sݷ")bzϚV @Oީ\q~T;*/D SCqxä+ʢ"=媖=ڭZQdWG C"$|Ԯ6*u(S ߞ!AFE7"D+[q0+$JۻM85-V(! Eto!w $R^^`^a9p5;؈q"Rf!C|Tް?"]i0Hqc^>n>' tuـۜ&WT4@Thd W(x?Q`)Њs \@Aw \p|+-\B8 sh_ 8p;ZC=_Ǫ-xR]b9YSYoȑY n,#~xقXg{R[8Cdr BɴI%w:d568uܵlU.}X2*jd .1RxhK]RI"R8^R8EE,Pv)*Ѣ|JSկ䐪"{۠F)f2 )lj4e[tYckE{F՟>UUƲWɤON g=}juNlmC.P{ j:~yQ@^=/ڗH&QiXX~OƽA v$~d=_E><}L^,V "Ł'<6B{ƏV=3Axz>7xp 3#= w0%dܼaZd%d8]#m*Xa>po ,mih쯫3856S<94EL^uu#\oupPC|3DD8.H!H+ýЙ* R}l 3<Ӹo#|?{4$>ش/A4\=]=23(!j}8%4=墖4AԞ&Zޯu(CОf 4A{(hcY/,I]Y4yC(==ₗW_+C-™ԝ:!7 T[&b1aSƻt0aF4;X¬}Eo#md>~Ej!urm+%{b$o/ݩ$^zAPPR"&"w>;~N3hx 1]nK蠹E>)K-#<Tʯj"fI gO l NDԦٲfzM.2;s=nV%Ob<,j= 1n4lPdc9T):]P&Oݨf?,w쇥S}g@, m@,-܂63=&E<8QK4"ljM]&ZSLj૘t}5R5͆?gaejhgP\ (qHjQUG%7U8UM`،o;N.9\G_@ZkG|iUd]f(#Ee VYP"3UYD%y)NZu))$f[Θ5[9np惘]mբݓm Hkۆmg6U*yBDoMnNKrN9zDI~=-{~링v0%b[BdhPw0);tN&>zذ ͘쑚8S ۂͦg~].R˶(,PE@![;!%XHM sߑ^HZzw8{ܪӮ"6 |*/mv$&ʻ8ɍ+~c_0'y̸h68G};~^iSGy5lkztA t̶Hއ#l7VFV7 \aqo]lpL]nP ;+tp%ܹ9fB}ׯ翇S$v;+ 0^N>8{q^Jr8}Y);, B8Āpk%gfUP{-/|EE̋K#Elz+G#XElU>n93xT:BRQԡ $e>mk9Qa< HfyRH˄ıU5Zhl]}]mUGӢ0MEq zb B$`*p\U .;S==0yh8nHL"ĵ"V"ܐ'"z0 =[D3E6cx<|=߬\$neE!:epeClY2CrO5|j1^L;a8-x>/ٜ n}՝A6d氝&''*X{BnYYt:>';'g$~{=e:&5>/Gg^|*ioՐa&X9g6U:x~I5<65N,JTm%Ձd K?s4.C2,(u."W3hُE;8IFmkFWb3m.ܙ]ұ 8%ytt9k-k5Un~ծt_݊؟TGV>:b:>dޜd\}$~ᒛ/eŸs+\ 'Z_jzXM ܢñHQ*ήn18N7 1WO"ۙ٠~$E<ѽWR5$=o=dxh,'m-.=S4z:ƇDZ;zN/}Zs V~J=D2tg}%V @͹O";p"$;*ː#%[%b%G:ܟK {sJsby;*ٕqbtV2з+o]Yݕ%У,|]7jsfMSqI;>ݸLݧz~i}fO_Fz!%ګ_ jCN.]:ٟc4[fd/4Ɖ8<|ޞQ[<qxX բ0Sfou_ Jls8.6F0$\*Hd$ DnEPqj?I>%cYBv>XDzL&۷ r /g\w{OҧOu8ޕ_JQpl{ʌ t?`yW}-=B"`ٝX&X:6(Azd l#[Ǯ ND0.Xpl7%?HLkW;] T٬ w<HgN'}vDdbVHBFƞAà1]" I:)3D1$L8X!0.1v'`1ӻ\Lnl6`-'P=p\qL&`^o'XjV:d É!Ro> ?#t%p2S#OxPrf DrCD`SR_tȥ,ҕmc^ZnWW9W =357Dl`p-HYȄToU)Rhm;N k$wMpLx%?w Lz/tS*Ƙ6jwc87|h\^g\xb:Nb0t ]9[=])[Ȕ-2Lm %>hR mfA\ o>lO;/gEuq{JsE{٫Ǘtȷ2-!< h[W|ah̔U :&r\,H$r/9.7" 7y:s5ԥU2&=ZVgNUV~2[5FG0uC%EfBiS3f?ׄ*bV.Ñ}^v.m~,F<:-kubm*//Q 2ؕ)JB] ~+\IգбKj#zxsh"Fd)mcLٓ7pj )ԛTS\$}+1&LƄ X wPd * ,e86`?l;Cv  <|f^Δ@r}cezI'(gĜγX- z߂{9[Osv'laØ$bA*"R,h/y/C)!.C6@|rصz@돵r<ɿQhml7ԀJH9#6 ʇ1ч HͦA%L ~h_a{{s)hx20Rxa+xI />b¥7Ugf01GrEDUD\|zkTҿqZ#uN_"g][T}~a|zH7cuE4.ZPx%`WJ{̄ @y >[Sm u792^Ӭ_HHUɴwO&(=̗EVNY.R:M !`)w2*-lW.T'b;.Uq9?ݬ'}3 73HT)L?U5JFEŢR /BضUW!!5"UArEaGxf9dP5FF$Hn.y0Y"p+Z=mSQ"~4Kcs<Y:+: ci,ӣ(\'-p W`qQ2X^P+#3ChEni.|b#sY1F #4XTzRGi!XytGrVRp:t,0Q|AwaxEu%S =TK2?lm6@Loz w"}uYK jn27rub8-vuq+K@q y,9avES%cxtKa7!9脪Aq v~;u5 C{@SN"1u{cğ'/wΈ(>f'673uDVf ^mmֹ`F1Q B0,u9vIyh* ·ц;,x9̚Eo=z:y[[hW H+1i F?iw:_i@f0 Ḽ}BNSؑM y,T_3-Ȉ9?>),kF[n[g K~>9fM#a`x>#VFg2"̼H`/d ,2i;Y4F))4;;q;K#E|)N4gݜ,SBM jBք %[. Jռ\SN <>>dm`A-~nkol8b.bvv\S9 =7Ȗ[)Kcl]UԷУjySJMϦ=qa[ U#9KtGOvJpcMgM@Ĥ^x[}GG+aL(%PQO=Txex`Ek>5{H2ADeBGxM2׳Xe4썟*mq2Z,d $\C'H+Ji4*Lk#bIF0c4/QL3-f[Id23+?Õ# ݗdk4aV[:mI_c`Sdv"rQ N8n Q:[я$wL5|>zc;MBw|QY̆'zi0G9;owqoџp ~R*J+Hb*ƽ/}V-ZmV%dvaW.GK5\NT6sbWŒg!b= GI(6vŪƃݒ Ic]i4uxNo j洮zѺpڣ?z7K!b ?}6t@>V%8(q۫ 3@¤hAtv[<ɢU rSӻPtJb1l=$iм OY . gm^0 w%eu!|t}.B|+L/Vo75fJG f|y4::])wP8FE8 Ύ(N~K \MY+':r_ 4f\yj 4`tu-]* Wr-MV8h?mZ0`W j-S"k_q(-֎_%qlvgį8S{]t/V@R^m׈*eٲa8t>znхBfxZΊ!#,'ޘKN<,3< D~BML;f| M3`#}Ӝ@p4]S"kvMA[%~]ӍϿqgsg<7)JVs|\$Brh\T"wlj;~/'o`[V߱2 xÉĀdoXppY\bɈ;?ʧno^GbEJfEEx%V ?%!lze {sEι!dEsq|YczF>Q~5, H5yD7;V ?SWDyYNמ0ָWVɧ.ZVṎ\%K'":굲Frق-k\۽m񪙛5Xj O'L`gG\:CG1s A,9vE pnk| ebrUli!} ituMozt&n5<֝TK hJܢC@ vw(Cqb<Ϫ"8:yƼx `|h(G l!Ia♈K#l4db`ދg'?vǷluu?}Oݿ`;N6*ڙ4<^T;ʺXglkQ%y2%sG:3N%d!jaѴ|c/,a2x<%\Mk͞IZBg,XӔXmSǚHų "]tiVyOEڤRlY1*ԊHRx4WѥU7Tx1 &0CGHSwTWuM (LJ@QP U=ZOئ+EJnJC}a?sqU$`=M $t4~[*ba_7kY쁵o• e_玿clp0}=UqMKXJnBuq]J=*mX,nVT?07}y!f0'B+Ǝ6]|9aƼF$Q!#u+^F!f\E."t[했p ;,;5䙏B-"]!ͱkQ9_ {6?`/PkX\"JԭpT0_W!=Bi|EO "RHS>j9x sC 1ZL\.lA&61å;}cwT1F,t;|ExUVzvx|t~`-TD V׸ձy!@MR6 8#[Uکa:s%vF~kUTR(GX&XZc4-~<0w$㞺4I b c޿Z7bٲce Ӫ}V$*nUaκ,6އ=-zamjH qqjل. \/!8!ް@C1SPmƎ%#R Uab߇ )[>AV]%Zk-K9Ud\V^naQfs0{ $dl]Փ Y|[^씗0=S$G?<'NA,MAbac?) PyT7@< 5I%!ʛpgTx T82XNO) ~K36;_mjw7chYbeS8cʝ'A7Y?5'o՞-]*Z؛<֬=K.ьj<&D pdlU1{JYsi[ɣli-UyfbVǮ試'ƨ2UƘͬaG;3R`2P`_c&&<jVHs}P4Hm8 \8\sk_Wb v :Q;x+ Fs7M0\=^A@ {ZhXAnPPVs aowC{r>x,i]D{iz1v@@!=L<& ^o9CP/p^(nv,5umb vzq5^Xm(K:FUeutJeu& Y0l5V5{!05bM!Qxc˄:Fn# .SVȿ5ɒUGD(#J Ko <Ir(j Vz WSXM {Ej0g[QEKpga4c I3*}8X!߼r%GE'%Ogl\;|a n5 ⧄{L;IpBY)dכ҃1xft9otpp*7pۀcKy㛤-|mLV޶|Q, Ww ? 4b:x"Xc6a?mG3Bpp³ .g^sj@8u@s177wq͌;dCw[=lnb:NfD 0C&nygVޞ+`gqD? ԏ= z A՘ f#%i3.}jr64@X֊ch0t & @ӡe;hC /#Ԭ씁S8b/P=#O$lCN8h" jG 4 |sF A<&a 98P"BO lr@}h<^o\`N ] 8C)S ]؅M |ch8 Hf x 0S_bkƽ uڃG["dp*0b+NUCu!B?b@o,<(ﺐ:]WT `Bb'VƩʬ"8G#O.J#EC-L[}m܅f@2U#ZryjrŸdY vGM6a 5Gޗ.#t`nڰˆdo-NGt~,v&70ָFF˗mr[*k{w[GHL ɂە YP2iQ`Ꝇp1$ A5fEY0읆fۭ ~ דH,T5d7UkP9H7h7u:h稜1К4IFOhݠO{+;5Ͱ q0?A2UEʕ-""0I%Ü˩@]%Q>@E+I&w,Jˣ.qAJxܐb|x10^pIk֣-uږ^ӒxDɕ&`& bZ[DL 3Qi}6:}s^dcG2f+9f?8O (wYo̥R-4SscX`I8@u'U : <LFr D򚐝k $+ׂl$Bf./3,3WD(Ntid} ԄZ5lj yvLϾê9K]қƻ;N/Z`WM_vDJHhnqFv-d ZCZ$-l P5Bl}aRM3 z15,0^PħlJ[ Zh[CյopzտZ?Armg^ns y|BC薮б&5 ݴG=׏ˆnBm8gIh V% @1lsmxe%k@*S^wbllzh}[}-̬&(9o.?{\.&7,rk}<39ۤkVU3hܘ/FlE$rns(W<(h^fF>>5Y̅=X<Oӳ$֙[SM*wCο8VYx!"z\:,Ӹ$)wlY^~Qk3>,|MFWP!lizA9XfQ14.`9ozJ?D~v#f?:~4\g3ϜF7IF'8Sשh^pnWK{;Wiwc NWfqG$k5}2*Z{/at:o }4!@y N(7LL T9ضLA=ƫ0k3xۻU@Gm .Fp9_?*kB,vpG>rRBXe$8"feW{?v]HjFCVևw`l65x =mQGRV#I “A=6IHB0CGY]E&ʖ}e+,(o0TրVVTNPq m80Ajhl1FhncH۵| ]'4]{mCUJt0HQkl_%fƥUtJ"L&MKsL|zG"hPD'tjخF~U :#'DU׮ (p2Ii.cvT*nCH8fhHg+63QjX-St&x}(OԊZ ^̳.Uka'Wc-a 9x5zn0+WfeVZC`kW>Ft.L)6ZQ<5-J)7}i@I ;xo4 %^@J= e%ĀxT3P2fh9Ү&9h 6(19W;۩N.*vtW(K eI6)왻nлFYbڼMt'MѾZ#鴂\ r)}E9Qhm67 /n%#^yS?f tlW?gT;;?Vl 2JRRVx5+L&ӏDWp̀d,SdmjxݐnPiL2%yh@'jRto\5$ (/?xG\xy⼈?q=Wsc#QFAs1?;\rBSB~"N =5`[^7wg,:JC+0v9<7ϻz\?@xS|3MEpCl^M{h¡Y׿d١&evFLXh[z6MҌ(L}2c3Ӟ+uW4`z`8f3bs'Ps&Y/-^*;?K~ !08^ dsYaDؖo;Z<-O,A8.'ƃchlbFIՉ&L{5,bL0 je5Y~9Xmd`YE#0،m(y/{ml \4Ea͠Q ͇^; a/ UC @1wmfoX^ ĄrQf7a#MBvZi54V$R %a98UTP^;cOFՃ' N:F`.Ag_hh*Ed%j+DjDS2&}!9.-PK“2~KpU\SC]|<}gZ}l>k|zL:QfDtP$)^is^8~gJ0S˲aE2\w=YQ6|`R~լiv.PhdF*,u E[fk;EζcC0YƖ^d d1:ss% (WcӁ\e@T3/. ӪzEEĊ^̦4G(1j."6yf@R[:I:jms V)8N{\]D夫r^8:h=E,af)G:<5״8tlB<t^BK YGi9/8զq=sc565tfQ^[&}o Ǩ(vM^cp&s!+zMG~oy9V x'+w]S7HQK*ͶB+  1TDTE?/`C?!8k̚/"EimR}>%gMhn ԼY"eE#G)Qomfٽ5>|7Vm.TWj8ko Ak{z=; Z.IDA 4Lկc[ec܌;:6.fia=N웼km@A47cVf8.)\l^Ǻt F"``"nr &y4ŁQӈ45?邈j'VT\<"UXP5K:ZPaq\+[S.,[դ] VEw=U_m6 <Sp!ZXiBJ.;X\\Xeft҆ҩ\]ڨXj%byXT\0y8”UG8m |H_@.p&D/lF&";'ߪ's-ا+[0厔Ep>AE_ mZI{i;z}hD Z1a$Hw .O[ F2Y__A̭ 6s~1Vʪw9,0KE\O0W;oЁf]2`.Z ~'sW'`K`IGDx.]bPs6x\Ywi]. ZS'zX>~3Y iH*u0 ? yNOH/L0kȾ kj,۵4,uOȋFD`W?ۥv)A.gb3z$mt]Hǟ@Ib;]  V"p) ɺSW݌D}٠t ؊ DPcu=2āE8X#軉d7]0_Iױ[Q 4(1qXb!?|Q+<'x'#0&\%Ĝh-5qIi'ħQM5ysyAӤ%LK)6232AABO&Ν`LUx"_4dL#cj.t|^YaYWf%ּ] 7`H.}'&T|5ɷ-kE8V}OЄ5mI [ߕIx۔ 1ItxaK*;=m ^(/F+Y>H\=USE%I[1 ^h))--S yqK>[ ۛ~JYIZa(+51Qt5~j(a0!x{a:M0\1|f`_98yqxIeLQ O>sOg`\3]:ھW??# P|Ʊ#?/dy?riY<×ރ3٢ sXQHDVHA+R;S\y:aF$qt'}nOLJ0{D<ӄ>YpC!60>opE"6Y<7 "i; @TǗB#Q\@P~R>h@9"@`F oʙ|o`X,…`JAڤ{/Yt btУVB+@gZJE`)xvDAXx7V K@PQ\TYem@<P`ut>{&">` +O#G& H&}ŰOߪmt(I%,\fHstQPK9zWƷlݔ#;! Y2\F:La=zQBGSZ(kW&ntd7IEf>㟬.=uSOQXu[rԮݮzKeA*]Q 8P8ߓ`k [#U,bR$, @*\k%EP['m!|CU*r)}( CDW68'`S61ݏh3Gn1a./s -o=ӯZ=ہE[?}v4tF–5JV? p3PqH08 ]܀xfwp?}P8~(p ! #Dח_5CsYWНfw8 > - mP~J~1\b ˆ[.pHp)C !(H\UNz$\hM??DljFZBsA6n:-a;7Bz}cKtWxP*pUps5J;u*k]#t7M R&!akZRR32Zxp/=2p.pWhe<fֲ, tG`4\L`+{TҀ3rYxYG lcPc.a:0}{|N m15.>9|[eTqYf(lv 㻲W`KDEZ~RxZQCl`9i$lT$9㾙#>`W n(0Q.glu@kHz茋? ࣙrQpy.k# O,RIH!RMQN&t&0Pw6 vmt&Dxӓ!7U2Fwpw<:ÚNZEm/0ΜݾӁXPf I:VnJH@ @4 4V^IMTP)UmET. Eڋ"!̊Lt0V]\uVԍ CQW$q|4}vP9JC7̃( 8&Sj 4ٟ>ڭ&IglPζ' Tn0!v3a_ ـCw+lVi_8t";aIvt>fq^ q; mf-{s)69p7C&E'nd<@vx)>g48ꈄDc[/iR i>ҐńoN\7il$7Rr`C4H.~bʁClW"#mHlnċ!8c4a%wAy~!Վa}T:Eו |V(=ѬM3@w&Kl10}ɴ&;%N2;ߢ9cCAqלnϧc2=L!.x%nl2(d0.kTEJL@.A@f_ۂ-fYX@z!OLٙ3Cmb+6o.M̻  &RMf/#Ep`G}wb'h$lć;C1^*6Ϟyȥ'̄YIOVi ɠ/1R 7mZ PWλ8,5a<ȷ=]3tiSEEq8?qH;mD[ޣi-n[{x(lϸc$gP~p.r2x($ MF)aK<2ɳ~X}L=#,K;sŧv:{ 5cޛ5==B[&B 3L}OiaYHGv_+MGS_%;*ꪅ).Ǧ ,,.*71(5xTN(s8_:>R~[}VplE0֕]$IHGJD|/ Y***L( C\3\ç@>QjJeC 9a& d+'aܧgMOK٩:2Ha9%~G>>`a@tg;AiGҲ0 ࿹w=>|A΃R&PQt' aI=8ḭx6g|ia&^\zŁ~ߙ=Ld0S/z &g l0sUd凙H i$"c*2+FxZN( $#]#ljU"p~}Y2@y"3޻>eq8|tU`035ќ KWp@k.)9X7~WiVCJT*Hbe(8ґ"ѝqghNF!?7Diހ*DN\_|L̑ȺbL.(+pmy7; uzɒV&2DjLV^hvUgg>,aOLγD 1{'T˃5g(=-&Z%oPX1> %jχqmrZ+ӂ;ӂs\]#_03` n`lEm q/XuSNT@])Z(gSIZJTIkg523~OXQ}y8,! 0<@,!8tܷ9hqBhGjB3US,ń @P8a"86(gJlB*%ʸHI!j:Gb_fIȊwSKR 7+ȋsL`d8&ҰKՄPgA]Un4if"%(DJImރVzJ~X&=`I ׇ -MUΠ )HT ЯSMXYFc~נ9fxj n8|P'0裏[fg0ZТ4 ;VBt4=%41H(4N\vHx.ʾ&a} 8KC 5Nd6LHI:X6v77hS;s.Fz}x}Q?^т}X#􂡭uRڂ>|1@Һ^s<8]fh5.{ f1e5wHi#$*}.~29t aPGle?GY`ùT1Q2{'tQ#Bh}y4 ( i =x= H=;<K$PcKKeT`13fFIPAh+Cn2@r jܯ6%0@GʧAN towM7M >6}/Q&C5SVx,TqF!gsVDafdǩAdxLb߳~S]PI,yXZu,rF(&NKFnKE2Ff&-%%(< :Yj2_Л4Dȟh4+-n:KEBZυ^|)gdAӒwvPTy}B ERdw#WkIvC.8%;IGC3=amܬtT_8O= "Z0RfB$;gX^|LPS%\#eOe̎ngqz$:j|sV1Nx`C ɦb [.iʽE^tsa-2߰%'k@' PԳiL,xhix+ &`((|*T<gZ6c]o'V4Zޫ1A*O[Xz>~n9OkEAWDŽ^g?q(tuOd]~d!غd7r;p˂~󹃮]S Ւ]Njaýeam+1Q -xC?ѵxrۛEQW*h$v@,7 G\ȝ:U:nҁ"o!Lp#mk|mNs7Rw.^oNT^=͙P#1"yA}v_L!zG>z-Gykr[ yZU4=#z~9o,Z91bϮ4kϋsaK !LoA}U n<$^Hј準4AΆX)ӱ&q\zԹŮ7zE()*lsyY[':Й$j;Euf#'=@͓<[JKР2ձ/b,ɝRYhl}t5T$fs_r =&lr zD~҉u8qՒ|<.5q<v*HJl垘[G_dP7o0edIz D&C^թ?OoK 6F!bFf1p^5VF#9~IGGxzΨ̃BJ4U X{"G{ï<^ޅ]dfY'DۧN{\Gm9z]M'BMyqu9i<u̪ƠPeV%mF~)gX[a&<>g(t-Q) A/3WH%! z mXqrKrػ?>>&3gSfNz[j[m)OC+'Ug$CyMrVH_vfvrt"BZm;uVWFwɽN7I WDPTeeGT~D:8Ptx%" 1$p}r}.ȕH{ ÀȅWj/ī )bJ<&'nXESC |=A7Yج 1p\s]N }N[w޺ cMKp̯LgDt5z٣?XWaak u*CƳ$XaXG}+CX~]3'9n$n"#=PyTk]aL/PFD~h<4I( < ~ $R/C8i{=R&d&ޓ' t6+ڹ^IѹV9hW7(Pgڜu*=a *bT@i6ЎNq0Ky+p2i8Mx,|,щm}^\VN^=oKH=4bZNO/b1|#Ums mM-RmD쒓ZmW%yºÆĸ73:Ncoi4Y.s+qEg}s?`G YOį-Zt[+I%[[B`w .1DQgg^ nZy]s}o<`7V*w<6v_ܾ5v_t{LK6>`2tRݍvZpfoĂ-sǚhWg$J&@L6u%b8Li2y Nr>9JYML % dY:L՘_1B9wSkxLL,1Qh=Mq yXũDIh,N/%œ6id<K0' b"vrDrTXptzf:ųԭR5(g.易yKiTU#3Q2 /aR? ::b\&)dd\ݙ#ֲlMKxF#%%FfNbtGM@taE,G6LuO7l "07! s1u;!R DifV xQQb tOQe-# nrVl#uÉՃwFF4fWPFbP T@p%8l(3glK&Rn_1]{_N\JP˨WQ"NʙIi K zGQ>nn}]03&@|˜Q/eo* #x5RNpJn$sV tLFp:Ev0(,Ս2$`AP`A3gswE9dR.;6/ |sb ]~JXUF~Ws>ϡ#'`mA%;3rAy94 Sy6QCv6W!\.B|;,]vy]EN` Rgp& )II転TV@vH?lG>!!ZPU,g%/ߘb>V(6owc%"lxM IJ*y~q2v,#^ar\2.WG$H[qu)IqI_YLzU=Eu26){u;`i:$]us\ĺ郞$WK9́Jf5ONBw'@P#(&$s3/'8_p+;P@l:^(ZA8 N͌<%=ؾ,-p7~BpAU5MC4sC3qnFm$ޤP%H$%RkE-EcEeg mNuu %7 /rfRk*ڴ½+.L9[TdNP#-meulf٘DFS|9IY.OgpVwk!\K9<.,M8cPƫflDp<Ǩ^{tpӌ)ĤVm%ȪI$9"Oa[XnZ+e:Dc]h~)Uʠ5'M.URUM;'MN i 7)*.QAԵ6w7Tx!)`szSn(oU?\\ǫ_SVa;QQ=g2P]{YU';^E4_}|a*ƌtb9zM_Z":09]~ A"(a{jnsShWFǼ=h58>ٯ siU;q|nw8oU|$v:MݫM`k#SۆxSl>-,tJ8Ӌ;>$@ΛUb?jciwV|fX }Q Z|˔gpJj" #>TI$~%ၨ2߻5#P>1pyyI-WbKxprnNꏙ; K'QT"j|HN3Ҍh%.q\ƬZ cWTڜ;  7nn~-|'[cx:zm(&3ggys>l:@=tF+V^+kʩC bإQr!9Vhift&SNXӫlhϞ9>n'RơkdCr"i?.>Q%3;ڙq|l29bHRTDC{84:H}6 ,\H$ {Qlz)Bet0ɩf 4oG } oc~uX?jb|fR1z٘ Pv/Ԅ" o&wc4Fd~#5ٞ-QXuC_oU:EQ3'KӝIPq#Z:qY{d0  aU3E'ޏkw{w!%{!z$Gp}JWtKSEvce]!\kbAҫ[bU1LZ[J7wD4fS*QGYroPB8 ƚş$M%H /LofOoPPlr7Bј*\sc(Y'۵/bx&XZ&^&G!e a5Kn1}4݋0bA&bqWzZJ\fңzˋK$mJ, 8 eA HT%kv$?^y¯"D M9 j,<4Fmb+#ʘIByVKBZV/(_0\A*zT9 Tms:T)qX*gϵd܉[:m< -b@{r؂l.:d4AM(JM$jcz=AU:DS%SB[L7'rdrsZ?ΫpBO+OH "2О,s=N'&\wdlĻ%gtED9K}w މX "0I>8$Ր"'+ :iȝy' ÉfuWWeWJA!tE"bj,$KK҆Q,fۭ,yᴛ~M2V7ܨt]B*JwǢ;2ku[(lC[,"`F%MK͗;WOAk0`Ԑ5]wx}C1erkcLAޝ͜9x49v .Q7 86Ю[GIqvs3r˦~PBA{ nЕMy̌V ,2$7a)(xn4Uu%DBXj! ۚ#AH^殕G,}!WP]y̟G1+ǡYjhm戻bpW ]E`B4>>!%AiYDݝZi(t7ұ4O:OZ: +ӝ؁bμ !9%сC͈*@&Ч<[SϺ!a966i>QޖoƇW!bB3&$ v,ٝec0hPCط?;Yb7LOFv?8-̻2^ _%I UR$$V&]mxHAU}d'R[RN=mQTgP3m"\k,)㬜U @g5u.:qw)-?%>I4|@{Ij;AKP{l-8zˑ(TI2(򙏇d,a1,7%vrQ`ޱya9{%Tdχ)Ԯ j$˒āvΨks@(z%dΏKqO4m69a|!߬is MT;D<s'sjKۤ'0 {[I.l#Vt>3q5Aj~}g[xQhQA$qJYbhK,+ ]xO\8e^gX$.Y.e!ۉKl&MYRpd*8)d);N`d&{?Ls" J=8kVH-3td}C6k숩ȞB\ UNO}nHA9+pfdf"?;reXe:aZ58=W"Mcj~P @j rHgll׽T-'b1<ًM3GWŇR jەodh5:>@$*,Zlºv=#g%MǦ|#+r V y;L|l lc吀֠%U7\XO&jf4fJT6l%C$ 4(ckҙ,}`o Nqt$KErx_ 6]ͲC@칊QYXeyy+hE_D0 -L)+#^$5u^&%?;wOd'/&2 e.?}\e2}DO ydE~bT֢JktrߴFv?t}msoi GUB~=淓8p .!Bใw*/߼=5?:‚BA@@%QZ(2yIop8ѮNԍw`g&V&:)Foa26q+:DMvz~DNЩɷ9k;fRyNqr"ֽ?Y)̩Y%S~XpRPkVp ʕ690|aK}~Ə!کt䗸yEn--ȈYˠ #AI4鷊SX&9[tzZfgTFoY^g9R(לy6\f":KPrۀ.82[^QAt{$K Uw^P,DiѠI¡E9Fy>67O0V߄mTӿ$ɳOڷvdJMEka;1}SURL(fIӢ@ބڰ2ϝp3*ބo~*)Le=~Dj)8'2 =t3f=n\ j؎c8.4t?'%!ѹLD'Aw_s=}2w @,oTpT͎-ts^;suO|wJ]+CR<GDt7(HRVVkNPp^/;(]%v$m+R:tXe'94Ֆ*Uy,+LwOBS뙖-ZjAU+k)1ǥz%v@TI%ROb]^3\ՙF~ܼ݋b4 \Q4`ΡFr> d Wusenj{EURCZ weDn&ޢH-{rz. RpޚoEY9g3R{9)wUݷ#DE-ЉLm*9 f,|J{i'ƭW1`c3s.bC83,"tujҊDqYLEoNi5u5MN+Idw[EZ%4 8/@joڋ{-tυxlƴ6BIKe1g#9* JbQ Rc߳$ez`^f$jX6d ܈e"KGPސmɱ/iH8k AͦZweieq6m9(_ Z[Ԃ>@|,6!L$xPb?ҢBe9Gn5fWϐ-Sܞ0Ȭ&]mfrWMyTWOYy9;EiN;kVԜ$$YzASMjwߴ/tjN;~_۶hY3xͪ]rY͔q#%˝ut^p%[N lS϶t1jy C 8cްm'4Lr|SJdJz,m3!jb_ƲUߦ~6')p?|8My{3GxOwzG3zVo;E>1 =aMht"jIHwo5GM' MSwo;a3pPF QOԁw3LBKwDVWJkDKa$삀ETڒ[~QC|cO'>P' KX6*K9LeBYQt|&/mq@0/h$Fp؇Ikh ~'9\"Yd7 (*9S͝v=Gtd4!bnvw| fdSΜfB ya62~ivȔk!VoSp1Z#mx2&T|~ɓ/_ԮwɈk=EM T*A(G5d㟟2gF@V3]'~[#0}d {A#F~"ƞBJ E0[ƖuW\cr) p_&vfMQJ̷WPY 0?' f^:DӱSQ3{UXEF!˜N_6|5*wEF.N%LQQ~^%[̯u d.|=饛w| ^=~N VwKhnxf0DbC4|(jT圴s:# ei-pC >LjX]up՜]hda3PZ?ăЏܢ2K'_7O5|gxw wE靱|BQһE4S1z!VMM6m15s.ޅ֨[̚OM찟xhWEaDXInm^zpkZr9̭{"?wū`d7ivjv|QR}p< oT_>|A57Ԁxyf>3WnL=A3uytnh T9~ӄ\@(jGZ!4 O.=>>zܽ$"< H/f9(}S9-|+g G %YEj&hqK&gڡK 8 8Ÿ I1XRTEx|%"1T`iDo_ycZNpfBѤrylRbMK$=gF_VDZZD% H[,'+Op7y!pKd@A>mC_6G%sv=f~p~t=2nbP{;$64{`W;޾ >B]ih0xD8:u^7â=d$v1ǼΦk-7S]WC`Xl' -M45\̤jI1[HvXV!"k2-4 Gˮ59+GsR9+ Ės6, " iM3(Ӷ^&x~w$U@B &'d`d@T( W(3BY'/aK*d>d6:MkqLCo-MB1ng3N8#}ByS Ň"EܠdTaHC'Nqb[! Ȁ ]#jc%f_K^̸ڡK縹X>K5hޗt{)m.oMˁҡ})iy;BExN@J)l1q0 ^@0I9;y{sa:C㳈`W.×e5(AJȴ@ M YB8 0$ê3V᫒y+;ȋ>{FB1,9g'([4gnBAd! #mFE%]JG!o3!shz}L:p2!C}_]x]WP5Jg3֟^ޖ4}(+53P/.JjҼ^7*ߠ=}|`2gWrlCa"l&#Fuw-sAv>&oDA:Xe&TIu}Kz%0*$]:ˁEJQ۠qKT'%JܤJՁ+pPEv{֎ ;޸$nHD 1BS_qHrwcvTUP#-9@[WF~ӂ`>bM>Z׭2\bMoMS=ڬYY{-N)|VIR7c=xn);oPaγ {kB ׺{!ƜZ5p1y-L@]xR&G]ք@*:SQƿw;FrVn&|ԛ0AϓSbt^aJF]`vA%*7nMy_?iGR".7}M}mNNv)jpywxEbbb+-'y._k [vZՕ2W>8,#h&3.9YPvRBHeyrse"әk7Uڳ[e?c SL_ȩD.lJTPMiFQ4)׊*YGw mkr6=VDYq ap9za'sA /N̄X/B#L Ĵ)QѪTb$mD.<@?V= >PܛgA`T!p3M1%{2[PTQ尌5?f=]87|wu m-c9VѩfP h2󙤠QgAbkwar k]@Z3cf/y[ 8RUWܙK4RȧGjz^5DN-cRSĽomg5,Hu丏˗Lȶ0y(%PLP-.-ڨ$ &fĩU؈e1l")Nèһo/!mUWWE/S)ݓ'V0)ܠ/ Do{k5j9zр)Ȇ6ruR(L/>i0`#wb&^4J3Cb!Ӌ7-gv?C"3iTrybVP2~.o걋tnހ5PqJ,2Aq@xu3g4F Ja K,ôQY Ҟ/[SZ/(s)h+%_ʫB6"g݉/*t(8|Q2ނΰP;J/e:)#<H 5IUڱt=DϼIN= {sWxLNg2C`XT" Du8[<%Ƽ*0%UW$w^Qnq wT d|2px,`6*pz"'ә@5Pf.2ғqQhO)+ӈq="5͊DSs~:SUT&)^JebɯHWwpCezjM]oFoNmHDzvNՍf1'%x6!R2`f[ Vs;#1}$ۡ˾Tv cdK*I?53cFnmps77UFlЅt54)ˣdd6IŁjS_OUs1{.>, fD}P%0tuәCv PChdzFF63A@SO b2]3=v=IyCIodgºG,9 aωsR.f?!! X0@s r'Wz !G5Am3hgmG;FTaC|Fk<4F31L$, Sդ1(gu ^A? Ix5 S514ev "?U5i`j#3Ց)3%w.z rf8)1#t@-IY$D{dM*ƞjt_M8U)`ל/ vA;[6E`' pOt%滽zgi6ԭTBN-/ELx!#Յ0}{`i%*e@[W F)&agPm8Z筇 ?I6g7w7VQ /:0h( /;S`BABټhFJcȧ"&hAj*ə4 +|rLq)ѕ"Fq<'ab({D+g?E+)(`v7ʋXnq[K,YXaqY{U@g %gb=+>{B/[C9?_(g!U{hH$g0Հ |0"ei']:D}ZP=ŵ[x]ӕ[2wvTB}7 lm&ܷy@prE}ŷ&܎F{2n3:,>if[? ٦MܫыG`Ɯ`BEF#(q˄pUȆsrL/7omy<rԬռoI !9!tM§;4궠ѹIG\݆̾rp>(N<1,Pu%#LlB`uǻaX''(.MGi"r#Q"BWWSKƺ7{;{ԴXUP$ 3Jv@t#uVҚ ߴ$\dG-cE ]]:cxJRhNt٨ݙAsBiK9Kcl>E:|@8x*`-_,e* =okIИ` TCi " aT6#SBҋE\L!yD|{9fhYq ?-+aFdTsEf||؜|e1E[xWbs7$Q@x2`ý<ߓxnċ{ hO^O^(ۈ Q+w}7;`ıJWKUҔU ɟE=2eLrow装89lB~O?|PGta`18f0V|.>·ߐlps"Xp\%_E16pbqD{ LXS p{#'T4pͻS7.O6 Db1%̋laү5w*O02E#%%Dio9$xlQ?Y] {Щx> 1G,cc.t,Hőu'۲F=xlB([K\Q0@R?%YSJ"Pkc.uzu)Tsv/fE\SIr0)+՜J61ggՇ '-bL0!$4 NSǥ~.L"Rήzv觭k*ϵH?6F|!kOL[qd.\t.e|{qb~1TtբRʉA=bmoRHd|Xr qaγ= (ڄʡ޹MGX#J_\v^KōA^B r{WfLER3OaC'/R ߑ_Mz ]֢<S!3)  ,z&Uhs#Bm Ax(O \QT5|&mSb;:=F :q+PD5 %%  e$[G(w_'6tΌ3Ā+|d|ss)PXTRTdiMe2VQ+m&MEKBteg>Fv}~ &F`Csf| ;Tz{264Ў޳QNCHAɅL@ '>tA-E^> ,``O9\M~o;v[i]~ k'>ˠrx< yl !x<\mN B`;]47;<{Cz}އmJy(lг^PGѝI&_8U&H]@2pE\Nᫎa0B6*Y\D69_u ` xx.",  "舡QW5:)0V5Ş{>@Oa>M[c> &裪Co8Yw]vI&Xʟva7!̶+HNJtaM 'cը9J ;\Rs 3j9է_zx9AtsˀuD(4NqٹM~Swxgq0t5tpkZid .g@G/'_TYR(URW(ds$2LVʻ]do^`dY9ވ:}'BVڽcShf'Eļ=ɎGX_oR"(${vѮ- ,%S5b3Qx:I1Uf8wWMW.+5XURn~(LyyU'%LMaN: /`M 3~0/Û'bsN2%Q֡0 }5bJVT\O&A6;2S$-|4b9`/3Xr32d;T oI#=,?NYtPL[lрV8adhD1i~bo0J9=&bf ]uC}/@-9ct%; 5!t&ר8}|gQز"_EG^+xcCSs}.Ƒa9]/Y KًA8&<}ft/Ut%HD#v,V, I)SVOIg*<8 wKŠKknַ5r+:G@M4ditҫ9BD\RS9.>6%&c-Ã8S.uiso!Et;~eMZ*# %i%5q*QG{p"щTsvP yq՛jI2c^{G Gפr?v1 0B;2C{21eCd[Z=[y!ۦy~4DKAY!qXw[xZE#428tԦ|Y{Ջԩ*tjxYxEq;=|=QeɷHEɜIP/xP5- 4r]vK[5( gt>6a@mOdlDg>%^`!*3 K2BuL7l=@iä O`!Z>s!z+#O<1ѾRekFmU}˚7xtt Wņ oS~*icZpq>/N, &v&^>ׯ?1\~ċXHo>hLX^0^0^0^."ldRal.QJ]UK-0#^\ɕ0Qh^aD~ulo7}'$O6G-B:f#|+u+8 ήubAIv/ Cg10oLݪ8woBd| cޚǩʼnəKKt<d<1%&Th#[`ũ궁< &YU%I"vqhJp7^TLsA#.0 DiԼe9?)Q6,#5  |wڠ7VtBzդ d 2Eu̬!d(Žƒ;>qvbZ;cF{8x8ZHz.3FcܕXhBliHЄ;Ģ)O t$=BDxw])-/<3ˆ@#0tnF 7\C۱ǟmQ%ƒ5u|dZH6#[<>Fx1:qBvxcY.X Xq~cXAT uUaJPA4Yf8r6$]C:C23!ԉww[8_JίpSLB:B c +~I >7*wmc~z7Jʙe-TˍjH"E9U(qaւQˆJ'/z0*rI TQopiHDT/*Ks("ԉ0]:t&#KW DOzM 'ѓ^trvȦ\"ыun5x3>RGn#-Ů-4^A~IO}FP/Y~#F\콫!H v}^2.Mǂ&EAMPN:q=ln4iz@ir<9+V֚8A-&dXذ*IX jҒT/T퉿U) NardHt"-4Fl a'wPPXLGph"qv+gLh"׮ٻ>^ޖ26uuY jC1D r"CuFft5P1"\*W@wt#d@7`:GJ&0֫aLN40C*C'M}VQ|vtqPk ^']gw7p9AH}n ۪<0|:Ե)6 l[zAl=I%nv+/mX6oJzǚzG|ej6\f <Й2ssvAC luPV\+?07`!@lM&pv>4Jt{VڦD-eW(*7=gاU.5?7%>鋧W4B0EMXbqh*d#RhZEzC'ex5CgQsoy>WէQ3,a!ٲUe7kؚwSŠ[(QZېu0Z@:0gׁ/g!$V|+dBtѡ. ʏv\8(evM䅇t:xٵ&!Y&`*8}a q0:MGb!DˬMC]!q8N9qpb:΄%WTy(°BWq@r R*F֪o1c-xG_Sj*2xG0yT?*G_C8s"$~rosQLa]*ec.wP^fjfl+kC+k!u*ř0zqRGոۭ?U}^wQ=DYbJzT?UǼ^-8sNLSHn^LƗ`V *ڂİ%Lls]})݄.)#.cݟi .2.T_J׎[u5yPWlЪxX:j `zs"nH:ۣj:^Q[`@NEAc&ޚx:lYI箵D t{W'%0rJ+Ojb<[Dͱ>NB q 3G6UM-p$)%5NtEcj,|e 3sFVG;/@DJ< Į*soܮDs|gU`1õZFw]LF = JAʰ@6QN& WE=Ufhu%;V 4TA~9wKDLQ:B* F@h$DwE ϘaA`jbӊIi^9Zs4dW ufwfy`@َ=Dfn $kZPYlxcm[ˤN ZjMrO?Eԯ ˠn4w1ys#{FI.2Oe9Fy62(\{zݪ>n*f$qSoV/3"K*fVQhkEGͭc:;\&qaY*,! Q]|=呵[Ș3M 22 1t{RMXYk6p'#"dVWWb.y8+!AˉCˡr(%ۛ=У]`^<ԥ[hF[{жn)@|z"O2Iw$f{I1?ft7mcRfr<9d )0~Of?aK@O!Ox p ưzWX0?}?<}\E a/@&2Vm6_ǬT^,H/+ v"& Vwd]|_?[w|4&2egmlo,P@:dN[^l6Od.?'zSw1;OCO)Z=/ ԝg]˳-xoV[J0J4wps e:ɛ7M?BA`=<|d9~<^Ey&&x&HrHɌƷh-`~C;IpXD4TȘ~3Sܖz _avpWn/*Tj5g<@CMa)@%C(=$l>ӷI=qA>nDC,,,(C"3=m]TF&^2ljj.S\,]ރGN*1Q@/B l.cbUUv*}W nm5!A 1¨VՅkå*b⣙͛SϰQW&ܛYh!WN'9OqT/."fjkASN)/ wTw'BM%w?J#;%_ T'K6Ugdl(Ǎ:D뮡+R>5di^%hډ#[W{ Y!yf3vỹ!o_2 %-xݍfQw `s 聱A\ZgSMd jPHo}`|D/_mȍnlvóiTɗ!BUWk\tfh|Щ]]ԡWF}7*W `^G뉨' Ӌy*Ac Sى>0NW>t NV'W$ Hg)1vrT{'Q\\qҥd[7'—[KHefe:HǴf;p/b[Xx Nw]+];U@%Vov2:_\ة8aiYi?f,%RJї3wdĻvj\]WH<{KXMSIΩ>:Uu \7t2 i(.;<ҵ }l^p|apW&ޱ8W+^Wð-DI~p;gD!ܢH$I/u}klMvo4``n. kd .H43F٦0N1Jg80ޕiW/arUɜG3'/81j)GV'T¾*n/V=SUeŞJU"O@+X#&:r о:t^]E1Q( *,COϗwP'ȫa` 7z3s8$}t'_`]ي_DPrͬKþ5ny4<4z}J1DŽE~]|fy?8gS W xu[*FmE=d/@ѾmT $x2ŐAVIxk[VaJH~!xqHon\iu*<֔N{-4Ӻ,&˻9$Ό&BE-2pV31(9Mưҋ0zc5#8yozcL `J]Kv(#rA?WF:#?O2Ȑ"!}?.q6-ǣ4b ]C%eYmT_0.o)}Bc0rN7~BZEz:աbh59韦G3qnibvD 7Bu?SI iýX%$ȧAt ZEsD53")RqvQƾn[4NU6tXc9Rņj~G- vHGP0%԰W,$Wˮw q}>NqΝJ]浊?hi ]~:"&&۝^]*Zjq%ma{[-=}0L)8+$1GS8W [x4 >Aޥ(k)'{>].Hp:eG]@x 0.ьq? Gj V `Lp&4~$ADOraB9sJ&ЯQNX7F/j5k[[a~Sg^yB1a(EV"8d*j;9#cay2O ?1>{؛P<:  {50ZNKМ^yzH{qK=7fr7&5jGpn fԍi|IGDnIHOeԒHZJ 3Uo Y;;>5\{2`$/ _QLHm*yjⳬSFlڹ#咑f.(0UAsƯ$_d`Q1=2ӲL*/w#Q:EL* >h -j)) )c鋸fv^W/`_[ ۦA['6#9!+^ׄ2ݰBb qO::ؗ}Kf`o%z{M_^- ,&қ|ʵ3 4ACrfs4]'K ezۥxub/eu2"yWP(%) CAkQ>1~:OΨ'3vB(*LthM*x_4gkKk82cr[dU( %-ԒB2eKOXNDKp<C20>I\]F'&y IIGV^2ATL\n+( ]"<-N9R.#fFސe1zZEmEYh4 GK`8cR}=,tS/_ WN4}삪(IW46]e lj.&T36iWQpZ4ko ?tbφBK1}S|@ǯb4wIh{m5r,ImB*.J' 4K]^CW<8r£Zlhhh$59.ڻ3[`~,L0>\,g~E H gab}<"¢L Imڏ!PP;ض\[?.8ğ# T4->/^Ž}*[#ZV^;abTpΑöOK;6g݅W8aHCpCb}w4`ٝ-f46bE sFjQ~%aܗxO:%c1Aޞ?^\WU_%9gZBnj\]zp ḣ!|OX|+/ɖoףkT,w^bFKͨil_bJ6t2|] ŗx~K; ԥ7e2nЉooVDrQOS^>]1mj"sM_>9###\ ~|%j&þߴYe58"ie'7Nߙavc 7ApM NuSD̉~ {n>8<&J'MAY;Ay7svhک `f Xؙ$o yLn8OÐ3Fa7)|I/;L[yi6R/LǿzR?8 k  Sct΁4|ĻE4[, s*? 5K*XPx&MA;"vBz2o2n6/?%=zVOvg"T ︌+Gn-P8?0lQ򜝫AГdA”Hu֑7Vfl SRk/(<BO^ Ǣ҅oV^hlH<ڶR?~=DH.k. hm;66E5o\ǁ]+7©ꂉ瀿o_+pÊHct2ZgV$+H̛ZLr98 CJ(3'Вb-"檺*3#蒅36 e:Eox]7HBWA5UǼ`XKRuU%>%:;L̏U̡$bZ$m@Η~>A`=b1d뒱q@jK.Akek#HO8 ,N;]G}U|&IeYXC讬F}P~pjBK3¸*#d|*x`}B5w7HNKDIQyacR?Z;Z=/n!p+ԫj2&i%#ݪPU2Dn>i4rryvs>i :qV.@v`f(ũͿ9͊eI KE4WV&H "߾F0xPQUj蚥;DccmL!1O JAl*pVG6>8[ܛRt5!w3z m}л7pz1Mق|8pCtdr&œBjxOUп$^|j!qBShL!I I5$.w6qmTvG G7Lb* X[$a/Hlܡ]mO4lKpvUIa>(4)jY-ӓ?STȧ|uݟ7`Oci}?7ן?϶??%ؘcy(<Ǩpa  FM>E"/L`(Ty:0I(Z\ӟ ˌJ&_7mUJWC͐uwmBXU)+$'%ٌq0|]|jfᶫv!yqc0Y$\ ]:#Vq7}H.+'ުq Z#uKjZJVr>SB+iP5}]gޫjԪH5[\ BSw^؍xdN`tfM_:<(' 4' {.y:槒? *B*eŸ; CI{QpuNR"~|q|y~ xe<+R{F{c16lڛgsv簽Iվb7IGeXV*ЃOǓje5V46RGG-o4Sn}@z4;R#h^;b(-3`z 6`$)F/q"i4䲏x`) 4^X+ /eyp^VkE69hm;IF&1F? )mNaM(q&B9Nn$qfqʭ͋<N ¤ۓ1PMᕙ͏x}{u(,13:r1r!cdͻkJod;CΖw>=PeK{;PrJay ^5zwS_Ņca$jGa^.שϕ+n9^xF ]!) )ŝJ ݭ*oQQMV4r$`YcYMNyZO;t5ii_q>?]vPj L\Vzu=|tg ::0vbd/添 t|a霜w[{NPdU"jɟ_?/?fe޴[5Й9MqpSk7/+>+Jy1xd/  Jn12[DgX0qBqp ;u yK CmF7[ny`| SÜg_X Aӄ$Z\&BsYvǺ2*..GgHLki.IhsS|+?': TJ/.gإ]U2h;C YJ }=`/Q5zҊhw2V@ל: ViAg!mXJY=_yy?l7?{ܱOQ# OvkKkw[:*%zՈGAmQ@W7M(yiv!WiSVgs\rZ XnTTeQ#D-+##vdo()>蛙,b25l3xIRuu'p%k6_G/nDǜ$j#fWV5F8j)xhS5&-OQ Ͱ^j%fa쳏^eM +Y,s0B*}2$-W׼!qF7fCO-_8Dzh//Vg0sbj)_b:R]iqa @D_SCAPEprIQ<|Yes2Jm-VReיBC'M t|ITLd!dWLn|JFMtA$i)nK"Px .K!=2r Z4И5Mg˄/DRJthCp(D$d8ʡnZkPd#ڶ^/gKcP_/u7 r6rg)Q.,%_1洣XP$ꔮYY`9b$ؘ!(NT/A.Rʄco_&O$-kZFQ3_|h3.4q#7FjY㍎!/|9I*!i)(h p+pB(Ctr'1q&A t}BRQʐ2Ia8*բ`~G )#Hp3t9t0xMH:+ldoO[ &P=6 lh'x!:&LH}؇SU)ׇRS)3tfVBcp،MDDʇ%sXt :%I>CW?IY!ˆ %zaquy/}%JXEufiξ_@v*qE߀ȋNӐ=Kp*愹v[ߴBLMR0"|bcEaVf٧xjFjsnl^Ւ˲+Q۽s_&6T87ޚDoOHSxK~7&~l8z|-}Zk5WQnMrM$?VVw(>UTŻ7c纪^@esZv ж\  87CHRm.Wk8ϫڛ@dVͺU]:Teyt-٭%Ln?,Ge-9ƫb5:nTZ򴱹~zƿ]:S:bNcA npOqcd %ft6Jal ]]ЇVx^M~]=7wOz WjyN8Sꐭ|Zk|3{~K _>=bh2#QwrtgXh0ٓ"ɗ3BK#\#(2_7Ox^7oy))ї5AȏW  \zN. ]Ґ}>U[_ɢ3:nd}+~rp2T^djEF!]n'&%PHRV* S ]|DqIC_bB? O^AU)&L|1DA6L\qqN~ERp 2=d>1mɭLFk;Jd CQmgղt;ygkˎUryl- kYƟҵjuxqp?#M焿EW ׈~ɲGűAQY#Ⴠ~;$mG-U%~O*n&'ػẃW^Ԟ߹ݣLa#L~_tnWuDoo#?o'oHv t,+C?ovdf-dq8w{Y;9:H| ^"ޏS8E(&ϯ:vܭR3/gDbd~ɋ^oz]^C=7Ϝ-xf6{d$+TM-ph wL{N;`⒡ V9`[LUӆمD;y.ҟ?b4\cr6 ΕnYGxD}H,0hp*`rEܻex C^N"&Sm@ nYӧ<Gh%?ZVo>!""I'lAx^~^ۏ?%X#L&y9"ޛ}v#.i;E111`HQ@Ydg x¦[4+D1hYexX\M*GT8p_c'&)n lwûO3hɭb y^-. 1a|:3` wSre5NkԪLoçZx|t(RmD 1^`(S\ ϰcczѮuj[pNqTvԣA_vq HSYqm|f5w |>[S nQZj۲%*sQt+G**4nm巸|-!S+Ց?%PP^KPpr_D-rVͪkȮ\Rҭ̐"',Y͗骭*X9/KMI͙F^:.۔~:b(1ȏ,C_&jX=1N͒C : N +gXSEQr5-&}Wò"$/-gNFhpZA/q?"c¾V8Ѻ@*>yɹ.\/$y?)ҏEL ;lnqjȅq!=dEJ z4p0MV!#.eg ctWPDX{^-ᤅg|rM.Qd68<ơ1')'ɼ+Q+Oy߫+]嗽!|sIwIC)>NF70$SM=/z>XRe%aP."!N.2 p|7ÛtD}ËxXpMw ] ==hyXM?fe: i?;m$Vy ī#}}$m{<OOOFD)c5HP5.B+/.C؛ @)(1r1|U'~tb&1*v^ :>?K^i8\*WIixCc%.m8ྰa"'>+.~|5Q_S!9`F  2F +ع@F2;ί΋$yA%,H",bx$j ?=zC[P yɠT;sy'&o)JvgOA\8 Jp#b勯ObBCHl<,5n]ᤍA[!nBw9{][xÏ|,a(X-nwwVer qtlF» }~*1'|+ n$qp92ДD סF Y>{e/x1G_wKwwPbwIn&' ^`#0wNpnccce+%2G'Wx^iwfVҧM&teLzIMs#$e6djQ4T9W?8LNz.;{C%ɜ %FVV7UAhXO*=9c`Iv$g0'@&3h[%a0tx0Ir%R=U`&^c)L4*ol~wl ze 3[\MPl˱ e 1M9Y'5^2) 8AoB?F>GhEGhzq 1 n嘾LƫTwUxVX0;PiЂ$FCi[:@5ҲSC!vbJαy1qAy 0eZئ 1$įAô9I"|  /6`(rx, ooGn,kU^K`G҃0rUѫg+ؿޚ\ex\lKUQB)䜧{֣=zRa2\G񙈇R,zOrQC{sIX)"G~"U K_u"p MIc6& > *ZiIq9N=⎍躃@1ts)uk 7Jp|v1w#l_F.bWTSReYI/~`:+9"w/숈7V[&{ªV=J`I 5cp󙦖 ܷ̱ 元4)0(DNvu |ώ,_lãtȇQ00]]#)vx %ˊPlusԩ$|V! /.B<ء]Av`w|KӼ8ND< vD 5$2klVcCrT*TeO35qp/69t&A"{QO?4JJLrDZ'tp wyB/J.nMR>˳?#<'oX5e\<:"H-@S@EWѩh,v/x)I~#xhd?XAp\w-vĥj 53q@PwS+]'#CYl1Ҟbr_ݎcR/\Kox)T`h3P[dw\QXjKk$4!:YH^cj;OTqM5y[3 =sfKE~Q7K5oYz8%g/USaֻ40udMh26OPKo'piv;/67o 3w h䶪 YYB á|g  @(; ހ::u+:vb7`EaHEI 'Q]rop&1̈́0RTczn*帠ɓMOtHT S۩]F iԙu7X™uEO٧Zu_.\h?,WuEZkvJ^!?U*?@f+: H=ҝ_)Z}&7;<^ͫM7hV: &L; uzX2d>0Wtɿ~+}ukxQb1麷v TW]uO0b WfI`^,p '.t1\baoVquĺYj:N_{UwDX J=]`;?CVC8_l,+r -@G' H!0CNM1)3DjE4$Ps<+PVAJlGg+vY;6*$I1C'*Hw];N÷5,3[QCxj0驦/8]B!qQ+zȝmяc%zoYoxF΄t2wʸ8#RHkfNKd~ ZQ7Iy>13;U5m\7 `ZiLS,|r&c'wHц "q~wŪ\:j*YFU-ЁppI43P$t]SK/]{t"w pV*aBL _d-%.napȚxt\ej^\)ҍ"9_by 8~E2^߭<#w:b^QUQX-nF].HnD NZG3m VUeQmf;Z'ca ЀqO }FH* 4:M{#q%/уDD*K CAs:67R>঎b.R mu|?#ssPIQD7aZ{X  p)% Txb +3[H0*ýPob! l\Up/Q f;cW<Y^"Ɗ={=S2hw١9R'4y-M|} jtݥg OŸ~1^Z\kdB:}1ރ2JC*H*ȭ$"2Z%E?NN\笖,Yy M-0㷞ۓ8i責m] ̷d~l7xl嘜>Rqʙt|*CH@Ff:ݪ@F_0וA揎?ۮ703xQGc1GdR? +o%v ӿp(B~111PɹL<}TR]կIB+7B `ߢ۪{ Uoo  nA\&TѠgzt3$bF8F*&l]/XrrJ\NFƓ GjB]]E:ɚ` Q ]cwc!*bESXqO ZM>Ќq4F$24ǰ25 ϰ[bCCrё,jiRRL:Đc~*i}"xh.viš@e pU59L=ZKo ` nQ2x/uOK҃0[*+jJJRtS?_i8|ߠ^jҎ9~"{-ڪ&{u[l+B'R70 =HOG:D&_5ԟ`%u\h5liBO ن-mBVtlFRM:f}Zlj iT6۶H $FzN! X QlM[VgA y *PS;!ժ}3˚ yl+\~r!k@TLElMb^DHu{ѓ ߈Mla;DuZBiB R6Tz33jG0 E_zYd^!uZ+y')m!z`%3}B[&xg4x@ڜۉe %c&#*YXry% or|;8|-tC< RLN'K1{ם \+)!'"w7$FeQ1R|&Va{bzgH\HS/ `geґ>%|{xxY 'Iv͊p뉽GShoVنdVH i0 zbm4̷7yo>۪o{#y Fhw%-ް3>'h8y4? C>27 oټ`o2˯?ޱ!ZHk6L0 7jB<˳S`bյi28TB;S(HN|iNl4`v@j<=/)n(+ = WčxzO,cm0ʳP[(DÁc~Ƿ*[oszB֑XM[ rlQY@`Q"~zE9aT7}@TU̯ Xp.TYGv{JN4ؽzNN+2 +Ni .;&emX{ iliH[L–>ȉ>lzhzCFMXf /_o dpY:}Uf?q ?n,fM<)RJs4zYXt˪Wt۪5S,;z9E;}),q֊LkE"*|yl(5%t\RpQ-J w;5,u0vU>/ʧ<4vc} )&tipf, eԊ$4-}TL#3zHV@Q$G!ʒԅM9zM@'¡PpI 둠cL@v#/SZy,#z[cm^:"QV*(kÐRZ85yB@HsgL ߕ U@Lb+:MІ7AҐ:*蕾Tk緁{bIl&с,K n $@<ˊFރO"~"}8,8ĎuS&ۃ"i?{z䩒95yBXwf{N*/^lQE ˆvÈ֏׷6cϏxJ9>5:Ơֻ<;qn><(f:t\rfeS 9 [\STTn)nnMF/l86b*ZRvCbDx$DqE {6nnRuulCV?#u₫xOmK%DzuwwRgA.v[+?Ne Fs'NlR1\h<:)[28T:_Us,'; TE.{xw;ɑ(gx[^;В6z8tTMzw9t5Lֺw7:3Nϧ5Sp%Inl֝H`l!X G4Eo{Scy`P豇F*;zFƌI]vju"\ZfS,C)ҮՂ;/ͽ> 1]v3Th =3\l 1 >oXU3h4$`9PM^1bwFْa²p.) Gz3+r $*iw u|pA4_o˯ m敖8ͪzNɤ˾M0ظʈ0#7 ko9D6jXzQp搞 7&- 5@,Z 5fE##6l}vl x+"&q1%FwWq@.Ê9!4 B}!8!ɒ (!V&kBnpL! ZoH Ƽha;D Z<. cv&Yf $jE0]U&s)bΕlݭ".O4o^D^6_wGS!1²90x''g7A%H EVȩEpWh͚E">?AO7sYDIs[n栬k9 2u-}/}FWvn+䌉[A? x7]׎!2 Tލ)`SiW';a3aӜE[ _bOrUH8|LIPt W\8.|s@ C |Ps;J<<8u;^I` 95CoBP~9U p;2*01!2QE" @HJINk:::}N=4O6ڙ1d` !y,Y]Mz< z*/=S+Fϒ ZD[[&6u.H䡶ajZ-΢i@QCSݑd7-/;ӷkgc\3sIH8 Bx)ė`GHY"<-;ρ1٩_4S6}"k^r&}\bJm1ْݡbBD%}]%Jc!#zBheF%qA>Q t*nk]yǁ, V4>k0w7Q_՘ph Zg b|da%=dkCh=Jz }I<_؁J}죂ZATcϞ?jx_[~Kw'kTݽ}_Tvw9޴1B,pÓvt9?N㉟*^1:]${fh11 FƗ,S~I¡]}@Cs+ >bpWEwV7č> .)Ä)dI 4ar9H7qƔ8M yX2ՄX0YnQw!}qv7evĈSNV >wjm] p}$O~4xBI$'rd==ryaZ 4(nSkFfÝphi>${(#}n8(?#m :}4dO G'+Α1  a|8#ML{|;wđ. @Blf~RT9f'i(2zl z3eC8=A! I/Hp5&_XW2zp*SP-q 6辎OnB\6erXfӘ-?ႱjEJ; ݹ:1i4B l idah H S[9-<rFTovfbypi)NҟG.N~$ 0`xQ[Y:lB؎DAKh)]d6.łAWT0Sik ".N Oj`V{㠭uNx Dq {BR, ^UP?#I^y#/F4jM}'d'd{!Kskκqw_4]{4B?M7pLg3ũnAz[Z| ,FQ;p'1(+/!e@_ZwqIr$pFAwt:Vڿ(fwׅ`ܤɪżBu@\Q8s%o`dd,^KoZJsf9+=Q.4JԹ]3yCp0c_/؃*w'Du*YnAFqar=~̃.ϟ"';n-5: onyqե~uѨN=ZI@)Ї hl'] A˾y#J9tQtYfx&p84M>`+ yz$p ϡҐ҉%G(ɀdde ȦuK )њuϢ|8^`|rǫFAs7F tV%`gR-sE.~5S+ONF oXf>}&q7ww OvEL*&Hd%3tt4nEzL? =S%mɑM66W*ebzaE3ߐQjF 1S9ui8Lh;´"kgwy3\M'7!>v h̍8=M'ܬjI6&=2e4>WZ7y{)z!YT;ĜFK="wY6J+h(C&h^lEdge73i[b˩'n#Ԇ]ԯAԗ"N,C_]MXV᭖Y2:0jIԽb>z.؆s))P1!]{O'57Ss 5FLaj*%f7FϓQ-?n7Oj2`ݴ Uv`QF+XG5wlqrڈc>J_[GF-8IRjχo8wרaixͪ\dI0kA%@Ю[dTpюX߈ށ*cHZ@Gi8|ktum+Zr#h 8l՟t0'!古JkRwoN#I)*NFξM22 3L Բ9Fb}w3.]U] ${fa!fp/K;b:+kE$JO.jH, Iݺq N؁ddnZ@xNDb-YIlQ~zIqu0J>DBPcM{C޷N-n60x(hX*FKWSӡ~2WC :168y"L1J /WjbHV,#Zi ~bK"dbGqq5a)LCDT%;P6;ƟS dH3 쌾Lz> '-bc4ouZ*!NR<|tˈAZnzy9;ixeɊ"őe/z^&2 oJI̯Aq}Y~HfyC==^#~s$!9|$Ξԋ4!da`ť"9Ҩaf+#向DVi> rVh3Yh3._`-9 ?6Ch -EJD|"43"^!\' 1UIU1-^zě-Av5n{P53D䫨k7aky՝C:g@1^!ȵ02'6?K9;TD/k9vF1T5ڠ _%.+8~JJ]5Fg!wF(A?KıvtH .,`e׆}C mG; ·҈rg3*B  G4ڂdRU%@z^aF]2t3͐2x~ʯ'i$3Jkݴwߟ7! mŅh[ Pd,l^>ZME?y DY,/Y4g(ĔstKn?ET\6 L(dPpV:+En 39Igfuf YSu-Bඹ=>>0+R@A\&l^0wk :>wFcr֨|1")(&9 B)p .UZrY8+^ZEKh C1^RX`[@uw;6*@"ѥ^l&]C>& Ꮯi&6nlS/>gNBExZu 7sz!5bCyj<>L谆w1Sb0EYʜz{4gG,㞒&ofWl:6tvdװus=pwW>餵QgRDX) Ș8ΔSZ9UF-Ol- UB zy+ȸE?Z`CǗE?e,rԲˢˢek&S,zqۡ=?AD3;؀ֳeW` EV3PG$MH_f i"nNa\=Y jcf+o*1&7 }A1]t{?tO˶1q,$ ʏ"Am.3=N.ds" /GđbS7-R%?:+]S xG~&rJS\B7Bc~ lTGVp*'.J6O9),|ZfWsaX$cRK=?.w"sV}iR9F؎1K>Dk_>uJoC P^t5,,RT1220mEͥM+⮿tǙxiWn%(ϤjJzT݅dלW⯴Td>e*WxdlηHZL !l!t& ,xU~. pa3 e~/'7 ZI &Lݛ;mJByg24L].3У&T ٜk/377@5?қZiKgqZB/~5v.ހ ^1nº &w$ 4h#{$ћw:z˿4ţd<%zO8stY\L:d7%x? ֜s_ؠLA)T-R2, 8RTr}I1OZSBt=($щ3&EIq~*d+4̶G#?<>q>ﻹ|3[''/'| R\}@k;EIXM;u@sSq@ 樹Vv3*žƙPt SoIv۳l9;onγγWxyȤ`҇k MLdLRNFM1%̈4.Uaz,07gsLo@:z]lI7FC5I&XEVM}b&".6ܡj FBaq,9w/NIc&5Fv/v w w0>cbYLIMn>Z=iM=F '299a/q+zxen!s(f$[ΌTdiܖl)y4 ն*‡%{h󓾜v̚eè9wO:7gQtrܙ&;r;~7j[K17TVNUzwE&MC1HHn["'}x&=>AOnx4#oN4&:c' $ +q ƅ5fe1"$TS%D a I3s`ÍV܌0V6;,}0f0Ve Ž1bƶsaα|sNoi~4^8%  T`%aj=J0S&4[ X'fJ|v̲n:XKf+LQJO,miæjl3]lt@يe\ ],؎>1 y[.)q. i,"6v˂HS Ƥdiƻ0sz807|oci \N~jj?66=df'[oj/㤎4l(E^R<:p?{Ym#j2N/5v1iH ZGmv02gbShkqKƗ C{9pK pȊ6FDŶ9;T7+.;)d6f`v'̧ 3Xvmy|.R{nLX{'~ooNDRNq?;;U <):)#tM)͢We>YUַdQBi(&Tz2͞ ^F+ (fT}I"Kޓ(_(V8} oy\KABa̸pu0l]S= Y{Eא.; NM88]57a ~M>j` e< qх +Y{ȧ9sO1YP^[^&8o-YXZb~ 2|rvqk=فK;&Fa2-YødHKb#eBd0-޺^oޖ ӡ eBVU,@9 0cgb=^BF |u6yȃ )F_h2-9Y  L+Х#Dgȁ*1G76 ̸)EFW1n}6ʍmw('3){zZ=zlѲ]G*9!k v}EoK+bwrn⬜^jĝg݈|iɦOLb|;-]PNWs`'sX0Gi4~Mfq7fXN7R4kOz<7zڷP-Oͫ\y#O;l!mcjArO$:&w K"Wq#S*?QWN8e.ә/LsbzGZC7<-"d\t֯]&yxIiӐ&elb"O–IGջL:NrY&}kځcw6˩ #h!}MQb]e:\)ECIكPOA$ gi ϤLh}"BNhIy4= frfPo9Z|Jlj?L Hl+9>abElAvOiVVnrڀR,L7WR8l,Ӝ|\0T*kZWS*֡7RBKA-(K+OmabJג{4wϛ>% ͭǑ8JcڶsUV%1Զs'R2{XݨkŽ6%4%Wk0Ϛ4Zϸ<5Ʒ/IPoM7Q]]kJKy~%o 1KT03CR۔/.#v~|+A9ue5Z-EPNm, AJ18Րf9J8\o18=> )zr,wyɗ-O'l>Z kǷILYb~b{/Z?>EpS:6ȇ7wIs( 9ut.9LętRtN#$X}({'Lxڨ"/Bly>AY@ňe ED~_-F~ w<wx "la>|#]=it˙1cn^~|(M٪T%< {3ۥx?كv8NXkbQ6?%t6YV}Ng8;DMf7 \,lj+G H [fq7~ ۝I{k j Vaqz_Z!p a cDVt%rz>>6Ft=t>@=1Y[tdB(oWϟaOyi&:`m ˍ芢yg7V~/w/(#~(JR S#WVo8Pg zzV,h &<:m-/t3ﮁc9[KxSKw@Q.:F#(rWbJT)Sh2yf0A vmGr« )۩F78|~XIv1bzU( GV$kHč'+g" cZn;@X|5Ě/*>Ym~wӗF$X*HTr%^|Or0$;R∢`Fazzz*ۂ ^ \MS۴XhU~~5<۩ { l MВsգh%XwtwPoL*?W`ߍJ?Ziϖ 5mi\GK*T<[C]?֙\/F "H[).`5hT$͸axV2hZr5 P9>_ԏE񕊶7nuL^ u+GM470y->pW!WhDT,Z!4Y[Zܙ#KvVӆ ACxrw@rSiյ}{N\7ӕȂR0~} ԬrƁȶ Hoq|&A,[8@4DA ;Kh@ZL{n|5w< f+-T|(A*+Ǫ q"*R{lY_WTfPrsv2Z_@e#f7=Kg͍Cr?韃ư);).Ee3NlM.+_nׯ|bߋz=Kh׀s^bxď"4M|?M|?iGS%%8J"w:f؛fŽY16+Ek}r^]V|UVUS1$h <64h6LB B 'N&|o!;Zk<<A:0>C{IUV" z-0n~o vq0+!.π.!e2|@Pz҄0Kd+ 0KD7%}ޗ~9h ;ɻlIc;W`/%v#+IV%pL_$p3g6s6]N0 :iYg&|7 6?Eѽ@I?3waA*k xhݝ<рiG6C:Uq>")UUF|bh&YI.b ɄFā䳉PCX ӵ$V!1,8<5L+޶=݁ȓe~e~e1\O+*&gb'rIiV&,M#|g3x4C]/ߌ/|yҙ0fWx!Ifj@j~3jX64:+_F[\ Ijd5+zSh\dg:4> /$>R8'v20?{XOvmSojWH2]fg2Rzf PY`#JedQ*RnESP R-6$TaVD)IB/>-G(he9b& C./h"]i6dR}B9.%Ql_'b0P! 1b-kD|gq[9|ڮQޡֿF8"}=xM/Z r,v.jrz9YN"x>y9?2H4q,W~uvy^`DC9xxr(&IÖ)A`K:NhǢmt|.xnM[p}~:}v#KB9v-Nj5rT}XTHå %d@xRBDF/PaitNZVъzь\.*%Vj>v5+7Z-ޯK.\z;`t+~2r}MΛ/e-dϠϵϢKAuŶ{W-%v_IxT0nvK7\l|QM윧GZ &!:U턇a1MV}?Wϯ4Uo7jV\)g\d_h /lǸnhd ,?'`p2F]Gch4p'٧V)@ϸs=À\nQAYT$~Hh' º{_e۱ 9 to_^7AO2)A [z)"S .58 ,CsU=4zo`wP,S%e2(aA3jAPhǓs~JB{`NJLuǥbASB'6䆿ͫ.\%h`mHvvO lHdFź /j$ 1@kXT?;Hu #eJw_ (i DekVNsNm1XJee%cGbP>}6[@ GcCS;qwW_,b6Ϥ ~.^|_aU8x&ȼHH=X7oⱐCM"ΑUw)ЈnQqR=ͫEM9?qkQ@bh>!YY!]~nkӪ^Ze@޴G*#59*z@퐺FU7LP,w\ݨԀx0mM\ŤT*=DHgKb\MHT7QC:gǺfc4(e&LA[L6q9d6Y%/7Mg"Ȳ 򈸓L4rޯȁ9KWB: r|yEEPTT.-.-7O eZ_IvkC`tsu;en6 O:4([8{cGB Pb̓ :0&}]Rf!jCՆjVYmfֆ d)&_9,KV)s"IWL\'5kɪtha"fsof]o23jf-6]jm"òldL` >= :6$.5'0 I$ېLP5ې84'0;}{m0dJWFyF/H>8*B  ن^oC7tW`_A6雼ͧ=~2VUT,[PFjTRUčޙ? V¤ZZrwIf䏈'g|L}TSP9m$!>Y0R_X81/$h9)k 0DАO-'9؜ [q\lYG#Dw ƌ_S:^FᆰP;4sN*VHʰ)S+;|NW9T0|sڂ ݓ)K0'<2'U*OY=S{4?q!|ϫ= S䇳3L9PN >'Lҫ37Bӕl''){ SoGr~hF>S1T w ]f^C^PчlAAJf;fC;afl;)uPa.uPq2uPs E]o(91c"zYٚ9^.9L̘^VO1SfN`NAoA3'1kfY3'{(ҸT@P1B$/+c6̜ނ2gNPά]Slxv5恧(n]{v{˴?`jw)7DTӎ>!eܩ%c܏9^#v+Pw+&LjZ,t$ MĎnic$7D*а4b&h-$ɼ$HipMlGxcٓNc7Z J!ZFhIu  #C:/2sBs3!q@I4(0gmwBG͎M6ȶ_N1Ȝ6e~L-_Q"ymKypw=lm߷u[#:ݯx]x\dˍrƅ 0e޲0e޲0eae{\eو?&^nh/'{4'DLONs# U.2!.$wҨ(pHLd=dƐ{B\*0zjj OgZ^}kWup| Wq/I8Hق˃DZ4\7 ?7-̿:c -柆'5C6'U #c4RM|P[xD4hJbIq+aNr,t:V3Jz5Ҟk+ "lA%H(!Cd< 0I0 P3_2fXKI`xsH90?ecCi8Q[jL8Ð?k (21$ -?Es%ɘSaʉ‚^i,=d;4b@XX^V1Rڈe6x%GU":M"lRx bd%eXV>TTnGiOZԤ1Jpras XE8Ě 011 p "392ڼ,}7+sc*T^V1 k'P^; zUv ݥQU xQ#J"J1HXf,@fJ8*3+i_V1P`iݍ+h`0/c@EA% vioB@nC%/|$0i{$Vd"ԕ-@\k'0OJE"ddSȧM6B7g{$ok:x T-"l 8^Vw?9:lAJYJDSKcT%FIP=~`A/ÍPH$C@u}; {9QQ^$^7']+]pc<.TĂGl`G`I3&.r׾bϻ gP$/_u:gV\hZPhrs%x\ů C6Sh}%lX;mxJ'.8JDz7xrCWnH𴬎:`):|HKJ SNUՊu~κv4<7]c~JyD;"|^qg2*36YV?ȑbDWow4#>d̶v묰ra>\W'(IoCW \kÏi8NQ˨ʨe]e ITxz 4R2H3wEđs(gsSFcz=mOOop3w-Zf hno%HA1zƖN?h)^9ܶ7fZ֠m5fv5a.7s>4*i]3L,tH >Ki$ژy<#E.o/\c+#v3_Ub0 t(sd:] e:/ҙ"#R!! ,EYTGO@y[,MR5U6uM]fSTC"1Pjo6GaǷ`VtO zeDe8$̳{fzdAJs>k-]٭0;ϟAϟPڐX,Ha!?RK?7a4„i &9F$/l߻jZi_.U5H=K#3$-쟠h}>!^"iW^zNVV|tx.RH59dz8ˎߒ q2R~୺ma R)d=L+ڇg=Rxf!%( )%BJ\TgӯĭvdJo"X6'H'0ی\qfgm 4Id6g?6{}>|*gN>R)>Rh)ǍܑBD 9qOu{hA<v#Ň|߁9*?<όy yp"R#%zB닌UQDEҷ~x`"hG;ܙ;4t;˱;z ݍ5/;z׵M=rRgaY2ؖeq.b^,cXր1ci G|eg?NmpC]4OYVMn{G-_OE%fulnqQöv%vW{ﯽ_쒌W&cʮt1 \Ť6B P?cgk_M"pR_Xhb1koVSj ?sKjpSPا(H7Qd6t71O@HA⓹>uzLdaa2PvD&4ѳ~haɨŧ"(x]Q[_ a)PV1O`c ێI_̿.pOU%fN9ۏmtgl'4rA<k\*`8uTMX<%,X`.@ [na&U% p{$6,7j@ќX$oIJ Wإ0>+֌ڊWLX J'sU0 o}*s6qu  [Q%Kד6B.奧KqxDhYwmn:`bЭO+S69o _@ϒVCTgcvjSHTyBl|uGAޏiHL..@߷E fV^021a6iTEk >pgyP<{VlW!ģͩTh6T.CFgJQ Ӟhg<\BT% %<9,=yN>H lpM ߐ g= \Q<ҘvN!4 bRb]r<*'d(ĎaQA-黍{'又Z<.)@^r wCDO"1*=Y,L~XT'7E >919*She =VM19zMF̤*>xD<;( ?_k|v*|E}ҁ+L_ha`$ $Pɀ~`r,RN$ E>+&LtK?.8[C1oxR R[`suܐBz,XSWHѽpb)N09EpC&CH?zˢ=ɮ`װx`X?;M2'  vVc^ %Gzc=P&# q?QRT&:M/mڕ…LgF'=usErAЉW %* xl ٪>_7 vdR\*KP^?+xV7aߠ.mFdǟ1g[gi Q7 DږG}q;e%f:xfLMƸNN*a GX{|)P)a_v4d%q9֧}fHruDxxP!"+fw2O!SxEhŧDdDk2(ᶩf??v ;Z-5jA8?Z: Pc($Y.,?s7irHFR$ y܎$|]z$HiUྶ.IYoqE+Wm\xQUC|/#T?clZIɅwMoyG`\mȷJF#A- w82F,u"QcAF`/VA71;FKMaU7I}M_.+ѷ-N5p^7OQ=z*Q<ŋ3ȿvG%x}>ÊQZ;⣔!s$pŁk!~PLwt e GIA>D׈$Hh5k&n *Eb: !4]9*D)gJo|D : PM/ +ZrD% 42~ "kl٢~T԰ #:mz}9<7!$43Zt_ D2`}oQ˜N[H3aspZQoh>Ԉ%aJB B S(D({B ---jZ֘3@N~ \S8Ϳ=f`7z'n?(~ƟJD>[ gDj,5*bdoGk{'SΒgl'4Sj;.mRVjyg%x'S<)+J`߯o /~q_H40lq :O%ڣ60#v&wrrNަ~\K:,1 eds}I,nb[:ࠢ97qʱ;dQH9O*jmԔ%ǛӒc_K /E]~jMԠYCj7][@L8p$yoNF<'Fގo$ގJ3xU}'?ýS?M~ eޮJ7h1*x=eALxB iF=tggz7%\V ,'_S!T'm8fe:bH;p-`ĭmKQ^#h{<4SO_ |AޘrW_r]G$_Mtd\_-.("hr_{ծa(K 1JƈUCqj`2'-\meWJ AO+<{嘛8( Xc+~ Q,x֤Q,GoX>U2 B^ OjH7.e.0 Xؠ?&m _r9RB[RePتWJEZqF2]j&++wmRĠzBWox_>r1᝞rp̀oNGxSVxr0AT,MD 8oExݖe6.qF&;gE) ]Krfh Zan"P/ܐRK9^|1/~>Cm$fן=74NJ1儺:*j _8}n$1cs󑃊xK(t̆[2_H^Z ;zp8WDXnk*HLǚVu5iWCX;(;de+c>-!e`l'>\ڒXx*H dc#Hw 1cFc >2FC^zCմjw 9 P՟VvF#i/06uCZxNAcb)/N:y,:f "(` `s,nU`mpUJj%ՉWdY_ );)@wKs #óZF"b.Uga )l"8÷'Fl H/AA8n=Osd}݆SuqitGV컲fM18RL; aL+$u/W;WI=Y\pޣhdnk`:)Ar2Clfq]gֹSmJO;)z{N{4+աcV0uV_jtwl}w = |mxτII[8njʑhg2XQ-kml>e8{/EJ ~Uq\ @Exy"x8"ߓt 'v^, gq3GJVTZ:hU`e2|튈8񘼢n Qܼ~,LQݰfN8q촴ϝtIG.3;ױ*GGWW>):{7??Z^p;`~1L\ nfo )VѼVA'$"RK$:sDrE}eE3aXQiRMpd҄MӮ˽P>NHqm?,tALb"yHg7L3aT{c˔Q:ŒA|{mRU% f%Yg;5b_kT%hǞB% I@QΞgр̗§c < 'Ƕ#*D&(mq T]${ثdt<)#^dgЄtQC$OBh&0ˉB-+;9 _K~J@Ғ].GR *_9VXa ~G0E ])g=eP$<,i0fKǽrKhm(cpo^/'AA "'WN }o^ᷫ xKf 큿xKaD7(@v/T" lth_bF}Y?ssN+R濺5X{𷐿6z DYW,zZzK+Aīy%S[UVdYd& <<`R_c>>o9͹+zvVg%VA}Q#ZO M@3| [StNK#SNqM 7IJ5)#M}4QsD8 (J 3*VOCvPĪvp+-n Ѓ ݞ9)>qs8T_ڃ3~<ce >LfdDʰigŷKUM- t3L53Xw3GRLJ2)9:boI#D*WZmiI}RbY,5]vڔIHa|TqGɽBE/'ڈ.^ѭ(MFTU\<nе֖bqv.沖k?U_[Tg+簑)> ZR]\u0>5k+5= cc=f*ESW4֦kUGsE 81Sw^NYjDήt}B*f%V^ F[GF1 R"x/u9x;Q8ڮ:Ebf p&փV >9Iƈ9]Mu/cLVF+BgrMV%'eާ%h[ː0^Bu3<nx4?7?Tj[5Յr؛ҷk[й%UɬUIŷ: f Ϯ`@-7%d#3 ]7nESgCH3}s3xbvs%Ng[$AleH+҆]iKVȨ4u4WzVx`[kШ0c: dmlBHH+FRjJ2#hG2X, Ĵ6tfTcNw@5S]UV"ZPR?f^nWF*_QHAJ8!@k;gie|3m>I`O)'!~oLݠK5״ ˨& eOʔDEԣ d02mjag7u Z=׎vvȇlFOy$S і|X)F:MUFhԞCG( SS%̑Зl|Y=Z)_WSLnazm!uja>6JܱMڙ37o_LAr*_Q-e- {7^_yw|̞|jKk{9G1na4YL&b;I46/i^V;}73ZݦYD D[jw&) vYRDX`>ckyuiyч+y̓Jǫxx]Q9'Z[6ck7'#Om88^ߙeiٳ$iucÛ>YF:kotൂ"N.b'EKBH$"7{6@ؕC%3m$з#s (1gef .3ӌ _՚l;(s)U?6y@rpWpTO6[߫edd::g]e][FӱTo5sp0#:bO0տXx`)#֡yt\-/NLJu׽C . *]=1J㍮ke͍t.kN+'x ᱻON^RsG8es)LQ}9A4ЀYmƠ#㥭XuNw1dZ0QHmyxKlSrrJNq{< .nP N[.(c__2˵wJ?eQށTlI G-.D暑{9{^ܷmw: ^қnەߧ 2-ODz:d81D6c%[dNN6c-Yx:};:w\Qu-sl2N]M_OY[dCt3S8czKtaD>hVO Cل͵{ra2xj 逩?#ҫmnvTN["݁4O'fu5I=bPiɗٞ^TD8Mեg(j2'eylg9gRl|͵ṭ#0d|^u7S_6~Nn?HwR zj~0~ u'Hx$et.O[^|nY[jionr5%gHclxqpeG8{O͸ۏgbI7&D2^"P"4S).2.e'[72YxCE]K1.-0ۂܗN_{/jY}^qSjܠA GMVem෣ I{\nfrQ LKWCI)䦬-N"+TC_yxOz ÝM 'S;)GsG=ЛRdz.dG&:1w-/=a2>Q{.SHjQ'X@f9슪sW#i]5VrK|4I.pODj9vUr\sR'. KIHMg^4f*_"8~85CSE7,CnrZVÛF`Ӳ:Ҵ*3$gDi5)ъ4Ĥ<VD%r3&0 w<qI~8<-l 3:I˜bz$Y>G^l':H!ѝCAg˖mˇp$+O]HN0 : : 9 9Ϊ C5]& s=t_lA(Ϲ`9}λӬ[#;!907t o#<e#37A2QL\>p͘=ϨiXTvOb2}{@L4>ȅÜ!bw 0g/[Orc/o"[a=t}`˻nʀYޔ,tڃX Ӱ@(.e?~<ٱ~Tik%86ړsv!Sc |qְ;-3ЎalyyЁe<9q&q쀾3?8l~ŻfPf۶1\nޕeVz*y|aӀolp^].3ΟFjo=}K%]B,]aDnn̛psAn~ط%꨷;,wnվ~\ UݳZB}Jj'wT{ִ6jhON<'% ]!Z>]5}YՈ+3NfDm78eWr:Wϗs,Yݤ#x::ՋczQP}Q= ǯ^/ ;q;r5Z0(%]o>=O?Ib 0IAe%U&m}.'BN"'dMU [Kwڍ!0~UrO2`GGa9b=k YT9N<8YoQĖ՗"z;lzɴZݿ~˗/ue|K[>{6xЉIpn~uAc/F3QJ})Ml2=>h6LhkQԴ0A`X 9J j&uXCh 2=ovq7Ԟir& 5FbfSM(~z% i4A~Z_s2ؗi>E=&^,$T@PN(]CL߃/ "GD1Y1)`:LuxhSQsWr z 53 n]ESPin`BpאŻ)~.g 990l;!7^n҄rZjbIW"""x c?zÁ;2^oi(M_k [b`cp'lLj.F[`"3,9x}Gji5+{;N_lg dCnLƄZe2&T+[ X'+pǒױEbtlΕ،5[z>ap0AÝ/-\pC+0Nl%M;hw#w/.öcш7 7Ie/@P޽{'0Zzϒs#/ak-B́kbϊrZd! r1[]n*A>[JD֓ ,bRԱkRYʗ ?/ (; -hV.be갓Ka5,G?،nE*8.8Rkbڳx9x|$kD]OILm& /Π}b}Xjqt ''x"j|<&;zAױBJG:"~_b+gID2_ ReQ0Nf .g8Hjn<v#qQx\gPLjNZVъfѢ.*%V 3_6ڍ>BgBMz.\-@|]?H9Jhဂrz XEGQ۷5L&x >IBSEǫ9Ne nTbhLtGp4k]3)J13Bkп ?GQjymZH3._+RhI] 3g%|ܤ_JE;Uo,t2_83E_Տ9@QѪ5(#B@_4wPEӱѠ` oM(cZAf\ )ҩO( <EvIē5v҉I6Pz3k@!JW3/aQ9:ơV,@K_bwoSQ"/H%},M:w$~Z;$EA zm|h\Gpyӹ(6%|uۮW1̃% t?aI Dp%Z%sE!0Km^ɠ%BVoEJAg%ȓƺ2L=At1BZ6Ha/ǁwhI5tk.v8R_ḞzCld*bdKc̭=;Y\IeH' za_:ݾa3JMUUn4h٫1K=ڌ;!lV/<&Ms@ԀV}yD)|%ԍzv$:LN%lFCZڌŜnZ̦ =4<=$Ql $F) CL csqq¯Ҥ`5vt+=.֓G[_xVb\`ϥK+5WKT1BO-a&PBvSwބ*<5ݥji T5n?ZU\#nD}q2*#FT^C៣ŗdMHL 3gUuaT Nى㙥bݙ4tA,fŭle*hG^mǞek~0C ;.wmi?XPtE@MU֬^}P(2:A̚Q(HzуY;ίq`790{%yP^a" j}w:J]됯.(}#t Ts`̌-8ˎ>|_@4yzoA=&OY-P(ANҼw\|70eTLH;漇yX7t} i 4j*䲃Zf9p7:= ,U #xmp@jY:N-ñf4 lZWsHg\uSߍf 2n+0Xrݰ~;.yn7`2 ,sB^]앦#_ᐽuSPXIiO}Έ;ۂͳl9R~n[BL ?ӳ+j(`f6;멗{ ;XǛQF:{@}38G} U|OP7X|[ U]}&fd'HW[b|+L)+Y@傩Wtg^}of۱vKDcWn5̴ƒLk-n\wn>͘8H̶ˈF\=FgOEp-o zz^ Ü/5si{tnBφ?gY,':BgM} He 92^ L:R7:mW\D^z×PMV8qzfթTJqbVxB{Gc$@}uJ3qWZE|HBl4 .hB)1%tr}[86u@•ayfsyjFw[W.""Ø4P39U,6TARo_aRQ5_X}qZKqjw2R3#}Cǥ_HE|ZK\0~,M6寚l7rF7ҕEӵg0PvnFt}GJOk琦6j|qJpa̗Td㲍H{uz<ժ! &CK4Ȉk }PJ4f +zC#zJ(Ff' !dS6 K3`3%|iz] 1 9Rv!I񺱒ْu-OցޓvVN9ZO6xP:ɧkxu-duMѪziWBL da>x8n88b!Ż bבYx`y.|0 196xp3aƙ(a`WBV<ꊲ5`7]Q2p*vEɉP<ŮWl` *.[Q|!{Yv> B&# N<nAX9&2;o킀lU@Ȼ6ti[6:LC5x ywA@ 2ӡr4i 46hȏΐ!>I :(+ ]@j_?Z 4E5[QxIUn8%Loc8_6%]z((]= dD{S3v֬|5-߉D>ʈV]jƧYN?6f7](7XXd0t2$Ys_*ϗxz\#}*;^=x~tW/ǯ^/ ;q;r5Z0(%]o>=O"?b 4;(oQA  '6%653?bo?C2:+ 4atڍ!N ϋQ f'Ob AkȢq$>,Fwt@oW_F P:l'!7Uxs`R; J2p HeTQgNfdeN$BQ;TuèfQ`2Hi<'ẗ́"(ٚiTfS#@tA,E}g QVs=,h~iv.[TN)N6<Lӯ%Ӂtt[PB^(ESOfPaƄA~7z"ZGl=4B@aVWVo8Pt7.^HExSVX'5XD "#ďFOtk`Lv2 ^;<_A}p8PkIJ0H|^]"Z'>6d H&wtt 6aD l+v%/dϓ5ME!mq*xwN[}>ߪݼ Q:V-]͇[p ;^Û8&;O}Z=l2Ysm$%@$aPMw$6Fs~n: ZUNjTqL %jHtj*ZI W&Γf \QEzF8HCw;/AJ)h93XIm(}~N.VQ 10RIV _k"Xس5, Ph/rޙAȡ(p[.IFHqP7:Z,4itd5:p^zy^+ dVyjk*j\mD+35GI*g<1+9)=^NBx,t8\AsRոg& >BFIS­/[-[ GY7jh>AHG73*K; >iD{>85plָ`֬$0.! %5WNPDr\Њ Op6V|6&g^gwk p!i֕C=Ú|yV!n&i"Z%4IhU~/mɆaj>zx:U %d.D)!2Y^5^-A( 쵿a2/im@ű42ra6 D|!~>",r'(RTX 5k. :41Gm Y  GBf(6b#k6ji_;- :h=6ϕ"hK!v'I|N㎇;,l EҜ0i6t@$~c PQf~kx m{m%Fn"qy 2ߑ߁6 #[R{gi{nڅNCcd7@Wt5Fyn 춣+AĴ:mɪM1Lp&&i9=&)1y7%oC9D5@ B.r/Ya/cTݶ<0#i>nr[bޅN:ۋ=!&Gh6Y#uwrkPmf+9ńjGV\ѻM*w(%#,쒰ssy!<(ŧ67>q]f$|y@C{Oh51[12"K>M2XvQkz,`Z3 Z 9 W>a/N{D>J7x=1;t`H@ ~g>%޽d6" }@km rތe Ŋɚذs`'ZтIG@9'不oBL$>$Cxi`Gŷq-XC Y/Ě'2q I] Lb| PSRZyHP!O1d2A_R(<~rL&վT=4P ZG:@)O36cy9oI r)%mC|s?ZjBn$.-L}y4^pկwj11ZJhR&\b>ʖ1vOFi(HaH,"a-n0vZ?Sd^΀"q~C2 tϸ?}%>wy_֯SlGP^E#v5{ }%f%V_TЙ~gZ\a%9 [ wo{xYb#pjFHjՅH8II7Aԋօ$|Sbl /05q}QDBaaxW WЙhQN>ךglq ~*t odyvQ׀q[ eNyxTqE/XkBh)7@ڪp[M BK6%Fz*B{ G k~9誅qi(>>EO=]lhZSdCdɨxSdo;s1*}}균o#v~:z?tTx '`}-fVi{_q$AGmXia[ d=s5vodp?(qkyhXE$!"D-؁1ǩvKH|~_v¯őn"OMh; !#X,L=);u I{]E>~ ">SRc)l* uUa,.R`i& >pIS);yE(Qƴ3E5sϜf:7mϙL'utcxܰLϙNڜss:g:OB3-GYD&3H,A%R 8 .uLkjUk/z9'|fb6EՌ_rz[On',l80 ox"ʕOdĵ\X{`e,†Ӌbq7#s`k]|+6lϢWx8i0Ɲ+qo qjFE VZ*")/=1|٤8z!T}T:-̎o3ˉژ2t\] |M# KdJQ-zm;sWR<B;/+֦ mE(^X>C#?Rj̸bh5m5/s9ٸ,g!o* =toZZ>sR f Stg,=0n=2 BQ)av[AۍRm#Cڻ$':9/ Щqy3ήPA9Lg9#>,dq1րC8_]׺IJ( ^H@ 387}^8s> Dbr ՁJ9(VJb'~hŇX&%mK+zⱜE lGvn\ Mx\Xն8Jk!IuɈ8Z&Mtn#cP : a\߫ZK8JpTR}\=ԫ9?AHWN?̓`Q j`LJ!csY؈ơQ!yov~s4][&Ňt.ݸ\@͘.p;n "çE~ 7xqTS.$td[uix6c PL~<)?Q@wu8 Keq {i¢1X$F|g ^KOjrT&d֌Z|3#:eH@\?An|GңF"ObG?\"kэdaX{RA/8FuIMHa6 'f~T˃$!I$ɜ:sv&1 e dFrx(C=,i{T9Y}Zjf9:ٌ}5cWflk(k(Xb,dڣ[&3b9qRC =R8enVfE[3Rˇ8*wr`iWibJK; nv#Ow_+ ѓ}ճoҮ!]#q${ f Y=C%Oր4DLi+|: 5X;_$]Ύ/x?﹎ӶK8r1=(7ڮv?ʖԜ5xc.jy+}|R#Q'Io$eJ'z4 7$YY,1OOM#]y{t`< z:^" pyQj6Y=6D٥*Y)\m J_ Àl- åVr.ػ1n2#sYy{d9& qv(s,͙ bR dIuUҥ$@n&MτQ>,ɒJ1O =f3A "4:PQRoRE0|(જ4r]I0 =87:VsJԜ/]^c1'uk9y8{AܽkP6mҽ,deebin@.>h|-6ؙSS)1R8RJ tͲh}B/ϦU\29R>G9oՃbp}FUvp&gH8Gwta MC\TQ\ 5k)ݪ֯0pB{uxy>;Kit;xԛ&qXk ~.!ދ+У(("8)vRl:RhNU ɯt2QA)[12~'񰘤Y"*.ӵUV! qmi9gw/]q̡e[!9Ewh1!h 6F ;4OH9=Kjw7;TJ߆\EvDZ'7%+ƌ .q,a9çDtowslE-I7PU*m+f/6b)CW |pKh{?bd*{ى;f$Jk`[_TUơ4_S uaXdٲ7M/L,8 6Iin|a61I/N9i"7֖ 6*zr?ئbopA!ydtZY+L P7,(kt:ϯpmD }'dW) 5ͯ9tKY֥G;ak, ŗsi g{0:~+<9Nsl(J_9j2a&TԛBxb{ 2eBneWIGv8"A |2a*N淞L\@"p wW5mJ<Ɯ0!LJE6i6mt?[A^Dc9p2ڄ ㎇$ 6״Oޭlϡ)yi!n6 `h `ÔF?:PAa4dijv8ߊTm(*Y4.:i2y}1hT :Ԟ,Qxh8q6& .q֪CSxG|c=څ9b,RB0r2C?6t3)Jמ ؔ#2^ǜIL&V[i!Aj,\ϩ.fk4 n.7AU{k xZ Ӡڄ}AO 9 yɃ !n ᦧȓkHZ|0&C(ւQ0䷟;kE:c$XJC ;\;0"~K;0"~?[ M1g"s~}!hA_l.6s[Tu`ֈǖps> "n.x{Ak]dwpuLj,>7c)Ggi2 BpY+N01g+<l7LJ&Gx,OGۓ+1v',eQ{ vp|L;C mu ᙡ*-QHBl OrS*03X<ٺ`F#ORT9Riaτ$*il1Il1['`MVN6q%ҥ}-V,BՎ-=Lz V=[(-$KQX5ߖ:Yw7 /fN&6P*M6%[vbeæR3Crfe'QX؆A+Pry\Ojy+=6T[^2վ@i4 igڂOo>DOIN~x;Gm­$Ø>Ur:pJ=Lu[ڙ e5/HGw Z2+QUYpxVݩ1h;TcRKȱ'9i:4OT<^[}O46ʺw%Θ+Rk`+|HP?]nLM.Kq7`qqcs"p!:dk寺  CtCS\ns7pc70Co-wCd?7D9^ۗ:?I>>/^D@%_^9 ߫T-ΆoҦaney H+4*e@h />b"/޳qHO76xs+^QM]c81?!{g 7TăvЂ$7 ڕI\q#l޲U͜f,6n/};?b~XQ8O1I/Ѩ] $ܝ[TFoChyɴFQR>n'OK-C=|i\4iٟ',z[vh<t[|"kO{e2Jq2v4`gcq^W"AsU.ZvR{k;E,SF\CqoOD@C|.v]^`@aR7un iaܞIg|m !(Bu 54@<'QJl= A/ S!TY0T':Ou <;EhLa l g@MD%;ɰp< Bv5::gw'vR;;|>Kg9 -ř|fB]l]Lad֐Ka{1;E,C#d%h"gtrj Q=3WTg`TUJRFГT`8+Tlt2"jbQ5]:T?%z9,ZAjS\vSB# a'{>:B'ل[ڥ#m} q)G1> ]nRLcCrz;o)S)ObJӿ8m6<)9LM{݂@ e: 6VJu̾ (017Et\&TiЏlKUxsY3hramPÞ@\n[<٬bo]>grY/5n_fesWwm_Jb }ڞΜzF}bi㮚 <5w֓D=%uB:~z $g ;,vK ӹ$~+̆ϱQΣ3;ms0aI)'wĆJG/Ǐh,P6lԕ#cV8&I9&լ,fۊci&<&L?Iѱw}#mgYiǖdv*}K-M6.Wi'2;+Ќ]PԮOY|&"}i,ChrDe]\QlO{@a@ tPK,߅OO?~:CdGPv2F$D+0⏂1w"%h!2@5ʴ -)Z̨(,xC[#X]X8։8ɒ6%/g%z5˵x?'V[egx.ʍ^uf8q2 WBv8}7?qkR.ne|NR|ZeѧF`ws~x,~ynǦ,,"߉@~.ujМ$ѻN;^{f;9G.`d'5Tu(ɼyp??IboA8|j{Q9Wc~C~ph YTN~1ݱ ڮ-緫/E}xVr\$n Qfr^*Z-QޕF5?LlRr/?F7+e: DKx J,y|K2|~+ |JF+‚|vr)w(Ip^F]{Ɩz^j_Ii9M'-k܍nxjv={r7yE?l7@dWAFxpVt%rz>>78|6*{xJmC߱vHA4 Q!4ooϲc9/V* L!y-:Z|(CهtģtA{pޖejkƴ YTmB=yn^S}b]9%P-Cj1P *Rn)1t}3%UxZGopF-ET>?&>gM/UhcesZ4ыF ޯD20jz1$/< |b$| j>GrIO+Y~o~>K|.EC`T (iW!h'+s,5XNW,o7b%_3(C]SfhܜZ ~z~^`يg[9~Lxu[Lݜ@.!'94E6 wk>+.}^B C8r}rDbAʥ',s"40@|*mrcԐJTdtBIRSzjDWiJc VIS.K&f0ȥml dUtkl)vD"Vj&N* V YعrW*l  T@w D&L'&2* !gA真X jzEz3޹Zϗ7Y}cREW0e5U@ȅ/P }2)t1IXMCOzwϓN">C졊\ò*عBSᕃ,Y~ɓJUl[8,QhCn'3{3?$RzF: DJҳI35==FnJ`8sV [6c{C]ZS}LكR'6>_GV%jv)Vvh3(tT1ݴ ~QiP!3EaŇ~n h v7w?43yooׯxT`r7*!^м6T/K.MKn4(wG CjɌՄZ3} X)װbJz/5O[or_e ; 깺Fj6"P|p%V~ЃdDjl_X?iZOwf|t%Sa+₋~`GMX}D`"jINO??Wl==+i|vEVY!OʉSDDϣ_t ֕;=Q+uPdM&wda!Oԕn&Y&gqaK㦂 n7n: ؁Kw.3ҝZTIt<)w |PSvcf./7۝`B* O<8d8Pyٗhģ m+F ek65x'tmP1M m50..^ mӻN]y\fRD/)p Z㌟%xpt?1:kdp`V~#m UaU#Ҽ ;'=}~[`4+#5.YL>GS{ (bEu& aAm|+2 -z ; f k'MlSHsܹb @ID؅pKXQ/H_Hx#!}Ő,H/J߲CQTQd|Ϸ<Ab3W+^Lw#ސNazO(5s6(PO? ]w4gȶ)'_W"RD=xGGL_&U O"2Z~dTƸZG ZCG_]Q2MBo#ҷń\xIP%7v`έF =r}B}_h-JF}dBJ(71r=I]sxG{DFbSm# d:>x u1Jܓma %yjSklP[Ʃ'S8^0P][!![K"<\Ot{=zo<}HNN*8|NLѣJ*UJ#gUm;6)1BଛӚ"E!7[a٤:.9>pM4Wt9'rS9=Nc.Lی[7Hjʑ#31awp #NDbp ߹پb//+J`. `9Hf#jG*JMEA:9EnZғq1~w\A Bmn }XFNv1;1!sDo~ dYil鹖҆&i˩9i/UH)> /J"s5`玾ғ .bBHՀWVbעRw';L|JیsJ6G|P݈(g='b߃p$π𮩡#.[w\+QJ~˙Cyݰ~-":C!Ŧd!d h2q&b;dyҘ.Ëy"y 'm"ԀB^oS֏Rֳ #0A0}Rqvh;B~!Kx(,3\.shQpw[ :TM2OÏ}7q?or/G|n}NkIn)L]gnuar+ lf{ɉh2GgAy:FF @n_w@x 7XO}ICaC&OrAh^j;||cDb`/b0!.13(h0rV=xπ6r-qgt$\7=v!n/(BhK܎mEGYt/ p 㦎l1Zn.VF1gh|VNq@UBZ/5֮1׸.ža5/xqO($AZWyFi u }V~48^\7<}+3%W<{`H'|qѝلIfRuwZoPvudGԿff^Q-d&puU4qv?uzMcё㱛o元:7/D7{ l͞U=hx%ZO8ߞŧcدT =ZVL9:]{bP1),Y=mDW_Dx-f NK;DjA}M%c0oO xdTlWtvXaZ93.K*G,bv5Z8,vP{^,U9fDߺ NaZSlfb`$qk~U N|4̏E)&K9rNe< }r%D"ڛ1=\hf}fַlf[Ph&Od43zwf@9jGLT \)khP?qP}r%ۭ0><%Tsn´fVCn!s'dH!ywgך[۩ꬻ[+ljn`+/ޖ%귈V$-qXXE.ü'[L5P 7ll/ MSX`'V&I8sRdxn,9 i;RKOsEw]E {9k4Ðؖr_( VXWܑ7R] ` rpp-+~j.]ѥRAO.A ۓJ٦mt$zFiHj(֚];K!Zi; D`+,"!ELQIboAD>-fTOQrnT(]"7Nb1[ <33I ? _%+7%' J8Dy%xNrT肺04pvkܳ0r0jr"Dҍ{`SnBC\1U ?;wlL D{j 4@[FWF9NƘ9J!;b/^. }h_a4د߁cf' F׸S4Tg?d_lŀBjyBjVkb Gq}@*X[rw QH&ǗzytDuӫ'tq-hi*W/W?}PGGQ@wu'|Y#Ep a7 M#R?^7audG +9m}!P^G<J5ϱ+˫V3kN*:~jfwM swq =۽-3)żV1I7~GH1˴hH$  RR u5DCezҤ#VqC?,_VVM$v9WwqyOq9?/CGr WAhtL(UM@h)wWxl=g7}у*=0'RM2kTXkP!>gXȿ =?wg*n8Iqѱ$߄1)ၚ>`/QlJ" _n߯ kSƪX`omל.$N.  4q5: nO)W㢪pe4у#vPq結bg}w}==fH& ۯ M쿯iпu-6Dy_7[Ux¼_yF fVuQwVhq-rwn2VG ,ndxpjaFGQ|qoph#û&.NA)ۓ_Ժ=u;jqCɒ< _"?M^բy1"$fװ2Yd; <H: _bK֔S˘rNa;9.8(%=diם?Yzg˫VyٹQUEr9r,չsr\;Yj5YjMak:o!qqxlH&tO&_)WaJ.Ɗaږڊz/3C]J/{-wZ^ʣnxZJL{V/y'zkmd(ƿ@{/{Oe\6TX-r,zנN-_bqCVV*%ef kbvYzv$kuk= ]!v֍Uj6:x. ] HΆ s梳lF|.YeGEΡ'Ν. qo3kHmsS˶^UsrjTN/{So9rǟOL?rZeN|~jlfN:vCnYcV򑮢ōo56ޗ2cLUn5أ}mƖz_=D33+6vklŭZ\+2+\ó5pq`)6>ML۩FM(SQعw;N,]:oR;ILv[; kGQD. 8z-'73!͝^GU+-cSIdkI(Sj!Ʃ*"K93s6drR4"A$bE3I61B}XQ+:*>H}6X鉨$a$byh 0@|_=nV72p "Edv g(à](̆(7 te 1G$E pe4 1lDf J '0ge q>/o&I:<,F@xXEY0b-l06/`,0D#&L"ȦTbF hb7gh jh{Zf"E4Zc6u=8r,?DƳk{g0W#{:r 1&04;ӵ `X'RR"c ?6=DO -wz~|˪WA'i`ONyVWpFPYM28s1wd~-&S` )d[5' C^d~aZ[/=& k Z4xZD Yhf$%O@I䞍F!z UbYiu3XEDݶTuTߙ}$=rF@;~YdZ,C˱Rw$A'E զTxmn 쬇MB" D6&3:;.t^wAv4wyɯsX e-(@a>-̒ˁC6bղ~Bh>ڦUX;!:Ɏ,ivQ v>uۆ&pT j :=Pؗ|%`JfU_ =hAsI:  =3^K5_a>S؆-tr_6%2)#q7V3* Av=%tSQl` \O ]LA'~5쌮mc2j5R6ڽ]UM6bmP wrB-_ RC&.-D$"g l渡ȮbȠ\:>##f_PТB.Yy[ѥ"1Ma=O*o(U]54'a;/b5ɩcv/0F!XӦ'H0m"OHFKr"PU:A !!HzhG)A!O.|"Ƕ$O5#9 -1|_y1$FQYՔsPNM(f5@DbH@euOfJ0DxW]AԬOllL ڧ뺎jHQ_>.4௜FW1˚~GY~2mr&'˒-ITi^oŴ$7,,ǾIլۙ-=[V& ?8 /gL96鄲ЙWq9=:}&G6zjގ΄$^?cZ'ļbl,Blڿ J^8}dbDCGс֒ReyҚf,\?6e)a Rh_*q\Z7>-TZiyuƸ7t&Xz_?;'3xae2?×?gug). ]Yl[4xxzi|tsm/@]*I\z*U|*3jw"`{GKq3S, x3LWd4{}fl<vo @~5rꌝL9x?@U̬4o %ag0M\CCW &|pWV9j+]CrZ`eףDq84鬰k&BWO+ʏFt1Nmnwյư/UX'3"xl]dLƵij0.gsF5.٬50YF.[5 \ʗ ˙xlpeo[4.T]E㏳ɿĕ?cuJA>&M.2gH1~ o [u3?to h#3w'Yr-\Wj=Dt3DK0FΫxJN'%E (-K]n]tt12<6~J,70&Obd5\+OgoSSW1~Mm$IWtHZsD , -$V=QjaHP++P3b[OrtҼ vMFʚ1jTNshj3]yh y-%c B]Q }U3եMۍ`#T(iw5\Be:oH:=zp&pO6{eg;L7CzNes.K@Kk-<څ_&mk)lŁS4sQS oP]ѐC5]BV~,q@HBG/tGD$(6|lno߯{ c\.{\ow?gM,r@b;M[UjJ{˻Ӵ=W&A^:6L/|6 c+u6vOq:B5{ݧSqstXi9mt5{#P@dXTW@LsP[`rQf6} <-ޕymq|ivM0I; }vɉ;_.9QX7`R-j3<{LT<6H04VL؟| e'38KRb,>g;l#TU w_V0x49Dԭ1ĥO̓xhSTͤkf-8{aųC̒'_&u$*0\btPOl%C6trpSX{׿đS+X?M{* ?QmY5D VIMfXBvU`g tk9H.EBZh!3b!oC.:l(G#8G1|NX~8Ϧl} GڧCxҴS0Bԧj_wwpO{Iɂ{9$)"1߱0[WQf ,;ĨʡJ}:O6rFPkQI}BQ'j9`nhc̓Qh,̺QޞYQu`H)tӔ=ن([BWT8MנGhtW;ɡyέ;Kuhp(~//~:RN+|qld{^2rdDbmҤ8ӈ2,DzNH$~x)&,M $`ipUŢ*gKI>΅M=(᱔ ܖAh5Vae| K/05\aFxP~hXīuQ<w\ av0d|"Jsnpe~^;4$f+>%Obz2!a‰yg``mO6\_p!9L3b:U Eaj e ӸRE2t 8w 3@lsv_w;cwk6.|lMf6kn^s:rbi:R u )ta!L n#}rfCrٝHprra73\EgଽߥSwwʫLɇMH' `)r:F&dɭi|ywtc6˲.'+|E( / y6 3íz=GK̠Дw~w;g5ne S11'M`'X^@; nrb/8IۯI$`j{OvΨ]84{t~4q;[056?@R'}#QVb;k(xx_pb,+Wv|98W'@m>NO}I0y$j چ~[^i+ BR*El?x6᱉R4| 񶌡@ݾb[vo>gYc H18J3el'1 wj}C}w^nSUHt0Zkv׬.|N{M''0=}BK+KFf_?O# ZefNFۖvـohCdXa<?Բ䑈4D%w;xw ^&m.T@  >A\L~ŏR>Sts)](+" Ӆ'ި`+@;E~é?{pȳgG\ nK=E=iF-rr]A߲{FC{~C{NC{j22I=aKﮕU0yZAObz)lG%Y:E:*x7iF7GbژQGEREױ2vnZ=:[s"O gD(PHNC\6ߒz@,hU92M`=#ѓzAm$7p%fI^Գ#?:3ie:5HpV2KOyհR~bDAL`̮X7/[To8] /> [,.eFX^Dֱfs.#=&0*K@T/xy^o;X34rʺB4dpٹ+N9 z$Nql%қL\2(`'ICD\I{r%Lϻ44˜eǍBb6هlju_ښMcjWm`xZ34u2MEMj Xv^]4Y|q͹q )Ļ4 `]Q}e*B Yo()HBE,`DKCJdɔ̬"6{N0#LDݤDRVVaO$DV׼±8ysAPMy!0$ŕx".5o9qr&02qE N\D6%e= _w qz"8ĝvur 3ա~ rJj>IKEhZND݀4~Rpj1Y{!R0\ FNi^& d'tbO.@~<\{V[/\/ȄF< uKo!;XG̴ ubQ| KVl~UO} !W͟9?NHpk/WW"HdrubGÉ/Q[TȢc %ZAo Bl|&Cvf_BLMmuwG?X0KqM(gmS^bt^"NHeLq; efmbLzԨ4oucP|W!b~ȿڭYP;(EoxE8:mM6frz>_J_5_^ܚshlk81BY\҈w?iTkQCm5ᨒ{谨4p!5рi@ѿ |;k߅ A>Qԃ5eՀܩ^IM1xzbaN<Xm/~77Z2uWq7!ɏrcPC?=D~ CөcG*;!Zsutӟ!EH)[,FdeΤWD4\&1D%zi)BOo'pSGNBo?Լh4ݠw>ڟ!p_~dЦ%>\8Mr:K6m;?``߃F݉WwqMy\e*lotvq}#Ԫ&$CP-waK ʹ0@v,c-)؁!|J5O$~ &d04'pg  J\Թ ޙB ԉcF5 ppp_^Co=maZVٳ->y/^N6Gʸᢇ5ԕy{4_p wt[g7n@c@l8dc`^(-{r>e!`\dќUM#YH/LXx{j@MeS{y2YSI#}N&*uxlu8}MZN9Y2f3?6#vPo>Q`[`jҒ#a0X8IkjN)N<I~߯HX2:6t_Eq7q=(qELh8`TS|H??h&Ǧi6@!ug78X%wH? hg s,)0=FX]((̨ufq^Xy X}XQUNpOݖA_go7&AXD%t$>k7 { ]/'REjhPnEY{>! E['!f ܎/ M'R?.5}M,N1 +jpugRjQoc&c$Htkљ.2N(16tWђp4pA(ᲩhY({!\M' ή8N/F24!bUk1srD0"\PNRĽ_VV}EpD]w*i+5]`z_Gq=O׀_&9UBYNSZ\ATg\ gD idib." Eދ @SMX&^q2q˦0#uJf"56: ,R#02.>!+'uy%.vxˌG2𼓾v^ `] YqB>b E ٍ%u&\C@ֵŨ%iW00hD 2 u7>1wR |_=-s2]SryvuSR#A~mp<1 O,O:'aD51˟D Ni,{˧$; R֝$@&ERziIc3PC[uS'ߞbc!IVZWAzs@JxZiO7 %D(XykU$qZ4hpJw5B^zQ-=?&ZW#(jiYߑ^p ,̀fX-o=Rl 0{ְ\ M {*7(4ER=S*>`'~P-2ݷQwsҰ,kE|WG_)JB z>n'q_AXfxU[1$)iaXUI/tVc4!ƈ /h͒*05\w$1tQ;huPsYSR*YwEsX@O%LYw|H# G浪G!,B`䅙K!F), + FۿSS`[BMF $ώ`I)]A?!H"Z\Wg>o(II}XղQ \ga3-]:, `9BvV*$ZPrޓ)0X! lX WWUw/jտR`!ob^͌0Bjpq4ovU}B{VhKdm:a:p.۸XL_-d!ꌻ-,2tbjg*dl0vo{ȩ|߶ ȮNby|d-.'!X:2 p l:դs!CL ]zRնO~bxn6]T4y]䖇f{,bwG,l02<A8z9`O0Ox4@{ Jrʏ[OL>v qɦ@H%Ho?miz]JHJ -3ZO.Cre(?\r hVe6 lp%Xޚr/}1?J9'#qGZL`kdxײUy5qC3) Kv=ycP[O6X+~ږ-gEtd\Ŏ7iz ؘXd\#ő}=]ZVj K /3(OЭw=(JiRIJ>Y'=D6PCzMUjx:;7r`&wUk )\H~w1k˨; Q7Ѕޙꇎ[PNaxhҲjÎ~husEG un`+fFΐ񿛬c鮊} d;O@G?t/Mطw1@C?[Vz݇U:˜9~Psont~hdyr=n4@0Z4𧷤bj5Hx$x$x$)I׀㗦FNe\ d֒6lyV$gauUG9i3&}5eBa3YDYZQG*QZc( z"|rX"F_$5_hL۲SC 'J.TY6.]KDC+A|a.zȜ[iHP[ebBWn.L|wۚrsƿyNPݻ?W:/c'[5^?)zQVxfwƷO[{!,y@z$J,F R{93!Ĕ¼r9e yHtM|>]\g>\[N6}D~4ʹ=3Y[˳npkؖ\?GbvH;02IC2ièZu C){*f$ec'[&;_A)[^ x1cR9{/ [3`w3K/Re~1fcܵ3P]@:ȁ|S )/@ig fW[o_ԵT^OZUC9=լVb@'ԠqziV+rQ`%F ,e.:uIms'Qj;) \騂u7dܟ*b7IԿ/-H(6Pȃzr%[F,(cqfOZ]Bۅpp 9Dc7Ttvx*՜GSV(vׁq)/k?{-\<5.iUϚe}w\r9[kY'x%2+>^MTyP^:އsBK.`ܦ/DmН}9vqHckEAKt=rװɏh Ӑj [[f?%MV4fUfb)RbJUfo,w%FiyȖKb/ޟpWu]icP ^`6(ݹXpSfM+:H%N3;SNu7dQ`({= LN 譥:TDMla[ɿ ]Q sFK:՞-S~%2ᩖi:M=R2(4d*8cJ0Xlg|`UT9mmD:}5$mSG+JKt{S%;l+DT4L9#e7Tٸ%cuϢI<e SM{ɚ^y$(%#2^eȁ1)(|~C(jv=Uwjox;¿']|GxǐW:4Rܟ/UƜM7j;!DA3֜=X 4<6J"ﴒhOdz7IoFsYqW7W;?͊_l\ur|e=v7qͽq}q;oOgw9fsyH3nzg}{Kbuq*s/ʞT_. Ws3ץT+rin,T_QdIݳp! 㐳7dedO'Pw̠|]1q)ve͚ۈo.؍Ytݕ'CftxʙӮ/+/ LeRM]WN7ObdDjĉޣy{M>, P;2Qq&u~t 3 N^"Ux8#EFx37N i=b ,N}piݦqNrBe(h_GB>@S~ Ѥw-Lj7$$m6+.  o5چv7_8pɋ=]v7ﮅVK-+x·\ŤӭUY?kYILb&͕y5.|^{Z??y /wN$71Sj{ttt8%W>E,ά12aH-֘4m:b2[ypQ:;LwS CܴWVҧuMէiPp@XYٵTd!fJK*0 oM]&ݨdgwkf zXd^c3'!/|EdXP.SvJL'.1{ػ<^,}> V9GןH-]8p x87]_w@r+kT>HJN)4#7 }S)3 T4c7ej-iE6:? 89M3E cU0oW!cBN1'ķG\q~Pj_|2^&T`ѻevN?$y_G1y?,]],>b<kp3 ^6h-AV5C'YÝDaN%d~_+?/n=냮7B{~~% zf\ķ>nm.j&Ckh?@Z! m+o逿y[YB;U_{x;.eiܓSI8|rtϟ}ϾO'T劊{AvYǢ2F_/7: OH%6;h2^3\cq%f]՛cHьSƛE/u222 ;?PfA 1 N\\QШɲJykwrdɝK;-]< h޵sob9;2^FR! hx\.<9NWm;8PjzeS]}gxs;R>b\Vi@%.)4C츍1w:%ӎ%BzsFX׍]=1\Ѻ.@ј%3is5f.R,jjv-}1m!p  b~Ayخ<;~TY`Ht$|S;Dld/~+yUX12VW;d'#H]lO.~0Aԍkn]I2[8Y τh  xʁ"ˣD虌AX8[e$&jIG ZgfuČ:ym!n?'6q3}1^ץF~ej9y?0QKt?Ev?Ǣ?A{t4t/ET㮃:^!#8N86JvSio/:v! ,:dKԫ_UaKEv;CUآ3l٫mR z[ Ev@PM"vq@2v^}\B{Gbw-@*w^sE#!Owi^);be𚬂pH5h d"BV@B#C2wm#GxJH^#`.-B퍆]I~H]pƌ0>V@z n7 Ha^) HkxL9/$TĈKKCpBjgr(Iy $ $wMqQoqE2w``"g//ᓣV'Bߵr_2Tow Vaצ-|M傥ǕO;QLӏ*h.w]a4J7xWYgPcc$zPm0yӳErX4gTL,)n(?RCl.!>ػ  T#^WB.8,īk}.hjZUm]'Q5ukUve GBW-_IWŲag-mKx̓3>kʉTu-,W,ގY#3"3$tןXK~ h/=zT {,|KhR`W};m?{yXTNc?W0oZkpWWnx|}x#o7HP_r`_L_،7\l_'ſ:;_k؋{ißbP7fvD )%c0(2`Ԛ12Lm5/H%SC jmЇU6|$G+7"%4*Ko4o ,-=D[_Cv%-\wlF)i$0c%R_<*k]+v$R8P>yw}YKJrKV-ʟI ј0`z߱eӒUbӒ%|Fw/ĸ1n2:QŢ)Rwc7u5R+=#Xۋ]-z4 mI?P?_>tڳg^g/=\p2xlg;;:9az^   JBAcTaӌ?o=FUZ fÊԀ#hM/ @}҃a@-3O&veH޸BvHg)F$m1fvAh</'Z+h|Bptl?P$f,fQX1lUCUll+YZ6@7A =]@ 1?"Gte/.Z3Ɗ &\Qpd_½YC6rV\xDIi]͕̋v4@юkb>spyvp59|Nf|rr>I Gg@5(A"K wfA˨?&P R:wX2lSD4o]g1yѨԉ.֒ o嶧Q,x`eH]ijP/dPGW 2Jd.A?hݱqN9%5%BBƗnrdipE[9ޅCJn %0la|[QL  A^Xkbac'MRV5Î(uď&u iQj]~򷇘'%;";w((3Xzu.ATLm)NL 5PdlUq4{Kpu$D<4ɑkAO.0e f(j*;M=8F&8'g[$9'._`1=BWvH?Kl:3k Ja¾J92{J#jmj@Л+;A]qeG00X2ΡŕSb2dtI`0 cj\K; 3 ‹_^̵Y"H,]P7ő۵;p fC} zO!aM_$B"JD&'cDEz8QL%I[1pA0Jk U4fZf]?c>1'6@`qYCI24S))P3%Kwa?g_G!}@ eY I@ͬ,.V{!ݵB-MWnGy^ipU$$YJBcHJ @F*p)ҰR>c-sԧ1)Fm5JK5/&`P |rk{&3  D:qf ^U6++|xk17:N װwqҀ턧fMaWl|=?Rsq1`YKxeokUszaDKS$"J*-fINǝjZekkK/Hn˞y@ĆE}qF{gOeXf,V]4J@.p2"Y٣%SDUb\űZR$0k5ue:yi,iYv1 BJ?+*%ZS1c߾Qp\dxAJv&BIM(\ '%Ѭ^KD!}?qD@c6t@j%o1.gTX0Fq.]*M҇TI*SxNJQm`hN!錘N}5Sk%$+-A5lINЧmҰq̪A .(x' 8ZoQ%JiI]Ҳ{ jBv:l`vZ3*OڢW%vQz- IU˂ed8F)PR mFc/+c$>+6:6Dc,p'ݾVuxӕXrS݆!c;Xh7u766 25"'7^Hrm$,sOa?8I,,EpWfixZL0 z~w x9$Q,bfˏx[Oϼ'ūٍxKE2yӅǘǘǘh~[}I?Pu@\jk/!s|CgtFV\Q_e 3^и{ćoɳN_pBI_t8j( /ir{FlNkD<)9])؛&fUTo/I..n:զ|˭Sݍ0 F|{&ePJ'q޺# `hF j IVڷZ=̴ŭg\fӳIi6;EOove5˳ :&vW&4`.\=r$ds4SqZcR_k&LCOj|(W,&/&/y[1mW_O,oQSCܼ-ě(7K c^=KT2oU%wZ ?KsGU*Q ~3vu\4(s"EM8" M^b1`51Q;}'᜜DDU<2a Ǥܺ觜:Y 㟡B1b.(b*N {e;4;2LG]34ڂW ߝ/U4"`<_BrEQ;C bci,^*E NQ ($W1^b1MggY\0@rxa9%s'O]k BQ1a>wPyYTu1?k]-p &IjW$'߷ҝ)EmuJP$}CXLTUVV&2Y»wnz [c1XJpRUnyAl b`lIQd ukLϪ!$;QT@Hfcxt~#[_EUSsv$ʎ7gvC|"<GH7RUznDQE?暋>^lwY>&&}Rqlg}FɼdmC3] OpWR0jeI"?#D塬VI3f#K Ǔx=m~?^(P[@^+?,u_^-+ڍh#$?4kMphsI䌨۶v2! .)[`ׅ\њkMe!b;j'T̥ytXir鋊G}A@ǔ?TUNPe9YBb$/}O@!^OwqO'TI;v_r,;^v!S?ڐmHt_08YvZ<{̺ٙR_2;A =H(R L+g1&7D5A@ԥl0Wae~&ېH#d+n4&FdII.iF۪4P5,tb<.F[P{vtսS#%BBm@̦-ʹic P̱ǍGoo㩗;[#g{7-p?6Ȇ;SR ^&K(^A`WR /YQ-SEaY2.liTK!{ǘC&&#dH30Hd Le8W?䆙tti޺XL"K.D?T9 bӃLIkS,.<.WvlpvՏuI#r3M*~D`{"8?}p4,A(P$jP 7~LSÿ( */W%2cH-3"Wv'ds}rN|،I B񦚙5ZnpzOIGV{IĐ6ܜn q*ozukD,4jɫ%Ϻ{%ISxOk9ةz}h+^a>vm%԰<~0ʯTes7xOԃ92^7*ʽ.P81q@,d45(0"7dA7DŽ]Ie&$Oͧ !2eR=$rx70V@e49 w>J+^';)Nϙт'Sɲk,j"$Ep\LIDoˊMIĥgAW UtIQOZ S5FZQlM_%#0j2ʬ|,/>uBj-3>ZFmq8 //uFD/K&+`B .:r,(|D,*͋TѴq% +ߌ)o}pTE!*C̾hu@zmٚ\":>k1,\DbZJ/\r O5ű(AҀł%f֢+^֤S"Nu UCX-$2@M6Bde|lv1c߸@'8\e,Kl%y6fWW Hֶ T>䈆igŌ:֠(Y\[E r/k;zצK@)@KJ{.4'[x7Odv; λ׀H&qh5.;b)X Ml<ÃaYpl%q/T(nb8E GR]VN`z.(캹؆"a\+< $^){J!; f#`Aa C,?ܓR [L̻k l;j.cmc)0RaBv]2P=ϱ;1⿋|DFQwc|)t!cm6Q5yq`}}?y^?}F}n{d2,4 < Nn1:W &BsfCrfqB4H o>4GcT ObޜA9y56س3jr3vчVzOR`N8 k6h -y+vfr5ǀ X`;/c=*|r]b]mjЖU rbf;V2cTvQ\Ytёw" tQ_~{lGt1CfVrlw)@%-IzCp(/y.,WX@[x j.e|  ]x߆awwRbGB_Vu:vQo-tWőz0rnlgNw'_|_k)a0 7mP?AJ~BFy+|LG$wCϾݰ.#-7i#RuVUq?el5`d֗qT^f}s< \QAKAa҈28 ::EU/L#[8vЌ%Vgې]Y(/D3FiH^-jɵQ(МdNsPĹֺ;"^M/H-V[3&d$j]]ҘG6\'/*BcޫK|ؠ.{dG*R }1b );> AB-ފ-*+]'S Oj`|ny[4nbդ4^F*R䌀Tt} '3< ~(62sШgC.&vѯDVіlV4tIhAkf6H & %`ivY8`py\a!z)]Rj#6cPya)wV@רRۆ4u^''3eA`u=W_Eiq*7 AWxI)k_ٳ\<6X2S\{JUC~U,& "],wBr$?j5Ʈr^QlL R)4/xԓճx2|O 4)q0׌xir3;A1_^[:&i3^1BfǼփCmz ǂ9*&kh(VAo! ޳zya Yѽ*06\ѯV+1^?y|tDLTZE\xy?Q$2/c.Iu Uj;61Jg~ž`YAlDl`lMX l:~{]ƳiƯ29Cgk#$*dvA*:]T6Ƭ#*JX;=vћWIotlp!gW,Y; J4iNT#s85Nb \ʨz܏,z8RXVhcyUO 6[;`ef9y_V|;?+c'w3(! |qFv+Ks< T!?5Źe\-3S[ Y^Nzv8ye]U+w yov6>Sqɖ}[#-loQD 7:U9|KrŹ ςY}]AV.~a)%See%U\`&zjOr v4Fj\ QhE[DcyJr4P;bӭUXtO|IXz2tV',ߍk`hazTR ;ЅV+gw[bSeSMl-f;sǮFhWf1d%~,c I.WH[yC0oHd<a@0fVcU$9"1F|vG~?ejp5jeoʛoܬ&,D~&]Eϋ J,k,YWX~+DFH x©[)[wiqDk'Cn?\Rcx6W-wv9S[NNTaJO{?=qs)G|{J'P%^p*:[’sU3P\ddIS}ޒ˄Rb !d%aN&edd*zqWaA9L*uffKd,s-C.pv~5$yC擉vGL`1"}HOp7ͽE;o:$w>| z8L1?t9ūl<ξUlxv?}^h2EoȬ{l-9X /I/Cd=xݜ;}F/px$7R)rp=(Ⴃ Y=tmЕp/PxӇ]` tr9p*cEwJ??Ɉ,7gÐJq#nxiLxB9:/{}¿F&3Vw-Q8BWgh܅3oCP$IJ!06L7(W *~^Rl$LrbΈ.F7}$Ȃ3?a6|'ee%#ح-b)$]'_-sdŏ<$Ɍ,MI;0t˓# )Ik7r1r5gD2U& ͳBSL3: H1>Q?tg}3Aہ'}hq^|~$sdݒPO Xgۗ]DR)Hc\ә̅Q y*( G뢊h<7# 3;3&ğB16Sd$oE4tb`\(4g2΅eߊ>Yk눻(ځ9y JnLI7%A! 6rx>/p("~ؼJ+DMo45Be "egcJ[7wqLC̟> -AͲYڎ7˷u'ן%У*lM!pj#@;TS)⋘M[Hb>Y^WT$Eq}Zw߬o!b9w޹;w M!!śbK]vT!n-r UN-J5/M Ȕ߁LAœيhC$mB֮E"4mT.F]\cm\DMOdQRw혔snLsB˱7)7hkO[s.Km;̈́I}K9A̻J'zYBJѿ"(`-5EUW(T#esҤiҲ4'^QE{yWʶwhwlqCb^7hӧӈ> a2>e%?}L> GD,b ܾ/R}TH؝2ozK<0qGbK5 Dؤc-~G# ;{K^JBl7,̉ra"m~/#Oɱ,`'NN.B'(vNmj-wbdjj3iە T4V=Ut[l۬[Nw J;8. jluBŞl-ƭ%rw6C)xǜ1xm$CzS5A@]pX#朥p.|SL{Pp[_h޻V*K&>ݱpRϑWȫ?XhI͢uG|䉴CgvK;BzJ) 9N:6Gh4 :g<'mye#^X^sݟw5ڒJ;vr8]gVͭw*`F'Ѧ(=-E5g8˘p8dײskm.x AӦY۔ N&uF :UcmRKL3GZāhT3m^r<1J#mx;0f]~u(BYT_lsg-u1u&E $S{t'_<}+p֏T4l/ySL ]{l{l"6a-v21jssE(+*H;L?"2X:a!pvKy0.% n6 x-Sp1rnoŮiU_6`qC}rrs .Zi|uSl!~&\| Bnd>JR]]c)$K<:)nW]{ sl̀z7!-|ݲJ 9l N+j^8FK=:}Ǘ{hggOO_u(z۲Nu8z!dxãأأ(`1BLf8OCUߜePFo8@!*i>\#?{Mz5tC/͜)0Z\Ӌ6A 2zsFj"!)h0L旊Jd}H qdXͪ$P&qZEb ߈87WHAkCBm+k "IatVńakq3Ux4,\'% Cؤ"F027{XkS!ϳ 3O3v` ȚaL^)`4Ii{q@Y8:vu$;P;xpB%=(:oXnaھ9= (FJ+xz99:D ` E`N@ q ]هFpn/$; w.tҾOF|(gXM[LT&?0Y J1;lCѴlWetX4yT2cHQHg}M7љ=Nin0?B. FC4U'"Q?'VQ&}j@`8q@@iel!pjv)+fB{6g&IEq&i*Rړ"v<:fS25$FtRn:5% v؉d?9rr]MX0B˻8l Aښ/ uu:-mSa޳טEhz3$ϞY={jx3B "]!{Н_W>-OʳgeԔ!)RC}}QO6|v50NcyVsJCJ 9314l1af/g\?.`NvOY=tADg|ðؠی@Ǥޕ:*t;Z1ơN!6{RYld!<-!L9# 5H?az )NH)Q0;is-er,iX#@P< 1rUOj:>_ [Q/i+ |;SYUt-'zklv9gBs,p/5܄'п@E/D`|ػ3\%ۗED!n8X%XOe< .-@(wvMlԔ"ԁVo xzJ.7K`NMRӽb`Yt~_Z{Zr\:Ku|@FW5:}z^tt˝wjeEzjNEwOޕ|I:'g]LEX뽣5LGc+m{mwׁήБ•Np;A }%]_8l5EEY팰[SlUpbc5%@s}L:Y[kL{N(ҭggO>X<eoMɥ Z9u;] />  F"683}"OP*_m ڠ4r, ? g=A1nb6$_zUt8nw"=%m@yKt>{IKN gb ƩtF3B$<^:|@+~6ZR7-aQ9.@jQC/W0&1@JqjלmOcsg협]XT/NW6c%Q`Jl~FSR9t1JA - Eae8Ti량[o>'eL8q.Mma cH<]I/ď" OPiq=U?P\)mL)Ts oSbZvNbެiŤmShps~9(W}?,E40KdI@D—VZ$s](X.ۤeff9# D ğ(t͟jS"z&jruUQJR 2`ţ@v"QO$|UN\Pn(# " r@ѡ׸t2 @,8ssOx g3(*Dō),{٘g`X{Mq,+jp/RdjU27'_OU%ao.x-E/{1yr&P#Q`0? ud8 n8:خڗENFL"Ɯ,ZAI8cO;|1l g$bnV1217"],(]uSBc,B[kzrwi:`: 8M23meɥ}gWI&SŪ0X}Ij9Q?R;(L^.K/Ev>",ˇ^bZ2($|$-T\G_W *EPVzJGqH#,ɭl!okapg13,]yG'{Xg %HEB-aiʈGaQ{C`8s7,8oy吓eW2g "+'K!4uZ燑"JLw^g& QNv򁴬Q/Ù=ﴚjjj5֫"r"y-@UY$"!<9K%\@?CNiRt0tp8F ̲L7ҐmuvAف/pS:k4ޯɖH$Q*%BJ+[#`"< Ѩ*W`4R:x9&5l p(C0"L=g+6bDV fm R'hOP4'D[?F7 ߈bM248\322JdDfKi+&v `)X%tr>s'aLb$o*G^08bc+Lp|9v0?^Q99 A noݲH {6LKG7XGQY 3xn&I^2o{"/@;xq9ym6s,^vNNxbg?9πcdG@f2ؤq|;Y3t4S1 # ۨS5FCHgu$@0>{݌e{ -"LJ‰K1 rr]lvG^n99'O^}w҃xItc=LuT́`Z20lh+zA0҇⧳59!Dg5>wEc~_BIw؀4ݲ~Ϣ<ܧxi*|cŒ=@K!(;9öür2Uv0jX}YR zBP> JN БduPGLb1JA#v͸f֬#U5{k%DQv\{`g G=?<|){bnRdy0kKa0ex?q)$I s*zN_sA{ٜ,pn BkĘQ+/GOp@])XdL(+3`(PѽZVn{ţBÎK[%_)\)5~ hN'Jx^;̵X$@rO={eZ|r[Dl*3Wt5EIº nz$9נVU[hWvސn ,oxBae`bk~RThn(=JnWoݢ&DP;t`kJA|F]jѥwvZ>y[%U /95z ď:$c]a[ʣFi%/;Y-/ 5+9P9E.  )Dqo}+O@:T#LBLlI$:HzlAeLaxO]sꠛ|3tg"G;z\ċ-ʓt~^.PU~K2-`P.`phVx '\b-'㉴DC9֓pT6BHz,~ :d40e`%5t%pGsx\>#H υh&?PMD=Nͦ7 Ri:#4%@"|TRG`}.ÜM76ݪxRԠSǖ=muW/_ h~mA}Q]q}x"cbmOjmSI<9+3\]mkϤ $fqg]-Wޭ|ܮ6RHٕ銮{(cEEn H DK9Cmi/Bna$B 4/軪!cEj^iɺáv)-,%;jdljdc5Z*A.dGZIw|'AmeMq5RM1\jxeyŦ|5o)w/X_(=\^On=uj `{ɏ!7Hʦc&q*@|!;EaELۇ'vz%$+fj#Yw ]sd]&y?eI>XNgƷWދSB}{L1ҟ,Nz¤r.F C =N'wQSxr s&Jh3 ⊶ۮNE8Ի <B˿HSLPLVekw?05lV"`ߔu1%瞤\О|!9'ªy5t>&SNxK>ID]>c0xG~rNG`3U| ǜX׈4|_qm͐"-a.jaWFuxO(36[ >:#|sLVSp߈?;5P'mHQf' w-9oF ,;T,2+Ż'X ʎ&^DOۓJY%u LZ;W9LGh6ÿmO Ȁ s<4k:g1I/@OCL<ߛ.҅Gb\wt8FYIzگ`4A6m;Pۊ;eԝHyn_j" 4XbL#lu-}""Rx*,##٩a1UWu0U b?.yZZГ@%jXF Zݐ;D$9E] 0je}T{P$I~}. P&:$f)e)Y{D R`YH K0g1e{;pzk2pz^WonvZeJG95mqzR_tC[|rcT 8>7k*m6h5B'p:QhuBpڽ#xs}Ad^ :Ysby Ond%Iހ{6h$#MF3$"{]3] $[ӊJZ>sV\=p!]1O%>ȈPWh [\W-5WzQaEa@[[EX! 9 *,*$*R2R-jTc5bM]Y+4Ee1㛿xM~4T?|\[40mH6EdSr{!53%‹zk']7R _>ζD-B@RR ӍJtm5{Bc U\gdO87h } 56_muSP6H394N^ (ߐۋޢGn "( 5iy0KNq=t][]@쩂DȢ\ǦҠ4A~dDf)qn)[wrTFpBVo>_g8b0["$0{KWV?kO,lh.wfYRL_ lcP/"OE%h'}Ŭ l-#Z0pZfxР}s_0 8FSe2G) F/orG2c-9J c_RW_s@T$ѵ;aOG~9 XMGe AI}z:ķQ2.3[VCT*jQ( TN ВӪWrBIYlFbqQMm3L䙹`G&\:Ri,Ϩ{zZ ]11+X0(.Ξ*Bnvjr-@@dPc\XΓAN疖MJZN$ڤny5ئvSZfk1 -4vFZ Y YT90J[&oܲmcKNr.?.p~Fk\1:v7l ˘{?RPIr%\ (G_|Da2Pe@ d Juzo$vץ uv׊=皷{3L)+ , ~d &ߔఐk\^keWsXurWm.1Xh}$_121‹d# )0Rܫ1}DM& [ QƶZB}p902*1qqp#aǏy;DT;\5T;+~6G+X>C8uTͬwݚ=Vs؏Ga <$@<#k̼"~H"wةn(4Ux;ٹL&+zX#hxώqf`;]-_< $xrs(Ĉ-ԋ 1t,wx E1b6р|g\V@qrsDjB[NB,4&AD(B`e(F"Ǝ%u$8gׄR6ӕe(㮺}ЀjүK {ۈW͋mGVk2vt-ܴ<;>*-%?wլ9j55Q+*8nXEu:Mw\4^]{b|⁅f|KHZ"S_zJON"uZTNAN fnPpߒP8Ћ _PjAB%7J͗yw;~V$Jj~]vo%r6#{,KϾm{}%;; RkEtVCw^/5/9}Զ{w視S+Z v]8BK&hZ*9<ǩm/j6R)ޔSCrp鶾SdR/2Y52Y;ҟ$p27IB,pIŝ%`]b<ϯpdRyg35|52{5\Tgj͟o۷%Y '.QY|kwu ֵ}?0Rk;PKwŊ[뒾M|?+ƺh(v$6ޅu `]Ⱥub]uu-!몛kNeYqNfEj ͯUME/T<4bN>jzvzv꿝=pړ-[cxq꿝yx紌Ooz<4Xc`7u4h@Y2(QMܕ ʎURqKatQ r/L z* fXgtq& n F9›zTJV7+h=+dzBcjJ1XW5-.ȭ`~?{g)/7c4N.p57E8u-&5=8jn7{"iQ<,1غ> {s} ZB?o\yxYF04a` Xaw7RǧDaSFkIX mrn݂_MFɗ_m آM3?1ZLbWMl|lr|t#CH F{?t\Ny[ +R&ʫl.셪T3?`C[IWeqs>7@۴PNYJ*en!7 ]3&ɿxDrq!5·jAs h&S)esT@MSI+QO+股: , 4TF4ف&O ^M nq >{WǷkBɜ@<Ȳ1 =XI!cL,)C 7r ,Y+]>xUf XWr0+S qeד!<| Li natLQ9$3?g/Dt=A`R@s w6NC(e3s|-t-z_JQ7ޗ>Z,n$[ϊ9V)3;V=nX2bͬs8‘5pJi]M%a^Hbm_5Lmד/ VɱpDkIiD6KN4u4F7XއuΑ5wh $@$՛lخΟʽ]bƸ|$OXqkT n6S85dzp09.r'85kf % &JZ<^ fL? PX6z'bQ{W켊J-C&}fxO߼04E˕}F=+Ct&(D>_}dK{.r#ZM -D!Rz.[\P)jиS!4r-@0? oqvo!&Onvw['vi34Ԑ(?D_-w.iXi5;M~]i]طԲhx"A{;{Sw+łhUN7>qo;NJ}.`N}s$r>_gD9[JLd!a%89 ?ڼ/,C:y/3E ϳDPGrҹi62,tU DmÜm !a4#|dQ"[:NdriR:v&tIE+Q}#~t.]d M,ba:'.*`3NHN>1ot6k Oİ@k Yv8Vr6l Kl1Ng#7@{$1+\}q N7KGSL,.Y&Ƶl t@"e`J:2è+z9H6U퀁+ F^\&ól>6xj;7o .HqF*(VlkyVDE K"`*Od\YsE| GFA&06RD0O2s Gfs 9a8s7ĨY#h^ʘyUh>πzhKӬAuꆵPAi+]=BWˡ0@<,Y-| ' Go>(wq3?tzT.>fOGOqJQ[>mL6j'CeP}ÉP.Ѭ{{ R5K]:p29f0A͎h)lt_Tե]lqBȮkoT$ A.G<1'(; ~P|C$ qMsD9P]yNOF>)/qiDY*@lW 0 !O5nE&Ϸh:o.a$qtv{ǘ+Tab$/}Q?4kMrB~J|l._^–nW] m@ R`C)8ɐ͊kJIP\P'-6>p||jgf}tWrAjлjW͗Oޮ{'f--84rLoMj[|???'Aoq |@ݲC=L(6*jiU jes8^L̡xe ?'ʯ}=W)a ϑ(#/fZkmXM4C :nk}/{wUj]UNosmN.-S# oP,'INjsnY5';ܦOșpm4 [E5|0-nL }B>]P sVGZ.1te&S}:^I ՙC807hik*c4A%G: [Ii1p'-{\W])2#,Qs j N Dn'Ytpesd #:}GM ϿPxA~?YuiDr!'d㟓+y^]<+Ȑ\:Ny%u(o?ފSIQ%L)TP]V+ I7z\B(#jtu=3=UfĠiv E5<;&__J"˳np|$?&$-ݏ.UnU!R^F±Gt à R?Hu sF<\)Ƿ+Apլj,ٹKpHZkR7[4E'֭9zv9H%NRL!f˼NM(e)GV[1_ErlcsP†6EíW[w~w2';ſ~tު@f{8[qA{p ]\/兦/i|3L'U{'dw2@Ie_MZ eS<{rm5m뜗>^{қf5K (Xcr\'%J_(7:P `l2%C'&ۀC_aQJ~Ӳt38xgwI bSf[MŧlL`Ƚb3ɨܙW^?lϟoku%Fd8,3"PE ybqVH P<,clSt4 &}xԭChL*|7X\ӬMg ۉIz)}AoC6˥q0tO U#!9爄P3EGǸÖ 0["K7؋(3L-m nnGgg{Љ[DܒK C=P%OKl}O ׫\' vH$r݌'s|Aa`RɅtie5?㞢=~ .|] MNHzS$!/_V_h9}\}96p&%ZolJ~^/VTF5X>U 7`3tGY5N|J ;?2fթBjx1Y.0z8lRŀ#J%T9Aj#7,8+|ʒ33ʻ;B, 㫅BbtOSpnEJTwU,jF&32RԞ$/L`9q83cA\"'jGM)auCaFVو4'u@s T"@++EMZp7ȟQbm GI#4s]?*~Wd>CwE_A3٧%į{$ԏ)!ү@țtw" eFyv@"ަ!rtv{iȽkE~?SJ^z:Հ Y7XO 8\V JM˷鵩7+Xͪ e Ԥtg7O)cF3bnrRF9bOP75 NE6G2{Q2 "QTb8[x$r -£)pB,L)dg3kS`DZYj=ͪT*-4~|\k^r kz rItt.-nl ofuo urp]p$K?Q&Eu#[?;7B Γe,]QL]3KOˈяXW\2{E$dn? ^q#[yCӧ[ӭGx118~S2i=TVgFaj8f˪ 㕎A\ '屗tD,TW'ʛU.&sAf Y.ַN t~?jlN0:DG%Ma-Gyg,(\7Ur5G3 ;@TG]ĢCFn?li~7TӅՁ [b?'If[ԁB.S;h=T6sw %S*=?1!pG6&岐ڞ\K?:{>:{>^y'STD =3|;wcPN ț~ F&.cGGῆ»4YTP_u*5a=Za0kP)]/l#H>1UKK7i(PGn~t?ֺG Ra9:΍6U/'nj[vN=t C7U([qnr n MRjN;_Ex֘ yx#~0~ٕKO'Tp,aS5X,[)9,1$BiO35*=y+R%ol~Vkݱi2FV)fw}GexGg_* %4IYnj;5*#"@hyK5TyVKZ fEc Mn stk1<#(vWj(c`+ɘ|-|3[a=f ɚkXA 8eEJcLjᅪW FH}ԾOtKjd/u_Dk>$W7aX?o3pBg<4@;~d*VST\Lx悡8~%0U2#Du4BsK5&7CCӫm€>|Cﭔoqz(K#d|Ոxx3W@S8&DLp^NBp0 O'w qXfk`+#vWCd5I)cg%;c!>OQH -WQ^fhڍevJ* *}RKL@Q1-U"Djg|cDAR"\ hZ‹<;~vRYN:UE439Ysye{YЍK^5y51F~vqZvɦX<'xu|j:6.{VkU8*cRZ"7"&LTލllэ4 p="^Qǝ~UΨ` DpkF[ݒ;K%tqC7J:W\{*i-6:Uw=fJO̖P҂9m!-%ؙrѣ7}/7vN$n0z y.aK( t->`)%a,.jk5&w.==5Dz<~˃NνF` Hq$N$l)~qczv] /I5ķrm1cgmz9S(f*y@f]KZߠj`OZB~a J(9%}b}̺wj_l/<2[33xB1צ,֨6zS9m7N[ 򎋃=MZ |gQ bSpm/eoc*Ѓ`e3ZXۨwUՀ:)=iDT`V ^/W=bz/Dބ[đ_x'i/V0*ɥ/yŇ!5LkvJ;8 %O+v1QXk^<;f^~+L܊#`fF_ 9j'q+ &$]%i'godC+4CK صz)V WC - t#-x }뉾VDS?7sV R~}v0* BυЩmaM&XRҠ̇f"p]/ љ6ET0eƄthp+ [یoXj>"*-iEN I:>0xidn $* 0y2N*nHSzbQy#yUtnI/447qwO{W`]&kwݥI&' pZ0.FkK0=|z7[[bVK A,GOz/SW~B^+,.<9Ca1uAQ}-[v4tp̍RAiGƃc4hGHjiW pS!W+ \Ako!Nn`fLɇg\W,9BT҄ 5IZ%TWA=Pbj)U&bS*V/Qe]$ |ÁSq,Rxs3v$G=w7rJ,JcTN߁)81f$fQӢ{)YF5ipk=b-M.I{ⴉ/4Rsg2ʞp%ۯ }= w81 W EduEA8c^:f9=RheNίU "b; X&:MUS-PX|˴@kW$-db-Zh%._ĨGׄL(+C?nʞfh41fwV8TmљW nqx}yQEN=uƢTr Ϲ𣚴ogS/'n~4KԴz"C\ <Y!Kf%5ԞTdޖ5.wQw%s f LEr\CYUn.,<˯P,kSRA2.' 4K uΒ`(-#uաހ}r3ÁSdciK: jwW;VTsUXzf!Ғ}g&GĵqQ__G^$GIG{(ISDb-k89{skYԋT9]_V /dzhb7qNW_k^ZS즧YT4I"\/py:@h:mbvGXNw Q4$7χuaجB]j* c _; R8y63}?t;Fp#ExH{L}.G0?'J<MRltӮg>|V] n x2(Jy/M87f"ZT6 b.oZ,$fF%O]YXXr'<`gwO#7/Hi+:Y)v䡽ChZYsc-{9 KZrO5~Kz={a VAN#x# ԑM6D,ܪ@00Ze3üp^9,JВ1Ql>*׊ 7*9R~MRLDߚi '/3Lw,rM{Snkqy, a7g8۱@&J=J3;kPdbx ?*}B,,138_rҨ!BV.bݛ;Cʜᛦ^٭F~o tIs?ٝ^Vդ_brٳ-N^O+ۖ&}Hӛy=.~d4'~hFeR/ndLy/97[2`cy*:g|12l'*G72sjŧ͂0`1Ŭ5%ث?ԟ(Q5鬽ߥÍaADQ6;x*|˳npBmL¾Mɦ9p{}Xv2ԧt4y K_\k1dgXEyv=[@Nk*[pvv> LT'K[76_ N )9[3.lhjTaqL? $nؒF6fX쵺y6\]ezO9 I' %Ğ_UR>`LkLOMfp"I@.@zY\f"7ބlW6md7G>F3rR?3S0d{Ǟ< 1V{F^MMg7 6Z2Z O5rZ›س'oGn]&'WOՆ!ݜvEW([ZKL, |-?,YxByO/Y]pNfEѯ,?@~`*}noU޶q`-Nkޅ]@Zh":ON~a}?0ݢ)E8 alS' />uBN Kpw( pYNO~@GgMu)"/O8ESjlW,j|{"NctݗmYŏr|v:mvjzbZ{jqfh>h{!Nb%3S^{nLN '6WmR-q൨F[7`x)>e+R) ;kh݋/. [d:k.Nu'x(v݈`t~cONOx H]GM\(^!"Y? ET[kh 7U( #ܡ@֖臥 6UID*<4gq4DVcx$,LaG7}Ӊ9lWF;樝&LOaEKá+|8>9G>t,("WU>rpjӯUg0MeGsXa(oW$o1$ev/"_ | /5rtHBM%1j4"]8XL55<LWz o7zGGxzDQ0U)*~2. P7J$LS||”u6 Q/l65dc=L=!5n^I Ԫp&Y}FmY+h&" EpR[GSJ?me̡Ov28\A,nHj1pP™:kdՈǼ6kbI S#sO҉KCͧoSUqnbc|Ѐ6y0 x8v|:BUN'.,+1v.C`A1!M;v ^}XڀEej'_cP}Soev1ԌW̦i(ÅBb3>00fϴFw.XX"U EQb=71^|Kl!Lo6+`:Z//; j;O)i^9fdcqmN@r6Js;\ -h UsIn rIYT aRyh3ӯINZ=?Y\[ jCPW <'mྃs$@McKt/n^`xYh#ϧTdKCJ7* V VNo,RӸd4)a889?qt L&Ot$Xn9 8a%Mb0)ޔCdi 7A^^b'% #{Z@R u{q+[2j}r >Wj_ LrX)9 U\hoUZEܳOc^\[) ֋W`F{7?l`jg[A(s^Mr( !;kg녩ZTVxw^ GRIᕛ(l O-#Wsy%AmbƔ*{dg/Yp$%@3q(,B@8(fßĀ B g 8RzV fuo6b@Kf|'ZD6XK88 /\ TGYj촣 á'բ}DsDzvM 'I iDST\ ,MDICW}y@cB%6r E6SDkvxhh#]F;i*;/[ƫ =~RLC!pt|T(( \C*P@eP8:D)b*6CLC(=Pc/YK"KT71aUK+K Ra7\)O){1X #I|Oy=}"[!ѳo'zP9d <$ o?$Pͻ½x]Cku16n{gL5yC19%`Y֬ϯݯ d̞ч4x_Օ ϰVt$:_jމX4Tϯ*,c5 `2h/$v0jAQi5tϚy2PI<ކzWa$Ȝmp܅qZ% 4trc۸ǘ]{3~M2O= 8taV;pjpTHD;a$0%$64"i,u޶64 IUG T qΛjYQʮU.aOZM`Si8̵ymu&ǓE!϶ Il:!'&jS :Q _z`Nu1lQE9C9!4rf9y)+iTye` cv9lE!, *΁\iL1͸9()͟Dئ0w?y9 [$o1J> ڹ\Ho؍'10,$WS⬊՚mkOMal1KODt&k߰ZY+kV)*;FlKoczxzWpq{\4ەvo_qj]-eN[a^i `8ZZp%3cXҁ/F G4K Q]0}HD!불w(q/iaB2-2؛nN`"ٶoH::ZI]6+@gUVprMypErGγ Q2#8UͽD0ѹq7^덬y*0P!W=v}N3JGJU21<2>&d9s*~FI/`%bpȭgڽB6i4鏫$E#jHLMbE؏KwqH;WܻQ#pYRD7 †gD6"k V{9<JtעGmVrFG%T pb|''rv=bU6'|2vۏfMag$WRI{sJ bp *Ld+;a ; @m1KEPbӼA/:e\ u8HmgJW3r _sݧq/I.Jqn7/VQXAͫ& ؘU)jfT>ʩ-敷´oUZWd{:^nT?Q}G@7z14ЉA >^>V=XԒ,EZRAʑ e J,) .Zx&Pѥ_jWKU11s3e픥 8y[PHs&݊2 ER;љ|; (ZCHÄKdU݅b헚/7d*^&E7:xww!W\ gF_Σn-'V\*|<_Vw F_شunC?5QMhwPZ6ل@l"bVg!y nZgνbKMT-'%X^!Μj?.5iG%U~\`M\8WKmzDQ_oXi홯~^)i-s KsF_szNs* B99=25&§Jz {*zhxJ{L੃SpăVE#g,4g,w+z=Lh-%#v t ^޷~4_"*s͞JDTn&A/ӷ&y6+0tWWWWWWWWWy4xZ7b)_${X-Ŭp:`{6لSU d47jMa,Í <'ˆO >8q(v.6J2dm;.9-ٲ=ňsT1QK60[Pp9&fHC%yZGlw-L㼱0ߝ/)I/O=s6'_[N\Ӊxf1Uld.޳F@`< VahfH/33VcBmUQ]5×oy["\A ? h,4sBă0ýq y%f^h&gτ6W~Lhr3gB;n& H B3={&p )a37Lp> (•3Fp.$Ӭ-x\KL`8U 8ax~lt\&[y`JQnfG~>V|"ՄHMp<;sf($η8 XK Ж3y-qd5bKo0 o0R8<{쌕QwA^2N?G3 ќ3  -81`UM8@$}:iΒS'͐#q⦃"Ӂ㈎2űK^] 옰ՓFvR厎wط`$jJܬ eyaotuÄ"Wv8o q6&ŬB#vv6ޜ G!nm{ZG.wx4̈́VS_Vi(٪m׶jvF| ADawll{{l-џ pHgt WDUA)3kHwifufti]v|R֊9TUXFIoiWXʖw\ADrmUBXGYvϲGze<i`K"ՄwQg5 q؎k}5Y 2TAZ~R <XKzTC3~y̲< v_=M !@;P蛼s48N_)(E+k}6c or/wco׾ϳc1uv8W)e!R{V;=+"ٵAo_~ 6oteL]C; el ]RvT<++׃bj 7`jC^#c/%]%KyLE0cw`"֦C~I}Ƨ d­smK`}l[ [si3hDaeO׆ Q4r u-)v40zs %J& ^JEB;gPYlUDTj~z֌R:;"?|];a'UY>9+Ic ףQw =w}otrZ<;u;Ae?BbT.R.82z&aK}zߣbcs>t XϲbwKYJMKPؖDOY۪ ӄb F 1僒žbqJa*W~lm\/ ue&r#MeQer+_ʇve@(BzQ]r2%Ƨ(~mlb1ܗ툝o[5ToTZ<ߌ&VMuSmD_J\O5#lnlY\]Bpںδ PhωCl!f!ٞr5WNP$l|~;OfwQg1hR}`3avl+xv`7d/BNW3e@KFM[0I#)Nմ~m~!Axl&,ǃHQ*xHni鞨3hJkG՘~͒*nF5GYBmSr>BBw၀"hɸ \XpG @C5sI[ܘJoA73 ar`'=V$1)֬0<2B-q,hr+Yv7@]q%hCPnkqKMyad`M?s#Q>0ˊ;'~ڟ0tV-d(s߰Iů$ % 5KNIL,^x8XW 'bH^ʴ1h6*4h_/ΗVe/ ŊhH14y|pXTy3D![l,d S!?*P#~[N_/86uGBDǾ3H^hUL|sɪĜ@B!ka1v [/"dGj#8$u ڳHjqIvHG^ u|ZQ;N7}=a  Kqx;RDc'קf m8:sJ&V)*g4K[ 6'&@ǚU: k|Ϫ)$r"vkE6~*R(#?)t%VhϿlN"p ri=P5/4[NAW+-zf#Aε±*[$ 풛$s0cNi!1l-$dQڦíOȨ&kTw^Fx@)fvB<]mzUBu9Ҳ}VL9yy,̙ݥb^Jp'W"CƁc+\F.6TѦԉwK)Wau.e\[>6:*A{F^LYd}J6b$ސܫvLop1zc(n:v"nb#]#m 5X8dmG}E]Fɚu+SS#?%k٥6(ѥ1$Pɮ z;ܱӌن]obؓe~D#AzՆL^иIkNZ,VӋ۱ǐb7CXz b c HFw0 6koa"k0|Na;V>Ô00#~_hUUT+ v̤ X󩦱6NhX.V V(wZObz)'ܖ8ڱ%Mo-84^YBO>CK. X7Y/g]g~^I3pϔ#psM)Gp<WV:I0f;-9יՄ<.r6Mt/+Z&}(ْXk+TqL޵]7 ƙvf\*bi,vh%V<}c舆1;'HBJm\B J݆R=ŤG'ZF芸,yBٍQsdf613mlzes O\/W'OڼSE9B[JrSTe&kS JnԲQ31%ǫ\%+v|*%G}>4?ӝ,;½ ;UVD֊s)"rx}|i"S ɪ1F$љ7^~;/Ofm޼zIz[x[2}y olgxx_3b췯}'\m8g~hꧭfV6/읞`DN|*GȏIqXrOzFWJ]wn5_ïL?"F`{ԍr}jKj{rPiʍ;8"F>nVZbgrx"ӄ&)QHz3 HLGa7}oa)f2KD;W0%QQU2W90~<3<$01?c9 MpoF6h^ȔK1Ie9!(q_cpD֖Ѹ9: e|L3O4|(ԋ|qsYLa^hB; U_㴢t sAoW"E<>0-/LJA׀dpBMc[E:OsG5v2N_bVY T_(Ίl2Mj?M33x$Jϴ3,ŊTA@/%#̞8P(H)? d@h|ZD#JRܓ Gvpw4@)$vHxGC>O\ZKo)yKOȿFV%`lbQ#8:RrY)cEV:n_IdJ>{D]1v3?0aO`$~qTVp|3N.N05:̮͙z,4SO^)ρx޹;Oz0$JD\/M>Re2s[/H_j|~s~F`zd~`eʖLܔYE3FgS,0=_} &>dFmF ~%/_u_;k.ߒ켞.osVW͵<7:+pL;275%Jmd|V |{k ʞZ/6ȓFx 7hixM0]F]<-4mNKdMLL:uLN6)2?{R Wjy.ysoThHoZ >s䬝`H RUb\:zg|~HHsd}\JvS\R\m1Kr4wIsn>= dϚ lcl %]35ф! de& ̀S\ {hgʮ\  %~oLgQرSq1!8>pX&ղCRl&0T#]9+'ud\ 9 r v߭w%l"v@9sٝӂ#Y(*!w;r (&w/ ywhwhrf3|`vo3;B<^l R*M&aQ6sg+#%V $mYlj÷mx;qLq3 G)?xz)O6, cJ11bR(sHAydb|ljh֪dWqM|Wun(9)|U?j V~MɰYmY/]Dҗ*܌j#)\Д ݽNa =M*y٫]Klv(*PҵmbN69C4Qr9w>k)(Pv2&ÇvGxpP`8&q.C6ak8AY$. R (-FI~ ޹Q|&A3)@{gyQYU=ӁndՖXU(XҁEǵ$s#ytHY3XL'WpH>2plMJ GۥG"IcHj׵?P֎@^8|kqX@=EBـqn>P[T"ll#ˣHxZ7_;g4.4hns"(qlr诶QW6gtSx /x] Z*U`k(x1s 1R03W}1(-8TnU%nSBM = \H"˩nBq#͍o,$ջ㞍q-N:6*1.Vԥ8*r r|L c>nThbfC1MSv=&ZkQZƧ貋gIKMMF O/626pOig1 Cc, d4gmĴ#dl+1V;5Pzi]8/b5%uy MzDrw$|0:sMm *VagLztjDmFuqt-^j}p+_@ԾkiEaX:Ceazx;}:6Q 8Rxea\qu1%(F[ O 'W)FP!xRT -`л롧8b; Hn^+hAVE+8f7:_2#k u4 x/r1F.b*y#ru"20| hn޾ /$%8].ztx̗`Q'ɶ\:z+N@EoWt2(/@6]Sca+ QtJe&6`G :6@p}FM3ft_C3EA^M4{Q76akA1!WJunjҢMRLPLJ =Nf śۭōOŭo'::=ɯXJs<&yHn[ ߦSYguFU cso5{dZLH ?73ȳX=S?v<߬^l#WZ\蕨,D1 ` ;ځˏ7"yV,YǑ̒/]vVys Ѫ%1ŽJi;v_$ "4Y4`wçb:TKC|eU!3lB7C$i3i1#@Q3uW QOfBaŭ# m}7_ʖQeD-ȟ>` B A,Mc(Hzh l'JMqU ^it ΖVucϻO9KiD*7IV1E= 9~}MO/ R}nQzbtvgbz)I@bJ# EEb.xaF1n[ӵ"yᖨ>ˍayހ$7M .G<GhrܠrBS<Y |6$$ @bXBdilˉKP\bR1 'F\zJLWxt@'S.A)eI.*'PU&LƨY@ʻI#4w+=cE9^^i"*Z/(* 13Ѷa4 Nzm6D-vM%=]CyVgkJ<y2x(MJC ιG~6# ɝI~u/ > D~b!U})Z>|2uߦᖉgysGYVFvM,>VΚMCm`Y}ׂK.W>/?? ^kfb8_{ʢ#dU?0WIAX L:b` [^!kɉGRmM{^ nH$C1VߗȖa[l킮o/aj ٶJ X$ǂ/vD~KK?6(N<G=> K\B!K,e'MdY[$4Ͳ##o# #P\ѝW>Ճ<>W~cEX!_}?z/uC8r5hIgr<{e3 v_Ŕ8ަ9TŒ8^$yzJ&nj r!Z0-^Kݛ7rod,5TޜA8Wj*%&Ήr'yz葑FkOoQ;?"38F^#-N45nZ3Z]8S{ iUV]Nߙ:s?g㌑Ks$rڨ5Gf{U!lP̈ڟ *q39}>a|͢Ip>.q}>"| #)츣X,8+U.x d5z{tRiSnqЏ.\d*s{2!>'gBI{&9 W]GzK!=ܥ"hANq$gA b"c֞ɉ\hځ5y=ȹ޼ÛP lP.4[us޾-r̫&o=z/&՟ ;<%+%utR(OQh8Y$T{ʭk~9; nGQU Ksԃ\NL]HX:1'QTo+hߴjج+M')N[Sâ"H!by{-20a=$XMI99oΦ%Ұ|{M_۵rc_ʐΌ/`"* 6U+3,zԱy.s<"Y&U4 <_n$H[,c_K..?$ c1뙡Ņ:'',grq1niHE,"#I&gT|šh/+췚ֆYbKC . ,xI. qX`ͻ!?AO2gwM`NXޑضZ$5.Pb6Cث S7m)flGcs,Yhg+ּUrQr$qYݨqI#gU;f%DH[ ϰKZ嫸ОO̹[X\lE%b*N<\evb4'q3||%C ŲXb~jESq]#0JM0:\%x&p:tZp#5{z+b%fR8CE* :?CsӋ|:J< V$W$+xlwf@deଝz6 c?Ür1Xšx:6U8S PZ9SOK]. g1F0p)nQHAP,E+PG/ , %`I l"xҬy~m.3瑻F-(-S=mo7MGdND;Uw!{s!fm`3?ڕzd5dA|^RHHES3YܗQEHym'ZgY}ym3uἂKD7ָx{Q¤1,c>r\ѵ9f<U%f9 JYݴvG0 = ɂI"Hj~ͯٳ$(_R_ϴjwVq5O+X3^V{dΪRI~L k˝sHe/wXEX̿@x>'kQrYԱdfc2fN>yfC ۀކgȂQkǖtik?j iaU[Ӆ`oP1 j0k(4XхvΑaXib$s*> lYw禇V\xjT[Ǽ{L^R!JbDK](ZdcU ͞g9*j۳0Vƈ%Xf;7&~!ٌ#F;b{Lk@c'8ܿI=5oZ ^R> ̺y, \~AӢyâ<$PɈDCj̘K@aW??fyd Y̲zMҶza $tﭘ{Pɡ>/cƳHۺQ-<31Jfӵzӵ{]kY0^Dz9Yaر-?1ERW~b^/od̴Co&?YFi4RC唭k~s+sb9nsVc2Ai/#xZZԣzX6Q _uu u^MMu'JWsUsUԌNTDDD?Wu'Qr, o)*NQ)*DޭSSy{Ga.|^((tcdr\7C 3U~ tMqD(Vl?0#Xڙ^*ry)b6ZjgD=})f_S$kNNIaUuuupb"O:AEebbB NOaB~1#9E!1/;E͞lL¶I/)fy7AEgq=c(uuUhqRTr$)%:UE:,~Tg(5SUF/YEfd%&i=%6kŢx g.ge1qXgՖ_*c-ŤY"y+_(fd-2WneflM&R-BgM[ y+b?îV<VZxc3V>)+~FcVBg"?u G2Vo3VD@}NPtt * *< Rk31M/_%AEBK2NNS:5ESSSS_y)RaKabbqvRۭ3RbHAuF ?buu:thb9IQObbebEODDqY(kBd+SXnX(0I(Ra5B"^d//"(& [f؝MD;3nn~u"&u"dQ<ߛb}::B SG \+dLaX #&G 7L:_0u89(K(tc ~b77Į܆*}fx+یZv²P<%~<^Br(b6Z2g\=X}(feSk$KNGJOGuJuJ uJ4:%:%:%Œ֗uJ NHa!RRRR_0!LHG?ٗbMlL6Y.(f[|7!Egu=cJ:)"uR'Qs9ϏIL񳊞ujtXԩ)4'JMLM krЩz hŪ1sL~jʿ{x}5?7q|޼zI/߼Px@7o\ar7bMX`\jPVn0ߎ 7zc0ގ: >ތ7(|ϾpOF)Ho>u;>P܅l~9a8G>;^lb^7C ||^T1iL`>.Bjh@et&؅>`M;T)un=^ϮBZʹP<4UX^;bC5rh~C`!|qRAbR4?cO*Z`uVdgzתU*%FozN:8g1`ٿfw! {7}; \5{<N8D#+ Ya$ J,dŋ`n_9?#DGhzw=O6D8d-dO{ Gx-@o@X$u؁uBp=@U %<HP@t>Jae̦[댾GNY_jjk`>CPNʵft}dx>$zzXP`׽.tBh9P& ) oht`ѝ!nNJU7-`(̆4пU PMn:o|B@_y}t)r n8O^fJzuRw'Vrgmvٺ{9w/e|w+` AM@&,an GiN wEqi 0 AHleBb<ރ\58õqos8Nf ҹ>9m}-Oq8RQ]JzE U$pJpvpEk2Z񕼃M*Aɂjy e!%3*B;pC; 26gLx8 W!Fn_bz;$vAiG턓Z]>y]ew3e2].|y$. 3_y4}l MjhEVH.cӘ[?#r=drtFSR:׸"co6˚<: e0C^#pH2EzdS::}S{S1dQYφy PUx6b=ҢUfYM /wN#Tuxx7 oPɧ `8 X鏆2Wc02`u!(0M sVT5`,6/W?hhzWf?A߿dap G, ?‚eHpf b{n ~Wt6vr5iUlo8KyV<y;<-^]Z\GC+6{1HܤelN3`⚇aI1 PˣNcgtƓU_[Ե^)<;FƃpeͰ{7RYkgp}CPN4 xk݅ZvIeiYwɲA߲0s#1 Gųޱ2mW%mZ@gGdőTa.ףYi6# bZV_mr'RZ^hR&8&-Z5"ۻ{R$c&޶9 %)[9Cd'N {KdY<F5j<8bL(ڤ+ybVW3Hσ fɷ4>j1W,A`:^MLe'hoawJ5`m, _і P }rG|.|9nf2Jy6yTE^R+})j;@JOyṿ&5 ꨂΦX_l-k^&bq@0" h'c`@rq@9@`mRP.멭SoxjQinAT.g@S#$N&d}?b7DZD'umߍ, 'UN8(y9`zVu{b֐A$nד^t8$)ǽ=5VQ>0{z!~n|׻A6=I`\4W5!37-ZQd3AVg^I',] 0%}u7=m0%#σ\P`\A~Vwu҄\gyVXdK֖ T\0E=3CQr E)P()уġ(__GdZ_LuONb:C"募Hc0kPg\5 l̒N8" J)P7K=9ͧ > كʫ|2@˞ML7Nd `)>ITԿ&@J&Q;$.qv7}AgRx$*2U5VkqrF_q9ӫIgE4{=N4Q|{ˣwa^ JpŻ]{xe^kxgI /u6M\ g%nq'jM糺Dh`PE.kJGMl% k v^E 5kވO|%_#zS1~SFw9 ip"^y<ނS]ՀA$~qWV+3N.7sa]/όtA,9-8Ό`)\l}>k*}oS,Ͷ VF."uJxFzBߔk#r^$[,#h߶?I&W}Wuk' 2B2`ww20s0QM? AyY\P"Ĉv8?G|婌kN!|u剏t>kqwԻBvoaNOͭbkC.ݞ\DӇO*lt_:PTs[,pB!j#Uw4җf*=.3(dud4'mxޏy o߀ xY:,Pv` C?=os!7wy!{G3=vn»7bkYgum9.h?]V"K6Hx<FSϲdMM?(_KTI+ NU/֋J Xw}7,WVx!6Tld =>ʒU=IPWu]\EIBOv>'U^U?bM/ p/fآUOA& z43@ W<<2< @evHsK}d3)~p(?Z;+Gq}S%} RٯqK~SEwX~㩝I੽w~⎐CڞaFa@y{.υihfyÇpp{ M:(Nn x2|x@6Ի踤 }I*CeP¥ JB5,/*?d֛VD"I $#^,vGo̒䂨3>zJ+ni3̄jR5%!ᒱ\Am^| vCR F#dg\KE< ubD'pz=́u C5B|}ϰ,W3 dUŷgPEsx4  hUxh(X,ST6=tїĺ눩Tx͂0I6Ÿ~K4"5 R XP`r EH-ɘ (Б`w qq-@lN2n(-CJy;a)I?& k#-C$rS d}v;gɐԥme;O&T #[I{Bg C5r/gyc'辷ӲHHN&ᓣym d1/`#l"䄵y-6 UJda^/d{͒ ]uu/>jh{= tỦ-Kd*hOj߫5=y 8TP=ĂpDŽd<m+9uTJ=^V*6(x+:i zFnYhh/H3~t0chV#3To,' Wf1r^ _.* ggU5y/74d\] Q@c46/DP rDa:uDRaE!y{zzحEL:K׭ ϔ5K(-S|3œ9Sb\V~-TamwlcYvj%"[#;L/u(xtz(nݚR\@fc.`S5lW7&05ZJx|nI$yO;if\SED{j3`+VlTIcN"l#YH UTCk>W()ӎ||T1F;AKt " d\æEDdN.brbrR\2x:254JDžĈ I {/͏Ϙ2/>,F1 q%Q:K%c Ya*W_\#Xr2U{UTBd X= ߃`@d z8 zʻfuXA\\v)ȗdjfe?쎸::n.EYJ@ 8z1ا7HDZU+n43aL/{ϝw^=NjO;)KkcK5XӵӵӥүDYW^!e0C!Mb$9c͋ed(@7&t''0StR}]q%5{LdLx~qLWbB=5#Ru=Ky#fuٔeˌk,Vږԣo A$tX=mN';* v<ˠgu]RoWѤ(^T:Zԃ.{jw8>gMW=QMN|oHl t?)LASq]*Ʉ3;m-PBxyѢ5/};ȪF`=ro^5n5Z~D`vJ$T}*ixdJO毁55 MWb n+ tw;4بڎ:8uX)vQa35Fѫلbُ:]U1'w'3+R4-/ܛ{O(J! @e)qL'vz詛nd"yaHtΘl̼ŝY[!vh,3GsQ[/IusRIWLUb:dJV] XsT<)X\.1 EF.D7|=^x{2u7P8r[bm!r[6l` UvW/e&:_wA;?Jhp1- Izbwbt,eM/ Dc1z?g@fwR 85x.Ĥ1XYJ/o]`/ N8YFʂ{<>7&fB2ǵX!]9H)L)*YM쩐aj@'7U6p%rY\1r\fwK=RSLOٗYbIzn_,Noz呢9sHuJY-<[LwesqUF{Ȗͧ ƌ צͤBs @MT@wN)r7W^`_V$=H9*)á#Z3]X1}qݕD>N9G{yZQES,T_=%TMu멳=?DOiz16g9Gs@A&D U8ᘨ?ot/hV+f0ѳ..ey? w ,/e1NOomveG7^Cī"cOo+O]HƫT^PX6 :kuzCj:^m Б ik㾏`B^>ŊX,>Xuz s "wB;+mG\-:t3X ӵ7qkk|Ba eRx=ۇ!pT |cqFw(ԗGu7._@V$2rݙ4rPQm20:Uޠۻ Fptfz*"!Ý 7phcko=Ҽ'Խ f! uKpKL76Zk[Fk=)im7jXzHɌDZkH2jUm?E!Emm/olWO^^"U'FHL̻i2{HS:\40yaD);1Bk5N~uыGad3sJAH1HY"mkP_N@@qyO8n}q|l*ZpQa`tҋӡ_ q+%:1kr9^ى 4INH [y -~H=Uʪ:kZ`3lʍ|T1l+몭% I>b>M{ĞN `HwpR=V7 % C! 8ݯC;ɷL:(yM=eNuRrG;#?KTsWQ?Y*p=r3ɘ-6ő,=H䧹᎛ȸȡiR gĂɝڑĔKUm>OEŨYڭmUklq#k=*~VuӽF/ρ,HF˗D KaZ~ A`$@h5E Dueh8Kmع9wCk,Y>*FmZq,Z)Kr&X%[gJƕ1Ҹ2X+˕JǾ?qeWy%+yl'eeFWj6W+ۅ廽Rl/'+\Vdeۖ1Ҹr YN#++W/+. +m.+qmʙ\yʋlu2-/S[[׆7{SϏe= nm^AH%HJ{zn5fqhyzp_t8IqӆlhN}ѯ3M_j>N]* O*ùFL4o LwZ}7茾Aڿh9`ӟ'Q0ۀ3FƦCi7Ptoչgz^GSdz]Muƈ$_}=[l Mb9aD>*E c*6<3pNI܍'!O?\{z ïxOGʈL޷z~cPȜZHk_n`Nqv@ L'bYR{ "sm+ۡOKq|"^$,gk"צ.a$ 3ܙbE1 P./`U| WG#.0]Iv4iʹO4B@'IWQz|#52=t"jGZHj(rMޖCI ;uv;1z}ݻRg2F!fxP TZJb<5&:2:h9Sh*<$tmhVw*&:Z( ׀_ ` ¾V1~tvəu 4ۨthsB!Kr<(ӱP䬵4diPac# 8=JqtOTq^ +~N3'[-;;. ԤHL x2g͘RE#k1484(Ʊyv25EWBd- xihJըCUA"rM5{ΠGɲ\aC<Ё -v_˽ybo va,lh܁4ˎLCab,qփH.?wS+Ҳ"mH,B*3r:*ҕIt;*HP\(ji1c]LuyVE)"NmcHXw7\U"L)Y0xY0wa^*FW ]\kO8~Nu14G fc<5 nrwQn+bߠ^QmndLYD7c* E؟^(*f?KobCRD~Er*|՘7,utjI'QnTe=sSY[eGi֕ZF 6(&lf-c k+r"1H߷_ĊF^x Js(0Fq0g ЅX 9 ]?:GC$:,|^ >1\v^v*İ`ۥO:rUq2ΤS Cg'3bWXγ #_GxJ@)|JʆoodYN\WD />h#p|F똀3Ac7Ԝ"V^Xf^ŽqJ<>(tRw8#ŢG񸡩H^Ԣ>(Q!S PPi&YʑG%EI"o?DsLkj-ma#ЈմlXt-ƚ~fUR9@gWls9RfXca-4lz1[ՍXkX=ŔXنܰ0ްDb+KmaOsN* +X43d{ҹ֝Gy,Rv \la@:H77oXXA~N qn@ o$@®ngJoC7I692)$+[=<yf[Ay_1y4fl^l5f/5~E_, %[جa cslQ,-Ã(peޫ1cgolR*,elE26cçMj柞3Ny|eI9=SY/==粬l,􌷵ymId͚-\|#G;M+<64Ke%n"jFp~Iccm.-D,u !mW0 wl{-xiL, z%ML}/.kycsXƒb+t6bkZ(6b3_kZŴ(6bq@FQxpBbk(2XzǭjmyMTD&jmZD&jm6QMTrmZ&gۊ=E4ۗM'4_l'rBwV*"vVz|`D,x*;lPg mcE}/++KJ({sh\ܩ9b {q4[3^ը/g=a?k")MC6*ٲh#W@HeGj~8x-E99`yt8z}\K//q I!F:3, |Z?L5[M]7<Ĵ'n4WJɀo}d 1B*< Ck)R%Mb .r_$B`8;Kmuqƶf%t(ŷG xMGj*5Ix ߪHP4SNEVBoJ ݿ([@D(T~(l0qF?۬CRRu3{ɉ>5"r6SD44ڂ?e*SCG?{VC>9!~9[OLim)ΒYN^Ȝ+8{3L"YVIZ>m5gw%2lv3%t߅&+ hKq)gt9Rfqũ1 K׹::ikF>AORdKTYZ%QWf#mE/~NE1rjip 3JdWdLZ$j@f-)q"< 6,|0%B fUav,(|95$FmEF4DT[=R`ULjixϽ"&˖-UY)Hiyp:6}mSs _M=_l 8mtWO%SnEIꀫz0+Ԣt͔?EtUvD c "h4|w1ɟ_B7'YXDyF=d^ְjaG# x"͔;(w̱[\ę7{"^臭 v?~g@dR i󖊷q1D!+?xy-/157'ը)-n=*6?` G_ahsig;mSyEڟuטq6c˚qHS3'tRxf:Y~BNyu(ޱ L7qm8OCԆ):qXOcQS*T )abxAq{YQVIvЪ5+5avYxvf:蒇p]k` cg^l A;G&޿_+buQ~fm޼zIç7AaBez'xv olgxx_3b췯}'z?<>*O[ \gPzXnFcjko  LvGJt5<%kfCßC|?ĻC @xV 0i3[q?4: 8-jZ r u*/H$tid\l٫N^֨w{7a& vv\\jPVn0ߎ 7zc0ގ: >ތ7(|ϾxOF+t#Mp$`{7tYM=iZp+ ?`Xy;XdSĤ!0aC% 0>b_ rzr L #6|w>v<%_c)}7|PcgW!Ûi?+@y`07+>b^5?'wC5rh~C@|qRAbR4?cO*Z`uVdgzתUPH9C u8aǀeu5n 8vXU)t-Gd$+7*ơ,dŋ`n_9?#DG2 qzɁb:_zz@[6^:pLG^2@v߁q uM xun{;|O=* HZ]~EݧWa\k6ԓu:@t|}TV2}6n#>4耏]{|腓O`{`. |c1R H< `1)=8~nX`;OF©NG Eĵ+R`a8Ud0m1|"i:8+Y,/4j|.1@iE+Ax k) x`$Uћ$ӛ1Dob@jHՌ$G$qu!tA/v' 2 3퍼X]qɽ8M%t=̿qR=ʸcWb !eG&f$pDk#rNdkX@ ϝDO6Z2jÉCztDJ*$\ Le1$$p#}/mh4s PTG}2Lm3AklH#i U;C? j!Vj47'J3v 7Ք[G זLQZ1-(gS >*:w@~ Lo;>6J݇tJ#RX@R;BAo7Mg~OꂁtD1!\G[z nD)GM8 ]el-" 38Bϖ&KԚri:$V0᱇f:9I {0UAZ-,֦ q,ahAOmҋX*[ %[I?@s8;FV],#"8_>"s*s3G9O75ضB Zc7 Cc;=M˂ˣoIvN4+9 Psz2^ `8{7&Jwtt (ɓic~"xS~+Y dE2@ ǶAALʹ+'ka,5jC  Җoٸ<2̷wW=$QWUjZh[)ԃ,an-7̭2c]j0_ G_ *XܐVeۖ+UV1xggOȾ@$I/Qd5saQGO Bz\\r0sz#6sQID䢎TtLbcTKQ nXbچx0  a@`(KgXc7Ea>]1oT?.J [}sߜ]^;K/C9fQ*>eZ*X<>PS^NU `KBQŒ t9V6JZU0j"% \wa c誇vs QSc)~;_TK.ɚf|QڼlnM㲏˟/*fܺTuGx̮~Q|`3(8Ƶ%KE/s_9^aNy|n2up,h&pӓzゅDqNpޟOVb P$QYKK&84QPL+喇 Ϻ>0'mG#@)'w5 ge#HHx *?Q\p(i2R|vUkAǛ޴\E)ćMc37y!!'Cr*NN-$$JO'Y]H}Q #Zj <(LF-jHP H$\Rh`񍊿k5ٔ/I=U g VKi!a# v` ~?<0^aj]2&~l0n~ök H{LJ$ԭIkȟfhLAn[CC %%@xe,xkfUabSZreۓqdZ_HI[hHm1\ '&OhD>&k\Bxgi3~Rkf4[^Ql`.9c@D"9?/8^jzN=SeD.J q3m0Sg XHLvS( mnIfKlZVTXeKC}Y=y9'ƤA"ireռ90捅׫y7C6BO= Zhz~ `|J^Wt ;$ɰ!ԙSɛ0fN-Vk&Z-g.hlcx^>d$꓊t$X̾Ԑ32; K2Ox3W$Qg3m3ZX>Y[p'+/\K[FF0xm<&KOj]~kCI ?=F.q<e14kWHLv4A$>ăXDl KU}s4I:9`5ˏB=|jxI5y?r,W{;{PFw6)5ǸArǻy+[6>(1oqHԒ٪kZ-?x-58(1uHj6t*[3L5Y/Fmɢvh&,|68֙9X͐Vǁ1u1~8ޥ=5 bjK 5Ͽ8)Wg) j+7UF4-t{Wv  & l0o{}huf4N׽iJJ+!3jcO=I^l\ߟx^IKq__!Y*PLD?>4bm1::ל7mFW7=FGUms[j=N0cY;Zk(uq 'la(FK4%9- m_;.n[p}Urp8~xM=QpϦX&7o ~LVOmr\Wi7Tmk"\{y5<}gh͹*F-=t'Zw:]+VG?PG#z;-籶 }sw kk-Zip6sU[v9KZߢ=u raΝyYL#w>}54땵H^qIGbRq<&&h-@-< } ZY'ma^Mfvn}m+9:Gx'Џ(I_ PO h>+2nkEuv 1$\' Uvb{htgat ,i^lQ1Sƙ=kNP8FK,XlND#'@U'"l.u TZ3'.`vtjŠpYi;D5i10QDI7zZd_缈S[Ea WUu2<迦oyC3X WvŞS**sb_{<E,2/]薡5ʌK m4W-Kv1dFm-Mg)=Ijǖwю|/^tR*%&ԔUv$1qY3>}|֯ʿ{x}Yq;z7^;;ݗ ov^~ «ΊIgo_ǽNBp>>3*O[ nʌ@}<-eA{[;:2Aa u{#h &&HX=;*&ySJ͢<2ù|n3z\ƓQ Â&9zyzwO!1 G*Oa;^g^7#S(?ڇ`@deYðy*C XO@bLg]Qf`IT;Q1/>,WJx8e*(.*#`mV}fzXk~)k8Y~>SN &ߣn{GPXT+ؓJVn4i1)CתU?;m8$!xZ0cRnlYjx 8J'HFdSpBeD?&/^<>>optϡ_&:WA1Ux>2h!`9vuD[ cc0OkE]ߏr}@HqU7>x;[Bӹ I=_('-k0H8^a#CZ&@9Ed9͛6*[pJ9vh -Y(@yah } զStvض|Tѹ4i0HKl=;$d#4G.Q!8#%ΩM\%ǹďQ`)&{q0N /igEe:S˝>݈mNLKH#4B@ <-b䆎i !RFt0;۴ Uv~Pj~؏=m|*T9buRiyN0HH=UF5A"?=❜ unwxUV~8㗫A:4y#7X'bkbΨP*zbwk.Z/>5T8 Gnj&`uܼMyakvМLPGӅYCCSm0H33`7,7&?A1H&ԹAw5-$|(!VY"Zzd"5AN:f[s^Nͅ0g&y} *Ixl:c@?H2A1AxD\ 9 XH)_Nq@kUSsq| +w1AJA<```L |  L/&gW1g䨂JӽcnwvH5G'hy-\&ۻ8[ lG>&27@=nR'7aB gs0f ,{|_T,"C骙HYd[jk@I+S8 l&n& ef_ npE<:nL1!hs /FÉ@?!v7 mP JФQSS{ݸT܎htxn+Ҡ!,؞|=sFO 2+G)鏇+AU;bL|Pk{ȧ+PYv`;vYVC|z6ȲvP42cX8 k SyYG=aon2ɇ⽡7]@="y@ʹ=4Ao,;  ؛ I^+VYqVCkw M,w_;kc4fjl6=H6Eo{ ]jzj֣Yڙz K{ػeڟt J/. ( %pEDa;q2#ЁDw,#&)˭z{Sg6i7*-b- <.K{M(YceԦK50&ۻ&"(F<+֋ aS^**O~g{oE~n"" n* eGCG96F̺ /v u,qbG)1D!wM^K+7z$ں?bBB<}~_Óᔠ/煌 I2 #F՚N<H2&Cg`^5UU^5U/3[&SU*zD>{=-6UjY DAx*?;HL:,`@KlL*,m%TUNVE Rc̍ ՏYv3Wj X@Z Ys"=KF'ca+Ȳ 8YqYu)5ؕCw6qvN2z|{UB_st Dnj\L@Z, T'{0)쳊 fc YѼJ,Z|1X~~<̊I~r^{o~ lH!WxLW I\G;؍kVTTPK5*U,a<هIS܇qX|"?ĢMawu2B%Ǖik Gjۮ&9^ӶOē!]~c[5ߐ'M!c:]"?-md Wu~Gİ 憚#\EeUl2- N` Er#* j='W<=zf@Mu.%uHh|apLWƈԥ̪#eDZMw Gd Te@PmDpq)WeET?]`j}D^z 5vILm8 ߳:HUx7Srz1gt@73r}CRtp7~&j`1yꏰ&|ՒA- )!u=u3 +.= (Mf8J)(=B f(Pyl2\ [uI "~18, ^1 *W²ւe[A60%bc fYdQAIR'5 >) HUҽZ)ENH㣅˅]J9}$Ѣh&>ZHʳ)`/Sc$As syΛ&cl?Ϟ,n*lr{4 NYs^G_(m~' b\dB{e~,`V?%X"lԃMH!ONv|zW]QE>1UvnɈz$S3n2FˍaAM !8NhU^79@`'ز&2)j9Rlu0EuO 69b(O KK7P;ݪ>|٪-._j]}͑.v%ˬ\RT[:n][ϡi}w)cgYH:^>tez88TZ%OnxF~Dr}7Hc;k A닑(-JdBյhr#R+Sq-O#x|\br{FV^Vյ7S2&x2q=PptDy /4"Iq1mN1IƳxTl8h8*ݚaMos>;QcJ6G/|4 Ii'љQǾ#-5s1eRWof)y z+z:WL5"yů~ q-w!nG4z3qD?zӇڧV}}kR?N (ZL~S8,b7}*-Ė?fD4LdDތHQ˯i3itOC5ICŽS&FO|n;OrMN0IfrZL+cښɬZ@d=7(4dwp N<ܝgQы!PCqanTbQ60SrF'=K'i So-\'z)K|ze[A@gʏ b9gE;d e `Ykߚ}G8t|kT|N"Fbde?Zn^-\16 d}]mU8&EMagdۜĭS)rbPعQq{ϖ5ف{Kl |i[e7Xv# phsLI"_9s]4@qs-Z9k i?B Ru-Ha}.q7r1Ts&rƌAXxz?TONV g;W}kݸj쳨O@T dیaǸ4ӎZDR53ۄkG̒VKvay[ lYNwIº)=(F86i<޶RCL/g!/_3|GF3{-+]5crFHȥUc|FKra=K_L~)Y[fnXJC)09L+0w_Z5Dz VC`t\D|^mjkIc |[DY s/obro*.cyyͣtd#cBW9N̵#2v4Ē8VLNCtݿV4^JK-}oT+fM']2b,,Zs"Лe~g Omf>B!Dzj‰;'X\,1nGѸ3夌FuGK}iɌ6n3f'={a+7ɡZ܂*bëtB! 5 K>aYS=aa _Վl%lx;qfzLYl0V0bZv*sb, R)>z(¥(|'EDK9.>vR f wj(>ޖcSrFX~)lRơ墛ٕh޳83ѓ-].yXjY3:,f&94ї Mg6Ҥ>#]ݲb:ֶw׻0|(WCo ,ؘa΢l gŇ "rw erݪ0^OĖ2 (݁{^Ma#OaHĦմOcx#E4F[E>, SvCE 7498b Eᗏd?=©\m!Jd6.\A_r_CWm4w憺߈Ì,knNv;_(*qOOH!Q(4ƒ57!yXUk?HMP¯Fŕ#` Ďp F(ө؛ n|UBֽwi6CBZM-x!%/!ݕ!<`reDr[}2__9^Di?s /<ߍy2Ϋs){}cI<«L[X05.omJb6å9,fyF |MC^:]G>@f6WDF{7'(?rH^~abQ[[/)f r=z"ǔuF]8I}#.&̝׾}W˕CVȨ4t!U&5m^+71Ce*LZ0 Yt?P -# maQm!,a[Mm BHiaY[9cAltЭS+??,- j?UOO=e冩ukmR^pRFJhgrUy'wpE}]s%dYyZ%o>hd(VkeV`'o3IxO!t;Qv_e~dG(@=׀)DFعq8Q(xQ3ѬZIڛWZsy]CmNeɘ,=)y"; 9|[l8:tܴeI|lSE_ p|qʶ?Z zDg̓,<UVl|d&8x^t?A ,9Pl֟\5.Y3> 7!QSʿ{x},oV{ͫN!yo7;o _rBY1t<wI(W_|4ZiYUTPA(?eRoWg־7ڌDc ?D8UIGD @9S(mUnazZƔ\;y;Lw;;A.ff5R+7YoGXa4u*|3 1?3 ߳)v亇CD7p$`{71.pb5M`2jhg,<7bĤ!0aCq>b_*;@ŃLg]Q=3S)uZf۹>H/ {*d1Dɪ/*#TV}fzXk~kiyn~C`9|qRAbR4?cO*Z`uVdgzתU?;m[O@s4>Z0c:t {_1WOnD#kN5ICY4?ݾshFF5>T z\}?z C{N t) m1Àl^=m/5aIr3=^+lM SN=i@,4bMa#5"șND=2lS1'!ɐ>:w^T>":yl;$#HlwRh=Z&σ h(O:1PȕC)JmY:b*#Ð.D<*KG1W#qYLVvvr)B9rD @9~]NyDp^,&r!%w6e'y:C¤cq ̡d=BF:oHHQyn|F}![0!`

nl! w~>ly(Gq@q|#L0(ǟ8 =p5btrܳL nY>,-$|93nuhŐPdRL.uF=G `2dupӁQRbi{"PيhĹ~:yNpΜE{hN%_7\ ߄@w6DÝvob9Wc$6:@_anؿU5~dQƁ3Z,HZyy\࣪)? .B\T~V3˄eߡrlQC\V˲Ňyl/?2fR{?EI LJ$N}{J#]dsp/uOm)G!gy\LACWb3Ņﵐz™Be֤58ء290"YVCp0W9 dW/j1- .tJ,9=-^.] I*ȺNoYi1ObjJnZt5t?<3gyھp) JhOCøc10''?ov-Qf >ZmD&'׈ӦcaRq/zaHY~1u,Zv-JEebB 3m^aNliD4%+3߬ bf1ғ֙79XO~.tg- yqN?u=zļ3<L|əne%Z7flzQE;@Cw0KTrVsCatC"Plw9|>s3 & aXFg3Q 9(6 F!ÉZ)J5'^`cy?wQ]KTr!D?KaqQ7qww Y?&4M(}ı͸NCOdN]F9֜ Œ;7ث\{׿#z#LoJlj58Mm cXP2|'ɧASрߜJbMu*O@{VߺJE"_ɪĬTYB84XDFhTK@"Ɏ$URb{0+I[(uR~zoPDVT׍i覒yV ղ)Օ)ͤ"b(Te7fqBrRG` m8\Bep*^܏򞍧n8l*E4qUpr׹Fͤd V=Zu=P3Vk݅ Y{ݻh緡\'4^!xrt_Sj-N cn:o)DvLJA-~t+`bp.;^1vA;uT"e=ڬ+$:Q`r@yVL]]h}o_.zWB) P:ե=1nYIxkŌViִՀGֲư?Yush(:`vj5 @Ao,; X ؛ I^+VYqVCrzz ,(:/5.tN,cvL!K;V0쁤Dq^֬WJi={ OAj{0tLN8a7S#(HB$EO!VxE*ՙM oKmh;The5=ySM+)B30WI-S{]X'CIoޕ:0Z( 7pÂ0PK?%h-*^lv{h7HP2{Vw;'Cg7KCRJHM5–6ZdTM2ʾ4 C#DL ΍;|Ax5V+ax/kr3g9YaÁ* Rd5N~=LW")9n )Ʊ7Yy'Ҵ9j-;Bp .6T,DJx5ܱq:HRZg24#m*m$9]bt?!;0ʒ5Iʏ7Igml}%rZ[#%[xFT&(ǖ]`q[DVW昙x_m%'pyM,.H:֍NBT^s@'X MIJ7 ˉ{,u|UGwE5/"2N5sA1, zΚa/*3OOfBS2Sjs։ZKN|ēXb }G$.-)9[) 4,XV)LHS*E+NiP}QK)x (<!)s.N,Ŋ6ϊ:!s>IN2(Ndgc.Va{QN@/Zg)d,b9KYLTz"@!\TuIE\[5kB[Mczy*sg٬8[soVӻx m[X,ua| auKnfO 1au.H>MнYp3;p ַr}+zZh;Hsd/%J]JJcs0s:mn:OanZr1)-g\(-x>Up)BA4.ЉgK ̯ rlg ˜ƨF@<э F8cy飭c[x5uWCw1|*o o8yڦ".nX~]3'X f$IZ"|(~)F)ʢH1>լٔ<'cř>SY-Nuh vasxnAe5X]=^%yQuږ-߯}H[!چۆভslLA&EƵ@a?[঩`.VRVWk5=2ol3~v3MsdQ;7|iC50^ߟHǜ;䜳'.gk?Zs{(kL cE1zRoƓ|mhvҳ=Cn+BFtOPE RZ< z lYs)گHAEգX>g¼{][Y{ UJBW>Xdn/ !G| /3X&+Ljk=Ҵk޸bR zcCɞQ 1MpQ02= 6N kdEOWfѽ0Ff`Y:߰[|KS3GP@ki\'CBUuI6E1E5 '%ε``lq @ŮGDR, 9鮷KYV傡9~IeRx(Egeʣ9Y)6@.L <|i_q $qwD~j^ 6+ '1 M7_qVY 9na(W iA)}_t>挻.j AxۡdA&+MϯS?,- c?VO~%;` U{/7*U8y yU1ݍ1A{w\ɼE Twax2~#͠s@+4V*"jFEw #˸<DZ75C=*XZ0O1qCmhI8 l07|^vwl(W}eNhq́}%M볱-)ͤ0c4ҁ|wTl%3pܣ$Ѳo,. A'^>_ pF?[?vE9ie"Q qՈ&W냓]&y_Vkmm0jbvZdkte1,jK]PzKB܍K_K$UE+zgm)U=Ӯ^%aqV:@L?&p=Ќu,ft&؅0w֧v<% wÇPs'clMzlʳJkE^/֚'~ }?b{ԍr}jKj{rPiʍ;8"fkVZbgr' L 4.[dݤcQ {W0O?rD#kRq(q7<1;懣}m7hӧ|n@zTq^_abCS/fS/(qXH,&9`5;/f9LԶ@#qv|,@3O)Nx4^3ŒVܛRR`F=ȝ\!J9 Saw8.\Pe y?HIͿj9x]@f ,cG!7QVPe@ϓ^NʵfϢ,9&%%$CeaGin)16; Q !Α iTP)wBjn؍3%Ҟ2 ,icKE֒hбJD zqJ } xJ #Mh|1Gj{\^k\҃H$퇝kdd1Ceb<;TIrt`i2MkE3-HJ !x? F`{]:< dr@5@-ؠ%"vecr_x?L+~~'#[U. Da=wኍ=H`;< /*c<VQ8~%kg?q5'n$: 5@Z6WuO%G5/m4򊸸DhBA$gH>rj ĀtLp)g ~Y,Uib$l}*ԻQz\2!zQw]xRy/e3k@jP|X7M^RvЖ _]]Mi?CTѮNؤR%?*bUN$s6Q$Gp3 ;ʩsΜI)dF#T-j(6۹")[h ~zK=uZi6tV`_1Ћ=bBݏHa*¼G1>#Ճ^)qqgWjߛ哳eO֓'{z_&c_lx㓽#ivrʩ젝2~Pqx.@L\-9630Ȧ4Tk4coL; kV\RbjjFOZSFXVhHh=SL`,uٿ9\(1{sZ9WzWel9gvlvS1 ^.l[9`d`&ZݭH4[rkm_E3FM|噙92Pi㠵c,[[r Sre{3i021rO|6ZNiˡqwZ}~0ӗ?x)g7-^׳k) LaSN](iw>;MA#F U'7>~*yԴZ^C3QQE`GT˓aSz**"dìq\j~,41sHbXiT< C6Di[#\Q4'fg pM`/ΜV)At^A.]@9Fa`R6 l-Sڱ%3X̳j YTT!!#ۙU" a^Na[OB!FhPZFE%CՎXُ/arݳgKwbJ-Ι$'ImKV,"ǁhFRSu`R.]R]@jyqL' "tDNJ:izY^u4p:[C!&D@7y?i<*ocyL2HPqHx12S;OHu,рш06A>díkB(B=$#1U8/1ߎ鈎~x[*<~!rEԇ=Ğ~/Ec;Y„PӈʡH/+F3B'݀00duҔQI3SWO a&,ĵUA |k<x,璯þ -Mh~J0ǭ^&PpYs[a@pVT [|8ȖH1G_(笣SNS#ÉX^sjf/ q:7@:86S220;ye#> @/=t'aPu Yby!Z^zty~K;z9ij/\ɾO3]ָr@s;k5BEc}ttǞ/h2"l85Qb5pE'MG 'KVQ>ð"b~;vQF|VT_ris{V*[ӟ|5TCPVH0%3pjyq2}#BNԵutjx2{~XR6*0-9%g2c\Q'%RItw6Obzi5ݜt`twlߦG7BG{ 3VL<{FK_&Z0RDD={Q[ fI'X!j6Ð8U->G ?= 1}Jt%c:Z,kclS#?N"Q: $Eho'=V A9n\_R=mg> :9MKC8)z,8Tuz5'I\UNo'Tk[ $jg gP" >jz6Sυ>DzF|ّc`4<`w |ndπLn5J^\<)"A5yt XX٨6S)r0 ciB_g_9<6۾Pfb>hkZ50_։] l-٤593dPxLQX)?uO-[ <@`5})x֘6P#b@0JbN,V*Y tC#nvg& 6IFLJ..8Xe2ř{82q*4Nud tļ|hIH7 U, ¡ϋ*A΢ Icox=@o:'by̖׃.[@ ly #Le`0+M KG0ۖQSc+D@td4G = \f֘|!#34@QLBUȌ.z|l wܖ=Nh[ \yBF;'d2 .OWew6x).LmR_<$&Q (B4%9lD}@/b\v%9H[S4n7dnJhMP}NGӧ{c,p$UZ35?d7(nS"$lMp>e~sC8ل`f"ؐaI0IP/KʜP7Y(O9(>ros*ktwW⁈ 7 Ȗ:3(l V5Fb{u(sj|?b~d$AQ[uk+Z:I^%\UC ȴYR)RN)υbP o~geZL -S_<"x+r84Sw mߜ[hhñ}(*?zxYȽ 2yvUhZã廊iKRJ 7lf ҅y7i6\mb3=<)r1v &Qq"ؓr⨪踗§`QwyD5 /Li$0b0T܏o RŝxKqHoc74J,` He]0Qo=|y7iB>jP-Kœ,D]̺D+y 6|2Ae(.ܕJ %ƐpKhp_@ucU.ER2j{LIzv"[(H8.Lb{,6E*'ű J_,mQmvN,oTTy徶`f6EBg1!  'XWby!nMU9ZEiL?]xzFF :;<| W7u !wQs7PCevCߢ5]~37Z1dihp[H $peJ(c*D$WS,jtOr:XЌ=c9V)`hу3?F/j=b,:+61{yV?jۺ2AbِaM:hxQJbD_$?@\6Y/HJ]">D+~C'z&89F*-$H~D"D UџMȴ̺P'e# 6AH{w sFE+ 'jM^$Q/^EPHxH-BO/1\|9B0ӤM=+Dn_/'iER]4д4z8] @ȋb7IMQ7}Z?U?Njty28a}c}c}9~܈i(hR/PPd_G2G^HH[ lH߰2\ N n<948v(=.8}qXgeҋ ^G]e<߱h3>IFr{7ZQ`%b[fH Q*bLn~p`]m1 ]Gc ̄m`cAI:Rd #70;o4ˤT\솶\sSV p{wrPr awJ8b!rFbLoWD>6B"9`S~:h:Qڕ\O!Poj-ۼ |xGi~1cDa@[kJelĵ.-%vs']D^&z9-E҄!ݧ%W[vZGb}zXm%bl{sN~a[{!GSz&}.C1xdޠ-\]OMp+ze*lXN$FROwU.P :$P)>YY~.UKɽi^yzXN`Vj?o,H'^ 'k#P=sUFbxoBTt7WllAA޿ Q&Eb* N?SCw>qD[1l0#M BZrzy%(k-VҎfmh[+m_HaD;!'wya,ygyȺvr#ЏԽfW%@agS}578 ,ǽX}M3Cy #Hz|覵kN$r=%_4&:#dJ##lb!bNjM$nXtE&Őܢfu|\Y*JO%B?OB?[:#Sɠ(z \ ĪӁB1-+*%EЁ.Tb"e|!UblӰ݅'":"TX[Ee h-az2_/l)pStsEŦSb])B}ї^lO碌FV^ \\KxC~g7 LC$}@}0 $w!UBYCaȁ-B+s 5t57XjOo! "54OgNOO8WEYQ1bS}$1%GU}HW*ҭ>~cGWDr೾H}9DhEYA,JJ\jYRje76\F#"vdE |ko+qPC sI( o5׀{K_3 >F)eOJןǟ{|eC@MJ(xjx9d27jQD f6JOG \Ә'x:vG (|A8 {=C3R?+eAbM 7b:Nv~81F^RɉӠoT0Ԟ{0FetZ h-ػ 6<(UoyrtG7  %m'Gi-ӉEcŻ)(ZBvNGM ]s:Ɏ_:*LFO/R?Kyb͉ & $P5_^׻ \T6qgH6| x1"?>D=AoV 6P?hɢu+t0Dǽ㈮ hо7nR8/Xn^HM{l}|;<V ?x7=a (ʱ2v A7Hz&\ ;nMT,^Q*eVkEdTyBr*?,"yYJ?O(ʮQz bp} #P/p\5EsE)jQ |?̦LOZUX̊u-ׅ?oe[knU5>|"OK;Zޣo.fMp}JtqZ B8֎vhhѻǕ`uXagoUAitLۣl*,Z8 Wg'C!'jѝ}zB3?W{!J+c9ـ3|OOVVq#TjԩG~GNchF[ Ubf_XCo -k?D_Gxel5ںpR68)1tMDB uX(4I G<(EXa d kGμ NB+R_˛1 2Y4b ܸLwG (΁󭼳VT,/B[ *h3MA%)6Qb潜hC[:# ;r.;rެw|WG-">tSހb/x;;?;-zvuc!%2|}LWJSo{+ +ʢ2St_,Qd+BUﰠRǿKlp5Gu\_ zrqڮjG#@7[=(E~jӆV~ 4y–cR$FNvagJq.eK7`ԨP:9\d(%U{ ߮|?/v#; R3byT(xZ43bΓӠj AAVfEUHM@ Pa WҢ5%e9XκAn2i4df4W[d5/SJ Dn1>,0c mG᭤Z[\r8(H.ҏ)҂k.μQx%RKE5{vJڼvKO:Gp45K[`, Y}=7OYTKZҸ@ /̣3<ۃ,d()xN DBh'8)n 969""(ۣw!(rʱGP3*u=O'""sӡNXx#Մ8`LM KOӎklGs8ovіwN[)zI%o !ON 1lBj!ÈBvx]678"T]9yEN5Pڞ1N|F 4-w%M|fN1hTMt`,hI]N3X䦳XCa]Xb`Ĺduq0@/J_} SDw̗uXin { 1i)\#H d(~翪=F}kwfyt~wqYS~cm,8yE=GA>Or<1}O]B6C3;+^: |F~DlzMequq=#ӗN-eY ELY:uKUpBX8J~lE(Q={s6БBV'U9kN[SCF)(mWzJnj8>w!79`@ZVTN"Q9dWɣs!<;ZY0&."nLu þ |*г4GL)ACIuPp*<# <u4ʃՍA`b,@ޚ@t r{Ξ'\F-uo)Ψ^k QcR0};b)"i)PA)Is|qvм-Ω+@ujPsn | n--Z~t-S2xS%C T; K_ ^K^b^c2``O{"V^DIr.('vMm~o1#i t㛪Nuu/mK6DV~6I _N(ҍSmH\D)I6EK=JUQq!Q.EcE,ׇM.E18)9k׹^㇔b&!A 0Sb[U Z3mo,.'X%n~Dg܈gHe`) yK-k3}*\])Ni UPlUʬgI Zүu%ʹE(Be\ 2 uJ%hyӣ(D `ĖXXqX0˰AvOq"Mh9 t ZR'2 b|wcbm ooYwapauCwwUSjIbDrP,G [lpT6^h1-uż*AǙB)T^{&:tƒ a|: rq+0>T|'}(-.fx䊃.yV :&ĕ5j-K'V(kYY)[{6+҈YjM|gR*MKiT'{n}` =KDa;5>t0e2X)c$8q\f"2yK.#'eYʘ\=05Af+𺼨w?jP.F M-0bY"uh@}YU۝]`mO>md;@&R+9 du̅dŢ4w?F|#"5ʞjןOj/s3kEu:udj!$SY\'?)__|)+!P Dr@R{`'_RN) ,u"ZL& J1]sT/Dmyn{+{ /{b$&أn5Fy,KN&D}A:v8gC7!}vX$!"Bu5'LC:"$Yy陫Qlʖ%p$Ial:F~R;%Sb+Qڞq-ݧkՒX&,(`lX*'ZD7 횟ݮ]KE)k~]C要pt n43W->p(@'=394:AP}#h&ZMsvP7 #Ynb%Wwv Y2_u>XqH5F- Z,|k [Է<^籎rDv6]I~֊f<}.ViݺPtds>ٖ1W*EE;6 fnMթk*"\_iZ}cNzvA[cQZc=Vm.hn>E\[ۯ_N.{T{ꟼ}Һe;Z6~|J?ھƁ'Wkq嘦7vo4w)}38as~CZ #O, ]w<ھz.nHAIc}[wb7A kjV..?]t52.jS#d?:Lk]{\[qWxF-U^ P!)!HfԔߊM- lT+Q5nsF,,f]լ0]㶠/N AfYg<0 @̩=+V-劭U_͢^+;#(t,T`'a̾j*=?3*b]wl{KB3bePLoMS3[cs* 1X)5DqI;̦.OSU?^RR*KR,n8>2g;3JTNT݅tiU2׍QT/t-/f,{{4nylKY6KNhKY/|c\^rmX|y)"8KK;^^^Ϲ혊8r0^^J~^RƳ3-/EG/ $~dB贁d/X;&zK)d/sy͓ ^^z Qr:ם,iz"cjNu!OE9\xjWjͤnE_q˖ΐln4s{҉7߲(2#r^66gS%+Te!GS,PΤ*e1MZnN%n E9䕎&e"v4VW@e)w7gT4;IѕzSϨ8I7V8wЋQ[_DWvD+:'U%8T ePsvNSj}S·IDէSFʮ!;Tʹ11r5p}Uqk5)[oT婴E*cRLR;`K=0QZ_.*JΤ+l+ĕOau\+k ǯdXj d̞{%c P, +*0,KXɈ3d[Ɉ {+k엌JFtT̪{~CL.RW2֨ϴD丕 3|/EML]p*cR_JK\cf vJ=󒛜>`4`*gVT&94K=cd9gs,uOKپ5ҭsd}[G_}fL] KQo}~v_sh_0l,Pmx˙JUaXJ0_ %F!kɞ+h7Ev(QR6H 4%EL ˈGKYبOy- 1G#.hĸ:C.l1*Dn’*ply7oa~f_~[RQ*ޞ̜XTm8`n1Jb*%MDQ- H5s=HQb<,K HWa 1HO\J;tc9Zg2t|޾\ i~3xٲ63'zY+_9" BK<3gvsI*ߙJQo J1٠;Ǧ=6}ٸ~&OM SY8f&'j[X51k`ab@< 78WNNmrtt- ^H@j 9䲓NQd`VrWU% "KDW/Ե@8+pV")*4+R9W8+pV tVJ鈥J6`"Xˮt 3v1-.,p{Dl2d&diuXx&'q<<>0x7dt7ްٸw۟LO3;}52Fx6 N妽~9i^ް7 ;ND!|r߻e~Pc-(a#(;폆yc7wC5'JγјSl˜1& 0w4'߲=D ~S& /J}䀕rUnv>#K?<P8oNho!WR?w>bKQ͎[.ʭNzuVny2ѣY(#wPzۛvIȃrp_{7Wn@SŐ>d+Yc4&=W}V<Gϯɫ5Q 7Ѹ_vXГ߁o2 ėl6eA;@k=R0dGlJ+>1M lҿygd!HP<{<{sAO]L~g,}'g)) >>O1@9aQС١QHn±@AX^h4V&̟*gGuTMG'r'46 2· m )wop5Q#;r@@NQhh04OА{ѐJ "^Pf(tQ;x5 Vw6\; C5wqTh; ƣiB/l0JLQ97z!˵H䲕` N;l\Q|(tchW4Ahp>h?B;V _{X݄}596UT` Ej\5I n(8VSc򇜗o*ƮNvm2hTZDbf>F ;y<`VS{ʪKS 7w:O~ ?|9}KEvarEĥu,!G/M/xBs4|O#r%s$ jQwU"oH7]'z=LՃFn~[4Lne Q+fB==rI@d b!޸hz$< +201Ϭ7&qN&ޭ)7d&A"hl>" r:&țn]$Ǔ)7 LB+-pz1ΩzI3sTOu?*gcGTTߛҳCyaQ h?)Q({>7K t܌-z0}-z5e"vԄ Փ/cQU`kELiS˷&.ݔ%fU\u[a"ka̠cW";;<;}*2 ,utMQ^7u7i+ wB\o&P:f]wXeC)A1vz A-1e \ĂqOט쭅_AQŢ2iorySn\[e0G@r #TsYXRaFE+JkbYyv[]ݖ2M(p BfJB@{v~B2.ZC޷N/:[NXwPlxfGkzR(~ o> o篝]yqʋ-,C*x[f8xG$ޝJdfFց0Inp ?9M"".b!m}f#+S }ӈO/ӗgw2@o:w[+$//?Z)Pqvq#ᆉKrlzsV9 $T]`?>/CǗ\ӂckT7d[MGm8dPd#3ש# B:D,k\8co+"'CZbQwvT%v n/[28|On H' u7l_%gR9R7۞?aQMnOrh}͆3pVڔo!>é5ҷ` 'x~(}ϣѭ:r̋?/ώ1?yv?!rߍ7l$p.|-U1";>)g3Ηt?"@7&4=0nB"]"Cǡ Y̿Fv9gsԻt帽UcAdYȮ3U*Wm OCAR8' $1=o#l >ί5^vU{V:o/fkkG`Zf;/O)Z5M,\gSl:Q3@}`֬(ı!UGY}j )\n ɛgv[#2Kd9neue"dzT=y%3>&JazgOW|`D: ⩵*am7|_TO'A`N'#1l!_N}=vXȭtpFZY);(f$זj>Kl'mj147r5\rSmvd3ԮffЮ ҮQP6*+՝G<%zǸ;'wfs1F+D biTahi?V[ڵwxq2Hc]?k5篌Y=o\}ȟk5ȟ z1?vEh(x1#}a)ca?2|8, S+'5S^|O^#՞7bF@7G_ S.6t6S UMʀ#m4wDu܎eS&ȴL? prxQ hԦ%x$G?`=FIYGXڀhQA8ZGx, 8LpTo8z#_?~ , sAQ&hbHQl)Thi[c46ZEN2`arH4} zPFLSA8(H4oij[Wxqi7ޭ^V7is3˴9#<y)דGb\l _+lG@_*fēJ@;v9 ;neAA\ cl:Ag;h dr#j٥9u`ht6  4if-u&LajK3er#%CS t{mg11s漾sgsAmdKg ca 9o :ƪ=h(E|a!sÖt.-/vs;/8+ i}X)+#3[ #PFBe浸-\ z^9CrC^ITr'8 q=JkOFq RG4(+ʥs//7QEpMD^)Ƿ?<ŝ s˿]eV?vKVXɋ qZ˱|Bn١ " u:D #`A}q51!qx=:݌pCR7LBZnިfƭ`f.찿U%ʂS|9gܡRf&*-h?;A Z PsVA*VCEb54Zp ẽu,}%؂MAV71)^= %\8i=6cg͞3%Rˊ Kx>aL ւ5UT[(<%&kA WiidobJk $׶ŭ"жCd#˔.}>lҿZ!m~-oޤ>&} pS,#H`Șgv1 caWtY'knUFTbcc,iALf@u۷XP.nlrWXA(5r$&bE+ .%&HRER.K'lcwH/U*x0ew1B.D$E4SA6r9@S_$0LpaʁQJ} S6ԁ yrĎ*%dm<>G$Ci@Hc]bTk4xh6-.eq26o)i8pR]p.>`=5魥D|F2Y゛?Ww0!R~pkoFbeoO((sU|Ӑ?8Kw%ib>ΈKg|hj觎2B>̐B>t>qȇd!Z`IxϵxV{ +{A!됏uȇXih8@d wXc,/yC=hxAFP3#ԣ1g4ql: y8FBǙ0'ނg9"G䀲['qfj R؎Esz+g.)c;#. "ʩ: 0P cQ Pri9\jC:5&b5/JuohZ`D {1 RŠWdG=,o]գpq1Q1,?'7<—Z7ȳw|QstJmƪym ?uq _vrio8_2a0A_y:d^\kp^*F9dֿU$ox7n{>c=ѐ=0+ G`LQQD> ʼnmwX-D2X<\?a& A $|ؚo k ^N1rr`ĮA'=fe9w7=9fW[yE,W,` V|i'wEPD/ypw5H=#r1V# HhDU+T ܖKoމB-a.0޵9Ps59JV[U+ >u3.M%{v: F4^ҝaxW5Ēw%} + /m/z)E~IدMΖ-h*)Jgl=oE4YrxNR9]iE08ޏa --Dr~[l<0hP"55.!lsVZ9;`7Gr܃m8TkbKoЗd-5ൗF]M''T xxqCͷ l)IQӺ:Ҍ6$ьKFvDCʉPhޝ9xEՑ a:#E\VcqYVOs?oV:4c1C+iTf ?WW/i &1]ZJzx!/%OAɋ'2eq{BUTԲMg}{y\r18:9:[7>(47V,1UQ+6= o C ] q<@YIEЅڟP%t&)Wxܑ_I\qrI5K7JP sI}&O;S/^#H/5v<5ZvB.A\@>9M1of&ЛZ"6]/srT ƙcqŲ;c,c A`l/MQ<&Bi۞rc]'&hA9l/ 'z tw"㤆cކBxRa\5(Q—$T~" Vk$QQ ` uy/ MH@q%;@1-fO3]>4*VwAd2ՠ1mn^K^ꘅ0>]'P$艂g yi,|c QuSB4q%_XXE:3Db%)i%?bNP0xZu_-(~ϐV"|1xcW(tuP wCE&s[LU\RŘQYCa٦,J,TC`LXIbCӾCw5_Wuk3<5=U< Zuúa]fXɵLfMpۓ.rF29ŕ+eZђ&F`v{&PGk~ ׫jfW3fdB`bMU"`tG9g-tD#A1uE/Fb,Ey"MK9ⳑ#(=BT|w* 6JOܻ1y۸EǼp8a}&ޯ\Z!*=Ťjrx/SM;(vhN*)SXa՛5 Qt-1DR01N{eo4֡QQ1P5vq1@s4IqT~UgCnLFvrۏ6V^-8ƅ;8܈TP]*9^}ᛐhunK Jo}w^ÿC\k5א^Ck{ y!{Q7@xDh9[P7R9GpAJoCCz`C\ln+U_!opPzWݚH-6Bk/"R )kS D/hwhiU3uP/z;b? $=)+:أ@, a$<:񶂯b8/YJCdN2xS#v~T9 "O};sNGwyӡ[^]WdݠPVEm͟soexIGb&A;Ұ,=#;)anӷs2v~?Q|%B\]ݟ9KvΒY {=_KkAMWRҕt%o!0iffo&0v]s75o'e6w+$rU鐡R) kM){v=sO|*ǜ{ޯZ=%^wT(Za\a92羢j)+Q5/=5OKays0/5h뵆` un't @(t(^K5?sq6p|m|-sV MUnh0k,h^+^P&/ L㟵Z[(Bs9eжϺ T kSJS;TP|}, psw=:E8q]YY!/l%`d0z `I7$G?mr2K(evP^c/8 w01~k #H1ɔtbbPF )z3wtQ+1ʱus4@SI?! q_pSNpUv|uX͈cBkr4'9u_ix_ѵ,Hͥ!ͦ옋;&lt-? iv4iZ unYPz=ǽOt Tgwc&J.keQ &tY̗,{FeqȲt3v24c>i3j9#`e"RmXX-'/o{Mx919*_ zrņ,߅ۨUP$7,z8Cy\p(Ơ3HJH2z9C -. !ᩡgűg=:afĎr޽quzX_Jζ:f+$9dDZٷ g+cNEHN 7LZjn2M*f۵FͶh˖Ig4iXPEX)ʶo ih|J [ep1Xj?±1Rۺbo"T7\DSc lc-ٔ> LoR9_vy{V:k/f{\sF|u| AXW%j?娭_/%7Fh2;Uw Ǯ:_nX ĺ;<+>EZkk9}m; 1ÂḀ+%*=Mu!qӛRM& hC~[Ca/Nj.aM{|vD .Jǣ>\ΞD{ד[bOk#Pot I݌\X|{>=,U4a5l+qZxfBYGgW Dx`WC  le,=PD`l}b{Ȧ )c o*j`k$}⡖(SÙ̯XNm۳E==LM7ōtɃ=EäCIl7g://P:mx1t7آnޜëtIw1ëI^mkz!liM!'’^aGkHNwbQTI4-f׊Lfg)P 3#<Nt #&̐`,qJGS6?L?'#=$ ܿy=/..sz}?8\e7t T8<C;0Ic;9概O%DM@VQU02>q<݈Νg{@,ePk^Squ\Vt vrԸ*41ki9#pan[h鰫 |T~M'x _%!O=xlTx&klqAg1jCt+`#,TuckǃhYuٷ/RA_$94VtҟC+ :kJP0݁@KOxTCPõvyy-ӼV1,+#|__usI{{CAg^/Lm㟵gC0Ls(?<4õXtJC-ʟ/ke/v? AK|Yz[[%݈ev + ~(1pIGʆm]&^Ghb {}aDu ͝!P>07)(' e+y cIIzӎbigW0`٧~&9$J1Bk!'(cDW{ FwwAIFQQpP$fSZt oy Y+A('?@mbgzuϧW|0vXf)qo:>݈Ǩw!jCyc ٺ 'T,ʾG4u$2+$2 HF _ "9>zw<_yd8l-Rm5#tg>̛`ʼn܇J\|xt8_lЮ>x$]H=wV<.EXy:+v \ OPp\{4u`h&edfN3z͊J2 3yMRn_@3YCM8P'Vӆ+ ]D0ʱo$#oO)*Z p)E8Qx ;r&,d~?”iP%\4Or!zh:=I0^chF9S#tŽKɍzɕ|E]vE zj#*?I%ޱ oLii=%Pc:Yǻ>ݳݩTrEš2,IVlṆ(*\g˓"/$PINJEd2e[͊Kx59J>yPV!V& ?>pAQPq`KN4,&"HD>DYsr"rr1~\E)N8|̠1K|\Lk0^HTyb2 >g//:bĚ- 3b34=UivMFʲBg K7E "U@sw|+'gYSzMB]ŸzȄeq n{qQC+}uFsadX@ rz߻H+_sg_ͧce"Ǻ.WysE_`̴7i~2W꙯tCfߦ22df#)vŪ?0G~Qj *.yt_::J[`lY?. 'QzWuMu=id{nP`Nso;Vї(3xsi3%hM9p#O{yXd~T<_i}ǪÙȝ:ǥ}I]"q?TB=`}'2@OX}G|M€,V(LĆ tr eTԤկE8J^K]T%3 $-sUh]*99\ LPXiMޅ7<ؚy8CCW@ai! nT]yi$(AP!' F)z[bk>tN]\Us Е?72w&7`\ r*$)9̃hX_> 8: wm!K1Q̛_{* /daQWvguPE ܟ4 s ~BlWzzGFQ(:8AqGZ%1rTԤXί ~J&P&V, I Q-^3HP)4Z_Oo?"[Y"vƑ:X\F:|Gs<(sof#Kȿ-dM'yik86LԃWp~4|}ci F~_n"8y0Iw>ڲ^n %ɅY;6 CPnŵ#SO/#I 'uu9k쭤[*u^`ff&Q8i/CҜ]rf79A<.W9qNTg?'sO|s2,g[.p5sgNm <+<_I-PuE8NI@P#U('Tu8Y}ҵ7rou>k;V&.HsWMef"(\..I*AP)+]2:^'r'y2O#L=`22yG|N&9g%|9~a9,?1')ܭm3U@\w4dS!%?U;b"W,RRҊn슥>}r7aŲLO>v*ׁRvt#2 ܹdJp+j=Jr\ EYDdV#G4ثc%&Z 5+Un6ri\ĤT!IԢ]v":\-/[xDUm-b]fH3biqsp4HBe5gI ^(Ą0 4l](in֦3 K IZ5,,#:F#dIH4M4YӸ┕b-X5bêLi"]V1o4Ēe9i#]p].љ }04x͝"iioCj&~6Vsj<},+Ib{ŝpQ=?OYf 5!Kz0q?aqǻq&Mwd:Oqx52Fx6#-Iqw.f@YY7Xw" y{0~Pc-(a#(.ko<̇jD!Og1u؄1=bMC[D[XZvB[ w7E)wނ$r#{_nh8_{_{CϚ8jUBr~V|Ė;ͣvX][zbWQdD1<F޴LB|[vڃn]p$(; ?Ta+Yc4sfW}V<Gϯɫ5B݀ ݇`:ATm0+_a/kIKb.+c § %C)L~<<7UMG{u 圍Ol !ћwp(=02쮋˖iJbaUGMB@W8W KI\iuxie52S2WUY"νĞu莼'D݀դ-B HA&oy%Kܒ|yR8eҗ͂ҠtL&Y2qw| hNqbSVFiY s,hjjpRegF4ZN,ez N ~42y'44l 40/CӼMtLgc$,0nE|f93|jV6+[^VW't@&Kt3ِEZ hlEn=ķCR8-~ w \aG1}MwWa+XTIo@f7O`GHOJkϥ.z?P`Vu;L{NQ8dM x gt8ՂI -gh8+QT8АmfÌnjEar?,eUxX~6hc+qݴ lڝ-ms 0'`dfԯr_s*'Ήo7Lr٠CG\` %7C܃Fc{6vm̶-~S-ESFKP܁Zy Rtf`q490ޟ>Z*4A}t௏rDơH* AM+/t5; Y4[[%F]qC1K Xs0Lǣg}|>~(ut|:jVªb";.ro1([Z">-dސl$\—kF3`ާq r<g0I||,2T*{;|O/V+Q1#c;ֹ04AJ7#|Ы=E#GPP[yV;A:]蠟ݛe8V!9tgWj L 8A[?L$\1Nb$x r|{M&}|TDbN=+59% aMj0]W6FmBB2I Vn@h&!iEf ,c#xCcl6_nFJOɾ6bۤiQ!N&I* :`> 9>ߓI3m( ]pRmMe!UݯC%ɱbuuTo`OM>q'O9$_OktfRQ ;1%O*5z5^\ f'S'N?m#C(چn+{\p!&AHC|4n38.#-e))S#A%d74lkB;/N<7 S)4 p-Kn4uSNºE E95SȁH'j0z2:F3Iĺ}quahv'tӶ` L)Rk/OBҢf/4B1%A&h/txr8e~j,EPG@9=K{8V_JV_ŋK_%>>>>XuxS*1gh.wǟjp-Jsзs|tgotZ m `x\e#:o'E7c5qu31Hy{ byy7TO-І,"p縢KHKn -"۔+; ;cP~H]RSx`ioy!%kUG?6 a&̼6 $63!?łnZ!+}$q@6T8$ 61~\QhJ~)"Q96hzm>|yZTw|; ǎEnzF,8 {Hh0fM_^Yqk-̾A4sh!WIw(4GjI@Kzs$ji֔5Ra6-ҺjA-hѠwg(QYidUJIm9HBMϫ2yyOa&z zͣ<ڼr:ѫ|EsںTP.G t0i:9%hin!it/7ZSznTZT4g7UM"S7Mj!4(M/֡]| gwu׸[&@1Gd-^6ko)#-PON @HItKކ<΂%Pɉg7YT^5Z6[kjg[׎wӃ{vI@I 7?8N;$mcQ*|㜵Lc`:Or!7OrDI_+>Z<].9oOj6===]EВ{ۋ&<= +y &yBx=._9z-6  g9}^Qנ踶6L@)GQ/G Ah@=.QkP?i`^4ao˭rs ֈ@Pp%TTnx4( 5R_<G]ƻ`061]af&BVRHRު|?Ԑ=xi8&P[CE,J?SXLahp3$0J76b!FmG zww>0G^(>2vf}鉨ӳ <<<;}*2T шL`ࡤgOc )ŬۊV-mݼr|X:@lփQm55M$jţFF|뢛 l jwG驃VٻjWа|Woÿ`V\Ck| !5dא2_:h=;?! W{ *~%e@l[=7Z#CSEGP.Gb,%r Ɨ0SEHI9):*I>Oܗ)uُk٪dߝ}#P-遒@K}쥙 x&A^ȡG<偖@<5.~^az(K3y2LAW׺^)_k)_˔u^|xZ__õ?kIZR+/a &""\ZCPs,v Ӻh%Ѿh&h&&hF&hf&h&h&h&haoĢiEY"Le:w}E7}@qDCɹX”%jln56[oؠ-:/NqONE_f#.Eo66N[\3˵jTjW.5Li~ww~e&y݈bUr4xcHKiӬ%/}ߟ _Re3iIIZ҇/?̈́uvױ]DlŸH`ttWI&~wn,Jf|"d&Sm)WZo7RʈRrL/-f}%>+KFJvc)޳eHpVgL@_("ۍrۍI{1,.k̬fJ`)챴n/oszejue_JJn&=T4kvH,BZYnDwE3/E30IF31I6F32IVF33IvF34IF35IF36IF371cgF'LzQB(e~, .++*Y_k/.}e%:r̳vut-KxӸԸS ]HʁY|F[oF$oRעck1_#6N6H c7aU۪X_m/2ɋk-4?ArrM%c[ R0n4ݰ2TP RWIg$kq?$̽;BS+M+MH})iw)[MFיe𲿄ehV/*Gޣhv'!|;z $t3άHe2N0dÑj)j$[#_$%_ɿ%_ /H?+E?gG߈;_q$}J! ya2WUQtQЖm>8ܷy7}ß&M|4M\ 6ܖCشMOj tׯ (*\bp.%钱 +&q%ɉ #ykH-Q_k#J= _O'AZ fp{_Ꜫ-؀| X"g 69%*yfJiV Ve*e*+o)o r1 e} 2ޔa1+il"*T<).uCO[/j%1`)" rQoU'a˚ƒX]'.97cP]^4JT( 4PM!ΫV <3$L%}Lo~HzM<=)zZKӚ5ZJ==֒aI, 1'NOSV$,5UOϭVD֢S+i'd94F3C2Lߌ&/OYͤF!r).Jhc> =hW3Jg aW3 ć6v袇~'q=ܺx0kw0# 5DBC ]Chؕ, NGM K>A5.o ,F&dr7PM'% Y^s1Юwf[P  z-+l InգpO/v:Zq^;Oh7&Vn\+ɳz|,wvJ (鵢B[ws?#5Jƃ0Nz9 _\ð?ֻѢN| Rf9)w@yѮ(et>SCQEgK7w"Dꃻ|Gi6~5!ePoksV#?s+TOxUVʼn״)ӺȖ¦uz~͂7lXU5Þ;eDg8 Dc~gZrXnA!Mk՛zh>D F}.,c*|ti*4 #%P0t7$$$ e,L"]MV0mXl9^c\Q;᩠7Sf_R1%7cKE4/8k%U$0;RJ8yB&~j.or)C` ch&mRƿVs :jy{@~CD!N:y$'$= 116w;prn+JH4)lB/' lE^*,X /2O8P~(+~$HH2U¨߼:\n-!p|GO1߃ 6@^U y~_"eKȅ*Q`C 9uS :nC`u~ z'VAjP,팴rV̱Ĩ,&P" oLCPw tN&5c:Wy8z=ͯ:ɯ/(7|*tToZ 4"6e_-fxKR./!ىĆ>ube۝Yw(EUז@n8W{/Y H)ZDIZ0Ӫ&L^\+6YM3h,-'thrOilW/-ZL;%QQvR;$Y#]Y(WiHnac &A%3iVK[c<ßn`q{7׬JStݷ/_x. ˽mѡ7ݚU=BC#g -c== ^\ֽPK(NFͻ)MлHW"K}s`j.Gim;V1uT ?zSHWԒ]*Kdj*UgI9q-1yS#6Fkj|zW4'jf1kOTy=잨:*9ʺ\ dQw̿+z=y*^\USk]U;[%wj(,O^@n~'v1%Pk(5R3Tv:[ lI?{x$xeWK KOQ g*wZ1+i-o屖Z[d}ҡ/$/՗  J*;r$-屺 EJ[75ʃ(ύi;S]bdɉ&x˛~pdBBjE)J*޴j%1kxr2CY?_v |A!#br`5 KtB nw)H&dE*BVQZI)dJUt!érd,O> 1I6,O#KM(Oe cpV>5a 8j 0 t!m07Gl;7#NŖl{aI{ȳme~^?S=%)/Ky ^B%x %/G;m_ğ]d>w?7k\*?Cd?t1CtHN]tdiJ\]# 7ƶe) .!ze9]r$%K!z97ϐ*QC`&Ь`leyu9>._+]rmu9 I+OKԺum!ĝ/o /JZ?,MMtKp)4]l.oN T.y%on=qR vbNFom9SQ?ݯ'5v'r_;;fkgc:A)i_nT]>]`k4B} U7uI ;DhnkwIz2ٝ~MWXXEx=MWKlm=4乔N[T R9vy1J<w4Szo$f?ZO-qُLPCAmVG)R=uQj9|ŧвV<[sFuj9iF5AeiAsW%ucL7qt զR3-S~m~DYL;&ԷuF`/6b;-|iqrq΍Fgrzm[t`lۼDӒNk)or;Y'c-SJ}BxE„ʼn3J1,ǵF6$V3\tRӟm.9.Sj&YZLON(S3J>Ŭ֚k%[z۲fl0.~3皻qe]e6BPY0_ڦŸGe;Bb<ÔuwsER,#!RWq3V"K+XC;-q7}0-q7[0#WWaVSG3&-fi_FpF7,奄3?So izDh^#챉&V&VcZuܟф9G%FI+Fzf0{I4&F^d5wm v݄1?ֆyiӚ&ԿZ{ϾmZRJ+^)~ֵWl}^6V+I$Rbbz%:xY 2(acf83֙5HA:ĩOf#k$ }VJNdZ):Ѹ/(Gv/b`;r vV὎_JswcVY&n%O*a=ꙧB a$#"+lH(;/ (YBZH|ͷvOsaDo9D"ʙ0XCI 2wɬqmWÀpCLHI[PŽGPvׇko<̇jD!Og1u؄1=bMtahN e!}?zPj(?O=6f(ҳ[Vn~d˭Vޏ/8C>?f4Zշ\;%Nf-VfV^:+U}TQ(#wPzۛvIȃrp_{7Wn@SŐ>d+Yc4&=W}V<Gϯɫ5†|ҿ`_x_ҿ`X# t^ DMEbO_?_JZk偯ӗ}݇>&IW}IKDՋHҡِF x)1O2A~X|4G߾AYAYHs$l72:j5;Ictc]о޾)kX"_&87TTeHLH{)ZK{U'J{Uߧ/Y]駒䷆$s[ے>BGII~oJr-D+$ujƲxmH&z2ao%Ⱦ$Ehc"锯1U m䦋qƹDln3[FCkX~}SjAb\jEkL򦮉p=’rlsgEҥ!mn{+G&ոqj.ܚjE)}y:0KG>mGՀpD2=Y9wuޏ_&ݛ^8ףCJMR%ZGQ8´o2 ;<00I!~y4Tn&Z!uXw`ppDžR&Ls[j0mkЃ^c Tͭӭ&f+h-_^I $ڧn0:[6A yӪW`P Nuz7CjZdxIoB:sU{JZG?aP\Yͳw3>B,'Js/S&&鈰~(#T-,(4d"dR>Bx°Э_AQŢ2obȒ~ޔ;S0'o<a8ܩPZ/Tc`Y(Hfo@1r+h#vae2W۹ ?9*?wrXVLf=y[ /F(# -g'v<#u<; Ч%6~m׎|JC)qMc/=)ѓ=)hßz n(dz Iۘ@>Wvtng-<߭S<2\rw3v? z g/!r֧p:~M&}Hn4G wr%(w޸\ Q<,GO^& F[nh𖧥(3_}YI{FyZ6m 8R\?U*G%)/Ky ^B%x %/7 2Dוp+xxz絧~(SFδ$<ŇmDxZ7c:wtsJB0EL/W,xB}И\Th(4"@\](wwq S1tR0buG:l ġf FO шF4bPLɳ{ d27z] #E(Xg '!: zs<<>yh&o%}HjGM͕EBq$GG,5b}e UotT'uYgת=QMZ- |ٌM x sٚ~4Z$bPlD5xj2(z3l*8rhɾ`bu,*qu̒HO"hf3u<~q ' _mn|jXPwH4 !G2J|w i ^ n SeNɐSvJKҪedN4 VFNiղSd' )N[Kr N* * h߹蘳fڒ#V&9AЌJ`vȂ<">WCy~nl+8n~g>Iܙhosh2F^N+ZӨW >ݦX]l_7_ol"VɖT<~9ǚ]J|DˏA")!s!寀T< NDsPddWi(%Z2 lvGqrӹVhk=H.JQ|úcާjtn/F.;  !}Dnx^GlgQ|ǍfvyPӓv+zKA4bwX4%=GɪD)["do)΅:׿66[NWpLe"VQm i^K:K)^d69^tco0{L.Ԉ]X&+:P҉W[E\łK,E\2łkFqWGEELz7LrCY\ҾyV1Zb!qwzmˀ|syƫ3Kӄ&N%(]ENLPs0n+oYs+zvS7!nYvXvu4_U]JrzF_= gaQkk+mKZ4%oӋyN)Wt7Džq,mřkff|@ݳUϹʃ$DQ)vz^RI\L*e3`F2hz?R4KhD4hڑsfStb%{^l4+Jqz-T!mU8, vr|$g.?z7͞]`ghip"?= ]Rb\??V,Ͻs/&UuZf5Oo5vi6c2BYO kO :sz|  ]*#o>gA͸wd†T F^$O:0,U7KƶB<az6Iވ*8$;P@UptS)Gqh. ujH(1!.ᤱ$ļ.~ι oceYՁ1X[RM@ D nmΨ&&Zj!P$BF'2|IFq]F ~VN5m`-(daq!lZiN5 F檗ꄃq4W2QN@wvY|85(zN(ƲX XʞL9ƅ# 6kIJٞg82Ʋ@X_ D`}2ex ï:d؆_BE2*5>dlV@0L).uCO[/j%XgUj8*ivt2aYX29x*Ӣ2#;\-ݙ%GDAhCW5Fcj*|5j#)G~HzM<=)zZKӚ5ZJ==֒aI, 1'NOSV$,5UOϭVD֢S8PN$^6m$8/o66݁Q`FkPgAVQ+yJBoX`ItB܊&%ǠDmK7l7xS{IB\y'ނJ`lq]a3h_h!>ƱcwYu%9ftUr[4*Mu6tČ <鐖xno {"ּ xIHg1puɳGY9,cGBh]zhj*/{Illz"Y~4|4[[A$NGQx}*\(+ CeUPY<.F*/B*C qCp/$0<CI0DLqѹ  l)Ag4Yx[|#MԔiJyٸ8MhMSA/o)|^Z佼/&~?jwo E!D+3\wVX`i \rYp@.!yý0H;'n3<Ӷa{F }_+Tx|WFd qo68aCίl0_clנ_S4l4sHMDG8 eWޕ0n58vH" =QzNebe '0)\np]CIb)6D/=Ng@|}wi[gKyXd<_dM?E>&vHM8i QcF)տgG."'x*VrhT$!w7ހ[ {ͳGjrZ ,/gW6?Xŕ{jn5A%^*'jЇ}~` 4l"A9]p_<ЊR`%}a>S7o{[w !?9j_GS :NѴ2S Px~6%9@׭z(!B ~dr+>K OC%v&HfGޱ{e9uLO٩dzyZ.G V]7PoD,kؙ1SvQۼ6q]!4ڙg~ө8g`߷?xq97:S\ @'~s .q8?- g"ZGEtպf6݌&Qˠ"֊${ʛMƌwa<L&Y$FN=w:gI2c4vTfVE4/ذ2L` Q`sJT<ݠ2|fh·s]xB"s 0%V˗4QVj<^" L)nxq~& ,8 %#61Dn_@k*PŻ 8PW {S<\IdGy<5rr?e}Og ~jR@>(`G(ML ع<<_3G|~#SB#~t?z?zUst9a{hY3s(gaJ҇fC*}hGNRNECTikԵS5fQ\q<- T|"JVpMOf|FAc=G5> };h5u{vGFGB]&Չ(iUT(Clm̍Kx$8ϲwǙPOgEUPk ĩ|B\RٷM~ML.nr1D͚T,N&U셮Hz],8;}jlWAX+$/6@\O/_&E+|I&BmSyWˊ>!+^Vw䝹խʸ:Ⴤr7( `kdt6؎mnX#F)i66B y*)edky+t4},.|Hvs i!_p`{N6kD~6C#0׿SsPiCCi~?~i9@ ObGcCKs<`DԒg4ݘ4b_:[t Ca2t`Фil;;p*:v G#, N!$S-[hJx}vaݟɫaǻ ʫ{6휛vNύj'UݮM+05+\"}g3~;`4cvY|i|a|i6fC#ʛ96W!GqR|J'yT독} (Ğ1qs[nG,CӍrR5ZN'fOwܸhN8 mf;z~6֡;.oU-%y!Ve,Uf_. .kV6Tkb1tk,51 ]2^x$Qѝ FCgd)5%>$r.WyAvTg8B Gw9U%8|Hd 6 f4f:w xu"1Õ spoPDMOD-{"K͗JD-n"~74adwװMeS!j VF:~C?p9;TTM+g=۹,U$l8 p6”~2I!2p".%)1+evCǔtfkn: 4+-uuxűŦJ׺Q0y' ֭lB?,k3ĉ!'QT/N\NΤ&zWg%Gl $6LpD ,rsS5VL"1aMlӌB9B:%)(Zi] ZYD"Z;IʶfܑhpիG3:/M5J /iuer%"Z3IM4wAlV\߃jKFs-Eڟkg1'I#^M=DPiг/.Da|NyS;]9[;9XZ %XmK3BhrL>Wb=aڞ9v RiFY0Ď͇ '!嚞zzBQR M9#,4l~\̵9dw=9gp@ApCvs':'AõΖo<\?Du|0qj"qI̹7ةbb7M}=X|Cb=;xqڂ;.NQ1kή/3r}LÛv3mYiǑ-j 9׸Yjbx<,7ѿ{CRD&,"r|b''Ob"9LJ10LS2$̮$Oi0fKkAn(U9do09̪l"Q9[c(jvo7+d6̛4/Hh֧E  ncbe:*Y"-. Ȏķn|L/(w lsW묏H,>iYh1N6X÷b(%7^h:ּZ{I['0^8,?w/x&u<;ZJp{ gk(I ;gdS͐:g[{2sq7\7~j}czs 9"vf 3 ;{b)$NY5e9Ģއ9ZBVϻE?6 }1wpڌ If֧]t|ޖ%hϏK]r.,[]]srZ?:~b z/1 N*'cS)i1&'O;K>;ivN){["-`)z4pZ6Wc$=JYS1P)3xHc pٿ@$@I5ݤ!WH^'_@ ECF$Ֆ??gEh͟*r;nߟqJNf+!IRQD?+^Њ>*D ))Mb9`9J }sUvD9h%+h6j͇"p11{F.izKj+JU^#%S•7dMĕOn/02`SțưQg#b_ʰ9= oe\'W)qS 2Iћ w7wt 9EHphm8@[HXm$d{'GwN09B}Fn ,{QۇnQG6TZ|m,X?*VH`dO9YC= %JFskaF(3#6&h9(r`~ґ0Z'j8L;J%g >g\E])d[N QoK:n5n+W㶸 s 'Jn>&@Np[<U9F"jS prnơ9*-IH@4!դzBZ'=5%"5](Z ْ̩R^P;\X|>)"!D)#}~z@RH+ݹ!krdz!مz.#9[0"9{Kou_B Z&ShwdR2! u2x.~ސ@NvR=/nnb JZ!ToovHU!;C,'VtCp\A )LOρk_*RUu>,Oy৬%P[t /s ~RKy][kr*Il7B^n!~?-Z*E'=_B YI-DﯿV|퉲Ea,LX{!gV|MH;.AP8, &y QO]WyvUH}jTHkjR 5wLDm 9a} T3%a"AVX9;$ބqx- O _n2; b م!!uPYMh_m}[Ů& Kfs"W,mY3{0=и5 2 `F t}2Mo|g d<਍V^U+?sF!2 ^\m#ƌMvS& |ͫCۯuuC Z+Ŷ+2t 'zఓ4Y5{T`w_p6 ͌+R^d e*kJ{o? f}[T oTڿ$;d!:,^Ȇِ)Pz; ^j&8sSo~hmg!dm)CwpzA/H_q,y GpFyku>^OShre]Wʂ v!z$:lB.ҜB. Zm6. .YHlрAdtժ# aܴ^%]@ wX_ kݟ%\Nð*Y7,R!dN"ea+gA!_9[aM#T L|ÖgwU3dfRYǾ`(a;LVJǵ И!q"%hk$]XPUP *5Nȃ0|Tŀ5KJ|7oP=ᚇ/{{rJ0i{f0/֒}LOodmo:ŁNJ}H!&6x$4}m\FFܞj2bߗ#o=aDgn/ǰ4w{+Iquo\o!w<(AĤMfՌ6m7ceJKЗ < i <{{7<+jwj2-ĜT+#b ޒMMAKH&=|2_Ӌ#LBTE=`KDKW tr;^ g0}!.s6PrA )aݝ.3 3f"Ugu)\?R "(In79 I%,CV݂_^ rr50;w6_{4=zbP;amb|"+Plζ|>vnY藮=r_E`_|!|p@~"ylyB*a Jo$kfYP~O,%\)̘_[܋bPZ|oӈ]E,56R7с.nT&Z}8ea fۀfDǧjG IL(PQ+ggV:R=$U雤|ˇџ֒ױ_7;gL|NݞP{ = Yћ}Gwٞݞ끣gD_ì^p6}lқ=n&ddGRSW҇ed+*Bx׀PnNq~p$%u5B288iH@cyΓ:$@_;9fB~- UdD7֒$o?FRDӕ8!>T(QK~@"ˬ ` ?Cޟ-5M&G[@ r{Z\KCJJѽFNEXLIwC>3LEϠ.R7n`oGG~Q$3Ws6-Ϙ$lAPc 5^oD:b+ fNǷ{'>U7Z[=v$֓ $G:qyp44d -;syR3tCP _{Eg>,sQİgZ,et\x#^Z5< -n,0 y:TR4bQ^ʉ]'鍯 |02reKWw=ᬩ𤶛QA+Wjw\lxG/ui "qJhqRzfBO=\$u!7MZ>9QvB,ҏiwr!xua6kPn?"  $r[Ȫijj dp@ 7 4 l-%r}pJ@ؑl^ uu\j1086S s:O n@By8F%ICH# 9}rzGu?/]F&w^,{|7V_ēG{{n:9ﲻycx^m;Uw淭zZMF}YqAQ`펞ѲqE%Jr2jxTk&En͍V)AU _3~R!:(VAǴ}{ߏ+ͣQ,$QU(X#@b1fn=jaKEhrz3nimXg.73nNt?˿{/k瓼xui8୍ķb,o7˛л62oAN} nh IIxM)q Q=Y(cKA-oB! ^W802c}uF-$g׀\'|ۨn HBC7GXym/ڇ\0ǼWIěq X.qJƬzz]uȺd`.0}s!yD(OUc5;[>Q%\>=2\2\Fnq.o[-  td lsN|J##ZY-/>J<ŧRt%xwjȖ%D8x%ף zǠ{PV9R#5?6T,ߢy B  %;Wg߃rhN/BqʋL[$YN_]0Wĺ)- VS-+ ߕFEs~:]Hܕ벴]-|س!Ry.Meb. LXP1xj-WPiov>7߇'[^-vC .zџOBFsy \^W5 SI2YiI\7f7 ^.C&qn.PM;:$lS ][o\I07:C]%& 8Wjn##ꨎC9P0/4q_ED |tG '{OjZ`زq1Ѩ9tgkB;_+Ź!d c "\'G$=?杩hٵHLgFv*|{7Fd±LK$;忄=4jk՗gr5bRq:LYܟdEoy@|N<;Gy(7_vp/;͌k/ը/aVeMd\ޫ0KƷg1aN,p ֟SM&wTds DbbdG0ߒVǿJA2JykI!~/ 22fzse汜RI,p]to o%0QŬݠw@9 c~^H͢`#<d7<\@}grQmLC9*ӃҶfi[cG,44 ^r0o]xCn/T綛ʨam.ÕD^Xio3a(elP;X;2\SO`*XrMPXj26Ļ>Zva`œ\|AF45]OqQnnIS,:  ]y0`:#~g2 C.~E+CK&.[?>! ?U|;?Yg_H7<_ftXVq$@bf9ua3 DJE73 r!Ji3KdmWk} .U&=iTf ɅgT6W]ZRE@ݻRlRkx68\ W;ubxn1I,Q?O-t\W5:RTVxPA7N`5az3"J*XMUmL 1mgvI7n;&n9z͸MsZS*98np{/Oέ8_ALTJ([?5gSV7F~=&zs|ujgvwct?ʐwVlX %1~n˟Q5fN3?Om0fZ_Q>cڶLX:! fR+Hf*磻oʺNjc[2Һ}16-4(ܬH*vwJnifзK=57CoXOv~T3%?|b|7jKx v?>7{mߦcrboVLYf\$5:ˑZZ>u{'$8moON!`(lXuϯ4fݰAIRXm=,l`/TCX\"v|t/J?C;Zf;.tY\w43=)cfϬz=lݿȇdTY<.}Q>Kǥq<6XP9 Es bQbB"hGx%YϓG%uWPUA)}` v|?>x=_0We',;GvzqfJ,gV#ONI%¡p)~t,G:ewuJlg:D|򡸃t*Dih=t1eGW˩;J&$ R²;I1 /Ifڰh mxC?=ֳ-6Zu:xh0xEc#鬁/|2F $6JYgJHh?iÉp+̶H}_mf6}ΜYya\uCi_a3I1Ӑ[6! o)Hݖgs֫2ÓB{ *̡ii7v>z{zR hi4LIA":+e"о ; oMsJ]_ ѐ_Ȱ)sEl,Њ~WԷR}4&7nY3+51!˦j?DVcN"Њgy-_)0yWGϒh msӈMɋcn}>8(5A,!jFfaG9({#:5<.J֔45qy khC;G׊,a&qcB!ҚS."n8VOM%)e[mӠ)g>1(ѫ)[9!s(֦33'$a)E{r2OQfwff "V.>V.cעWV|7p17m!dyZ)2l, Y0Seg.oZS`h77)S.-N9 C J\SDѰ Cè;%PPv?$]kR3!NMT"F7-C9j8eNh-{NEr;Hݕd$T XIj'& C=ިHh^[C4]Ϟo Mm7^,*ao:N}1t.ۯַ٘Nl _omޛФ'TB: ]k1K7J$,}?UrYV6L3~sJhJ@G%߇h)0.0!KIuy)$_<';Wyyr5:t׊e80Q22E# #GP4 _ݎ# W\YYCސ !_1< bhAvʳϪeNA85ԁʉC9J )e:]jSJ.vz^1,7LexEƕyqu:9|Dmm.ijl<% n2PZܲiP9Hm a'^[6'K=I)7}i嵈%нV2?4(jßv'iP?q*8d33j((޾:h[XneXoRd%QjI7lVx'|&e iȚ@2SGM/DГ#X1E{c8NL`& +(5&XSX|pkwT?&0$Yӫ5qwK}5q=h|53gyOyX>ŋy Rnp /]xJzo ,x1p~t ?ҏtG#}r?Rb@ B(F@1#R%, I[5>D0Pц%24m=՜=0&,`T jU%dl `4כY/+_I?x/+EVO)l48VNʧu{UN@yV%.l@d9 #-G/Iu,ѽuC!}}7{h\"X?c#}u.h(.[߳@]Eaٗ$s2:RQYp=yzxR8X3\,J'4ȓBP̜C9K Pm3c)nj̽'J~& Rx xpIFL{#&*̮ir>XYGQlUM;-!?]Ko;;xJr +X1㟎޸qtq]-Ќ xFT\Xg,3O/< F/,4[?"YP`rւ/b:b, Þ!R &F=ecbx#'ؑΆ#qjqn16gC N^&^ AZt0"~' 'znqŒg)J}DTi\7dII.=CiB&P ހ:&m3l$me%NjQ 6PccJdHQ-\ɒ.2 \rKI㭃m8uL륐 w],ˎ|L/E9g)Wk%2d"H5 pKypd^IJZWƶBIsX"I:WlAtgmo>\h<7= 'qhQQTHT7uPg{>a'| ?>x,bE݀/n?BD3Ed ;NE?Lc>^̿kH?9ư!)eHgC%d"[ؼ{,ZAP)kb4K#qKP8h`ѩ}NoB-KϏ7a;u;6c1AՏZϚUDŽf7sA0$dő H]h6pNVFӅ=Q#3h<Ŕp!%eIᔑ> 46`dO =V։!~ilNP]LzSi27#PY1@MTjtjFT,zIa=ҏZ#0+qU:SKDF ˴\]9n.]—b{0 2K 7^&UGY9ܫHhgF{&9O-QϮ1RY2řP;?Gtc܎N^1Dpȗa'5tև\5h;{?cN}Lr4e[4cnB\kVi.5s~qNyѦL MFe;<AIj8kMb\Gf4J k } lafuZ`6N?r|=e}%Q}y`EPJkL~$:qz= O,'}X3.8ظ8/ؖDQmߡiUu_WS pm*],7^ Bq¦VMJpOCnbBmw.ȃr?,]f"2h.39ubFgjgXhr?!`85n8{ڕ(SFq+@[N) ƙ{naz/,)(GfL#E,q n5b/l\VNݜv?<ҝKρƻw>-̝2.AFRK0Kźs0P n9W~ B^$Xf/ \xo\9wQA-QZ^!=0(&o68 ~ o󣗨W dQr;jd<ܥ^^ke#0֑ '[ǣЈ "t W &IWt5arw8]pn>7]ߕ1; ܮ|!ZQ+xgt@Io ZKocWg8bZs'(+_N?W|V)?hxGxp]|E7Ad? "U~rV.:4XvwZ# '%fY}ŨHj['x2.P?_B`NKߥgjPdOR3$)Lnр?Mǣ[h=dB|04?d~o&$葤Z]aM#f 0Q4/&ි%>%j ;L/ [9l5Vl5j~6UTC,˾沯uX6l.TcpL$KO'b8k+-R};1-|#Gp1ˢ*ըդM<@$k@pP0'x1aT6HxJNQMr<|~x{Rm*v/j 5 (*CَnA#Q=Uг0"ոXƷ@s8pDv A+wk-O ki.ݸ_ ɬ]DX93}ILqgNviۓU7gvw9E=P}uۡo$͞`)(OuTY|ƣa6_|~DE#]M.sh e<  6LPs\j?2xHg±u@aejy}DGs8h@e>vt)lCwqu 3Z"'2neH([me/7UGX`rl39oHDIzq2Sv>_?zh:ZnZnp|1mBٮtD%a RG"WۥW+&X8ϰܡ[FJIsot:GI]Jv=Knv2z0QL #<mI@7o/iO$R="J ~u G;wi!Q!$SX=Jo=QQǿCr֢ykV6Y_YIŽf467C! ^s9EBYd+rFLu/j'|;" 󞑙yAf52|\Տ1 322Ge5]Zmf2f7WBJX ƱSZ=5vԹ6%+Ka2䩺(x玂7;Vb "hv" WRxA{"YHL^N~%DQr>%#9L\زV4[7:CCVaʳ ^R ZCo;9fR.QF Av8N:(]](*g 7v\dBqu(:6X-+ޫ Ƴ6 Ē!5P2n:ķ(IQF+gXiLՍ\,I_lSn 9SWn(Wi",D{lNX@}jdwv^ݴ~T|hRh{q8Yz SIȦ{dj Dͧ啙TF0Q[y! DC r ϝ g>j=?>`nyE@,܎,I) 6{j_s67hz (]q& 5w3\!b,Ak<댾~ORc 5YYj)e',KBk#,u9};4?{=,_-فB m g  tFuˬix0Jjg1,KJ=nx\,gw)r:D^W?_?ŋH>RrBn,NX^qvt_/?̴MNn +>Yg9"cȘeٗ2|#} oC==Y$rÓ/JaltB<OlGLt(Ҵþr?˝;ܫOؽ {B19:#.4RX&*F37(hwþ~;Oo%Sr~?)Vp?VϞ[5 [Ô~(5p' :zI5;bh\^IKSʼ xlDA"[ t-KW٦uŅd9l5s$nGOvUmxst-%gK_Wbmvߎ P|1P(Ag).+I,& hvn 2P ^YY/&QOc^CPNp!~<]qs$vPoFuB6t0i[E!FqlN ^wLG~oG؁7´sqKɋ*{~˵U {r蘽

E]弌a8s<2'W˩qXg g>)|H[q`pV@ܑj(6\`6 ͍8۾&oĭ[g<-'x-kB` hR[65wDeEs bY@YI]Cߥ(b3:xFEǽnBs tʛ#EB}{z?r3@9jo[)uE }ި'';Os)^LeolbW;˻];'%0={{>{qsbӳ'÷'!>҇T:>HSԩSr;١oJ4ҵSکqǍkVw婸>X}L\yOEZOt1.y5$SޓO)R#5yCn|?y)Qs:*ݼE>şOw"Az7﬒>jދ` +^q?R#nFzh\W9 ];FNq7L- ⏙^7ɦ!2^/axaT gb^g]ĤcQ~7KBP;A , ؙvA{whfu~[QQ{z9N_b@_ywChֵ{.i4FJ=.߮?t&<A6M"TTNd~89uT4,ܕw1^:FõwaXBSEG$AG7wde[i!qu畤$ Z|:$/_%uaҷ^6-\x'[(Џ|%0~0[ Qo6vqfvz#эEF Bhſi@DpqrllDvVq P?†!P ܯTa105mC0/`}e(MN2bl@dk v>uhatf7ϪjDKΐ1&;!⃈^m eL&n60HlQ̟(kܒ$Ѥ;xJ`YCr| ]d5j _ kl~6NG7><Ҳ:S@eӖdcv-Г-v"ЩtzU~Ռ:zHpxWL["W%[P1>ߘf?5/sU~RcbV=/gB_iF-{e-yshߜvI~=!?#;_U t)d躕ɵ=K~E5Qb*Ln՘NN7l |gL>\]SXܧ|.@xσ?+ñ!\?'OyQ]<ŋ +0A'UZ:-N@B{#Ը7aar de(JOFZ?;b8:$I&טe_c\.˾P$]Q\Yi͆%>b4 lb2!$UF]Y/-stAJsyIaUio 2mk}x*x{Rml4A[qյ^DٽP g^I-Ql?]ף63RZCJ~_]dWjT @t_$-؜S<[=qzDV \g;}I wY}YĘ7"{o P4VRy, ! !5לNAqc# R|؎bk{yδo&6n4ok&f5Ԝ2ڏ\HڀliцFg>qzXx}`NSϽ|VR0Z"'2X m{+{?/*q.ڿ%"g#6?n8I;pvݜ9۬d;T[V.VJɫu6A%a_2@?ZB>}7&+󽰡yǵ5Gzβ5ߍ}Ϸ?Lѷ; с sQt:0yat|`s(o;k-&.bC[ )9-eD@g5lT{0e32av4s/K ZcݦfleH3jy}F3blV4Sv'?TޠTVF4Y5Fc+/=&`r2mbVdk ^~OQapII{nqWI&-4"sG|R_0ܳ!#˚N7 p rB K+W2Q= =#7/؉,-11(Fj51ꯙ2llĺn,J 4I@2ȱ-ÜzHʢeu)'ʊ{x䒍F4Pt ˙}ĖWZ <c,\{M.bYTajԜ|\K#aI|`W:~?+o k+ ,i!`¯fl(~^ŕ,yFEV,Ƒ5w9r'##q3=75EjuNva1n?Qss=cKע0rb9Ku&#wXo.ܲuii''\4Z3yo(w+GO`򞒑?Xv|CFn퍅ٶ:3,rɕI~g[>ݲd??w}4)D%]mw1Γϱ3_⿭-?4~&4XjT~vmXKIY9()&?GyNcmx)N{6t]zn^gI-̣PMwhl"D`u naVr1g4$gBЀ}r ҉Q;":O(-_G[ALG~{u,@2`B _E !#"`p3GV\y`_]j6k.zn]V;*s"t): 1CwSՐ'p,'$Kjp钕7V+ vkZDEPگѰp7Qm~y~ E,>nP.l[wM"I+˰_Zi!n:Fk % RdXB KMqyrw˂r5a}GqagG9-(?K?43 `&}SҗznwP &#}ܰe r4Lpps,.Ѣ5ԝ3Mo^TJ -/I`YZkAMh#`(wםE)h@ǫ]b ߰#f43W1<[ap߹k_*Rn(V!gsx +c:#bBA8Yb`U-?O\ZwR<FjA}NF.^nzȗQ|"G d'w@rZSrHp4dVY{@sʙ! Lfl&LRT@Up" ߆WuaR"sG}oqQA@ 2&zTTJ{&IDK\ Ϛ(DB<.囨"D[g /8РDi_#+(5WN ׺.Я-Ril;PEz>11`%բ$BUR4YىXى}b5-5™7?*Yۆcx<<1(\(Xqm/ *CދCc4!ۏ! rȬXXd.$3Yi&<}py:/<]E ^E,Tȶd<WY( BW EʐenX)`nøC]6kOeiJ>HX=Hf *q4bMޫJ A&1Rz4P<0rd9O#3rXϖ;?xn^-X$ p$ިF^IǣA:S6 )}F/1>0>]5P˞}W*;R fT@:% ~ad 8v>. o5]&o1Cf#Sn-Rina'Mu^`z0]FI!%%&{埏0(di0DLRM`L"ί*VS1X1Fc $ay޼̃/GPTwN*qcPCx6!r"&T`qIvO0p WH(Fvr1:' d|cb/)? nUEs LaU)c_ܛ n;7(3+Mazwwq Kg*B4'~}rw k ̢&30Q0KS㉶O?&szh=]bdM}T/ϿW+j4PS *DLf3otRc (F\f)̿@faZ'[cU-XW}UˀǃBX +)th /ivT+r<4ίFpDӯ `9AǔEAh̒~A>ҋĤ~ɦEQ= q" \5aIݦLbr>nqL HuqzxǛQr\d V|E#]_/{rDH4q,jS6 D[k99Knz~ l+LUQn!.JzųĀR-9( cמb^nTLI^J?e-TG񓊛v7M/z༼ ~ڴ.WkWj "+PJ3d9s 깮Pʾhk,)瀌EgD~åir{K JðhBL^J?\0FNYXQBԧHV EI!׉4 {{5j KC)…fbrk%܃X@=eU#Σ" b!0OQ0I42Ko7$z={زw>- =ܬB0RJW[j1jo ўT&i!հ(ĭbJI.:gJ\Wq76ܝqP*!$rL _6B-?Gˎ-a?!/[ n:y7}n4dfcVgat؅^K+kJ0iHS=ږgGh9cIv<@֍̂xG |"!7dmUJv+˲>g.L8N}ՂcA@ _GߢWfDzy}}0_掌0md+=c'@ZpdC*Ɩpk 0eO4|{'-ڸ&t<o CwBi+Icڤ- G)d?i3|$pp.%ǕLR*yOZ֡a5atpjVRwpvCH.rUlT} VCacp:ȱ`K11KחAB=k/rACkWu!ݐ*_^ū4"sRG4 [luW^k,zM>FI |UYYwC(6fX7&w,b71?d0`Ŗ|&Mhmͮ&f>{E' u > =j᧿'Jva2oc}>&.SJ8c^`Rt.O!A3Ni]@k(D/%P!pc.Lqusnm9 ~~\z;6H#"wI8t~ ,?Ͷٷht$y=* |֌.~[J%5_:ښqKȫD5Ȁ ]/ENqjqqRe:C7Qb|~"? ߒq(J@A6T>d*Qqx+; l!yMd3/lIƼNxMG*_+͟Y\E_jK\҆jB ;Wi\F*0cjvl:n"bijPEl?2+(G(4\knũPa*r(w7 ,H-U?D8+7o``38\~)U@|A)k9U%.']#j RD,h4cvE&#\g ~a1_@/=ݚ V+i0NՌmFT }t @)8U8&<낌Z9qhKsu ""f$I&ۋEp#\gRu _DG!5Lʄ2C?e_[i:MxO{3c8EO.Q",H=_7Ih'dT|.L"ynoSD^ Io$N{깁KXDI^X|βEʼnB.jWyղ+ǭ+WlE.BO*D) /ŎXC/]a_GOV05 Gr|ATYOE(2%B@! >.X%&U`C6/fP?y-+au$ՉTa~8m HA)To3^HFpR±'kpwH]2ӣJ1B"Q GB‡2Csb=""v(ÖoE67q|ivE &n kT@֩i=𛞨]/U-UA[VeHo?ǘ,*Yhb/'kj XeN#ȷ!f#02K3 Ưq20XKI?d`|?lrHidnv .2*@N)([uCg30d_CQ|6M dWӢo a 9-c=+1wOl %88nGK{{'åOi%H'ςx T+2{:Ry&]_u{:4 Vd @$P'Gn66q1]8\wSz')x't+G e\%n豿L<;4&+%OţNsR=+\>B$>91B6qi*bA|2_ގ_{ #jpR@n}@K512v#RTi+2ʤ4vDibyۯW W7o S!a3@%][|fl?a yrLpoC\[WO.#.Cl|:dF郏h(C&S#ʘ{D-6?P2KT$Gm#_y˴]%.Bɀ6q*x`b TifQʿec5|ӫ @mgϑ՘1GFcj{v:rĉ)@ rGIq]H.h2 !=PH΃}v0OzY)Euk.w;zAk>bxrF^+Y WZשM\`"S q# k! 4D\^6`qhXlFKe@P;g"WW3 ܱ*T1Sx\X3X2Ig-c6/<"&l']^1E .q7S#9v+ w8 'BiA6s9xP`%Ƹ f6#̵i W.XļO<}w]Y^6Z4ST.#$eZA !/ENJ1Vx Frok߷?z? ƌ]G^mX9U<؊?wş^ wHs8"+TxV^Ί8Ԋ!{\JW{Kij`"R"S K~Fʇf eX"!Ebo ~&dDϋOɬMnC_P1 { 3dnh+Xl*P*gY7W/ }E>ޟBSȺB ՄS%/+nޣb, a}D@''F@,aJ_ 6XʀRx/.-fxg$jN,kp9}(R0ڄ!i`\,}:pЎGGVVL_ g2g(ym 2aQ=J^BJ^S L7tGD1ct@{a0=4BCs!2XOƬ>;Ԥ0}a 4VH) w B6oՉ2LDFu"!]kCT~JBv>rY@Ik8ԤZTҾxJ_L_Y[ Q)L "E^ eRT5<KfnG "3jinFg,nQdgmvIѸ@irXìjvYm,X]J/zZ;^_fP2s(O(D`@.TO%~DzGA#$&)q5 q2"w7qksbv ?s!  " /Cs%qN+2j}K|;|{"}O%/ ɐQ 8Sajwali޶[ҏVMJeߡݓV3㶹5kحp11O[;1؞HÜyY9& !Iux1Ărz)#= {7Yxi4dn4\PYtMu3LGv0hCVs㑪)2/Me{E^;vTҿs|CM<$a\;_iHSPh䌤U l(@F IUD~j(y7'UF;&NSyh˺gbE$ yE8PSrT0Z)$9_~2Rd)"}/bqp?IW/^'{%7p~>\gwm"c^gttS}u_]pl{2H8'83B^~crl3?3-,6#zzjD.Ip^``he,C j/rJɄ@وܵbmil6T"(+RFdgm[#12뭻eÔq; ֜aPi*ܶ*U RrOHOcمxYݹ!x{c!=[rTI:10l zUIO PK%n$]? {p!jZb|FHρ!Y~l`sѩ1>CDΜwgEײ7%@9ƀl?9xs]$\D&E 0Ċ7:"JeX~ v3q-68l)>_uR@juPrɷ; Gv/Q+Z۝Peyq?C"ϼND`f`}DZo;y.syb3WAZ @.9̵?IԉlF(ݜ+B}.r4Q3F8Tl)6QЁDrJA8 ,-?mdï|}GP+Z`{u%F߃UeB 3^eH"ۛZuB@Xb>/FǷKv|W_ʏÖ! *v)6n1Hn63Fݠ@yXTeFK闓3&qj[o8 @J~&dGWXM}YMge69!2Ǭٌ̦2C?Oy̥ Y9dxÇ|G'/I˓+zzi/=%Sx9O`':h[BmWb:hK%IH@nh WC4ߑ֊KMIWs0:\7W+;\aeUgg^FB-~jY%=`%>er>E>7Fzvrb9:9AՓcdU c^tCsXM: H]"32͚>U5ߐ`b酁N^'N#9 +{+1c%>sl|F(/C(g=5"KG7Rx4~ is:ԾjXC %8a ]<1∯T CZN!AxD*"XI7t5YZ4mV(7q-YkachγmN讁aDy$b Ρ!;7HPݨ}ʍcme;{xAV#@=E Bwqﮜ(BlA Or-JŠ'BsaL%suKu 5A1[Sp3vOΨS L0Skh^`yʟ/ɱK,iLEǣzN @2N8:73ޒ}Bys;D`ćYĘ\#H o(KmcatSj+guyIDnyҨYT9gLDyAXrpwY&0ifJB%,( Qm.x|Ot)D"J8 $=N9k\# EB9yIH਽~~hwy"DG6sW  IBv*: w-~ 1wNΘN7\It+1++^ _#9n@;Q"胈U G \.psD(TqTfAzBQFpZFJa%^3`] aD1Z d/%R=Jp-1r7 ЎͬcS.(<<0E̕l#2@s)y!˵Uqp@(*۬ 6:Tњ c#LXU%f>Լ5S SJӫy?H໋?MOC:&RbzF$K !2ěDJL![J~)%j˗%ʉ| lj"jxzr9R\pwVpar%FRix绸@k^Ӽ˵t<W% m%utԚ4 tG%9Bj$;qB|E y:IL_ ۜcM$d%Io'Nw/oQ2JUT:uppoF)KT0(^)Ie[.ߗ{Wh_q;aվe4יBo̾$m꣊֘K>èB.Ҷ|#a Èy:W t:y+ %;= 2EFмFI]XSг3xZ,*DD<͜&*&:M)I&")^AGcDw48`-E*78В0i 7M FŰ.Ff"q{_6aEm0jkdsR@S)p ѩ=1у_{_`ϻu[`z`?B*5~lRz{J]ٖۍ42`|ݔb9= 3.{GYaسZ=wրo', qMd I`^./Tr~--+;#MXɥ9vF*C gI2J{x.?_jO7"@0a66QSJ9_V~:a bV B5qpqthct0dU%u*N[PdZI!}\j*`_h@U҂GF\CNьpF:F;ow!ږnv#e~`zs"݌ʂP! 9eENQ N)X$m,o m?34 7Ro~X' mp 6E1jrDNP2h'o~+P Vo"]m6UؐCJ"f2.$2jJ {h q7q ]Q␪l"KcJkF} B*&1Z+~+':%+Gju[,.F!pư얪E!&78Ȝ]]Ywtxv5]TEn =ЬMvοPʃ5g'CC5N/n]sZ+EHvԬJ~qas7{hUֿƂ (jU Q7f'FeS!+-Awf]SNGs QYIaF᚜Մ!l8h,QyTڡ@)|_%~,kn%Jòj'\1ArZz5DvyL>CB:pX :j]nx"`MxX}bUPXDKw&T$hx[ygȈwJH7j7X$)b uw9-myeo<:⑼by1N*_Ϻb @z 0QLukdcklD[f+]X `T髭~X#2Mpg55)-s٪DX2'*VxJw[etQ-E7N3>[? Mbly8[Ζ ,x<k>7*a[ԤwɣX1ٮYHo$5֫#E qI[%no AbZįYhxAa19Nш$Ń''{W)ͯN[oWk҉)Q o\<<gq9]ǎ ?H‘+ FXYߋ7_{~^΂>tkg,c-Ġgg9^.S?W7yO)^Dm'BY߯4?kS#ß~'Ef)i2T@7QK%D%LѾP_H^Qَ|Bp4,_(} vj)R7 é|.c2=diLFhAڐ:}r ڂE!x//uJ)AQ#Z|bL7D"+Wi J5$˒Sl>frX|S^2I;ؗT<| wHb6jqNp( f(wfn& z6]J3^ns\Fg1LJ06HίF0w ::M @kXU;(+eHN]bna2{Do*Ȑ `Zq]yv>7Q#ИF|VB7ı2{x17o6é&ԟF"st ]'DzOֹ .&r>h@?&~Cj$VL I?τLMk}!rZ<\x*N_' [ D)} 5M_f\HؚR϶\NvY@'zwh\?VYKQWpfAK8m6mn/%绻! <]?dIE-w1/8TJ>YX0M#]Ó 1 $Bj5yP-ZpT: &l4(jvIO [H n1Et@pD2 us}(fgw 02UTn>7V[ht*:ӷIUYp1? P'Y?-EG\J] C 3 NG 6dM»~)cFer^ϯV9ۆJ 0,$TttE_4[3ӪB=鞨3**zN$&dm.qUPKד@'O"~K< Jb"PzAc.R20WP{Yg-@Z"X?oI.#`:Nqj#/!?:-ɔ`}?0@M yD1`$B!*( AwޛHmU2{GS%ג"M!Yx7qp&857~?ؖ@[R@o@7jે^)*fЗՆ.;0EksǓa~6뭤~_Q^U˯חl:^MbW=೟Cr~5fNܤ 3bͨw.ˉvГ u7y.|o!wzjqMwPNG3' }f7y}$'hdXki`vG^=o=_gbb؏ZW& Af%{t+~ VƂ^MU! uJ00d?c>ixoDŽR{w,Ufz}|[^=8Iip4fQ⳨6A5uߗ =' 2mz vќJqZ E">"Rh( Մ/O `6Hʩզ[v+E B*(ѢC*O Hć~^$-XaEAXN)y;8tl;>z)ltaWշȗe2EpuD@ӷ~Hk sX>Iih",p"Su5 zGKV *\N2)MyO}7~^::̜5H %؉af>}{FyQpP rK c*Uc=5W 'sHgS*=G TnFׯ2ZJ֘ݎQ#is}mڛ|ț WbH KP+\E~Ng#h~>h5ٖ)~;F9KQ) R /ayІ"FiJh_*C$<ԲSqh'#¹+i8xT&բ]: ){,h.YT5Kn6b7m ŎS2,4ZAԇB,%.[mf=J7!l $H ͯtwf`e2q`L] ¥E K@QJxB͠dGo٨+_ѸEuwI>V Q%9C]d3WP"29NmZY0yb:U+f7QeFy2| '4td2>@œl=h%Kf-a*03D$˙]%>*mi3mi7(&K~x"5RCw,- S$\ȗ0s8͵:ln`ڿ f[&]o/svEڕnu]̀9f?@&P|IԅL{RKXPe פo%vpxs vI9l e՚Ab-񆆧MR |RoWwrJ.2_UɏpDp,j+]tSD,sO, w4`2LkAV!P\d‡c骤thj$eI/M29HSv%*<.GSg Am#̣4ƌ HބT<'=G|OU{Qݨz_/_Ob wmß#BBpZz{-^J#RaIlPeF3G !6ۧ+{*{~D6f~C/ڷcBq"%QcW wP7" ~D>0mh|GqJ6p,;f.]K'q)A5?f+k2ЁLp)՟)꽸^@}=Eo>iw FӤBGAۮFGy4vJkKm:Bmib0I'IF<񜳷 )Yc{r3-$5)&V&#k@­v]1&ΕpLdg֯ l#kv*Ek!IRROnKޘvqp{}0 a2zioRR)PJ pT.{LYQM_&ouVU"XrJx2AsI'|o(ۏ+!bذu$n.m&d^@j Yȇ;p{)_b!m߀fKoq0|%kGB-UڂU=WJ.x%QᗨSPM}>6-vсy&71aôidmzoG6ic-aڇ}w-]o) xfqs kr2nd䴒D-]guGom؟׻[w29on=hN"+qK{E{7oUjP(yaL~f5ZebTyi-,s " DR9M&w7.3TIԄ-M[AhCg*p7> Jg֝F{i{H34`IL5G}T@"64h% FOAz6e-2+Nٻn~ǘZVK\Z ܈hwA,\̻h Z&6FbmBf&w@Uئ7"MbeቍZ9Qo ׻ cP'ӞfҘPoV,\1e*1,)6-S0 ʬCمbGM;vR4]TEB%w $"ul-ƐY,}/\~RiCv9QeI M}ʚH],g # RG &)# K:^T!ݦ6_JJ2wpM8i0 BۂZ'i-WPq䛝wdgyrl}*͒x{i4P>M3>?ˮDֻFE( ŅOʔ9k)_ō;Dɻ$E?21D0\G1r@ɚ364pQ1h ?7YgDÏ! xOZdza}%$펢j,LRҀk 3 |L>uIC >g|mBQo.ǣ%HS{s :3r-h':xṑ8 =,ivFGJ. /FRX0[Xn-y6sv]U"j\Erct6ZRbaUg @*F#6BTќ kySG8kk$e(A{,0˯4v휆G !/_j/7/=)^P6Nܗcu/K_/|]Q&!ju3JHN['xg9@ KhqF Ic|jbq|{dae:ĂR$qyG!a ξkkͣO7>ћG`}xҞ7vT+pV+ R9e.Tƴ?7jXA+dvݘW2vbؤP[iXf![E}iCZ`]/LX@ =% Me͏]RY:M14X-j|e{nѵ22t%&!bR1 q%Q<> f&Í,FU8\RQ\'8L^%n8݀rQ" P4MHE:f ɱՉ6J+ڎ-]lhτ~&эy3enaRrɸ5˴1g| L#`rq- @&{ے%+#qb3[85HR +EGAb3"oοYFP̻(Ё!%:zE6G3$tTT0%D_5S2m`{); @_\Uφ)\UA]c(NܺU]QF,XlR(mlqD;QcgZрPkž)J2P-K<&FE$*wF [+[?J3'' f؛Yl74ioJY `Ӏ\Q`5j;PS_yd#BPȉ ~a۞.olJ!@%:I/(?S0n'DB2QZ0J.eQ'R-o+\"Ncp\)mXwptY) Da7JZEHtChsaη ?FbE\v{/ 퓙u*IY5_V.24 8'ǚ޷g1MmtN@IFz`&@K@#J|({(VS/4KN?26hEtRr$)#)G S\U˕_V%PJ$xXxydʆ6KߦL[HZI}Ek^ttAl>HŖ3qZ-CBC#xRi-)dĕ™dH9*cT\2Dec[mXpt*aw=L@"?A4v0g(C64c-Hm'qUV5~Qc;rLjJ .]?mxzbTw߰W{4M\{͝iڬqBEOy}䋑eV cE-,$nҼGl*6yJjepw48"G[F0| <&߱дMU&ҊbDkU+\Mqӂ0m:*Am R(_\]|Mɞ!+7nn/>uZG sbXBs3|ZLaZ sG,Xru47. u).'T_HK]\-.ك^WB B4SB1H8ɩP;ST@SSA3]%U8+23`-"P(ZHT_␺; AaGEY;>+_eOrWİe8Ո(J_U+a/?6֟?ԖŤ)no7;;Hk ?6o\R8wK$b;z-azȲH*ĥ3EM10^␖H}J&>a!3t1.uԄNFX'dlR .kv \uMq,EiVx8qXX %;MROuжĉ l¾|H|VM&_ލiC=cf=k%э\=7Z-G zq$| ߕ9k|~3!1 ͝b=@sA&SNc )dN!5Aj5ϋ8H{@@(VU!>QF$g^7ɩ)7u G( :EgQ/'%-yN m,cDIߌZofLƏӈunWU&u_"DglXNiI {,w>#}F)Hx0o%[zٴƟ'FC$ ? Tj򲏮*.Ww] 8QAO$"Gwy t +bQv3ˣScuqG3망_<4*5noo) 8|ٓ^0_',CeAm+Sjh<b V屭()Y:Jrmnc;z&8l0qݺ,,@acY)Wt&\A'Eחt'SU3JNh9R>CVp]gz,`\a+aJI;Lf9A 8 ?vzHY |_z}Ŗ;#pc!/RCh/7$Sc!ϰ7G A92ϺgRmb2&H}юj[+:Xj /7﵏ ؿ}>i- 3/}p?4; 2ݣVUԚ->i3 ^u@g]Lt%X;g.gm#c0bKoUps_ VRM3Ҭ #dxNXdtgY"(PT{J<煉;09k~cuzj=6#ZɒqliY45ᔶ )4~\+ e*K̕2@grTBNY++KbhgBmHNC+,V|m喣-qҗ.p ވv$58fQtCZQvj^6B8-i:NljJˇn{44o3+(J/Z[Ž^&Oć2݊P_E*? ŷT\"} 6>UWYFHu"=1!}P'!)L~7\ Up)Q=,m!irtPHӠ_) U=Ey才\:9^,:ZB౩U揫*e:ɧ{/3U|Uz") ŭMg3Ɛt`lB5G&0-7k/AyJZ&X;21gaY)[ "@"ٓ]*E dߛ0Ȣ+N\ ~VynWZ 5,3YcKBPhP >dqxơ5FH!ș.3ywxVh,ǡew,?@^ 썦Z0kg3Hٛux\= Xbȍ##C k\~=E0ܣ׋|LW/$)J.նE;K%((b`󯽱+%B7ΫP>`\b-J(΍51ڗ7ꕢ-Lǽr;֥˔8%g\oD m-@yZmp3(9I&ܹ?: H ^Ac duH3:tOH{w;~[>x/Ac Î IIX) @"V.~t39hxGƊ_Ñ+b;o Q!Ux͖?Y"jUPdh= ɒOpb,%X>y{=(owc 8:a~qH)qz5ʟYʌSnr&r#X,!H2u_ٻأ|?J$`Wk}xAr|@ŕ)+'bo*{ls!L`u%?WX9emʊ`T+ + w;mPz9}2pQVa+5bkEAM" W?w@D[a(\ J,IbmH;A.d-.&gGՔ]} M{ixngd1ݬq&`7q-<9=+oCLHF z<_Q(AH<(304Fڎp<IB.U$9 =lS&7E +Ame') n e6#,z 4!$-nCEpk;# maVoC[lԄ7lv] dx0bUP/\<-pN˘ǯ/xCoQj`! ҆`k%bsl<5 vwP[-X8 ?&ta1SX.Yh; d{eEzy\Kj8P2-NZ[ϱ?oA}FA@otGR ʭ!tMzԁԍ]mfA8pʟ<^QK'ě3:$)騋0/ŵ'd͆@S:NmM2#s;T{QLaQNaӒ'Ϣ$6 %;vR"Ud*CIh,f$}c5dt.&qFV`Ch' l̐(@"'\ԮEJu[\?YJgm~jغ7hhaC l!8`5-J֩&+4. UoS9Ҕ56c-MlBtHSvyD~!ڋ eHx汗!91~+J &⫐Uhv$ZκJoL(OdvA[^NH+B2mMR5 E&zVdtF#*Пnv<~(uU"c]hihi8lD QOFuX_?=KS $݃M_ރ8NKK%zCo詣9NLezx)CVoh0peD&Œ&Z7v"XJxEREFe()0$HW!R|$rXCBp2K.E#%lfg35aGd\]-NDZKTDw)`L4%䟎<yz(y2J-)g}nBd׉ꬕ+ 0ڿћ,?zcᑛ`#f#= 䎅cW\r YndJ9.ih$$q̐Նmޠڕ2(- ,_̬i~(J>zH mC_ʑ#Vimd q-%IRI='дm [3}lRtx>P.20qZ6A ݚ'E` Ն0g% ;4^ZY0`EZ3|}<Jf[G|Å6!|}:h/v}.M:onvL,|.ɅxjG?Y7g8MZm'7I LQ+@r(-+ʞ:U怫LJwu Y\j5IiEN49}?/t)GjuW=V/tb99Tnѻ4r.z[P3m^-,:vkT7ݴhX&8XdsKqf S6+ {9!sSđq>5ǟKMh/G~kk^ZucK4PHZJөQEu\?Q> `ysC'G?Zognl+*^/z#>*"^6h%QtA~/i PԄ",EЬ^wlo_FS~tUayV;%INw@H` ڊOE x~=nB'EF@r/@h ߊ?-@s$Cr49Kdv=y\Jk1 H, @}M7Eb_7m&I.F)WSW(Aƅլ뉖~<: S8 ,κ!lV/Zk޳I ֢ohΎWwctỿJ N)Hv#='|&XN9g`6jDZy))L^ƅdqzCV 9COF$Krs^_ht@ y5cέ.HZ ҿSHp%!anPC6,>NuM)ɕ E1)QD͝}9^Œ#W R2WJZJX$VOֽ cJ (Q[35 ^ڛ`[ I7/Q"H&GXbT_29-HR &Z -үI_2YKɑ쓎PyEODAs^64h2sDt g9jjr<5"Rrx^31P#ŵ e7!NuHnhyIb,[7i`DX)&SME.?faX+?__iFX&dʒ[W"햘`آ*Ձ[80%8 /º +UFɲ%HD\`>IaDު%'Y.DA")\zJ@خ 4y]b4aB3fttYJ**ԡJrܳ&_^kVeK:Yv04ӟѹp']!v -TTlgl1[ZBFV;k9{=^q&РSmL'dl]jV(]3X( f& 'wW=f^eY*v{CL)x dm kK-Jg>NeE Z X >6ϗq1*"!|kIWMA|DaAS{25~VFյa帺AL'_[\֌ҷDU(:M([ɖ24ڴoq'uW#9`Cź4D5mMJ[,>L] @0b zCޭśΕCYDu_&"_(`SKYV~mq#)} 7+rf`ƃ0&ct!zہwpfW9-[I Լc"}xDVv({q >[(8 71,2v8MnA1TI3o_Ֆ-f0&NE=$ ZzI%2 } {MvʿL /!q `hXԡ]|{Hyx17YaRƕUVB4EΪAP:I0q}(Ef)G)hZy(XU Q PhjEdS\. 9 !U) )_QJui:3&~Ϊ+Jj@Wr<p=I6sg(DT)X"l_̈^|)?k/{ޕV D$UJBAML TL XS/u_kjnvw콮s5׼|C\U*3[r9vgTg"V?~E?u(H(0F\8М?]MqŏF3?YPD*&^CssFyo 2ޞKgq~ <ҡ$JRSj+tj ^H &(tnWF4(t^W۱yQ9sjlʑO-U4h 8Q|dWᠫpU8ZnbcET17%=.tƖRi?]v%CK@qCu'ݏ *ՋUھETi-4QK/4P[HIL)ջ]ϴn SBM2G??6\h8l-kK 5;/m:*W)qJ7% Kj @bLjV/\c%vU* uB]E?Va懑O{ ۯv5X懙Fڷt{3}6~h\i֭TWY?"0u2.5DږF>sUP:ύUE&Uf`<"PHp%aN*0UPqQ29Uv,n}(VcN+O-ɥ;TAlERS"Oqg KE7g1k0Ȓ.zeUh#~(ko4|!443{yoA{UnJ_?73%_AA FW_J xݩZWz KEEB8V H+ ??d86̓#w58'_ ׊Ȋ.E[aZ#rw*ĮX_͂=՗Ce_yu nn310TX]JiAF/Nfs\C^ms"x}!Zh?O eY b;.X/;,'DFabwWyYm78ZzԏֶVq K@:ִN7f ] NgԓȸIu=~(xXV? ?Dj"~\"-S _USy;oG oej ުT*k"gmj<86u+cMBJ,e )kog'QC-p;FtGM%N*סעC܉ue"hzώLCߨ.olj7,^!.IԦc^!oY)hFo3B5RLq/F+W;oy_F%^-vq0kfzџ[f|L]|9/͵tCήҝ4Drs/7sfYXNvĜd8oثxg?enV@+JjYy.p6cKQEaۣTej-6g0S %LoΦoêMeߡQ%wP2Ňf@wni xb]Afs`tRHB {Cڀ5iGn)cV(B8YxONk Ooa#_GSQȨqr^ hW8I{F@ckJ( ޝ_CkCZ#Jk#jmm@H٧]Sɒhmڥ9?PvʔOK,Ra,1JZB`gs>:jc m%U+Yr_v^Ǚ ~ڲj6Wl> }lmöӒꬔ@o!.^ Q@n|p#C܋*J RUqAcgro`.JxQ@pxbEGn~p]@Z dnݣCQ (&Z:A* :^$ 8 q<Ȓezsm0".@`~o X]^t*@~f"+ P+x.2+b0J}0g6&ahW N=_o"辺Z4?IŝMI3$ljf4j1?0rOs]}T[FDaϰ k KaMBMt9w1@Kq<- {Dò^5E U*,9#^=".uu@w'O͕!.^+JwK_ l[iD+3^JO(7ZL&A% qãje:;B=i"{Z07AE5KD88h ޏ_CSh3كYi7k$_p~XnH):̯{ f*Ħ _~~AP.~SQS vOQ\6\(:JMU3Jj%V$CBGR2U 1Qq$FT0K+%='Lkr=}cn2su8 -SZr(@3Qp$asjVPZQC.r$i7b`inR e ;g 4줈Y)[gɳ6RmMG 0UI /悚ל~Z OV|o[ZGb$9A8p$pI\i#4s4&\) WJ•;0OILf;r8]UzWj=]zzj\kw*\TvK [T7 -,3R}g:-78< [ʃ]YiW0 xiVW;n)-F=۫ހzOɢ ]iwnin. EO/KUC>-}\lOX, z_7?@SkFuQj0LK`bv{rop®cY*KdƁh:VLfcQn\ &s4NS_Ϭ4П2>D&;Hp䍩yV䐇Wʛi]o2#m|hR랟gYώYߋs ayb"pIIZ7;+ ^2g`S9C5<Ϫ\aI2hq_ i8/-Es5-Wz 3pcքtCŵX;k=k=Ԯ& HFe@4"(-f-Yjn%˲ݱ7Bch?/߮Ǝ-p&~&0nc`U}cSRufJ0(3Jڴō/ZCpxEf g]G,8GP\?+RD eU:2+>oT lz bxOМCF?hMk!͜a8rr:gC:\c.hAKYxXzpCZ%U\^8,w^Ak::,`Ԛ:v~*]? Vtll#Vf:v4w,>dof9<$??u4ەY{?{r }5ϴ`)ϛ]}Ε״ 0A'_6c<<#5NOtgL7>/Xc5ZJOhuۑC*DDǧC[_Z-^ION*;X#6+1aG2#P مrǓŬM1ۣ} ǩPv8wm߄ dd+uW!.^ KЄXJMV!pe\"`2VYqXc}[#=\gQ̣蔞0>CTCK֖a:']AnJwYUUIUvkZXUlvu[-]]P2e{MECc U2ÑJT&3k]V#{NT\jjX>T2C2&ߚ6k5^'LTm{gA6[pz@Mъ bv hzjfzjOO힦Ԝrzj==[VNoӞNP Ka=P֩0G`;%Ԩ*PK0 N@n7^ &cg'u5 @ Igaj[`(z?7HtaCfJ.4M:꟏ )A5҂MHpyMqet iz] :h }NU5I5NObTKɨ$î2n`JAC{HZwbŇnϝ~q9+n_MGzRiƗֳܦ[~Mdb^bM{m ~h*!\?5g9+c~X} lF:+;c| ,i-I=z\}0 SCM|"LL/%صs<@""E_`{s*jơu U|bu5aщ O-lq%Ӥ"Qn<lux ,91w W =`h=<xVӳe>o[" "_D@ BfZ)2,:5J:ĩF96}D 7䚇CjS踠*A1z-')q0CV6ݞ;q`f+E0U&ic:Xy k_K(hO/ji^?޸"CoT^ u>^;":4C5Ѧ4=7D͛bmjBڎZvW: _#f)VKu%n\nnc,E\*<{i(-Wŗ؆)n9/n&jMZ[}=~;A=)[4KÜ.  9~Ԥ-dnNv{KZ:xb];cD+xK>.Օx UMy?auv` ZBun%/IQ !N ïM4Kű&aޗM룉4dOXsa0fdw';UVd!24pJ5GmHP{`\$#d4b:I=kbZ/(}:Vo7R7>2&K3 2lMEiXv5޺#o0Ǘ1,tIkY{>HM)7)c$,dK}2#P #h껶ſEmyF$SeBo^=P8WP'Rۓ%Ɛ U@/V0I{B+kk= 2^=E$0sCEo+"MpFû\~83t:y,|G]l>> ??^`cr=.iL ~+[m,nZ_%QjW=OIm4Ƭ7]mУL.;(WWNmjr m}=G,o6eX5L`b'y˛HōPP2G __o˾7"J6YՈdP1WѝT`)Ba I )+j12MȜT1D)*Bv1 k!Z׷WF@AN@tbGf z{6MYr[3wP]U9[bWx;}vn?Ye-;ы1im(: <_.ܧeB,T9-.o~Rx7¾Z_/4ᛕ^/SZpGՊ7R@ԝ:کڂ_q9}x%JOKTcRUFtQcK<بR9 n+Mx aK1[4P's;!,{(RApg)RգO>d,1C(4Ҹ.&ΟZ@<ŋ׷і~N+%/&8qH͗-egH ʎ3@ ^@5_* aBGxr:X3s9t0W=*9pfkjCN<>B X&-]LUʳ^_GbӚxQ]rG!b27fHʋ>r$|]_PFz\Z74xܶ|Ýq`:t6 @*ԋ5OU]$nn6ݚ9?% 5,9˘ՙq\,諼g٠#nXwjuYOS{otkȀ}dcM4 FȾ"0TQ͗%ȶR-b42MRMnzu`lc4k1:s ҹ0R0ͬ_,Ft4ՉeXQ-6YȆ;>jު3) a ?qkq5>Ť{P(pueVb(P i M@p' G-B=@;$Sk pe n7lpJ8'PO>[cٽdjRc1Jmu C9$ֿ F6_"|=썠([;%K!TnF@j\pDt u?I`&Z͜,Eg`8|PE ̒y#ygkkϐ)5FP)©σoBv޷|oOv+.웅3*W%@xxl B˃AymFCUo:5Db Wq ZwG9+"k ] L0!]:I\MC`\{VRede/ |ͤ;U1E ƚ5AC4GQB/ )l}R9m 0@$CnQ-3hAȤ~P%sYgP1C_]3s"w b||f (~CxD8}OgC }:ɍzPL_!ױ`aD 8㘅·xj`yǎBM4"~(D<θma!/ `iR1VE+BMc%8ɮǴMTfꦃSo?u%iL0.7nZEւ!âKOF/b`4bV鹦[Xl2{ IIl| (WeH_myfhM B|$R fEF8Xp3&': GOs _£bܟ͊8Fl#`B絜XHC*!%+{b1uRu>i.MW!%fӯ-MAuvHȣ*3nX~@N \ HUiǧQDڻO4M*3^ Xi, ޗŒgGϸ#IJsl3hd'J ?6ceZdfw;%I>_ؠ̊_1Qu^2OKڭu2)"E(!Ysʱޔ!YSxzO=\Y{#*z_ƃ JPQ6gȕr8WνaOسזՃ[Fy(/EgYb<ޒ0-.zɰd0̌ޙn%^t,^;ڌ8C'ﴼ_U;kJĩ*W7X+i u1E٧zZ$~eK~Ux-S~x]-WQQc%pYĉu6]d_,BI}RԖkf)ά5GpTŶL77׮wOdCef)t>VCg'h+h؅VkaVm8mCnm]ÿW+ϕgd0L6vxeZk(zU \ֳ{8(S:iN(,rEDr2Ɠ{Iy!Mڇ"Fͅ-@޼Pk?^: $21Mzv{\w6|b :s`iMQR^ʤy:Usa&&͈6zK TƮ;Daxf :$uZw,~RK?ak ȿD 'xNϷ_RBڥdGUڟ=Sf;oBMDة?nп00} *WCCF:zAs3jݲl'BOOIB> BB2^Ҍj<&(adhQɢocg+OؚԴY~SLV@ o?yw`*y.vNV;v*Z-r3-o_yH6A GtUYCP85"FԶ(@ >k "w#y 0Z(bFnt$n%Vz}.nrh%k9g9&)d~GYEU 89 }))wOԐ-lhF(e,DeO^dA7#O'( O'Sӧ  :hgѕH}]^Pzf7 wLȻndJOb2cfsi]^=G0sOLٻnpJű"xՇ?,oǰe}ŕ9f9Y&4Jz-8H?B2)o^ :je#3jX74m@jjMF }s3skeu^sRʅ]Vz=`ӃV6Q6u*YkNCkwwjN#2W5* reJd6O#>N*~4dnX"9S[n<*mqMއݢݒƣ8'H#3Xk3hHR\NAw_]PGmQhGnΟ{QX`Uo@ZڲwzS줊{wJKBAv-nh(6$ڜß;sFYY=?cwGۮ(0lb1ob׻n>ٌUW_q1{_N0w ,7++U)x?#pz,7[[OS%q[*øIIUo@To=1ݸ@cy@ϩ68KRx)\ʠ.N#\Mʸ][Vg#||FL_nЃx ;C`7aq:E[_!t\푴Պ][}uCިyK-8qI&>6{ ҵ̬WL0bX.J&m ʍjW i1 m.7$hbt|0y,s m!B) zF¬%^WF(]He —9$Й7K*e9u{%e;x)|xsI-L:*2ZUС0][A]r>ọ~*%TZho8r] 5ƴ5.qTqKGu=py`AT0-7ɚ H!CeoOkaA.&AW4PȺ0b_[% +mۇw%UwjxgܚSVYi Wȕ2r;H+^fKrL;J:A[rpI%- ~@:mpo}w)S% ݆ ݾ"{ZDJ23f4׃`=q57W ]uS|MXTcnQ4Z`Un卅G$ԵG%]ɢ=[IMUR +ٲ*+Xb} Aٔwe}*c*-ؕw&c8fYAهse-,yGLVj V_{y? $jw09WY:Wq+x1)ц2VaPHu*h_]_/|.-hHCE߉uQϨhs`>ˌjU2P#EٺGUKU6JJsO!`%'>8LpÈ狛2J>Aư{ز.>dh:M&\Ihp|aZh\kJ|lY @@sqZ+Rf :RWͽ9fN@fZ@+kp9*WjWj)RK]WjWjWj1RJm1Z|J|v{R=_EVl[ԊEJ-+[h+R(_[)/e/^}֍d(>TlC7"5r+-R[KKiSt% xRK4Sϗ _򊱹TD܉[rRRflp3+Y'$4IO;5V?Z̲`LSʂ.{C%ʌLb+s+4P!lTXY6'FG߭[U#pߚcRMwJ[GZE.rY|RcWBݸy#ٶS.fs·RoYZ͎ƒ%AKfVrU+SV?3}aRa/i]?35yL`]=?>?7K0RU&>!OMU_HIj X[| d*IU]YZøo2~a϶PC )߆Iξ+-f" z~_?RTZ}e-~,<`4,%`$ɏPn ~rn( 4Y>y(+iG&MoukI7Z-vgnj5O1}f){UB\a{dr0mbM:7j77\G:[Qy;|6+[s^yMDJ O q-Y[WY+RZTi Q?/֨]U;QXj~jKUoUTZjɱ [U-U?@ڐ(@ƶ^:ۛg)Gcj_} g03\췼<0auF=\o4Ogň L.l`G3h0f\b {ڊgm6\p6%Ic?c O m@/nõ򺃗ZY,{ΕݸCh7>V$80z`29׈뿡c2 2bRj)OeJ&#bB!b$>o Tʿ>T 2MLd'z݈֫|Yl+gGtr'< eGLχy^%yQFLoԤ| JKUJlzUj1_6t?$Ru-v{;\/8A*+SJGiyxS >&HɿuWB0{(ZMN~ݍ 6!{i *S)I -+ahzajѡՒ 88UUgJd+rje+<'!.|(dR9,)}R.v xz~??:JRŗ*P>.'Ϝ?U*`t@Q]CYo:ɿvׅ)o hz] CT*tSԘ/xF}È'qtʳr7~7)*dv%OaUÈ{̆ksJHg}E旝RQ;vٍBc!93a^)KH5^/)csޯ~yW F{YoY*lXh5q1=;CIҺc*(WƗ>慟ZP\#˻g~_G$Y:H΀08:i0ԅA1<|c|UWE@_Qݎq\ADwKr`gٯ(sg/%-w%)2^.SC9,@<9_r WW8;}ff&LÕL||]2ۀ'+\ɮ@ݘ#*pnIojE/&m \*"^x犑e]WaTޅs'[CQL8nZgd2nY'xXRC=$/8fg#LQ㏬M}M[;P~oܪsW9-8m~vHhih/8lmgkz@¨tjc%WGF;*-yfqgZV}o^/s%X=WZ֯=ڜ#:j2X)1Hl}넋79|F+87iuG fVFt:>G_ZNj˧OvꏬocM,s[_ϲJ#i0SkeW[Eڌ}zQs^xrcces|"ewhcE29>9 = &cvl,r>LNF?R{o$Ql<8b#ٚ7kry8Sw'/~9O; ;9)Z$p4@ Ioqm%kKr4f<E~0s-1pShD'3E["9TCnSQbq+&-yC7GE/Tt69bB󓊻4:%7^O²#06۝C]UiQ揍PUip>INwZFQE!Q j3{)Zڤ~Gn-5MwQDt_ѶO߈hGa݉R66Κׅ7Es4 y^^>e;ei;--__CT0Hvk6 WYх& &-~io"TLU!~JSjPL-FF,DuۂE>t[n 􇥧`?s DS@Ba7̾U涞[BTh U\ajK0%6P Gt6 fm?v!ْL5?' _1eO=e}=W.bsJG:BxK|Og){顣x a x+_~O|hI[t5 h+iv)9TP]}XT!KOҍJ1*#; 2|1KETѰ7H.90$M,SctQ\}B`@Qs/bj5_*Lz_>lezk-j ĕ;C^^oDm6.Q bKv8(Y(lzM^/wFYS!tUM].쨛802d|vP<a(vKFk5 3򀠨oˋV9!{*Hhx/Z]f峙nF{+s0ww_tut/|[@#h-|;xۭM]顢iv*lYcd;0)ּIutl<|Hvٵ#;' |~\}"`0cs2Bu3ȟ(Iݭ o+3|62WdML:À;s^¡1I,y22_BUq0'8D)w,~άnb&x#83!7 aΏ b6Q۝CJĽ% 7xn[3΄]b.KO1xPYY;V$^C97]qZ5!+'{Lkh K0yWnUƫ6EK[PNZ:Lfz:xFW:W~|~n*HBF1}0&8휻ڛ<-` im.:> &H.u>6 cCqlG*>,unI+ko;Xt $VLfzm1 cMh #ƲܟѸ8 ,8˾(}jT["J84JӬ""V4ga(6 |b]RE./VIb-gSJfԾͬ~:>/$(j-PE@4HҒp`H1u.nhY :AE>#2.$kE'fmEMuB x` ✏7 V ^*/Rl/+"ddžj1u)gH$"nM ȍ*-CPl4yq VZ!NI❄ ʹ'xqKH-fAA`2&.qU5kpTj 6tў[Eyxdŋ$<ǔ] c5?)d01} :Fz^1mk񶓎EFM 9S<ʘ0ܢuhC\G,2Ҁm89n ݰQ$޴ [nsuGߍ} >w ߭E`7l"?cp?r~rX [q=(v yR`ߜ{!K"XNܑ9Py־H 219+OOCtL=5c0 #񈀠,~+}&;eBB/* %DCKmԔB/4CFYT}%˾ J ND(x Z e]baԥ)}H\#J5Rƫ\Cb1ލ4=:̂Tbrz7y i3M[v=b@r0 ?jň47mPf`{ NHK)Kw>#D8'16oC>2QYy Px|Ñx, fMf Zbٕ.`#BT0a\~z+qg )$0G3-qR#ev,;_E^qmotSRRy.28{Eg7k\B nlc㍻֕A, HV8P}ß(yk-0LOO!*\BS {\1VpLnf\8#uqIڍt*wc.w VFIS \:ۡCmy /enˋ9kˆYs$ * ;Wn[0l.777kgj.9-E1I*#bӨc{į@"V Yr$+MaV_9ښSu5ywǩtF>l.T:o, ]$U=PX*ԜQjF.@*ysƭ9oܚf Hۢ9tS^e2ַ񭾵7EqU9gTiE Z5Y9u<_)B>q#oMBǮ8)T+}75SﰺUe>ܷVgfgE_CZa"iv,%GqJ-8 N<C =4|ڑ8IV\{&V$QTkvzj1 ЗW;Ew^|@M,JhM=򵮲Y*&j6jebl$D ML_cl/=kg?wk{;xk} Fn\oɛ0>W╾؃H:墺Iӛ{T i|!@P0mo>+O*?NJ\&&(tli`1Ȁ&--(8Sh5,>X&{(0&zJ;JpIr%5 XimϾc ?mu#5yQݝzryQ4 /S/&j ^^E-^H *{(DD'@3*G,[y`7v%?l{OiLlJ NK뿎'<3-l2JɎno =0(. XE{Y9R.ז*vr5h[E>*+U<"UM7W[A{Evt N䎙XΈveva)l ̂DY(A5ڳ?1k$}.7uIiER)vt0e5 fA[7f° [3b)ijT3J22^dR)B⎌ <BU/ AEOW$,),'Mdx-pE}X ?"l])fQvs} *Ԩv 4˛(m³z+'@Svm8WXD2Dp\|O mqTOx{.i=oayP3x;5E0'K|&$JoB hu-L%P`I.r\т9r#bZ}Ym?z'>9`'- ݆ףa kzAh>[;#EN&mEvWD8wB .$!OXd[_e 7"8Yue K5i6 vyTᇡrA\B2̮mW" R*WCUiyWsuYUH,fl:]WcG&(:V}-cvJuL΍W~4z^^ 0bz0R/Rܒ7iH^ P!W@2` bl *Slg:Ed0MAMj҇MAQ wsr"0N?󜓖yy#f\> cˤw 9oY8o}^i!/PA7]<3:gw_`EWti+Ԝ:e6_x񐐊 Iu{:VjqORK=ZfRrг v߫UKVU }Vk߇dXDiYʎp&{*YF3yn@A::=Oȁ`8_4Q엲ݗwng D^"݋lvҽd+'BG*9"PɈ#&zu~haqvoU\t$ABl|\ o7-4ʬ' OIFځ ٚDl7HSkigX{YAac_/agpy'mܴh5 jUMTV:"h9flKd Ԭ5֊,NJgZk?9d=tyv=Nk՚E@%8?"ę^Dֳ+*77~\y 畃Μ ʆ/ eel&j[gW9c|q4d?CG}c>F_廎m(!}g>֞/io8#1h Q>U.Jf@+ eXIg@x|7%& VZ//7}u Τr1gqsn1|[\/IDeeG^;DrJvDKAS Y1ՁB x:u  s|&M6 Hp6T6IhgKÔ{)bu|&6u4Q}I!$i96o.^I0/OP{KdQu8J;-iC-l Mثdu4H+%ea(ziݑEvIWu EI9c"O #KpG+<}dG~"\T_&So TUYjY(Y8[p39u~#fgT9z4+Sf.laF.<@?,+W k[>?j`9.,:w(ߜkNSIĂ!6Bm !QDhlWꬕSunC3*IubL'- V.V?8K[!tΦD5uԞ=.: :wIĬ`{8V-՚=zВiSsoRcgԵ/bPHE qXqly,DK "nIR˯.I+>8IMSO!-Ei4}К83uq1`ANF1A0JТwhZ  BZ/}TqJmd=ld A ,CnDyI7BKE&(ZJTcL5kiRϨ?kOZ-H벡-E?k b^b?%!ubR ɒS;m`ۏ{("QR(EEDђ/8u& ,Cm0𷁆1>݋ IV8ҟjL:VtPSo}68g7RNRg}}@IΑEh)Ry{:w[ƳB RE(Ym.08Ok5ӽtpn,)B=fiC1$m?uyĦ',JqqZ"Z}?:TW_2+8d/sP*\CWqZFh~g Zԕs3՜J~qyrkf] &&Vi؛m,3\0,z)YIa/9j2rbD~!y}Z7vBJO(IAhJ5wxqyo8Qh@ꤴ-nOP+1Fz>gK%" lrVVјpOm|#lITmӇZ:B_?TPYM+ȃLJ-R 'AI1'BtLvI.tCUo&tj\9kڔ *5j ۽ .=͗ϰocURž] pl%;w3B ǧ8fH<1_M42sLA=]zV{bi *%%u:\QE]K9X/q\^T#\KLM mI"+GsIFQ% FeNŒg!&" cSfsFl[F8Y]Uc`CFpyltl  +W+u1~NtCQS7/u/+hBD8{nӂnTVrظD.SJg٨հõhHM NSY,uxx̞38G6 V6>'r'BܒU!}r3Ojfa-JDdw$u<G6K.}0giOT1r/y䇦E!'y:ie~P 9gs"s;WWOcʰΕLWg1{EXr}FStZ۞`t>!'lDmd緹D5(-ǤuV\q=r0#G-ՇhkLni^ҷ<@\(!E/TU*\"\bv[]%0*E< ʼn+ qo=F7B%2L2Dy Y`4jg:O ހ)sG'%v^; V9J5ޗ`H)ߒGu2lY K sQœ`2@\gH(pwa"\H(XX`oI`/=Ga`A|gK5\i9ZR= aa4ܣʂ3[E6G`Pn@yO 9L.(麉yĜƔevI6`3?L<ZzS Fwj0\z-QhS*\uO y.1vB[no+F Fd0,|\*r#n:jq1?>"=)I^'CK:nOLqŢ`@r(FC lW?m>EX:4"+܊[GCgI/o}r<&?:cd|!g `HĻpb! !ލW'Xðw`@0#np.* UH(I%98;s31?B8/U,ہ%G)Po&ܑK1?No*Cئ, siGOZ>E;ʲ7B0H*NI2+%kr?~p=:b cBدw_Y/BZhҴx9g%Box!hX "(+,\ o/ݗeaRG@Mcn_/?\I `"tW]Q͋vRwJEڬΥ-g*\1ϼ%BD^9.<+&u)|t 6\dt<ke}+dKY;j@ۻxWmfߙk!p_eE_N@$Mt@m'`d-K+`!tG٭٥bؗ>P:zRyHj]MBk&b,1BQMQ5%?:D"x-FLKmlR[+}kVx]oB:HfDSK2^- 1c UNq_Bk}$RFbl5l4a͵g/G2sb>&v.ńRR}gOM9]/$={Mr%pSNd̋,K|Q_'oH67vgu=$M4$=q8Z {EXduLDH}A02x(B^coKIsS>Z3W+&3_͜cIqrr޿rxV WfdXmx" i|QBɜ}]q "a$5MD)ҟb#!mSM1J5R鋗k[Z,ḅ_ :+ 7Ql1/ gd SU(cvsvCEد?Az&FE6 /u6lrl--t*>3L-&zկF݃>Z|ZsP94.O^V8U0?l=+e/+*T6LS?F =m*+UEd!J֨d{O i_Fh@ЩCt.e;!tsJY~\4emz|☜;cK)2V'[pDWO}@UstBv阇\>Y|)?i7~V?:lZR?4F,I#Nq8>#:H(\a*xBfm<d?R(0Щ8TyP e0H†Ȓ4E%[UI6r fCѩS3+e4 jSKY!U܅"8#6$*bS[((`D`7o f2Ox:QNUmNͦ-&Xja^7ia* %6Ogeutd9*wmcw;r|*Rɑr{y+ z{JhbsIc*?{^e2u![?:SO)=_6Eca=g:'P2k=Ĭ3Pz6 ;dy?Yr(Yt8'\tA3mjy 6?%EemvZnv^G9^{.G)e/ڳ- A)d ^5GC]/{7Ù5t6wl&㱅D>x#I&-W`8#9{ت7ԯ|_QAbM4lj&}5! .Xqk:m]ҷ8 ~7;NI<(hh:ԽLs{z}_:TnƇ>IqGڂV r6X{$hQ-@Eg `|qaV^%LĦ{z~c+VmFmzcHγ-5JaX )w6DbsN˴ ԩnd6UK O>fl2X U G =VY†\Ű]Ģ2|٨aHnٯpjfN+ԅ "jAI}^ʬzH7HU!5Cac{raM}b-u4 v ,61TÛW(ڀ &nJޗ1s^Ћ{h yA56ķ|iDz"1p4(Ç{%:dMn4+ bѹa(tH% 3䡚b stp˒"VAZ<1= Oҩ{G/'Vٚj}~)* h#NY@] G̈쉓s.wsRwYrǐkoj!%J .gs苴1u2*ņU8Ij tF6HْtkUy4dzG#z؄&~V>ަO?݇ړUn׶l֞>[+ۼvDf2\rGh_4LgLa3$Pi0*h=LfAFVDd,+)\:Jy+om8qएqΗ}PxoP} #yM)8}tџ_J䙽$avxs (GӾHo@_`K%ً1n7e5@b.r@6.L(m<* *!OĆl@QyTϾkBz?$+s# D@WV}:~=y:4ݬ;qkdÓQ` 3 H@TJ0΁ϧ G-B 2Z!hf=k2||4Ҧ~5mZЙNՕ +.A׃/ceJ2%h& W6B:ɽY*7&ޤ揤ח,XSAÂXu;Uy#q׻{ PTeT=WvYN[_ AeD W$OFGLQIHAN zIٱ劸Mn/=`@HI-kOq!,bh< @g!Fxq+$E oŀQ2_:9ekE͞C`s4@Bk"H}&frRWN;x]L8E;R\rp\$g}[/L4DTeu+Lt&AA8gr6 D}vO'!TbT:~2=!!'Aa{/ܔG've'2ZX>'qa~6\D.[D!aD9)iX'} boLRq/6xHN\tKl/ X H 7)!Zq@]1:4 q6Y/9sʖ rN {K8)t6h6[Q+|-* P0HJ i:z2u8 0}2+ޠpS&B.EA.& %k5#<Kl,3]%"b8IκZT`CN.deVhd)88*bR7AnV| Am /:Srtzh{ v Q}-SQ7 ) ,ipՕ ԕ\4C6R:yAk-W?4譜_( y~`%Ƃ-SfU౟#%^٦$h8kui74_GkGU9܂FR%żO4o.bBy>z;!@%&0ЯMƊlّWQ`c^䙗gk͵kfTRyI|6L֡.*l N({0bV*kR3x!C3EZr$a^|sH 'KypI: ʦHhlJCϬuΒTӡ5Jp^waޭml$qe\[_lBf kl,aBpޏ.<Ց#[̳s+KMxtiEg5a^F$OiTEV(lZT*%+u8h%@Ϭ$wa為ЬBG*I$<;ذxczOp˄{uaiN.VJU v:'jnuX $Ay-K/ʜ#ke .{*wBw-@)TXs3"G}\*+wc;%W\VƢU_j):!DrA,!3¼#cw,<]l?9JYޜ?>cK8Tq- C@8P GRcdžB{ieJ!(aI/3~ulS{iSdns1}qM88=G٢;D๰pf0qi]j !nn>nN>]@2Zzagg{A\߃)p4Ĩ눀g7i u]R!_&n׭<Lxo^SV{$c&SmHZtU]VBT7n? ?OWq?:pfIX5zEj#mx@ NqX40`̍y-] bNW@01\+w;rG!yLbCF 'zeYHG&F)VBI2s'KDWHJ5a tK>sf;fjW3\1JKn?A\>0G7PJ*ӅՊHaڭa'[6e.Qb`,*;1aJ1cWH>,/ iI8T)wyGxpr<>JJMZ$YZd7 SdbxʖtbF3++WP)7Dvgg <7(U V3U;:&ϏBu.&N@O UvUcUFxժKé`^daԥv/ CZ-aDW<#TPO<. Phmu?uH y5 6pyX6?oTwNlsAԣү\χ=*Yѣr(Y `D4L5fҾgE[L 쇇 9m@9-QY q`IJ_cfpјBudT8_7V55|L&Dx)09Š17Ù1"uZG ]loe xWYdMRLbnbPKd!T:S䴡AOMi&UW$эRF7 eg$Wwu))vC bdpL)y(jW?o <@}h> Mh\GO "WtY号[rH1ԘeQ:߻qn!K* :9,!KJ5%Ao֮!g y}$K(C>(ѽIЦzu{.^V~J!v 0aer"_2>!h}[ޅRPՕDW׏9]@.}w>u[$9}%ѕ#[ )?QB~W k;n&3XRt`}6[oyD.yY\CT#Z{r$YZR!XI#Ee . X)ˀnm ǒYw>euj&ƇTd7Gc:]!hOeNeIޤWמ xq&+$汉!koad`uGVn!yВH^)>nb^!drAVBHZQX]QdaGsbp'p>ްWaKr6@lq]KYF {=kMSV7pX]ʕP84`~)9(ibkX&n++r4׭ԵTW }Ya^s⹬W TL׼"VkCpi ]y^]/ >OS[LƼ4?Ra穉0nAHԼk(8ΎjꩂT^ &YPH=;"u)$;d{Ihu6ڴm)Ӣ*4.VtjKp`upӋt&;ӗ(`յ uFnU1sv[N)BdkuzRLF: Q|07ͺ3 d  Sh X7Fdhmޜ)D!R9I0VueY $;-;lT͎nc~*3C@ח(w[.@K%%XpiO0sdu 90b_S\9/XL6 Ou)'J1sd<+W2I E4C{!y4Vf oum1 ׹77c,nKdB^ nHZ3RƱSt,JbP+.yf| ޽1$$)$ [!+E2ᄾ~'9NIix3(7'~TpW,/PTA=o|LB@G᥊o+0Ks'#Օlt"@* !( .R,@ ʠ/T"5q0Y ДGh`MѠ=DIw##ıÐBPSJB =-i$-cJ]"~~P4MRX{U :y)ΰHB*"I,7 L'D^.P3EvD9Sڄ9%ÐmKx8?XX%Q:{o0y ’At{4 Ċ` 4lK*åWf טe@˻^VZh32¨2.WJ aCˍf@O%(MpTph-HK5 $Id W, E( ne!U>V^[h0$M ;LvڜĴF&tdN G4e(hbF"<"t YvjI`4^@GF ǁ+&`F@)Fq WwXG-OPSA"e"72fXwyGYDMiBI}V{8 yRO\6@w DӪF4-`6SBks|0xBd$jnM(F8upfY_ɍr,`hH6UX@Oa BgTBw}A$xxB5 {: G$ QOIOJR=Dmt7`p5i(_L#  ,ϟpl:p0U?th2\D 0ǨW /8& ώt ãbT9c蔲z.ɵmSs_4ǃb/Bʎ&zq׍)ڣ^{hSF}s4/*δ=x2c=ڐ <R \`#cMӶ^|[fjoif+'b\JfyGek 7㏷1L(o|hxrxTP"TAQtSWE7{"`|S}fw&kB4 QQ*8I*ZO(+.EGbνND09ޏx9lTiy GۅfmϿg۽e^^Evjn}vʝ,|Wrb20]r1n1`sa|7"qYbs;E6̠QZkwvݪ#v]H }ϣ˯vWol  {l{% xCeݮv@)'^Z8x#"/櫦I#7l($Q@`QJ.eQBv*RY D#!F.}',&}\@L7cz2Ƕߋ%*J-ݟ._- Ū2V^5 ڳlS}No]ÊYހaz.yԷƧ",e٭NsnOta[K[b!#OP:9dG5mޚ^~G2vcďc63 Hh&K{mE3@nVaO"Y%^` D4-ٷz&frreg^ 4YJSRr)8t!ߞPVvF"FF,X.(3ߧ0DŽcثm:)s8WHX-hN8?zjqvGvDUq-HvDA(B`gNJR7Ǯq5݌(Y jjmlj0P9+ Y-mu QELKD!`I)AD#'|V:h?UÅj$Lb @ #bg߲rvm8n̺lMpѠQ'XC.Stı\f6I(C-gdeA<ԽnX4 zj"$Kk$B!Y0됭Y1y{ef:-w_gz/VݴvYBԐ8VP4'%wwcH4_mб%aQ#F(%nBI\ȂSx֛u"5OJ 5!H5i_ Ӡ^_WǵOvg?j=cswg^^wEmcB+5c7lRdENi}W,S>53w죽2V'[=X?¦?>BsUa =}F|'TrgOvY谹kg[&.n[q a>gm;m>0 xU\z6s亴~" }^)>%`x S^t_5A8 h;̈-UoSZtfOU^.Mг }#QBr]GjŅa31RAE]` X?ZXΤ2|ɣbj.<)XuTbݘYѫT^Y]DZ%YL) KAՏy GzzbI,~d OR__5Kކ`%LX?xIvꍣ}DTkÿ80l: ߅ŎTE9=vtQdxw?j93 HNzЄu_flhtF4ڻtY/:KFtvȷF[?n9nbW*J%b,Q(l[T/tV~i0>n#``m5:e=G[)m} vޖxW UIBT85-t Q9C;ȗRFlD&Y֛.(nH7R5zgPx'1jS9.Uc u`b\FZ扣GVj<.VE!t+nP^^m D!TW5vq6*./A%N~붼ەf~T^WW^,Wx#BZ#GV8?淯8RmKf)omi'-E5uxҬ yd=Nnc&Є޻WT/ حI.$o.;ӀǍ8M*q9:6U،i;(Ø +dkVʂ6O =on[CJYL0 ryyF &<Xa+v5{wf8~c$xQDizxx7a.T47"VyĖ_eEVCOϲI,Rm_'lYŁcl]`T;iM̱0qdm7YDxw| }f-swKݳK6wu`d JmxZ!>9TKgx#f#G6>AId2r}[ ۅ[Z)-?fSZj3 R^;{wZD2+ qj%X*odm c '[q![ܥ㑾Mƽ Ad"_9C NEKAT S.;܏;=? }9%q)Ѽ㑑d3~w{/սv9=+8CԙT!OP#\rs܋a+4E xSK)_^9oCW= םBxo>z5P=fc#\d4-+U.elHa/.~'BF'͂l{'l7jEoѪ3we,6SF[&9Z4f$P\*U8BoJNw7J f`N'ls=)CFx5:ٛὶb%F\'8'pA]晴]x~ܨ[Hp3~>_5wbb8뗶VHdj}탇SKY*0WmF:ӻxL`Gϛv| p<)mڇBM G"xm!L%|9BE5ou߆ c҄R/B-2C|4q֜}fr T$J)ZY25c^m>{Oyቴ?s`( X%y !M.BAIq_J|y,.2]ޤ7}*8Ji@'$ uX Ѵةӊ=*GzjysCZXSs`w9z #vV?"\ 68;-j|ަk7&V`+nj7bQNj#y؃i*6͏1nt3YDJ5InYo)o'z{*gELD%Ց/s1L!-p?Sb&@>8wP\{ %+&!շ>'1o֏貊nrB$©ߞAy>J \o's#cٕJ|ڍL1w#Vm])RwL6\y jעlyac'FfFZoWTtg3?n-2 F6GؠAN7(w"j8GG.@Dl$Q$?D8S2]uwj{W4[l>[O|n<󸘫<ǽp{ * >tM>ǵU^&lJBVbtיw>*(&7e+gCcy6IM5!=FXՐps<ѡd%wF] g.VÞ,v4#=꓅1wwh8(Vo bgזSIZߟ2eBҐM K3ex. , .qч=ϐ SBR4*wu492`ej0:^$s3+ .a5 ۓq* lvKk|-v>3|Ѥ71qDA gÛ$MYP~<>HCm .w_Ǝ& ۱:ѾWvp|7vW A9>[οv1/|CEb3o?+yUMtrCB+ou|էOZݮm=٬=} U6]f}z9uƣC/ PrS‚yRO٦ьKjH6&xZqGOp^ZuN8Wڀ7*qңIñ/g_1R:>{#<&k< x}QIs(Û3Xo?Mk lɑ${cw{S5N6. A&^$1T#!aџײeB_ @eu )wg( 4o&1+!fM7+xoǞhwGGًnVGNx=هCIYA7پeNsD Y@Ru1x-azwPd>lϧrGgf +#B3Llvѣ_V>n*GC.mWo~ăZ"w%Oτ#tR B@z/TɼT5+YeQ`8.nN@ ֕;w$)=xBз bQ>Le sv3E#v=Nk"i⊅ʏPzN"Z \>2Vp$~XHȷ ֡uR|߄)<9Mw=X1%.i\Y.l-w֑VDs$ʘ~E7u/7UBUkbjM>пOߟrF}gz\jrU.X7'R# mtV~Z&9[ƖoS|%EO\y"mFZJhەa=LN5åp(.NIg9fr˿ꓬM3O 1R;*zilTmSρDZE2l^}jujEoD(,6ڜ{t9:1h+Jt6c Z*q>--V2lZ$9Y#Ц6Kx 1'MYk d23 ;mMV&kX~فs :&ڦgZxm7 f kkYG:o&)3W{aʓZ4=p5FJԪXXBOnn+C\H=iADoqYW#~xR8j騙vPze :G{Y WeT,OKAb*I3%H9T/q0JeUE8Ȋt'ǃ W uJH)8.ϽT!o<1RN(XS(r` | C:Gm ݗ'.irP2Ko CK䤘Uo*X&utnQG*A{xKdxNClA|8CMɯ2z.qv66NWd 3/+{E9TPv^9 ޝSek3t wy98u-mW~OMgfQ2U^1fGZSy`?q{#CМɳbTT6Ku4M)VsC4!Ͻ`mʣ˓w;儥]ZԼ֬Jr[6yя5#[Y%;O.#\ 1R]j̽TMXF"0Sl@\~4Aʙo@adPnʧet~W(x|Ȳ0 Xxnt]UQ2m%51+H0C_.aNX-h-lTW; įU_(+gK "#Fwɾ tltپMJL@)(-9 is'c0eWppz٤\Xn]\഍z<\9Pոxm6ҿC{щշ%3034P؛qC]Zf ,x/ЅVZ\mĂ75UEIl/[pD ,2ɉ}B(i}kzji7'Yƒ溡ާJ?7V۫Ժu?[XO꽖8MinbHlr Y仄\huAE m7#:HhzuLc~~~dV i 0e"dOJ΍T 8ߖbF$g0;@NC=u#TxKy'V22s;h FU5y1 ?/9j[X 3ʴc2`0Ms/8jvZ)/Tsq nA2RF/p%Gfc& VSAfe8$A[mZиh3وܰ`ƼY[? kGz:1{ƆK~O^Dд GeҡõB}mC.,FhmȢ*fj8:훌|{FKETL׫)/pD+U8 YU,B!xLFT#g)12Q Y{V&21N??yPŘH9Y2J:Q]YD-ɪ DZr]@K.Sn.Yu;_9.8-Va딸#UwaG[{6* us=b >4m<SМB{:rdyvn埄DKGKj寁ow6 (0ㅤ#Ш.sB^@T*i4òh5ٸoYI.uQ2F帊*W#1\;w.+Ż \ fw.I7Vr.ӰatQwN4݅ BH}_a7*H3U׺LUWUNU~wQU VXel3PC|OAݱ[3؁`s 58ഘh/d<l,鰂uf]>l&Q|A{Jᑆb-$+PTvH>]Ċ09+O!-cK q7{%1^څpD~y]W:Qėd,FqI:Y ޅ:4^ B ưჍpj:F3!a|0G]F?% ,&_'N{iA:s=-e0LN (DWUHAz@3$6qbL>I߼ 2p]ϔVG=1~4TgKgQLY%zMFE:#`( ?N)7DDgzTi}|A=m9zXi9Avdkz$.Rb۲bA#7^ƜqE[C= 9k(0#?=n4zVRW٫%3LUS9+ڼJJ^'1M7 Q_bݛ}d% wz`w6F11OۥOvHIma~asWW- %4,7e4;WS%+{ mWu#KT>6 u*1TSl2{8NmQ`ا \KX}yšqإS ( %M\MoVe);0>\ [*bGn@إ#X JJضE ]9]qm#hl7rv6)4sr'^&dSQރ5"#4iS:sy$yONvD!t+" :O.1FTţ(/w5~nO^ 2/jg*/aWqMMfsJ = Ty=s~݉[$Ç 9REE`E8C\|ˮF?/gq6jCQ <ڮ r'ǃ6 Ly)yQ(ds+@56Jxc|x.[z=OpV5>G!U+Lv)2L#sOpA}&Ebeqև72u=(`8لqG%:6.S$})Ȋ ]y{vuٛvQw}2Ya)VW&6\v$)=Ԍ):{ONvmWڛ8T{H OeVjfENמ2yiЉU;jze+ Q 3mL~n9%*~>܏S3vE+t ^F:UJX|[f$C~WڊDyAn&99Fz)$j#L0C\@U,'( XvU,:qD]8x,]D'CH] H^n"|%Ų[r˦]1C7qӶ7,k褫pv,//XjN wVhv +cz`;yƝ6a\ Ƚ͟Qj*Jn_oV:[2|T≀{!Ce\dRZGBW$*Z3CO/'V99F<9UUK\9]DQKީIR PgVQaގa s.ey G,Z >sN/?##'?(6զ~Z<4fFvJ hوp}>BtAs&RR'fVvjҠfNT;:Ҝ@5|vOs[/kF/OxPcMJKw8ћLi6b%iNnRE^R 4'ƣX(VI$$3"S wˆ1 vOH\,qa["/7b,>W.E,cv.G)^r4lOkXWy8lϨf}C< Kne";d$I㽹Sۈ ?٤S0vl9%$rr@ O%9,)EAVPJibSM9wc:E&y(#,?O0A.l2 Y@4M*q}}' hTMk;nӽTҽ&2!r:O+GnҢ#P+=JzHih2s(n^^LVY{E}S<f!1vmtebQ(KG21\uV }:8%ǒ`+/S' EU2~I6m1a@bzb R'Bc 3[Af\ȴxa2_lZ$pD/=jPGh45tic5ג2NېW"d$) ea -6mQ+ibHw!D/9-wO\l[f`:Q會L{)twLΤae,щț1ER'Z`ݨXmbtރg2+88H+:E0dNa+yY7nFk1-7vwlb[a'Bm2'D.z貀ϗC|̜Y+e*_?mh9Y2LDab>Yɣݭ љe#1cOIfm>ȴ^ ~ j-˺#X#e5ڣ󬂕[.񢛡F{T=eDʊ9n@)e[V7l3&؈ Θˎdٿm$t^-NXM ',AIK; 6UsdMA ešk7T(UO~K:.B(8&JZekTJ *oGTnZuqkTT -ʼsB2,eiUl`}QZ;w_;G_>—QX>{g*L`YppL3'qN|%qWX B|N_shz>SR157@2?hQ9Y9p*XA`Dms׌)Y <'N_X1_j^J!!h _{Ԓ\;l5:|;xV2!u1Z/HSG;h@1ceMa[& .D-FV ԌecvY^5 -t'YfP q4[2-NLvF)pgCZ%w~`QcB&Uv \m#3>4w!w6ͳ촀́´}Y-33; ~iiXSS+JZ?> 3 g|\XX9$Jim3LhkS|(#9P[` +[Dug Xы\la1N4{.C_S`v9KV]CGxyICnƇ\@V. +\@VUа mgZ 9իzOյoUYyJHQDP6Sb{rB|KnǝE vv>m W=_(i0ـ⫔iY7V)J Dio1y3cUɚH3}?m<|ӧD SS/#T>aF8 0GOn,8\7ԋ@|dTAɉ9Կl&Xn'0xCy?FVӊpS0A>TcB>q?Mo}'ć u qʁ}*4ͰjT;*Aoq/;C L+:ZFWX'vsP:bɛ?q|F9.лwvR0_ũzx35^ruҳ}Ww5},eT a f2mޤ&pq \g Ow:`J)psxxA`ª+EbD~t.viUmCdidvZ/;cۥI [y(v?R;{Bnm्0FN)8Հn ,F:~Hʩ" L ; "8Fמ5>,3D^"Gpou?XG h/E+ª'*iz0#dZ5avYG>f U*Ǭg[a4ߔ~CCa~S98}@XwԱ#mak]rR `!:,U_-:^cY\@ zz c|iarI,ݲh*0SfQcBmlT7_G,D#d;XLagi"MMokZ;}kmÚD%. k#y[`ݳ_TB@h C%|P=2yu:!LQMoX50ؚ`eDXj; zEưIG!7@:eME XD%$Rp/{!gLt`+^|6*(ϩ~g~g&u.Q ܚ .;ӵڦ z ({({?;$oG@`Q =wE\y:K1V s#KN5p9=+u _[M^Fr[Xk w'ؤB080iMq'8>k<2h0qA ikwD\s%1fFrOc`^(<b- sKAv>Om^ik͡G)%j,?0i>nFyD ל*ڸqf6,Kdn9oJʝNl7V>brzYoɝۆUmӭvR{K SdqI&m Zҙw\]+ߩ?C'+x{;Km%B_;Aw^4&'m?{UL*&`HB ![eв dc; J3ԛvמx>FX}CZ.4+nϘO81!6͎!c>󋾽 l [GTg/*Cy[[;etpɜc(}I^TLL;WIz3&?Ɯoϳ];ŰL )<{];oZ*^PfDvRiҿ{l*uԹ% v[KzXi#8x8m!N^W!@%J5bF-r sxfMWbxB+/*M!DybJ )}:\ˍ>ᢦK^;|1ZGܜY!`)q8#h|T]*A"W@ K~:TxՓƠ. s(u'TqDBZI@XdJܒ4DLcRjR;y锖 _,!~9prDDa+ >^{z rO* 4(Pt\ӽ=gVdORsqVeflJW5k]D:zm7Y)ek5$'W8*sawրL+OkEed iBC՞lÃ\J=ώ80ȠZ8hnH)yT|NHse#$2g; -Li\Z:rJ͟rѰ6v(ucÈC{ki,acuG+Ih#"jv! GIHW"(8>LU:':$B8/h>9^ 9tM`9 a{zHA W#d'l8t#nzt+TK-VX5 V ?۾hɝU4ƻW/UmUZTP ݗ1bysN]IɭR[]?yaTǮ 8 6RWh>z|y ~<ýg XzcA4jT9!$r:ziչ Ѱjj4;d/sU{ZՕ!.a?'7ϕ_iO_]>`NAg\W|Qos3SqN# _@ǂRl0# G8(4t䌙 Le@D]#Ns>>)Ӱgg:@[~o]P3䖉FܕWfVrxƥbt9X97 M%xzS*WiŁ,İCf?NK9Cpzt[͛v6VuQx_2j,mؙ"w-cu >w(}ko12n/1o2He%k).).kڪЏlcӸ^A3qM3"3Q=P&Cc,yB]#y$(;uxcTQaYX?)$s2z0.d|sC,_ Bٴ 1(.i63Q <zx5="H uX>V^_nX5{0323;eəm^Aۿ)yz&8 SOg%,z&lycI8|)'4l{abfVkyoG``Q~Z[K`OGqU_à)Ҫa q/$Ǭ%%MYFh7~ }_`Uo1} Ʋ70sO}V/e; FJF 3S`)Ad|MMqrD, * 썦J: -ZCxq$dn ᕟ"hBg / <{I@xqQp)0C !q*%P矼bAVJ. +aB>+g߳bcQwHJ|,ȤBSa1,HXrƘ#L6?<6\ST4>=sYzODo[r8{>Sq+vpy@I Z{.Y@Yz/tuo_Q|Υ ,r9צ#`9gJ_NB,ik$.BӋujy',r!p:i礳\E%0@5 {(nWv@mkN<{HY90&aV gJ=rdf')à2X%DzH Qo}ƺU:}'tq)x%/kK7EFK+ݏɰ,aE9jXa Rh9Q%Bq%;De'#@"c J ^F\n$%i,oH2k_'\ ߔb矼h~ROҀ1HhPRnm$J^v ;Ajy%LM M$x𨔽*&W߅E(@ǀ JjsS| t)Ͻ eeY2asĘKT؂Sܼu#. RFIvsɉc2. 7G;ʡ㠜IVʩ>丑^ޠw|IT17O;BVW \M6l!X.gnr O{\?sr~ @a2!DMIqX^F,/Nd@. i'z,WƑn\h CcvJScSNdF{yۄdwqp 63,쿗 o.:GW,%]4p= t2SP`e; Z?3es*m kYBVVnfw7 -jB^2[*h:HhE*_ύ/"U[WW8Tœj@[{lвܤ87wNK@jZ4mʂߠ]1 &@5س-SƂl}(^LgvFǻ[2ZE޻{S =޷5Sk8OJfHK6 *'!AA@! 3uVН5_:X mz 1]D7uAê YJ\#nkĮti"&#H_ثhHE5M~uO?%mj?]JlVd|Ǭ39G%]3F3)>?9DP Le%׶ obAWGi=!s+[j F MXۊ D2[BCW5(cUqq VԕL*t0DN%M|mNUV  뢬pkk?C16n9ctrRl4Z+D\ NWpdn&,hQ~ΆFVOra+Oaٮ5Mܖr)G5/ŭ0 }&!e"KT[()|Jeۮw1 ٸ0׶UC\L?~_XbW1;K~ع}3e;x>Ђ====,g|x};< abmRVOY!gxP?l=ތ6Wd=z?6JR@bꇔ2GyFR欴0-*<X0-B"^'[JJc4Lddwh b b "}&H AntS:Sq`i \#Dt "R!LbTT +Ʉ4_V1b"$DO$P sGɏA3m@L:yQMV('"!^6\_(Y1ϼB́\&VetnBbcl)4HN=;f>6oNGlsO>?+σ\>=aO/jt[XkM5o;H2Lj{bV6FIr+ܛzcl48gr7A On?Ɍ^f߀_8׀w(I*bRw1cKY 3Tc]n[X Ő+^ Ǚa" yhlF44eEHafZ @زs/,md(?]>wqdgnd, vo y̲ߤPHgFyW_,J48&(K^'f%ׇkЫd%3wp7RE8Uz bF 0+KZ*I3ɜ1Ye57CTG <ش,!G(|t o|Rqw;>琙2#Rس=#` H ^PcшC:HdǐCJජ";[u $mI CO$yq u.(P| KKgFp9t)WN]ier;[J&,'N#17WTCٕ{ &&r&O=(rcyOgdp^ 3>WVS$@ݬ S,d4ʨ ^?[ju#W2IWsvXs}ІzґQ%wK{^U; mp̊+:._m 4n6>^)&Opr\٧dSɀȬv dJ<$%ðbOx4qp@Frrgg)/ պ+ H1 .P(X({2Ƒ v`u69An(A̸h 2W2}V"W ֿ-flbr<#'1%2^i;9ʷ yc8= M>Z宥;upyK˂e&2Z\r/QNy.? :sTWj|r0-S`n&1ٟu@҄Ư #s$\K5X@邍}=؅ ]KjPqm׆g_/kQ&s~I΍5ܻ I/=RNٕWwwdžؓtgX2r_1ҝͦ JOk5Z.s;ͽ]lVZkCi! 0z}xM.38Oʓ^Z,9c&zY\HN:r"XBk/7U" gT[̕0qrzI SW_dٔ=-Ք~%O]-?ɇ?s:qB)D@RȴdML0lf  B'i#'Zet^+f: hz)X9X#)Wsdm2-HڳgVΉz l27>ۿ oysƆŽR48e`Sa;\NSs1Us@}FZ` Ƥb0Z B p7So'*aʊA^4_tb+g6Ŵʺʅٓ =D=9mKʇI|t H๦!\/XH c5 Te2oK 0-:*CWjlJՊ(^^Kϐ*H3wϽ搉B@@4aM"w'楁 3Q";W.{%҆t&csXj e|jBLN-t$@Ý \Xi!'W҉} nhgl<¡S3fGA 4Pr$j"&3XC<4>kK+5Gi "Dr R c#Y>= z qȷ%-t'cGK\ [SƟ[ vLP=DI u 2PeZj*3N,yߏG#1^[a @-l=Ӂ{lfYGAܽQ Z]\ ͐v9o_( H&g>:ə4AV]|Xf?y‹8zze=-E5 HSR`8ȋhRObêu;u49NB3z*I8@F$&;}3_L PC;ײ3ۉBEx}Ť^(2>`h:54J P3 úRŭ2zBI1r$*? *qxƟ8 DwH]R\aq RLVלiGu0Du{ Cà`KX%46'xS4Z YM ǂҍҶYp8 ؄IomqcL1RFd*:=u+)>!PBAi0^NVu3Pl2M Mѩȇl+F91%=ˑTD~VJ:M*zCUτe˛df %=! FRb/1çg3]ˌ.<ѡx7Qfy<_bbGN#HZztE|60EpW@_O=Ë>NwItDxXϲp(^,!j*\ٓ?e>? 6mq3#1%<4 bt`/#КPsϿWV^7…pU]V}'ۙz# Mw;q캎[Q)xl En0[ $>EaRM"tg`Ix&Y56 ek=g} z$%G)0  Ђl2lNz!K:[E#➭C ɱiCoIvAhᘻf*?\N! i}ѡ1;q|+Ϗ(a.@cxU lZ#=#" QFtjarOsSWm9g1=,[.;o\jHSd @=eԡgIxজ9x'-U?t;V{ aCANæ"k7bۉ2#%tDK Jo1J[1UpiJ l{ 7< 6L->9ˡf3gdzɒ^L N Ս DaO"h}QQ gȓѸJU~%j9 6^q ҟ)  L r."E$`UMf)}6@\_mSeB/ʹћupR:%|]G^vQT/.!u --!J8Bi+E`gId kFp?8N&ؕ-1n4gclg\ _Ҡ#cveKL5ler4#%ôzBu-bk_/7m+iWMg[@*YS/tOnH|<67nX֚<\eߺiD:{Lox`P6|i@9: UIî9 Ƹ-_nt"DDnPLĤQ+-CXACi#<.=HZFAx fY"*m:j>Kj1 D@y };%5iNƃ J\Cˤz}$^I b zD/QN_VgB'?OwB#xh3'haaׂ'gc}'vCB<-ą8~_2`)~H#VCզ[ǧW-&>r=z^Q-SIY>%PU|,6()|z(Q|z.R/Ծ1ͦ6Ɠ90@y~o?~ Nf;?݁wȤM#yž B}з _ٟt# (PɟVeg#sҹR<ˢ$a] -l*J]T`-s C54 af 5.>PT ćl]#w~24iyL#ilAM@v.FWR"B^2w6@ _乤wHi*8ǬY78r U0קz?* b0'D:ykwq>n壀B>$5 |'yG@G@(o#a.Hb }4^!GyOvI'CLn.|XRtMLY kqt -cnؚg/1wuqb]˪c}x†09Iɾ\=WBܯn.4}>jFhQTGd?pz]hs.β8W6 'w]q,@jo0ڥúeEGFе5PwDN:(3Dh n6ĒFC3t9D. Ahy岀V w4ojiZ5 Zb8L UMOb;a|]T3x_fu42@6im>,ihS1@rt^-4 $M\J}ܝԥr.܂tv1koi 7\wD6v)D@J9v/FkZ4J{ {hnHf+Q1Q7 ) 4;uC+ji[A4աk{A`mb֜vΘ3]j<>E'@gy;NRBӣi=hPn]Ji;"+Z`I-pt;bI:A/l~{|]Ouf ћ.*S]\La)prVc &UCa^"2jJB(i! X%љӐ;Ԝ)heV! ls[bё'6Ke!pq=qwZ됓H,?g1 \@T3qr %hykƹSNr$,gm`{Y> `b@guGU_)f&tTat2I,}*9(:3|o")ΠKDMϓ9 ;6#9%?/8N?Jԛ"tbtNek8.O)M ?!5&xgg] "|cd iN=>M2/^x _<|gJiɯGk\-YFةÄ#F#F#F@0c˥KD$nQl{F;'iԜdz& %ZuHf 4 -}4hH?p)p*?T:15Tş0a8-\QRa"Jiud'*&bWyzxpH74:;F$]C%i#Ӂۡq/,o( bա J;x-{=D0۰ɒ#JSIM%˭z^pn6^!}-漮ǍF!DPI˴9L <s nk8lJݜFBGG~J> qA)-nI4ʅ}SkXb/Y`. 2ǁ`\HGÈB M\ L8c_lI YWc|{hVއ#g? 'Io`Zʊ@aޮTA>$[±t<,2B Ƙ-+YHVJ3di @8*0 d%\ \-COOǡXj`ܓ^ Cmr޸\K4v惿PC@kw:F(W{ٓî@0 a v47\6N`0,j# 4k#p4&>5|f 6A~};^}8OK Ms))N-{⥪9aŋV 4F9* 1!(--J(ϮI@dw0~b =jUԏO'Ƽh?:;~\WS%Y)r" 5gxlYJ;L HUQ$9B )8-8Rs",Yy%L*@X^BhT0Vڝ4"KztseXAt:^D@`apZ-M' $@uYƎHnE@r֘đ1PFԜ8TR;Y2ʳںRn@$|7_Uݢ)xQ***)1%jCѧQ,psᏠAN$>. 8 *yHz%%DʲeXTF >NE9buu{:wo7RD AUwTՀڟ&W-bhNíL3iB9ٕ=cTAGJO^ϞQ8ܘ ,;w3$|'GiWN c \8/ѽyMG_Q zYWkI !\#s$Ox[_k뎖۬02qKWSMܸnM%٭KM&E ZWFͤ%>Pq^=.mx+{^7P~w'{ygana澸)w~E9մb/#$zm[qO, ? jZGY2},!5Q-$NUi3&Sz;eD 'ϑ" t-C A'K[;؆R^*qDvu7=pshpjC*$$2LLAO-\GQ1Ï3Z{e:B Rv5gўiN]VG/9J Rt L±F3\g6T`iqfS̫Bt."BaZ@y4Fj"]V% 5T,Q#*6<:G3ݫ!"t8?<{ 9K+dEI mLTd`XKd@I,eJi`bs!{PC +]QK\t02  r6lq`C ؁$2Z&sLU#;*7b&^.H ha{ӂWy Q[-G[Ls$5KJ2o!d8(s2dvd'fBW*}u[v?eHӛm4ʏ!!ڗ`ʆ4Ơ}&#rCPk,I6gr.w6^4QglԞՙӵj[2E:.־3o#h*uUƌѦ.f4JLJG5{(LGK#.N3+~ޙPy.3=i6`Lɗ\1]? Ԧni "{bQF3NQS@Y1ȝ5âWo1ԜIh gp=1|-Of'A^Ԫ4'% n#0؁z>do&}DJv~'Z`Gk^jջ`m#e0.)NcJ/u).BÖ Fck{NXa_;a3kOzP\NNVo{svovgfwŪVz΢؇l.q(',JbObr_!~r+LPpXAE/W %:p/pH>#צ|9`Fc)ȰGDѱ`u %ԟ#/Ll`O71ΪcJ;<M#c;(a|h g-(YnM̲TA\WSCiVb3"DHjmUdu)"hգG>dCȑxJsT[ĸdrwXbB;SnT?W?A,:9Zq??iy Z&?׋)\x_.} _S`R9A X\vQkL;pO:)ϟT 3آZn^u{kˇK80\TM 44%)oKnA' $UU@x;  ~ȞDt3mQK㴍FP]#Э*NcEװ whxzxliy/3B[' sHطA%&#RʽhӰ  1}JO>'"e,urYD8L-ϭZM> nXpk.uL5safX\/k`8Hp-S ?57AO;lCdHUgl8pt9^S !ZY|N"B[K|-ju]C)Z|v^w# x}+^#&&6{"T%=Q1-gggfzPdQQ%BXJE#u"s%H_B'BT|]H,qYB}jgM"Ⱦ+DKз$*t\#ZPQsVmz-ృ'-Mg*r0sWVʉ/c<7'0w s&+0Gtb4 X/$:$MQ[YDmdz_4 i;h zMR%lMW->C|ԫ奁|/-BPӵ$;?SQjM'܂yKitko5Qh)x;D{&L^@\)buESLS% Qv--Bڷ Y(/AB%'AƦO}|.F&ÈVKRD߉ɝӡ M$eZD"]eFf݆Î,mp `Ũi!U('b>v~mZoi>b} 9&\`&o,(ƆXE>Y/c3˳"  Sh2qgޒ:;<<"VIn[o=իVhLr+Y4 UhT+eO s&6\aRVaa8Z\09zIyD}=Oqp< GqƇyB7imQNjXCTZGЏ<ĬSr195(((@hM0o3P јbǟ\'C=ztrPCGY^@,06%4} wgOTeps)7ఽ{?lz&tT+iDٕqu\~LϽ2M,U 6zíoy/ד_!}l$/9OY0Q~t~W`ʒ+ ޱVd"~Jr.  V Op| r-rb} b~qx?X٠>mXRp깍sɱZO?:І4;& R="KuPUȣ(P$S`OZ՚Sx#wq$jlNW3WP#-)e3z#?̲` AvѱF%o`-z2'3n1T*YqZCX C4.J||_lV[Dй'Z?>ԩt&j:~^\+S_kĎ#,uoV1x0v jhi))ET Ѿ)ЕkO`@nGOvhEXWiL^.ڃ l>t a0:ZX$i7{uݵ)׃aK~݃hz]؎~=wLrv!)tμMHDdj{]o4H8?$=uyзakÁ5 [ {OP1aD&L%{Z3]]8W &PuVx E{ M&ς2{\&vPe^e@28J5;R}y @#6_NP) J4 CB ciәw6`a GǛ\e_+3Kp "ȶnpS.\riܠ2CkM:j: 񊁸D/z0&1^D/ 4Ț 4y&0?+bczzS#6=5rȫh,zk Iixl _z _zTFlպXHDMo 8AlRW6$Tv=!@{kEX^-In,C}R(K}9ؐ{q!ǰǰǰǰ?lXǂD:$@<{c͏ tGjV|.Ey]C޸1oqP 1"?"5g,LԵcM;~`;LDJ)9joF XpoMн}#1BG5(.ËJވ0ӝDB ^vsofOJ,--OG~Mv!%C ,ڦ3#[!q' ͏{(,ϣ@ a+撢ON5աzɓ0I zwUgX@Q=Q"|7Fofx|QRtOl wϊR<^?^?^q_ }ʄY^#T7?kOuxD1_C}ঃ#.#.<>>zN<~︠gb>)p1{}4*z :̯D|>HecR,yJVq]u1 i9[#}d38kp]zGKX~!DŽr8 4ng\;2]ʯ=~P{lEm~6D} 1Jc6!agSsj>]WSm|e1[|^Y 7R`)ɅjWɊ{wџb g5eU=Te! AyF}+7kv+pOnX>=.F. Ӄ;x"?ZE̷KH^DkPƛ9 澶K $oVK~b(KxMmƮ(zGL\#1FM-0h_Ls"#c.ܙ v{:f"{Qe7΅ɻSސo_6Ty^x#/ȭGgg=m:*9 "$ἻJ,z.0~^:m6\v#9O»ğĹ4 XM29MڽvwgP11 4cUv*x ?ξGE[<}GGGowе:@⋔87JLn4(אTlz!5 0p1|+ 2 &@? ࡯'~^nwy7~_vw6WpMz[ (xn¥׾}{]Mߩ>m<5>1˱z2wF\7ZWbt2max5D}7q.  /;ۅۅ oz,MjmE?A;7+.YOkWWWkj{1CꒅsD̳[<[}ZqxL$57Yu''(_QR||ZVFQ+-$uvGNvX9,^%p9Y yS $H] ;w> ͏ͭ.ڼ9"[83^<>N\ya<~Y=M|="w> ֡?}+SRTw毹 RZ3,+s{ oAa>>UWqUp?N/.VMd7AySy&Dk(|J"r~iPq*LYhйd$O/-wrS+ X#R,/D19 ypw cDkݡ?X.IB7,&3cF &/ ];QvPLFQ'ETs[E*Ԟ֩dX%6gex ~CxژSꬅ!{IS}yBSj (#z(TOX?Fd>}Y:R`{;MydP4 bT3 ЫQEj_6w֊N5qFEzY>チCY6P7 %\1"b?H@; ?79fMup:@!@zr{8Q?OFdz/'µL@зt{vIiwF0$y1Nd;1qXVPv( -!&Gfk(K!xnH;< /vy8<&z.^&oc^&l6Ɖ& k[VЃVb4Ј>͏T3!$:3C&aukikv DPTt~B|-:bNg!K'p{~./.}^3LorV9R vMv>ݰ :dy8purՊ>9@o_2KRX9~Kj8Bj9p߽ Z#ya4}#+{͸qB=`jZ1Hu˩SJVתhByrk~ɔ5 牺(@Pȷ^=_?Z4-^rG ]yɃvldyZqP OW!kܪA'fKgᗋ`eIo;E HsN xO* @VA#=ƪ"at*X&WlMʘiOζ'Yw%7sח[$ n7yS$DY .erW2栝D6"0ǟq(^>Fi< GO]Wlknv<~=& / .I?KA6:lۛsJ .<6GO7+ŋb6|" ›!E{j-j+9,t.OnV첢赏ۻ/EG6׈cjlV:%:!zO–i;rGoe TJ%;-)=X+p7xpo$)<7bv~=== 0L\O8qeѥbCYo6*횾\ޞEEϙ/+z[tb- aM?dscXn\Ā ϧ`q7DMvY_M2.s܃8ݵ]ϑkCzOi#kx/2&?lE2]t"5n!CET:?@0Р^=q~e`ڡ}e^I"uÁ;L8?0.?X[N_v%W`JR-0M74/ngS۽ HGmT2<5A)x"4,-dAnaf 5^P4qO\OYD;|r5=_QQE[xYA^|8Ww*.PB.KPѹ NC[N.aU`\,_?v]υSN/ ^)'ha2%$@~f&V{|1,ҹ"K݀đ]us>/'?W=Lb)G_gVJZßjU)4[xsWA?Zy7 ߝb|ŨddLjͺ%p>|\v'Nƒ?g>5[388+ f_76[O7" َH\ žMn>o&7qqwȟ/* b!*h*'y`"!*栊i[70s n!c4+cn$X &6X\J4h!-X"[m9)s/(5;]!o L_ "tT7ŗM2Yb$jGΡe9Ka&vqR X Z~9_r$V;UhUNhƠNSyFW 8!Lrfh{Ѯ4isW[:-s1qf(|#Eb>FFWzl Kc~BS+=|M5rB|*wxzk/Ok7x/[.&3pG2.a*Ov 9/E&Su;2 ȍmryTB*hR2D'8> )0Q -v/[S:jpp;WW]R` QQXSlj/Hq i 9f$T@H-P7]^ٰj%i8n㠖b="@+ه|nN*C5IC֫(hC"b![Wp)\fy ݹJj j,F3S߇Dܥol݇v"I/sTg=MlA ρ~WD"'}Bg f+2iI..مYJ).X2d0SI~&pRkv- Ckt&yj0|8m>-om>:2ūWLdF \%Dz"S\^fq2IxbnĖ}l_>բR`x&^. My`P>7,&"'Jjڒ W%RȚkyv풌F؄HmȀg!g(hFxu^_ iS!i$=w9x_✨HCizb΁=Qr`0pe_[*3|(<+Lor%\VHpg%r559:AWZi^Xe?3)4B ԙT6lޔ`N'&_H ?@3nR;ɼvpo}T'^K t^bei|= to\إL~[o=x|Q&?`E!G$xv#0?SA.GW2B lװZ0\JiWw!Pn+)a:%Їn)oC伾<_U|}_`wB^{% ^`wazFfir-g~ e!)0[\!s&'uf$فVUkYksԎ =yҧPp0zUWcpJa`gs*_7r7V9٫Ox~ϷؓSfy]a3(D?/<0x kqc&O'eNAԣrXXaAR~"K G/@x4ڃ='P#$j$trʾvʖ1,{PF 7 7\<y&gz5ms[B uarx}l̦0nYKUȥ`v=h`g{~Q6N >05k02gs6Pn 5<|y(\$gt-)/\:v*d8*qrD7PadNN4L'Cw&@f8`>0oT{'rpZ OvC~-${<~$1 3P/"üGVurTeGU/=sАCd(mW}C8b"7ǻ8<- -X^@@R#LL̶ 5hMdv Wn1uȵ"Շ&Cё|/0#IAsTDT.k ȼ PIo;UxʙW4DF8|K/m` L9s>x!/á/z^"| n;^~) & z 2s#:$<7_Y֖^=ΡutG8M1KBRIh` YwD[|w|B`XEX0hil#JAֳ=ťDIK)9|p./A)~{Jv]nbB:͖+:/~ h;rlqĹh8c9`}q%ΊNびisvdf<=ہa4WHFK 4ЧAVHY|7NFXT(3- cyاPMx!Ԅ Qy035H|?B0U[M:f?9dhD SxjGqWG[ׄM-9 2AQR;)I.9|sw PD@?J?ۭ09_`rV*6|*G6%hqTH6oAn-}VBB2+1-{Ht>5-}[+ &"){:U^MkXy/ݴ<^qZĦYT/C e=uQ!fd"w?ȢZ9(6g/ҘqaRTQ`-8g'/~rhI= 9"V2եOMS FVogq4NՔ "at@AS<>8!a5. ~|u 9(w~~[_d.r?F),:%++GpT7)aR" yf$@dcċ@:@>+o&~M@U?kGq_ZMm+ϸQe7 N߁_kUΪ]ɞϧZ۶Q%"l% ߈Tu#{(W/yzQ|Wn'@[ 9|bdb\(K X6ܖ;_6<]:%"P*_hHDJ63ӹUkW1o[7ͩjy5@c `ܤLPwZz/CKrwE NcKw,kzE~Ql<q,EXm̷4|cny-ݹlw2޵r谴yFgav\0% ̳Hqٙ,j&VhR-nIHo!Og }@RI[7r46z# U|V8xj_饜_^| HB7OcQ! "R==Ҝ$ImV6h,Z$xL6G yEPmi+U.Meڥg ^.W⚗^zJM#]G= " R=C{v>ik¿$L̀j 8\]G^8l3sm [dy,4vg}-iW:#/$WB]}e.P`f,:4Z @v;]٩5eU)$XHcZߕ(οtʴ's5+EFA"'&p{$)?b.^5vGH-9\+׍sԣ0*be?D. ?}g M|RJ;+خ/>f_|̾H뵀+E=z>E쯸򈱎۔^[`'tCF*r9dOҍ[irG[JipBp}N#hqMiD5a>X87VU)-:uϺt?ICGv"GlʆϺ^-SRI%Q6!J#3In.UcčHT1uElhZ-h#+ <H""*FSzv-;^F6y,f~80::Ʊ3\/ m4}&,)Qȁ1؎qr?.cBlcK]EQ1ckYGOI[>ZEKfU+_gwx.[F>]sm[`O ^w>%m6MA\:5]"\lIᬸh6QL0V# :)d%:<LHܤY# *ǘȚr+qQ2cfҭE闞⢩Ħ|w|D~cF40 ڽ^(/ [}<^j7g@\7ңӣaqc>Vsfj<_擫R'2$S@ƫÚ!4avS;X3ֿnj IlԆzqq1~<<#%l8MÓeh6`%GvLu畮( *<ݜu,y}X1pNȶ$]jyĢa,箧ԭ'Fq}|$ܔ&{f9ݦ&}mj>"8# Rpͳ5㡩}/;*z9C*!fb<ʆz-fQ($Z1cLU>12%~V6։~O%*X )% ALUJTVwXpZ~-}eww$QHj 鳜t:-nw|¯MG~+Ie vwײP.@ {݃t&(!;Fz2Ͽ|$N&otfT=eo sj89b˜-gxpha?w}Jt'Xd.u K'fv8UKA^zQ Z/=F(\U0 EaH>F{nx"2x~<48C&" JE@J>4㳒rQK@P* )Z$<_.W:75+͟Uqޟ/X˞nMm5p``OE+KnGHH!cSIK:DhfE§U >_Z4<XK:V4"]L~>|{ "N(RÛ,LbU^An-(/MѢ$'/ )K `7r(Y veɈ#kboD?*, 2PLG.>޼9Ah]e$ ɕXݹ$l_R4%KH*:a ,BCO[ާPC\L D N].5{ jT0 *TQ "\jӜlwXoӖւ^sE&yjD ءRQޣ [Yq=x#2b XJwɂm> z6La"Wo/ .'<,zjkB G()d- xfA'+kw_j1Sh1L;@CR1[{.VIz1^Tׯ[Y@'Q]RtɑgTʿ΂R1$=@pD%NiX_cݺ_v[iZEbd+ǘ& K :&&rCO$qNn$؇$;];Ռ+UPTX ͙-A䴸"F,'6˔>lTg *rp?æ5:"Z@;)N!.R %n`F])]_T#6DcYG{k 0n:P7nw}7' ~f9;t7sdwvY@"+rR5*^Ba!seWc6i3TF \dnV ^/XNՓ|7#n.vŲMY-Z<%DF$ԡ0C5̐FE- `9(Cɽ* t4͟6c;Dfȋm}Zr$G~ hϭ!7&5WB܆Eupr6G-{v ,K{is̕Oޑ-ʣEv8!N6% V= -m2*t~Ξo-(;Bw =q} ( l 7_ښ(Hϐ 4iii m[et"n;_ R `I?P1xqCn ż}ub*߉IBS;]sp&O'_XMzIytX}RQ_—-Å·˻U=\:T.e3&FX --éC8rF{=g劽;$"39U,:XkhV`Pz&Dz~ 1OM[gҶֈ%hZ_}4; }6>Drx2p00bS9=vZ ]o%s Dɤ< ?e Ɣ*_o5qF*0/b2F_~vx+IaAH3tD&WL.lh.`޶uXrbٵVŏ峗ϥne7Pĩ$@ECY}9V|T.Ac ¶S fxʼnq{q.5Dv@M[=hn?}Z!"G%Ԑ&("(١$0OC7f}T&LeC# ݰDRUB"pMws)]<AjCP]U TKQXb":+Wr@)^G\ n>|䙚M@S0KQXeu8,E } R)WiM"#Hrf1q(Ydu-$" u;4;Hj٫英NjFd6]xɼi+ V@EOwr"w0)^I]ȟH>s=i;tZOHǴ#6h -^;pfB[.k1+'UAqX^+vxW A&#=E"6 Mkvw*4cTaƎ%t7CmQwM+܌;{g9"׬M7hº3l]—\ocgPPeC}0'n[~٤ٕ vHE!1lh8RppZ~ݓ=6vuW;X/ \G㾊qn]yV;}rzU2^\6pv"_HK?^c+)ę嬠l><·ߑ$Z^;25Ş{SD7RݞSyJbҌɠl2+vH@S!QN#e 3*H0%P]4MF`<cliC:Q+X+MwWդ]gsoӄP!7Qˎ_PJg7YYXS `97!l]ƚ\c.+<,YI8@=Q7\^\^䦹Qu?i^WֆԠr{>P^o6P9`8~џtAği;3sR.!F17yR륟rCZH [NC miKF?sN[1a 0Y|%x&ű0{ kf4Cڅ AP_RJM<"?W6 IXMכkb-D.jU_"v~'U!5M85QB=VGL-#+k}.tRiX xY씔hJbnvr4& A؏6;׊- y?–{f7 /$V]X7LLN=lUT} Hp%,c5(p` k(MRՂǪpHgEB@aXX޻e,٫.햳2ߟʺ _Ys).0B{,C1nl_K%8;T?c R;8̱Դu-P?:+h5;8!$ ZOq&ZB"x_e  JEt`2 RRR/Q_uIZiKTbJ wZ1a9 4 [M(Ma K_Y/RiCM/-?\2EA?jLN!I/E6aa4))*]P_kUEW{wӝ#C%b^"gMk>)u"on!2ٻONK~415RNhvl/ح埛w^lh\v6SuJ"zd{-grW8L,'հ;oBzx)?! ̶,ӑڿy/-TĒMz8A,nq,ϦX#[Rfɦo&ѳܓQc2O J:84C5 zMȮ(86)X{1M"T|@+|>^2l>nXKMg")Laٙ~piXtOshk!$){ b"Yc 8|_|fT"&LӦ=>`Jiڭm_P2_K _!Vt}Nʥʧިn@㽷ḧ́o6=V[` $uMP&EaU/d -*a_xw_u _8_{"_ hZb¿ ' 2ͩ^C;?B:zl k:1j2MwOa&b[esY6i7U&n掍&nfu[LxKTh9U [J{FҮ:-jZ0d"p-& PkMM7]z[itm~b2΂Y[ qscѤIIOWn%]uimef(D亴*$ǩ?P_ ۪ ?W:,z36;-kvr7}Z" <']Ԭ'VYQ >za-@ !b'{AZ-WhGo`G.%o<* hN\rVJAHtYm?J>{ >} Y^wa})y ?_Ȅݏݏ n #/jh= bk􀡏H jt#"B(`8T՘<&X_hO@prfƋzWFY0P\rjWڐjSrkdOQ:/.7r?cĽnɌqV_Q i;T PSvOO9.n,11ñ%?AF 9'cܫ`ǡ| ?89@tTVM5h!hz]mh|t^f8 AJB;Yx[Phhȟ/ngSA#sΧ/^Evi{ }w`1`ŋr{ce8BŜʒ[}?>E !q0(;JYxP*  >>JLۭv"TY ly;L='./l~RR%th|<ҕ?އi` Gzga.i Xkt}D4X_ c|&K,)Cjw'Fj ]'K\B8Gsd'Twhuz 6ig:hCssǿ?`QL%I%kVht+z۪a( /딻[+' ½Ix;"U&EM`pwǁ3+M5k3U{cdBPV>妐L"_T >w~$ uşrrJ[Qy#[-eoQ7[N7! i7-)eo؈ݏ[q>nYTґj3>Eg12FCK3I>ƛuv{l_;ax&W~U#~Td~ފ '̓ p΂uD)'N6q Ës{oD^V]p ~l2ۂ~2 "_yudym+ ǐPocS>>UYu 4~{dm~W"x1!t촁 l!k޴|C\-#R ߘW>D4DtEXd0TVWJ(ƌ>3[QWrP ,x,T 'XR;~}"GKAKIM#$qdv(R 6A`ܒo1֦dkk YcqROla_ȑdojXjNhQ }/ o). ݗ%Zx -)*:N<9TR3)ˊ7=pOn;$;-E_FmjyZR ~v\}@> ?{EY3lxm'أh? l`M;(<<@UVS@%gk3C7c(#'3`] FW2'ǝ'?\=X Ml ȟ~GLo]@f\nt5ThcWU~ |>=\ gV@E:kMemRZ艉3vOLJI%S,\Z5*5g N9@;VW$T]2+KGOJ0|]vAJOI9FD Ғ+= ~8uCrkPZOs0Cfմ<ًJ!'LCj1uD̠;%i;jlNRSw go?o+oʒs/5A58)(:NT +3&9"su}󐊀 "Y6DO Y9d+,Uc4Yww&{#GoBR*DcWM2I04E=Rp?a:ۻ0Εk?z5z-{ 4e@$vS`F6WY&[GH6T@J0°u[l<.H"EȻz`(00ӉN=|ޱN[ٸ f,mm's1㶝=T+FQV#Fa]9}'J" C>1baSXAbvu|6zrWKr r4_V7-'KMٱ$s+x)XHzx⛤˦6^/jMt+gG0BkBt7^CLc`q!Ru-X8{I.ťd$la ۷Џѭl9%RjlS̗=8S$N "DEG.5Bbqxzsq'=sqVͭG(3@;zojt@}ӥC4CI}/PDp__Rin۲rF4kNh|-oW*[ +.9dc~H\NeS|=9q^9{YDޱd|[fa$\:UiXtn6L$SMɟ*sZ D|F5. uF4J2fkSiZnfbE 8^k^Bsva?=~q>~^/j^I .xz/ٻE Yלpcؖr{Su!ҩxI{=G+H/ryQA9ᠡ^z.zʰ?#~OJeP)l`Xc !xxxr)KǡWKqWId?)z4Ks&2@P{r;aӉ=n\.eFf']]vA*,'͝o[tSUWQ$3D@CV)ܐoTeRFtT?R&3MyŘ5Q|Nta {d>1tV^FPm:z"$tv^8ݺ9PT{Y'Ѻ# U„{By AH*$$Ww4{u5ڃJNޑajiiZ馚*הu BS5R(d!*: ;d誮 nָKdx C;5n9ql_ qPH DFSLjT! FTȒ̑lHT`, PՈg>YQ *i-/kA79O-x$MtK$o˞,z4ך;9(*У˫ltZ+KuI!=SSqwEu3OFOEHyu*K5z4^OD%NwE ,'`@mz<FZZѴ0=Czޤ<&Xe;jzn>~4_bT8Z-|*?"{Ǐh}^l?NLS:vO᪆(A]ɇ+c2Of_,OOT.s|K}:49O `ϔskNjwۛP -_p'9~S/E|.Fʘk!e 47 V=.ȋK,`.-ϝ Fb 侥NE8 ɗtJ!cWzU:_5i[ =pf&nwFpe<1WzGdv!)K6#]GXSdEXcunѮrZG%|<",Ox_/oWZ)0?&s(m{.eѦmmM !WuJL gg( ܉nAkuM{Uj膅'S ANEpGޞ!#S"$–ЏGQ5U7Ι" /e眙>do&$"%knDl-D!fgS ^gWTs7M]wr1(٬@^noBʈ-YG; jCt@5xrtM"}X)f#Z}GH6y95pBg/~W?:X`C\C&#qYD鰘x}v"[BE*Ԃ,#`؂VT1bq0*81yQB-J)4lp A<^B1ڦ>I1Eh2X Ur%d W|q+%'KQUDZaZ]lHQqdB@# l\lrb"xhNtZ̧: 879dQWc<9y&tί] G̰+M/_@)I&I*Iȵ` lKcc- h.UK.!)~4\钆$pˌFCx/ \TUEElAWLtU59H2Vku+#N_&0 qYxÙ/:Dq"Bp0책*[,P62M=x"8Ф24$LJi`i9r~bWpJ;82,aJfe {6r*U7WFZӪd|8nH.OzЈ¶Z[z!ig3Gco`;.N=*)>ioK)KM¦ûa*ҏuN:I*,AӝOPVN|aWi :)֬XqIsڈ2gWH$ܝ Jh`9 (^[m9KPVZcpddЄךu ZpAH09+o4_,`A9:raZc6݊{?gH['*UFw-9i!jF5`P r*p@$bL"eY`aa1*LVaՆ{:8imN*0LKZl 5WC VJnA;@Ɍ_9W曮o"x /VR_/ 쨶&_U${ŨMWQNKCc1<##k#Y+,]P;<-Ȭ"jvJOmo W Z$;HU$@5Q.ZZ+&7mط-XT]:4S ujQS$?@<5݉N A![JJPmtB;Uzlx&gFiNPH*\:6@4o[gɳyPv>Xr0jX䃖UxWQ4 <i2[(eIU{.=%v{~O) =&cK͇eSL'ע-+B}U_sD[ȹ3%d e`aaxrJ2﹖-u'`nRwKNj|=y LRE|?¥j0li5$2}JWGkbh-ž:~0IA*IcVU231DvQߤԛܾW졋pړP_g~:MKXBQ/[cҪ!]KaJZYj?kmn)WUujG l4N7VP$|͋ :NKiϏ%a3s&v>>y}.(rHlAlK-`IcLYK"[7ꇾHYhqLc z*u0(U#4^bE-bs4%BmLaVEu70Ke=K?m_|qogmhX"^vj{M*2ݐsbt9粒ca $_q>9G0FFo]ޙ+6ȦI\eŘ1 cvsu&rLq-~${P09 N: Pj*r[X)TnTjWWR2@So^/D rw$%L\OS̛U:\crK/To<.}>#2Ba#)9T0}6LkFJb4WX]dDQ̐Fkv6[HD'޽u'Iv15wCs--]D@DҤL Y*z@* v,YGVFm#hdTO\nڻ}ɕN7>!4DvhqC6[o=SՄVLmě&4vf/6\\D .]zmős?n<ο37 W{B jW@1.w )PxIXϗ?Kuhǥ'fW_%M " <_D'V*n>Őx +1NJRvgo~/[^ɢ]ʾ8Szo׵\lT8/ђdᕲӴJPlZq3$tܛH%Jl-(=-ɐoͳW俣b,.$-iIoU(X=,;lmwv2% u!&9 6cK[W+Qs&{iCq׳;akWM݀f_ c?@5 K[(l6H}.L!j{a}s_!a )AΏB㥛A'z3PZ-C֡G _ ʲYfCS?Ԙ ^ rB|3|$V}8Hp8s?_7Q؈0Wp3 'O` 2Juq#ņQ@S/L\ "a_z6=vn|s;s'Շ䄂YM6Au{=í. L?g_XeF+(S٩"O{HY#/>P.,/U^~̤aYSW50NG ],28L;UBp+4kl D@D\!' Zqp;E1..7ZA*yt"dGSϳAq&#Kxf>RB5L(K {T|uaBeSH>!솷6ޤ-#^I(qf+)!A6}1ϸ;9Щ}pm  Ӯi! i3.hRT<'Bea Z>~j6KQcKDj!,|P1M0'ʩq ԑL`fMCd'3Ի?xD eF$m^7xzkY;4]$^>oVN,:2R SjiN_'دK b^;u0X dȽS2+6X#Hg+ &B߉>}-"( O>m i d7U|;yp,a" \/V&*TVNK߹{YTTb/&ҟ\㐳z_S}Oͧѣ(=xv_s<{* UnN@l$N(5Fd|7]Jdys[}xH9, ¬OGi'xBzE ?{ÛtZG:r{5q=W?;9Q:{}]T5X9=%zɣ^BRb@L¡/zN\z^R'TU8]$Wqf%Er[(a/n-:քY|] -̟٬7F4$C! BTE¿GG/x;lf7SSBT;YЧ xf2 \_%@8cVNrkR&d)}ܸcN7גV\Cyjp*\IK /L>*[YD-]@a⮩WQ`vSgQ/z#`㡷/ӏOvpc=FdS'a(vg1i7YhW*/ #<ҬD+0c:אcF ONEo#~dCCN6f @#OI>m ϯiD#:Us#@iz6{3yA$}nl0 $VYv-BBeoĺsOJvtK8p]3w8wܜ(ʩ%qg6ŗu@V_߅:UwK#.LMw#.ܕ: TMj$7==|"9x{Ŧ=Z;^A||nj{ǯNR39g,Q㉲*yj Y*ml !3( /h;lKpI t]bQ1y[ L~E6⑅W*֟d,ڊ$.:JCG1tecaK tI6-tm-븋+rum)\׫Xh)6V{%4ރinӡh#;Y*Pn #tjr[ԸH8Zʂ< @r+e3zG*~x|ycX{";n*Ns@3J2F^Oރ9~h$%{ۗ+f}&!]fm~5"<{'j^ 3W:ZK$9t+Yl+4&w]pHӫo٫0#q^iуc0r(9Gq>ſVPmT phWkt>wt~nVmg_ltȫZx^eBv iX k1+N85J-*Mw-9ލO }_=JlRCwzdO΄F:x]Fb%4 VAHJME^BGg^ CO;t:~! c5,t=!p!} bWHwJЃ!] u4=Z:'Wtؖ)97rk4)>-#&rL f%3( ̀Su .Y(^@ wr3 _Y@X=ryjPH  ~c1Xo l`ԩZsπF," t\LsPjPl o+?Z؊?׋|jF*&5?#{bqaB)c!kRWU_Liϩ$l;] Rʒk^7 |n:7ٌ^M?x /=kp>_ByE)6B_y v`c #?.!tϨvhP-OD~ԣéY͗3[paA 2 ui"@/W-被|5uTo~Ӭr V|D[AOjZg~۴$O5_ # ǁ )V(ӊ<dN#v額j^Q a`E  6@OpRNX`"(B}+K}N㯽HAݣ=3mv9Y\2=:I:)__V6DRO/{m2B!s׍4D7\ ߵhz󷥐=Jك9KsЉ/- b2 rhM'+HE}vMwpZD9c+d,z;`EB`-0 =tz wWUgऩ8hHCu` oT"81"v4] 09V;s}=X}Xt6XŗNx+tj! X$܋pONrNFUрS}NRXI$+A9Zw$yproH==@O5cϝ/vvB!?OvGGG"9|aZsi _^.Χ;̗ĥ %kZ(X-2[в`@w5}Aq3:%*j-‹b'aMU`oX7/#٤phv74)-PK )lRkfhVBO_cCX#`ԒXU_aTvA@=Qc_qv~X@0=8̵^!:p>=)~sģ˵VxXd%Qw{Q"bF|0zn%Qa}z`>x"Hpk-w恅ؓS`jȘd0z[ǎ_O3|U`G> z" O֩vvo[Y8fiofy ~aInjVaۅbX 2J'> WwC^#u抬r":9@;t(*)9':~No"aBhj)YZ18o!AbO!^7FQEXnt5=w0A)a OtmGVzu.X#<$ 3{òx58uw{ۧv作UGX޾7[80SHx-& (^KP}3書vxTT:G?Y4p]ЉdӢT̲q:d_J@lW*.g JB/ Ib%3<$@\a&7RʅB P/eշR87⩩;"/n>:" y6BN{.8gop. XR=8nfN 'LKvF8T׸ @?s.Kevћ!`-ĖA1A@s0~'ܹҔ%"+w]vwjmL[OET@|Bm9`N.nȀ 1S^l$1:[kWJ۔K)7 ̧p>.f%⽩;nn-3 >_ӕ&R|`$WRCxϭ}|_;ʹˤAibg.]]䚓8&PeQ7Wʟ❑ nR95`{A}2M?kV{!,*k\Q1>q88c(Ù&WΚWjvU?oR l#I պnrQ z߭ CїBZvު_>N# -5aB,OY{ Y?x}s.x)/_%%ґ#9BKb`^418֢$8cƷ=aK`"ʬLWR lRy7HwA'<F@bM`k92nu,5͂N_uxFQZ;ɋFiKF!ȗ죬#Z!)alKm/9ܷK\9I!$C`v(˒]NhmUfck -Yw~|u| |HCIywgiKP5:ijG0b nύO.՗=Myfłu:&) s&# R{?;0Emq:j}UKD:i4Y3"X& UĊ>Z{ֶswƢҚ3"LbvA -Tm1 .x~cXZMŁ)Lly;[SU^Mf8MCz=ySpMw#'h/w;uy @ XZ5@wLrX d5iVZX!kOS~NXTqά l<Y,B[?0xP`2I6'zp (`ob>1IuںZ@6h75HGRt=y /^Md+&g"jp%ia2&_}B+܈b;^h}fYx [,> Y[|hmpNby1Eig*) X"{{s>fLx?[̉\)f?L瓛/wi.|s9Cq:K `B-jpo΄2{1/vlf ҾsdqDGok8Z2;q)%=T(fG[@:9ϡNU T'NSAD&F1hAGlaVxDzгGkohhjMv9*.4ⴃWbhng@j4/,'ډN8!ߢ%>>©R/$]\1pv(y&AU/C&ƈ4{%qv(iwUz])9Af;NZ08La&آbO; m쥦,ںʆԆ"ʷr8qz3 6R@:cD $G- Xd qwCR^EFqҚD;04i rD{P5AN#拹ľ:V-1Nmt&⇝İIJuu߽N+JU^!NiTls,@ QQg{pɻ\Qoеjv#`o]x%;wYN_zO^%){ GU" m__pPkxI]f%B`;ƝwADEA.p 5qo_.+F^-6^[ГTxWKeK)̅:cD 8Q* |1%p.^5Yޗ[IG©;3A)q{O;~u:<ΤaG'֫$tI`5'6:~-T$xrӢKrjKKƚ. :Hh"@0Y4!2wCܝ){/V#a+[U4TQхPʐ]]-c ,@w@u#[ì3ma c$40cQil2P`ITmq!~v\Ip/Swir"UU-q6>B MR[5`HMfAE1>t񘎟 9;<焧">"rm*ymTv($/;Ug7R6{"u?3Et|3p~X.C;Uְ]<;|;ᙳ4g_=w=yU]wý,|Ehp_f D^C;Ş,2h}8ZHCXdM1'Ԭ!s6܈3 MEx* ,Oh27 IA0YJ&9 dK;Ph݉-5QJ;ev#g#HOKyo:gpX%l*뢍k ?YS?ɞlBϸԝw_U`n+bT5.d)^ wW\!ϤA6*m=%~I#Q U&QnY`pb=/.Zyߴ^houYDc#Ө}^=n.'#=Ydj2t=O sNh4#lVC7y6M:x;j3ü,U{6TPU]M>WZ;q6 d+Qr\X2&0ef d [-D-1ۗr,-w#Q/P Rxm5Zːğ#gV^o/e,y*У >CIstpe |ib:$ 7 3Z_r#ؒ/8R~5DbAhj-bqU8)~$q(Q] ꘫQG!Usg&7яQN94UDkHx7{Pl׳ `lrxBÚǓO("Kkc)no+W er~ ['w"Tqu_No )$}5.]^Nϧ+ "-9ڂlDiM-feJᄑh :zB#̈uW2G-2M~[LU/z4$MTCAA{&*n3]-0=SGњLA_[(ӏv: \\(InZ%WQ8RY \u»W+!wUnڻF[R VɯŦt{jTn1O=UAF?v fxf# Ϭ]Sk҈nL&nudpvcX-$ߒ_ΦK 'mtnnl.7iٱ{U?,2Rh8ةQh3aSO%AT2i -9h3Y'q5fTi-3j9}nne$E ;D3 査s9}8+2'JNA+{cã7ѻx3|49i#u\cxT7ߚ$ʙq6B9 b58\h_W*1U#ȉ(?R5̩ҧC*v:>;O_;b`*Sӕ-NԕIh.ReYt,0oԄ{~zZozJ.C^K'ȣԮu;^)yX2~9.7HVгғU0Ƕ_K$Zm%3J(\V,oDUܵJEVRyEw69Txy[o%ܺ.+ee2sR'kP99d{܍_{_7+uT*17 }\ҟ$ƃ?E$vT,Gw{gu+z0]rxD~a?*ʏ~w$~w`mlaE,SQM'Vv+/1  tچ٤he-ohQt6Iuko{&G82u *`nM.58)Jm [/A P#ӮS6>SWe }2@Lv~?RyG%Xԅ5[B!&I:X{ jz=nB֥\h8ty4,)p;(1 r$YRk;t8 5UA·̿l^ѳ(=X⤴~IyZ!l3ڽ8_ˊ,)k"^@O%T)F&XN4Jb;o5csΜ8/HK Ȍ'OzwC/637_!or&Ԯ|h"|`:֣E#Av%9zȬ%o). v9PsO Cr^d;$t(% Pq|dy+w._U7Hx- w&r G$\J: Ae.5 $rFGb5̬7~=|#':9&DX*V5jEf Bysۊϭ&&#w* 9#g{rk MGp&ooRӻZ3r@Jeҡk]QJ /E۝QvhnBEya60A ?7xSHhݼË?03rnk hr9!Ojޡ*_W;Չ)?P5wLbRm.CeV B:b}_GмTpc]fwu :](9qcsTՂMʅ^g˱qڵ 6q΁A9r!ybPDv^VUL,2k9ْi9Xb3t[z3*n%P c`>eBO&MGJ{׭A'-:[3ewQښ;hmZ[s^Ufo)Z.'Ӈ6Cоc찝#ߠЂjɳܾr<&O9AeݎvfC19@/U%4T;CɧazH[%Fy$|DB'ӌV@ t(uфy#Aa^ߦ 2|^s[Mn7V |\y,}aM;)e}&r.[=#Vv[GU)V4fek}Fl1I 3icv@՜Haif'PЧ32#f9,%|#Vd&DDrlD#nDl yX}dɖ rs.ZR]B^U~Ez57ً{07XiFU E?l"3<> IkIΚk~m$%ldSM>p4#珹 Z9V#ƎƑZ֫\UyiB$-j#ě.e#^\wmR.lR^}_򷝧σ_J:zIJ^ O\`i&IFu?ŎRFt=g!GWֺ!b#Cs ?勯zTq@*j:[-S @):W1Og<|z l% )`[O0Q/(ֈM90n/]ODKoL;MS $" ,+}H_3f&2vX 3•X޾GXR #2^+N+ Q*iFMEFc7TpZ𲋼6ڴk୾\s%X厯n7̀o*3/$y3' +i:횢r?o|a ۈ^:RZ2qTqUڎdg+Ficךq([>E{鄀4 *TV]BP4} zݡUP|*{ϫYCCpgjNs׭f=&K$gc2P9+N-z}jBlߔPKn l6 Zs>3 4JPQ1i^t5"QK8=\F yDF3ŬQ[QB? Kb#RGr4zQƬ؛oLW _':w!u0Jps^ՈZT>;ӤB?W-I)6*3>|'H7q3RfGOia*ɥ,!'WAVK/5e|ǔ,Wc `ȹR6U) 2#Fr!zɌZO,6ʥc{T-QYXVvNeYOIn-$Hbv(ϫg$i99 @ɜA (c R\ɩyhgeL-;7JDw>9]wor0gvZv8r<O`0syόY1ɀvLm?+i@~ͦ6:stsLEy{ [Cßw-bzwiwTh10GO+h*Tko, xPMmox _Ғ [ҝ?_8tg /p>P&^%d}9Bu,uI19MDM̧RqV٥_0r6p1mYZ9|@sZjb ؃'!e"IUoo2DbZ#5}}:0djrQ5(*,q{eEAhws&Ķuc٢SJ'^1֞c/yjUh|eBussZzd^"JrxFޑ*#^ ."ZR8ZHϙ^OeVǻ؊IB`=ݾIx۲18i5jGk(|0Қʼ TS{.&⏳K5}eo^sY?wNanRƥ 8ZeW"PmsB/RLAD=2le?y)|OU+Ad:9sP9+Ѕ7^9TOz⡦ hqy)Υˊֿ]9F^Pq:wt3_c_-/}GMg oȝ^4tFx8{"b-L 6 D%LJUR+0hhA7g05GcŵH)pUB]'+ֿj;R \*ZJ EWrJ*vU>GsUXEAc|CKyB] +Bsw}.9 Xf֎|#2M+"ϝ3DfM5 y 3`+R{@wϊMK/܎w߂U'B_mokK+_5۠:]Okb gƤ@ ^+Q$I.8OÝ.7=~+(C8|V'sb(}IH])|߷Q \΀<.-S_Vhg)J)) áAU*CnL\ٍDg`wDivS~ Vafk9< nGJ:ƤQGzQkHhj֛;jd}iO]%0+9ERFkP(>//^@ݛ)fe<=eQHJAG L-Vn꯳NA ?CwVAKìaBU$ r?D>_$y$M}9n&ܜJF~U-U<_sx܌i0Qnw@ade/9R\NW{K!=\,+ XN%(c:?n.J1,wX]KDž ;XۖxC$O~T?V?mO_ Ȥ +NC*L/%,$ I1c[Cn[Zd۫$&?BQVjir%:[m'qw:y8lH[>A_/ٟ/>._$OFY5:ܗZg`js/;l,wgobgn'%J!A+O5&IY5Ku0}ۼj4ļ턔Kɝ2Wa[JV @ŹM%gZ*a%^w# 8e0ov[6=1Bx"l'yX%| e!KzG]ML(Hϱ.` 踙n1R}BB,l35Fe{>r>qCɘFQC~Ot#kER Iح_%:&x'Ṵ̀\D>;@d ?Gtx?G9_w^Ic(x>.,M͈@&e<#9d0S~R1f!d緤"i8V 9exd~gZ%>IXohM~y p_8 ^u_//t>p cb!R`I"q>hj39UAyI!5V=EyāOh_T62duP5qj8{Zl Kn|{Vzr`Y ˃,TNrX#a^xHqvHat+;Hh'ox`1G,T·~LMPZM鉮(@=!<)J"FM r;=+^v-nqɟ"d> m3f`{ 4U 3]n.+nV g ڸ7?M))h"9"$nȖ76tffPl)T'Aw)Ad=_!FQ`oX\6ʠ;x?[]NiWҩDN̔ 3׍K4NpKZ\A@l2oC[ Y7檎h]Bt)=xu%A5F2B}f| je} h T[+C!ZtMG YELr|On[n 4Ջk.O6|o7|\U`^NbVyz8L f̋p0/%[`-! MTX5ӄ_F[.~g֓3=xKDK%{0\:nlPhujڵ ZAfQqcMGHʽM&xKcoSҫ{3؜xZAFW9H>'799KbTplJ`i2Ƥa~v0H"/M%B7jG1GMpwZx<O{7be$q4)nr*(k bˁFednA@Y,V+τ,=Q\yrp?Nr]1VҚ/j(w:75p rTwPQ;*B?"jI%"T, qDTfέ8mS[f z&+l4ZŃ!o+D(믽إ>crΛqЖoWhkˑpu\d8JG5wɊri J4_8n!Qʳs|r6^-ψ{^>-Y>_ɉd"Sm "?tx\a'sH V/~" zu4+HT˺7.psoiW`o % uBBd BpGOf3Ór$Dl;zYY_ʛzp֧Ѿ00rk;QUa !/Oe9Q"a-MJN}`+%K=ϳG׳ZbOs`@Iz$_ֳL>@Q؎UTu7"_ %58 Cxt[eƁ۳ )Äqn`upl1nnCXf(pJW?AOs[0=[͟Z\Ғ7_Aktn֍@7tJg'݃4HGtUX?5@Hw0w͎)*ltZݏ70tq (#&#YrJx`m728VJ2%V]{qjS݄WI|!hv6#-:8{-ޘ)\"ma*^Ь rM_/sAFlnP;&L^Q+mㅈQ?ݑ3ݝAhFwp9Ss}pF*I]b_C1/irƻ|!LD|]gkp|]-U~k_(7sTs5FjL7 &Rp*{X6.S<̫'Kk=_r g;\pCbOE78Ą"!~,jҭuQHh.|lR ({IM=(:8 T?.`BDo\dRj'4,g )nc[>/gųS?k6vo^5w϶~~DJR'v{<ev0B|QBE*ǿ*9)p/3a]\AUQ9bHq%] dph|ɀW^>s'eq7켇]є *Hp0V{ѓc |H~yPz2➈@Ol x솀YuoF+ Ae~ʔNτQt6cۙR ;ɛ/Ƨ=x+޴0u;(o 2"O_m(pYo1rt?WCцh<[+͙sF7p"Й=V.7!()=Ԙ* )`5 DJ/V5ԻZ]ɧO淍͇'3mVbS $1D #^]|J/ʩK9ǻi$y}>Eż %˗o $##$䝘Y#Oef/ =Y;F@u]2p ok^zL5d4`soӃtѰU'z¥3`οSH;Ltvû&AB Xؙ_ɶ :Ckk7w\\*;4u{h&o!T@ts'U`8Tw8{ggx_ |2GGgH c?OWBb_|FB: Abm8 S_ԓb޳ٟzV?\쩧&x߅Fz-Uk(qux\\@M$t6? $A$x0`1 lS?yR<)~EX'VoW=%Wެ~ʫ,h} K=j5_"f?Z9,0/D.Gƿ1g6wV5nJ;۾Q/b?w Ū }I_{tG+CV{[/Ҭ@bSݚ`ųFm`%!u- g#RXd%1xax̄]R?O"eJ7c#hv BdYf﹞NM:ʒW @^T7CJaede.#NbϲHܒfnϜØT 똎^1N2Wfyɓ9$mubvn JQ+o͗ʗ|rr8c`5zH(x/م}CKaN%̀ M2aWc.bo l#F0 :`*b;sL!ÉePupu f g M:u!;1g\Gǣla2 ut ^rq)w5Ka9pȭ_|ͻhK qIp=3Ds)8El샙)(\uy7)k,ۨU-|t;^>Ԁ`XBr#'DlGd1bwVށ\ʁ{ȼް9pɡ^5sV0DvgF˒ڜEv* _ë+! aҩ8xI"ػdM."fJ~IgM1>&tx)PA@_}}.iq͑ E \ө > @;z`PP.p|D7i$K. p ]F9Sn2SZܓ fdQa~;$IqH-9(Nh;<"`BXXLpQ H˰a=($R=i/# qcj1`Զ-@~\H|'Q ڲ$=N|^gr:a&vЙ%:별!ݚZu3okyl!dS\@ Zl2ף0 橋Efj ?P[GaܘL,SVlj[5b2I{sh%+0bB&uetD,ruΰ*>yWa/0`iʫS}u䰯k9OYT6֚>V͔ )J2>dz!d(܅>GhVg}#oܡZ=|W{K=ρ6VF8 6;Of~vͻb&#Oπ꘶KX.??tjJbl:Y2[]rurjtY\2c|tEJpχfiOϢJs@ ZKSӈhc28R?PbF"9ɕ_Ϙ"D<DpY"MJQfiwfltt6}3a_V7"&onyMI;zw%FNttMKfһLߣ$Yh3"VDߢʐT`-֫=ч\;c3S6:^H۲Uֹ(0(ξTյ fUz%ɣIHƱ_{!|'rrFˏv/'ly/k}@1ܓue!6 >e(Eu*NBͩ| GX7^r1pw "nb!N1T 'P q =& |_֨v 3%,7t=[pM{5y* G23fw `(O=7VPU+z 3Q R\ !t&[ե';tewc"VϷWYi]?b86b,U5U,)[Lj2x^ӝ->W~5)-g еCnqwër7މpfoՅT/`Dw"DW]vgKJ#,=ņ2 .lDzmr[ԐѼv4 ?@|2y/^C]OZì˔Oìawp24;tEQ>mUq4\æGۏ 6gOr\ф>}˜ |/qLyKX 9s~?e8S:}A3pcKS9ϭ z=L890NXx}UEUUQ .?rQ6ѕ׫gKy҂bmIUIzGqzGz7:jMVQhQlahMT4NaDIJ\#6+~*X*F+IaVyUxa@ wAFʬ[xʕ9ɌfDV1V>e z)o48i;y|2hie~ƹ'Zf ២YY||tDTI Imdm,*{п{/ч@5 Y"O;|Pײߏ{G{wi{ H]zbD9 j9r/3Enoȏ0[Vě`TuEh2 zvW`. }3{-k@.ЅptS2vm\yGLTh Lo휓EQvRM Nj֗`}(=}#t`5 vk՘kkyVvFdSFdKF<9FWvxܫ$O :H na ӽ#}[Z՞5v3#SXA}:}U7--Q\[ݒOW=Z]B 04B[񘎚4WF0h*Er;OƗD`ܑnPnujo IZR4.X'~x.?UU߄vx #q x(#{H ) ԈiҳJ2*T6)&v|]p-w̒-v(9(F~&NvS'[ai nanP7YJtNjwڝI8r~I0 >"9*F"}܍RpG,3"\b,ѝK4c(ԏ2zO k!=i@6̕v9#)"/q 3&E786n+AIGي*9bܠwX(>"v.C̘?Bi;L(z[禥!7IDȑ'^ }aNĈ0ǽy܋}^cN\vR{ }|PVTyڳ)* wi44t+ܧIY/4YOg+Ųz9i9i9aAi tDuM&\sRĘMkN;W`}M7g"|WrM [Px#xv꾭joM"KJG`dɎJ݆ g!>#k+?tG@F E+ 3#]VfM%ɅĬ&eMg+k4HK3^z=(YBmXwG'oN|^ZOh) ~ ȭ 0D#+b&r҈놡T+1Vo図>74jY%D?A"3[7 Y!'D 0/?lt}=%_|]C7ï:9/jDhƪ4tlaޕ"j7U$8>3η>|V^?rWlN%xvBu*iRU.L. IJ 4t -҆E9,+>t0 ~!dpuu@AL%YL;u!\?LKH(FY|s "^ (qGBVUyXeѨs޾á3* 8T?dJ!88`&>`}7 6 /6knw0 xgCb7{"/8RjcfهJH QH={@."KY3q6sVf+sL5k*]P*V*KXf7s0ookX6`JmLn xH*R$YP[1oo4WD{ [8=/Gs2IO Nx 6G-]-9=`%aP^$S(ly[ Y1X* E%*.AO h +88qjQ朸RA %kDR:F&$%/r$T ( ߯RN]UBsS^HjѳF{yc4pƂ*N@O+㷝3ANC.QUC~ԛ!=~͂>|Up ?fڒ@r8am/@jԜ-23j(k ͌KS?s3C*G 0՝JmgVX& 7^!*5{USPVJY{KOv=uÕ*Bcڭ=n'ވg>oʬ[=PGPiEi>hD%DN=6z;0ѧg}=Cnz^{ v%( `gϞ~v$ k<pd ޞ]^͇ߔ̰d>D%7_l?yRT~ƙTfGc | 7yA~N~> e*FމL" B|77xO@#^mFڂ1P# X¿fp|5X:'Eѽ $1;!5೅syFDʚ>KQLŢd>pQ:/]K"KVDQ% 2as˰a&0AvIuZL!},rNKc#bt[4Jkrڌ7i!g]x)=۝ Y,&|4C.a5LJ)vF@CUGUSz<$\eQl;Q`*`œ$MjոLʶt|Q! pF|`ƒuT1ap?TDDj!ysƏOFLxSx&FPG`˚6.{qqZZ IY:]XaN8z=^=Y'R| O^Hڶ>ĉ~Z#myOqQᖂύP?>oqtn=>Mӳ>;I!M݀x&o80$Aj`%r{n_~+*㲭=Q|8ǽ#^伆)oiiuKluU'qd5j9_ vsҥL'Ə${Nf{@Nt#eT9 VO65gY= V۠@6No%=z%~{l&y05?8*[28Vq FG@Dx* 4 V< 1PF4xB-e"" 녍^YDN(0[! A97Wײ,64,A)"gBmǐŁo#U0j8K"Sp5Vu~+4* #V6"+U^]߸-h]@yG~Keק/'3.ۚ[%|fo:emgnfݮQ7™:ʉ t5hHC36m.uַ`Zo |}N a \ e]L!5  cla6AiLaAˆ), kYFzѫ1bX1>L+:PrkQ&{ZP 1E}Nҋ'T 6 ',p^?XrE+?_%q( cĭAؚlޔWDə/gsY=Ts_Uǜ,4J'B?qBH+%@ b@0΍3ոϽ̎e^F}JLnd̀IR/h6)"?=RguA=Cޭ7k)(@z΅=]ϖog{yNtg[VH?-'é_]ɒ^w3[fAP-UD315cjnj)!U3d'I1'D@P<~`|q2݄I"~B-L?AE~D M7Bɽr(L|F6>[/I./9bЩFCf N5L%,1@cUa cC ,db uFj}܀/pHH+l':-M)"uXZ?D\%yDK2f ĀwѠcnyIA}$ K 6>k4*$<3>+',…_M%1BnAg逥r#Lb|5Zɽo!u p&hYuZtĺLYꌑrfP_cInxr璐>1.'t8|ŀ PlX20@ڌtt)"DJ\cӍ ' "Y&E,6ԙ˘]w%,,jS3R1mOF >' ǣy^E(ǿ86RTPFLN \".`4%Dw$}cW[OzSpIY 2 |:䀔1`Y~a&:6EILLodHᥣ)] \DS-t:IT j8MkuA{(08~c4"0#o[e7TdT@2UCh"lɩae)\!/S0;{` f)Q{@,Ys8ȸ'K?d: D2@ ‘B3VgHB8)lxsv1[2^0-yY4H5mRM>b%DRll9R=] ]KrB|Y4e3өW>f$87|Mf3$b:;].B6QmdCC~Roa9d~ KNfe昤co|eN4HcWT 8/[ƁҜYtA.wbf<+$.c? 6uO L5z:bJP"ߗ V|7p2<& VT@"@ˏH1џh%D#B́6wcΙ ]Cu#_fօizx3¿OogSPcej)S2%٩@^@wᣕDa%)Dga9.\TP hW{JJ:ծ!A!5Az˜/}ɋ Цd$yul{PʻݎNb G-gb$ Ex SAqɧ'k^ ~>9\V!lbGWeke'Ǻs3(Evg&)ϑdT4 -h b-C֎~0G'@-ہw$h@O9k5ߖNj՛*'7=ޫZq! ΀ R52wk Y{d.Rzo!ň~s|2H]ho{|$Rx5@`ҦjNM&k$y"2̵Eg'Ȫ5Ee.Nשsb$xz僧U%>zO80{.*7Qe zKNi˴2`ODښ//O>ʐeF(`@F; .ezУ.vtQ5VJqP É 5p*nԝJz7%#7Ї؅yR/ǽ*uHZ9"=V><\-~1TL/il3;^Fls^QT)QZh*Uf {TՏ]힪UR}D2YN-gUs]I6' =xdAډHsE\ri ,,|<"i!i Ӓ}7zwǠL'`C`a j[6=b%AB"ʎ9 dnVo7^G(~5).K{A9?EKcn2ͤ{GEGWl'Zݥcb*]㫁;uKFGq6ɴIHfTD4AusÕgAt1Sr$ )Y,)7/at,Nx |?0"`/zr>~?PnStY::,A 3fudv1h2wbA8:TRU(E;wn;d곉G NO]~aEUx-O @R|\ t+6]6,$^"E!b۾ qGRSM#MߤQ @T#*=y #%o"v5 %toe8SpDMUD "@r! 0 Lk\<>WH 羽tk_Sj%w hWXG'`S6xlʑHuhh2IMW^U-ಁ# (|3Mv$Y1+E;NQo։CIFQԅOrN!P 1; ݛ6k$a! *Xyyyt{J^#I."EDtI @rUoOd#?(LLso> vF@|`#,M2qomgwH{έܡ= y^iQ]rq^(ѹ؎ycgO*kd SBfK,tՌ>E3tLADNMkH|K+ՕoZD'h֊%:@edGDJĿ)!#&^f|Eԋzz Γ TpVY8_ӐR֡Σ,|B4bh}CoZzb%}'d␼)+;DVWbT>z;lTQЇ︚.-i$HUD67C %]J\FmsR VFeߤNVj1!\Dm:yٽn .8ZQT9i37ᡝ?J::LR6Yd5,%,D`9tR}j% I_E`-^6]掐ưDXsV#yqV\z'}F 鮭x2Zj+z/ McǠ8ݨ_!+ž0Bc ? 奺1访!8?LYQ)?Ɖ6 |OVn}>!…M&JF"Z%y5b@~*% ZgXQe7.o9H3X2f 6^J.}FiGĖXfsoRzo&Crn#9Yv,.0"aX8T>MƲpܻ,Dzy{ы>Wyd/RٞB'gȵZ*Ej[q5HRwy7jwfY }ETv*Xx<,MmZ9XUg>n^+kӵ{xPӀz^%j;k*؞ȁ\A{t8݀fOW6"΄[c@wA>UGe6X:UT.@ĵR-awڟÆD6=ՎJ4M?8(89!@,47+=iL$Q$]u,Ӣ\ )l lic+Th1y_D\c%L E!&wL8 \ $`@9ªYUDJQ(/ 0Ng@ݖ{|kY/gw|#r熱#a[ X вWlv+j2S|3 gJ $VT1޼rWVe[Ԙ`_oƓl:NRt e~X.Lj,)"EqlݍBnT@f.fDv8\nRRMG(&ƣ Xbf/\yn.\񺛌g񓀪^fcT=l") d;!w,>6%%4ADni=p?+su|OK`7"r:WVII̵,ݢqc g r|[&@=ɝb9u!3}\E`f셙tQFij$$vx!u pe&]dkQk" w,U"e5c@D_U] D^ +ǚT 3c %u\k4׮Fe|&-@P">'Yn$`RWee#b64Ω9J\`(ȫj%~KtpJ|qA ll X٭/+[C}̨M37_"6pXcmZiP yh?i\BbPG_wdB҉^Sx(wR扷V "%"iJP[Ү\7_RSt& ezd˕i>BîKC,"d|"SM&q̈́sSI̙u Q-5?a_҆""bӁN&snQ(o%=~~ +;x^~rq)ao%J[oZiyͣC/Kw%)U\K@%$u௨Ū*x6ؙ=1UW&=,і[],:p'L5XLFXWcXza.Y3H$RTY_VQDl=xJ9-zО"?^EUX {#_O.?V _XO"4O-Q\Izsu.&_N9x9`߁>uǰpT+&7$.+dpZ\Ox4ƹZP3sdJ<λDuE* .2ہW!-rT[9O;}%_OۨB_yTsJ:TqgK JerP,zj=&m׫t׹tI}r|;!7BR!5g;0]R磖]pȺ+J|fXK]q^ J1;+$gjP=R״`*38ro[NG6[b@ʤ[@`kqaŠVE.c93pPXD0/FCø?MBsE.TXDcUnU9&|+\${o萔t޾U= ܆,Ė%4`b>9)%Rt_%'fnE"yZWt(^nyyǑl1]ө6ܻSjWS D$xD n8:{"_uJ:b]ox}tpXfNz.xeqHUbC2ILbl#27Z/gWɽ`Mk`>qQO~+ CB%ڼ?C9f8H`twW#rUx<ōĤkɎd^t۷ s$S#4"o1^%,3,(} ]\&Nn fpסZZ.QqZ*jU"88үo NHt7k},[1R.'XEt+ˏbAQ%d¦)sn,=I|Hݩ21ݎ?a>»'eR-e݌9< kcB[^x@#Нijbu$ESy)<Ŝ*d< /V@َHaD8Yk$(UsSgխǛcD?\YqIedXԥԬii4 (e$;@RU|.EK{]LCsݲ3&VtJtb^3P'}W-Um$ӶRL[6t6g$նhr`ȣ ѼvM E{8ZAiխ^&ǧ6vOM/#| %+!a!- Dɮi:̏`ˏ7\O4d9Dݨ/xήD i?sȹ(X޽g~70֣WZv4(5䣨Vx2^~cx z;Z.XR@M5E5o⛤FhǬOXbvu_"KպivDE^kR Z;%Ja-i$ 6!dR,ei: ʆwӊB#]p#Q~K~zQwMY별qX^UЧс^sp|DZ@@ xoU_0K 0)K+HK|.IgԱ/]rvc?-l/y/5XNa|Dj!ه!@N<-\|o?EFUAUOx9R{읍% ok%ay1ΩF]Lԙ TeGhf@a\Nd (C5>mC\UJ&¤TjĀ?Z%,҃%mT6s PxsP7R,uoHBؗS+jRTH+Qnmxm٨u!#UCͅ8^cfy^rX,C  , RAerz*t9gЗ@+3ld'3.UڳFdg EuSUNM(F.&xyJt2vEYs]dv"_e{LG"-Ka?"Cߊ0O=㙢э2JÊ\HLytЌnf?0$#\֏xGCj"X_"Y4 y6Z+CNp E ^]EaJ0q ~6[DG\Zfi͕3GtP*C9ʬjwY5WySJSfU]yʬ C&?ޔyȬxū'8-3~_I V|f #vK}^x}ntcwQ# @tPjUNW\lv4F\ԛϝKL >vx {ڥfSpNSW>hyW3MJ ;`L/v1*{ޫA:'͡EO|dY( ;!Ҩ)E*tCViHKi$"&/*;/LՄ1R]{'dG7{ktkQhjZTjDG'dREo=74\f'~o<.pGd0A+v%ܸbϞ=|%R Z%Èa5^^qMf휫ì~Jeʮ9F3lVsm?߀zxAT_Yq|`[.WYH@Ă,2IL34mxӟ[=<>\3a6Lu fA̛33~VTӽd$tYoko7d :\p͕v+1ɩz U]V4H2=cg;ujT]μC2Uj T~Rv<22 wq8ؽۙ=du{#kp/36hTQ|jՓYc(Am.j\DZ槨h !P+_էeB vB@񽪆 Rx* '(x69Rj'E5BÔ[ⰹ@:ۻ)s^;H]L){#qwk7:}۪P_z?~3^dZ])l"9p;}ao;ʏ/$?.D~zw~ϲS`*u,fk,PZ #6.A1lo+{TUժh?d]s0W|Lޫr, խ-z?=OI8Oʒλjh\gtD (f0ߐdf1f~9 0VP!L>Q.u$C"QuQ'01;EkP*bQGRQm_Q"`C)%dCNA௷^! /,`bT4;3H8orr6.om)!N7sTuD>dUAw|ݡQ.eZ{+('-Jwӄ(I8{uJ=A]()Lps]Gs z[_)9u;}.uʴ{_uGe̻x*2Zx9҉2;珼o݁c|;h]kⷝ:p/{3^~oշsVB@+ 0;N5:uM6?ی2 m6q8 0I:#v7%Dz,B0= UMkv|R%j{p.>b Ȍ__e2ML+XeeH2$v2 tYZePmў@"t_!1*C (@ Je(YFwWe2~>|c@ ǽ*NlHbzR bz+XKQrGDôԩ5-HבVm qZfd/Ha&A!߰Y=`WJ}[OI(lTP-lrkiu+Mfw?df}ޱ3=[D`F'Dh O-L-uZ]c2uÚUk;gy[COuN!̎ȃ >O%:fJTt[ ¿ֶxFC*0S /F~-uc`u-haX oZx:'B]Qk^XQtzG'8eV«+"t 5[]0:ɞUz#+A̐E [zSL=-EJD< kGYDąUՆ,"IK<2Pz$ UFFt8vwڔ;[Dʴ UˠK}H҄ P`.DH2o4U!с G![9OuŽ8 SoYE3WzYNލ/?nvXӘѿn\']"2LXR,q6Ιz@P1YۙR"Z_1XGO\`(*J#L} > r{({7kv@x(0:yQdSM{C3n1lXXŢt-9[ Oٽ0̤敐L(c[x [FAΌGtL7gT֝;Ѿxg\F Y<&!?LiK8wGwGG6:i:a6hT]bzM6o1JAX'$MX6I5 J -- ǡx@9zIte#Q-ITi1v@.=IvRGkIDqqIR}ͯ5pcWӘThIUV^SbUF OSɻ ߽92Ӓ\!- Jo$ވEi˕_{S퐩iC%|38}nw1}W̐m7:b}+2-cuԋe]"` ;5cΛձnv{ ^ L)u]J ^A^_#tVi #]knʱ5#RtVR%EW8i[ 0`@5 K3Y?:wS>*E4g ^Yh#W6f2M#d| ]<V\AA@qr4NB{Lg2LT%WFN2<#xNYgAXՒO6o :SaHT}PH? 5Cw,(?i&& PgP= Qe*\9ȷCep>Ʒ,yΗ:'LiWZ4DN%ķ!$R;[ !| Ǧi>l '3LVT@]x+( 4N=V' K=8AM尛f/zH ?{ՎlHc S! .;ēE6By8INam>ڀr:Ov%EfW<("PM,qg4Ji[z9R"OXI,Ń,ufCO,7Q?^] o&dpD\4t&^?ZU}/g' ^?pk kϞ;?~S{,Zm'J=j|z~_w吟 rt#_b5zg\е6勱(E% 괸V 9\eq* g&t[6u"o| \/ 磗A磫b9KRD77N bˑt=chw|1r4],+5>/z%@Gcܟ$Heb㞊)_p C d"` tzWqV/.(S9ۃלSX{13H8]~8jSFV{hvSﱓqUeI,srGO-rHbr4 sU|Jl?Yf:[j,'_|~UgO&T?u@M@_]3SL?3&7;!VOA qY$%:i (15 !ߙ-ҧ^Ji)ea#V[sxTW@QcZ2Yq,VRx,VvIV- u_\&V4+^n!%boBTqgy^TōŀC\7~kNMoZx t.S-zQ{g6@iX Df@[\#XX~IA)rƓv%t {Pz/FoinF@S*7lЩ4쟩Ğt>&CKN-1L::\ RAkΜSH4k](hr+L:KT3хQ5_LGxn7᫉i~J{^io##&#*yoѲE3fS-`ҦY0!Fwf_R }WX@4b$@F0{6\j|ӆqj[iq.Ah2b= QoQT1;nrux[De1 T?_kZrc?9ipxF\pqg0nH 1UZRhl˭.&Thut.2ƩF$41hM3)k&\C$f" '2x2!{T'aͰkk~kJ׈԰Y#k$eykooV5>8%=*:UXSiQ:Uh(EׯR%~0v]j0h<H1m~DeqIt$j%_C{sy, _ysςo̮ T`IrSjF1XEv;ч ?CSϊ72Ћ!)#9NFeu#o17z;_4 aX`4A+J2LR8eEv= 3Hs/ ME6r3$lm@$ (F1n'ф||D ˟zLJJK]Kr}{Ww$OLA{IMe%Nb2ML qQ١HuG' NpkdȒnN^)կ:o *{ EI(fis&KQL7&N$n$8ʑLoIdfR25KR!3dgʙ[(xA(זh֡d93O(\&Fg}A9~UlY)Pv>@קJ7fcKv5\ ?oI7bqwC%|4TID +!cBŴϻpz ߬I,4/cuQ.I_Ų@U0Py>Cjf,uifzV>$37®Qˡ ]b&<4 !f7 A!S%!- b7pXnp,Da1nA P<{c@Rp_2y@A/Fg`OPdMNdat2yղ]1$1kٯ+~<h37ղ/@!.^ߥd+gT]8ٺdVasAz+-"WטTCWgȋatd>Εs3Uffvb=@Ղ0e&b]sGl[-TMd5rNL?zp[EabK0ww7@vD3fڭs#(QzϑǝYa1k(%aVًza ,xb!z<0-˿>A#QFȃx,Pq1U$^% r'ۙSLuCMF\uR]dW ܇"zP]iF'(ms ȇ:NtnW:, HVГCE~XmVL^溎ۅ ꆌ[e#cM.fhO[>KˉCnB+9s[MQ{b1DŽH EU!Yn#C*iF6!cip?wM(CI<Gv l4FmtM BCbݶi4 Wġ Xi5Jض&  Y敧YUf+7 pa3*s_% ux\o {)!n&v,LtXۛp1#č=x-HrB_׍MWwҷVRwY6: =ݟs*$b0k~J_n<_vv_~ċe aB'ANjXьӑ?Y {QsI!43 N-b2yc[a3^.>hHd伃qjYSdXH(IƟH^>N0Aւ-nQ:Tt %Mb |ud͠\J5~J@h5IObec AHaX âBzI^S8uxaM%%BiS!9**zHgRN5=)W>dCODpT]+,3@?Pz9~@cUaPg0R;D N5:|} &VݬmRkt'/it'ZkA*1rzdW"[JgR񘵰VOʭOʭ+qi[O n}87[/D=+qwQզe޴1`Y<=DǦ+u4sj#yqɼR%Ʉ N̘/]HX^\>]i1*UX"r%._* ]˦*$!FPJ5ER.Ćor 5c5mˆ TcPL#a!Зn7:zZdOdw1蝵x+=s)vZ͇xyw& s1'._PsE>UW.;*|g^34#P3L8!k6?9S?7x {V?_^ʪd4=(7[u2=E?|_xutCrYsO֛c#d:|䊶+,"X{1gRE.x0 G ݝNƟxM0%C~,SHbr3[,M/ MX<|zyRHB)v) U}ΜRxĸzQ|nJ L*G(@P T *bI !sI _E))id, x|2N$) ٷyQbEDqLPr[9/͝dxۻ-:`$k9֬TcΖ18렋ݘs5`F }̯-6Le ےП?/{3 ̮ Nvn?"M'BgPߧ7yr3C^x@/KgUk!B.R:xlh )rUq\rZ0lnw:s%X!.*0pYnL|-VҞ~gy-eVCSaj /?S+?6]iFkrp xjW`sUe%'ܥ<>&Uo/*;/LSM NzsQ mg«h{kx_T.ёmI-٩ԶwЃmۿ󦖟fz^-7 ,:/GU"#2{k6w뿽 k7_B ^Z3$W>z1\Nc(C'$^uY9`T/x^q?U58wO|Y.?Vt٬SN(, Njځ2*jt; qb|)eC塍3XC1)#oo8f|.W W$懝% DJp=\(Tns6Gh>#U] kaϏonFWT:p s^=}vs/UQY@- "a1'(~В wѢ+/?7jזy.A*wZDQJh m">b ?l;-mwDbOv$W7)|Ne`54D$rDA&ʼn}sHp8Y\ qn42UWC,nGjsiLsH;40&P Q];rƾi”lH.CDfѐQ+ Sob _g2{]`UFߴJSŧ@g5~8+ӟ(YJً@X0i &ys|Z{& {B0{A+$>=%VJ YS)? {-Dg ⨎ISo!^^x}'IxF+|[c:?]O[FMТ<eQEg9=}į ﬖ au'^~| -zݧ;Cx42^3.< y2A2w : h*{^T&4k9jlzgez $]ckiH1PBi| ^7Zv7Hhq;BqP~1yߪ-UkbFV$tVL*i%5ZY%")(2(LL@!-t58c0Qq#Fҵ|"7 6gër\2\{3F4ac((,>*_o4fݲq1 j;iKT? @〈 jCT%ŬM硪F3![G,;rmwg;Ep^NJ*՚Wԭ2CuˋՏ]8J.LsAV~a[gL}SR!Za9ˑa<|e\cSyD~H-vW:b>t GWxt@]tJ( l;v-:NHz`%* 9u9a }$_',s mܓ:QRXdnQd?Ʀ G%o(b>OF5_{]7?Wv'6ߑ5pu~ܬ!ܚ%pѸ6^)Fd\He"x_YA!Y+J0)0x rpӾa} 6xXQc4rP B=4&H1xDC=P,u %d[QΒ:,TfT`h!TO: el`cwb!s\JҙhJIC̘>f} 9h.\#eVsea]𓁌"7t*$<~aULzoWHf2)T>^(P>M͸#NM2j/ Nz@ -)y^ER|Һܺ;4J/ݤ d+䧑GKWlAeAm+L4;0 b-e%Yj|nƣKlv =pp;@nb^dgٲ&8@&eUMM~=ol8v͠~L=K@FP9+|ٙGa@Hl@lRyobKZH!FS1d9>p>U'SF׆/Kj9`sJaJ\hnP Tl6p΋R[;OiX)gb)aC25uO;f_ 20fl FdKc)WZ6P;bX{jF[eюS4kxw`_yD=rM;^JY\@,(OF6xF llaB{f gBHi//_)6~an DU՗[$xuS7.Zs{XMNM1u?fZ<;*^d?+o1䳡SE[Z5yCل/ujUFB9Ù?(ɨM\DF*3w%]OՁ#/" |z -֝Grq8BJ9Z'U (p؏A| b> X4jbXLiV">st} Y:TYryqC*AF7vǦt1BZ9V [m B ok"@^e5l-!YKAP_ln'ǦPcuNb*d-;sF} ;)gxѿgOOW:Lʵ{dxuO xEpߥt{>[zG>7CJYIBw&"uc1B8P>IF{v1̦K{8%VDP`r"dv~B Fp;a2[ 3sJW](3i0"N Q ^V,+=~P TVmyxQG˦'Рb+[IIHU6Q xȱP,vI+^xIRo2mhvg=wi/.Udr> T5qXƠCOu39KUgcDzN_R<ПKߔ0%k)hyt-7n;yM aBXva32e1BtB"ԛZ|\ G\O1'?(9jwbJ5Kpv"|E"$/44e+ 6>FN.Y\dOl>ٍɳ7<׆ˑ=}>+oBO﹔"& 7>g￐V>i ˪lߤp{Mx@L?1tQwP_”Nq-cWs3gOȝ}Mk99tZJq&nd01Ru%V" įd|9[>Y/^g[[^{t[OkS$ۻ[ɳg\m#[,sՔrt#_Hg[ѽvX PKZj4Swg H)4弝ϟIoéi;9LJU#esv XPI%lǺnkFշ&z>% _TePB]|;QdCaw />Г ۇh  fS= % a.0 8%٭cI뻉|z9Oz;8 C&Ve#cF|LM;@)JZkT菴t[>?:X ͳNNz'V2`Cx͌j'Fw|E֡C{9CF!\=q2HdZEl ۗO|azW?~FuCUE,$D ṉh:u8-m%:kj*aǪlGuf],#c Xn/B')j c/9%D{#l~>$uHJqZ2 "́#\ |/ߜM}}t- ?&1;YٟFI~7cϩ"=ң"y;HڝZ&vJLsF4N)^l4u*ɑ<۩dEŤSLTe%(S k@Z̈́a+fNmV#߰NON{' eV>ͥ#]e9KɫȲg8J-S`{Y ÀU f\9OD3_aibx]/^^'4?771g)8|\CSMSx$ܼ'~R G( ɟ|:9tNiau'G7(NZLyJϗ*KQRNPBkوԐ@5X""_^~G\BB34N0pq7צh:sE.{)'t'Κ.Cdr9 rx޾F]: xgv'% :1_FJOXTZ;]@o|FFyv'쪧i3JZcL̫P D/++lePEΪT]gZuF}F-1m#{ogtAtswc"ąH4movMf+7[ WV; ,jFZJoxyҾ>S16XM(mJW͢eeV0حHs773wylvPe'V`:0ɣMdxjXc'ӿ@`- Oÿ*Q|=6w?ٿF\3Sn;{| h z8BFNC-U3`[95R2@) -Q'OfX\4g |3fo!։ 3r6iFFRHdؕc+,"2DZnJM2T{?5⥈E>l#[D-7utʯzl Vޫ\Φ銋ɺ R. iqA4.$HѐKrt mӾVkWN!g*<u|}GyYT] p"oL{c%VUpvL/+T=/[a`LM&˽802l ?"9(xt " _ÍO KCvo#o~^:Z ѷvpeqy~l"/E~|Kϥ( V"U(>: j Heta|r[_ˏ>la{%GէZ0C # Yab2IEP{?A;RTN.5p;'"1ceD`7:4 4ԡur=hK*o^\W>J48o=jSue,%K:H6޳zwxMz8Aaq2M ԐӤ+8CnM(%Uwk>j~ ̛y_e.Krx'[<''Qѻ89WMn'd7`)؁ΜdϮ./f_oidhw2`iH/Ut&+JAaahuӁAU J9\\&J$W더+}֚Kӈ.J|m ,7W; 3EeH.>R{PU*2*vMFn=Y{'IhQ؃NG^cd@蒑D V,QK]uHnf `Hf)Ѕ͟ƻ3:}YX.'lz|9fy`u%y%c:e_rOZ3Rc>+@#0(rP: lN}k5n+썴%%9fqVĮVn?bR3˳ v*SSEڢsɇP A ͔u*mR596>K9৕%6!wP+ VYhkifAUҌ8Ǔ dtk3% :S\ \"I`qw5 'T^0$d,S22L999 |ˇCa4pBNE'O\cWos`\Wx̩J2`(lBg߬ݬ#9`AP&Ef"ɷ5Z$~vhc%$r+4)'} u))r2{•R%n̗ѵdYh͟}N?ϘCSќvOnu?W[*%~ilxQٸGU5ʿ<Шy?>;?K0n`_`~Aawwf (P .1=1=1=Ы.:v~}+SG;E±'5E^ׅdA,Jjk?':_ω-?t J({$~s7d s$I)uբu$uT `|/0Uf3aP޺=azY=Ō┲Xܶm}V[1 q ItO 'VϠSӅ4Y^h`бYY/a2 &x 1@*k.! T3%e2/=߳[A?1`kkc:|( P"JJYZUQA|4ÿ%ÖV̙ NQW\w!7Qi8v[=&'\ U |5NO1rYv W!Bzmz6tcJ}?@DrWA%:ZvtѽB8(R"Tl#7XOxw!0t@šo(^#(nwd|3ց1#Fp~db.ܺzc |NNFO@c4[n9WzgӒ)|R-7>_fһw77-s)>1h kyU9lqa]󘼔:FV32Ljq*Jl^GU5 1t 3WJW$RY^?Âqڝo{7)m V~4)LCv㮟R YzVDo^^=a|@Ht8;M>w>ay$1kpt"jv_eA}}HӞgս:P0*'W=C6+Z1rh>񺪽rhsufhZQnA=3/O}2PfvyqaJ*HU+_JBSC0C$PG5T(ڷt\FNOwB$o2N#tAJ'a&#/B6)o`x ZtQj5ahnjߵ-$/آAb !W=_4g22qXJi ɖ{hm*bLLj_%*M@;$6@|*w7OB]IJ]5KotUǵ1қl0H-1~MR\1ظlhyi`g_ER]=aН { CSb(dhTNKܮe؃fbZرW@ ٺB-z+ 0r#{&7^ u5jt_nXӐˠ@6v7VPP8D6mEsCͪamxޑ%nx@5jJ8CKYqK5҆Q7{12z:3 *} X rKoį.Qթ b}/ɥ$ #]IT M570p~V "J] ]NUݓa v(kb)1N6QO =H灝URNVdNwmSh14%`;exGS1 HRKNǟ6Zu$B$FFl2I.$F7h c!&:M':M':M%(3f92Y :e Q)2L8=C 76iC !mH%9_4j5 JCyNXx#) sE^:ؑxq8(8_-v~eK}|myZE EoBJ.t$!v'iwK|eE1> q (N]d1s 4I:·շ 1XOkyXph$5Ag-jgtL=Ň82GX>˜e*a Cf}]~ee'fC2sq tIϢvoY;FX=z {z}/bd78Y"b#;\AޏAޏAAf)~Tw ë7DTwVPNZ$"ukpCJK6[=zhhYV,42cQew-S ډא!.DO^`<1X5RBL)z/CբyӣYŒX?׊aKPwl4]οXݨ6"[y}g  Q;c}_fa~IwҭBy[*>Ӿ [m$^2 sz|a8׹t6LR6ƙ)~L o3{x5{ qu,}¶q&L?""ý˜iA)a1F 7F-s!DxD)nvc]jڍqQ/:1^_(lE'aȏ Fkǃ=_j;W^|a:/XwEmu[27fo޸Ջ w0iۢދ^^moyȍQypVx]l{(,C<%xwgB~s;i/wܵE'"&(-ОvvKpN|L` ƔWC7v.4:F=΅r!t.|Ý }WK/ɣߏx?kUãߣߣߣߣߣߣ_:Eae@zr6cPw_onz/w'@9?yM.#t|; : *G*갗M/.K]GoYl]՞'rWD{X{X3_v{?o7z^r] RˬwYT{ǽ7}}}>|Ļr% ِWK|?(5>*0 VJЍf oy#qŸ&]-B(Vy5)Z*M`̓]r%[FE'#o/,!"(N'S0etm,-3|Oϳ2ZOar_r$ofS^In$!pG|M`GQaI\[Ji6V{oete~2;4 ReNXh\f`LJ`3^ʎGa)'2AOL \)C^w=6^9hJPt넿 ݙﵰ1+i~låv2jZHGø[lۜB/9觏 n% knU/w7iEXRؔc+uM`#{G!HWOJn5N?C1JoM& ѕ>'No،A֝Jc)>aHw5Y r_w2}Jݭ?N-=%gOHnN׼>$ڿ دXH2+VcwNkI Ģflh'x *U`~"'U5VMڗ\ %+ﰺR Fo2,* , Ix zȉ,lan T )x gʹ#ZN4Qh ѻ+ {W t )9M5_uvQJ)ڭVv*-gUtFWyJm=]y)={{[򻜏2U_W;fU}v-Y$4@6;ٜHڬ՞^%[.p xHg^ms`9\$xydIuKyeM/PϢ/x7Zp&\wXr&ߖˏ\Q(C_ ?^x'~ϵڋ 7uNzQu{/rb-KΩ;. V-%5-N^GӏkVv=+XN?jtB)|t[AO{tx$v̫ [\7>?^@m ^@m4 ǃ3[XDžn|7MSoj2';{RKEh~WE % m)/hEh/AY{u?0P,xNQÊ;]N=5;z[ s5:Tk/rZ]ϢvTY7ЉGVTi&"( 4hs#,  5NJh-E<|UvSm}v7N\|F 3K2UN\[0}G$ލ/? $ng\MUխNSz5o^.#JR@e很S J@2>RWЦr{ "%I& p McZ7b ?W,uۺo0^xSQ2 =?wqe/1z>Ϣ%2]DΧ\Ͻ)/ޡzf^7~s Qa=l>N2d}>G^hco!␗cۯj᫚%PqMؖlڄ];nӚOIlv vWf+tKY !& bY/8HҠpУs =Xt%1CW:y(  9uB՟"rC9M4@B{.8O9 >I-7D t7;:;Hсp g+5j$/ ujy*V\JU@1(Ym{s>%oΎ˴x 0כ02ɺOGMBߪfb<6~ƪ 'ou:5س"?IfP8a.sp3 Œ xҜ25Vi $=)y`+TXmo9vhD h "GՑBUlWrɉ\ҤU&ʘ<է)%ftFcv9|ٌz8-cµ 4w!huz߷ޮ-!KµYB-]\*%d*Voudo)Sn3Z% 8X$,ؕ~ϸv]G״*2yql8aI7srW$FsU֌Ȓ&gSߥ3IZg>)ΘvܩՔ玿&t9ϮDv) `l>FN@xQЁ\&oKIӫ鍱zg kl$jF^t+D2bX`n=F=1'.2nDx3ѣ3яv&zg[3w`ϼ+Ly~]!vd]!Il8y'?de=>z3R?7 ɟC&y$s|Shvݵvl,yƾ]4?Ufɴ!*Tѕ*Kx]V•oM$%1nu9wF 7h,;ڇ#KB#OcKcojG:mk{0Qg|d=ϡ%Gp{:jC>:eRߖ$~t([/,p}Q (Z fž` *O΄=JdUdgIţT\ybxL)WFr<&ݼnޝln^ xz7[ q,3>=?YC#_CF=,iT{EOB [%/WY%/'gx  ; ;y䁄Jn"Tr P0<5ubtձևϑ~=ϠqH!0H2.p%H\Kd=ʿYb-wzwjc*`oe¿>|Y0}g\W <P_5{n?Xv6mhn=_ yG=t\!C+%V[Hw?1CѺޟ"r^ <-ZE ޒ{ ɏުo%~C5w_k^?~bH/#xaW70!]z_wz/ZpWM~@߯7ec@i>wO#eG=Jy[!w###lFs7mᬸQ7#Gٴ2}oX .lpK)T}%S ez@w0|2@\u ԡH$ZPbsΙr߬t-5= ]ꯂ^$gH^pr:gpK Ynk T} Ns1q"?l(pik+he :DQmOoA"^km5WFSNU.!Ki0t65ܥJ 뇅M!!%) qpSaN/ `HYWSM <3?ڻ0v`+2)WPb@l`Gkxr nt}v;RAvkX춚mO{/tlq~-'H䳃t*0('dzѵ<[ȓPii|%LOu|ã(v;ԍuZB⪈{0c9g4kx|p;T>*|8s㯓\5GJB1R} l:V$fOHP8! eC;.@* q.֊v*`2u4mM?,?5O LVRֶT-Rmbn!b|־?# dq)S/fI 52ȰSg22&ߊFe8GX zBv^nFC}8T5aKIi6" XpzopQ/+^ /n&!h'0KIJ0¡m7R'/E&~ɠ12JOSj5hSgYޘOC$Nd ߼BӇI/քp 厹0eFcu:AGh+ .,#{9`g_/:X¿(ߏIK!bF5#*G!A+m~|c' Q6cbG_$;`5qxA܉8J_80{' N?Vs\Q* _~?䢀U`%:4f$Tx%C#BZ2DKQ'Ea$': DwPg[ D.i%o?ݠF튒vp90i/x:;Hހ\%9}2&apָSUe*Pn%4\#1Xg󉓐 -?ήh_>6re+^$63SD%~/srtT1\4MžX^^U C,zcDF^S8L PF قs{w0*KO7ʎK #K\ M8s$&뤱 ”@Y\ \+T .gs8ϦHЦV{&|]}-RT 7Jv;iBnY\)c8 ]\+  H+l0m;`1T ,KgW/4@;c7]nu__Yۨ LMd8tb9 X=,$tlՠ_ oP:3NQ+h dy TtfJw1F"9,靦rN:eìVcfox^>gR/€t+2FOq''+nz8?>'S/s"dK̓ޗ#hqw2gOޗ(7vr^1}h7̏%,b{ ӏ[Wd[\$L-˔^zĩYTUR {ٲbMm4_셛rXZ* s%*g ޖ<`q}%y u=KiU3dp6U"+ $6!+4!_TSB265;g܎|y|vI:v2$H^Vtkk$FU)a8XD %Tj;;7GqƖQ(4K" $tҖ wgeTXݛ((3>| xX(GHb-Z)Wn`#5$GDAӫ HIq=wo]^nY^r.;~^ !5VT=G9 U2C7NJO?[97>C ` C3[N]jb%z =3/iM^>4;aǗ22iqSvQXo'ʁ/ŋ"bfـٱ;?=u\TVH)/2X*iPp:O*%iunuvO"^^[KǼϞ},fW[Ts ]Ht?tpGYχ{5ہDBZ5v꾭mq b0^QSn R7bC&*.=^n-)lqt!uH}:Rx#0'Ł;ihԓޑj}n-dĮ̇q"M?.M'z-S\)OoŰJ!o+5yOMdX+R \!l2|N?`?L: (=&)Ѩ O S'ol$z&![BIT| }aU~B㩰85FE`- o œoYܟf=+p9-oK~Gcd K| 2R)OA|U}/%TrE>a$at~&g_ DuP$P .l`1_n6L^āpG<-t+Xn]]Z| Q즉n438VT @H1H7Tk#WT`./Q%0h` -n޹TVƖ#I_Q#09By8t44pv J'=edXL!е;:EݡB iwR.ޥ@Ύ$DF>jݕZ} vNӅ ۧP܂J=yp9uNWy%.o;{[ 7${e}eK`QmՠH~nt䗼&--pf_goHClY[[*%QPI ̝-$\\YL_#Qz!(?E pi.eO꾆O];aU\vP/iju>kLf6lڑ:UҋBZ֦c1v}ϲCއT̎Sknzƹ"&IHÛhڡ暺raiЩj7uH9D8fj嶩r%ҥ JC1 }sRxABC#i 0,BUkK\ oۤ9hg:o1p}iH!h&n%Qio5&dN;DkҮmN5PSpqJ*nu>+#8їxIN@A+*eHRcm~3m!tl Hf<9 7:#4#UX$W>I8'kpX>t/X_<ܫJQ0ي$v6 w"*jډI.Rj zAs'Y۸';6q,ڙN] kn]:/pNc=Chi]+S3 !|%9{L_~p[^??E~gʬM ͬ¦1c'ɏ-tpO0}@u+5E|_;[ ~4<|7P›0 /C 5e_15uJc ?* Ycy7qnG ,bpD5 p] y+cbp`cb4⭤+FO ˴LB2"T`!e:KWėe:+ذ"!GI|@Ԝ|}"c2bS2<b"*νsTvId q*]{%<-vc9˅pAli0݂2聮GqjX1G#hZ ʋ CS -WN=ql nmd0L^[ 2eD%Mf{J9erQ*ω-.DFЩČ/=X,㈡[X-C'Nt=vsoN=r^b޴XC.Έ,%Hb pHP?XbFbgB )`Db)^ o-'1(9Z !,BNa7sßs8N]*`MʓI]d )+CXcvNA)$&"F:F"^o-C}X?!ȃixݽpX@m YfC@)uؠ.Z5L_Ex/~_IB~\|Q4a] Pm?\?a9;Qה6r3e=mRaސ >(N #@A-b$%K!o,Dx?Z #z^yhG!^0b@ЀN`G59?/g7t|K8/Y?~`.HKJ_3I1eaMWu$m?^bA*"TGb/L ~_<= tQAn[~z?8fsA+Uu0HB] N;9j&\ɭvWy^ /˻MoIpNYYda {2R}#fU/<@*2-D7 V rX6xKMx+OZܓ4V+ߠCh;+xHW͚w|y3sh 05RXQNƠ_\h*Y) \ vAEc#5t-I2)$f5]MbUxxnŪjVWvز/ЅMz ؟ 78YcJO'r $n9W>۱(籼U2km ST#-2Eh`wu@OxLIպX^#r7 hF97{nƞ-bETVҹ7CaU@}Qa< )$yt>ե5L`)R1{6cHndILC9< S)x?#gA$e_VAZO9a|/QmY6+v!?bBBOBW@_ SWl,Wq,<$ũ:֜v pdtw?Rp|INnB:9{o.6J}8aJj%_',+OHJ-pŧD[NCQ5_B4DžܹA6!O,* `SZJ\:#&T J'TQM A`RNxk:Sf.Q..i5tzGI=k[8Jf%H")BFJWPJ4(mqT;6.}Y?Q>yr=;h#U.p^hصh 8唹yi$:m?kg=NNk@_v5L_4j֏ֳ;^n1Glp?O lI~$EMYT!=&Њsz^1P\`<aHEQ}P.VDgǻ*A#ܵ'RECnRp0kF1+Y2xCK1֊&^|dc \bY*@p+ҩNUvI2okBU.^Q@7DorbFp~X[n0 +˪R[ZI 8ؖ1eOPӏ񹹃a!z0|P*$ Ə(CX]X+`+Ԟ/y>o% =@4/T䊮x󆎯\ƸĘ\Kz]|~Xᜱ>K.K<3AI{yƌ֟^*Kx*CO7q\d4m/qV@su0H(IT*ArE|8+|?َ_9>fjEGVooxkHO>IATmSQ:x:`W?).`kro!|?v%p6H N?Qtg58Nג}<XN\ɻ2ez=|(y$%s,d5*[.[;=z?+ (.^=X8k .&Y~*,`T>,(B(!D!5\<4(KKZD|$'$TGXyD_6 J4_̗UN(ȥC gK$ x_7,-u>bL}v 0qP&"NlIZ>SE5ږ:@"l~<Fw9Xz2^nR}{ti윙]Bs] cN=9|+ ,!lCBQ&zIL5ԫ916vZK9>>19HK~AAI&z&d=݄7PKz5go=;bB5PU sE0+2Iĭ`0B">PGɖP4>`E,§ZA`4?`:I};k ]g,Eh[%VaDdp%Pl).72-T~W3~@}3]D~bio[ ʈp<R3ɧ?.ɂ&6}5BR@-_>gM_ @ 2 C(&Xb,c:W>"+;4ݴ@drZiٔLb{zDxHKJV~SzJ.e̒PtB$v.8.A›Z4o<Qwf_!.+hCm/bh ji .peo&Ep%mkFӑ'FNj vi ƎӹDzK_7ft9OZ%uȷV $ mB!Y I O.'_yp_URj\S}꩟+PK.y ;y CjW VB,.=|)Ke]3r$).0sgN>)HRwE;n$P=T>N/lb[W):u_.  p1 >g"l4)L&ӳ̱zMBfEi0+li@ЯAMOLՔ2 NF"^ڮ5C)ⱀ}QR(mQ ;=/``UMj*d9|zȝ,x5הBmz[f1kcʮTl2nq^9E<͢(:@xD_|өq|H]L;0g ;d%)6ArT$~nEXQ:uE  i裢[e` NVd:2X+=?g՚{3\]З. |7nm[mܺWܺA2zt?Nf:US>.oӗǛQL,o0. ?oěƄQxn'um(Z bDX5Fi-LW]fRwC@6b@5PGmDvM8t ѕD x]'5}~3tIuw#@]A"G!JGzW(܉V݊f蒔F.FQU쬽G੭D77^V{=q&5ZdƎm`~Sڋ?gj-MPdN@7dki20QjwW5z5TMQ@YV< "Ax+0tRysd![xY^"xt D.(5 h G1[ zˡ1nS<ֶ7Ӑ ƇeMި5M2)*L^0Yѩ*qN{t"U,t/" 8D2px΅ ]ttk{9'^OrXgMJ~BF[{'B6 , n ?O./ BRZ20g8zU0Ozr1vܢG)L$Ob'Wm$PӱWz64E@ 8,䛁 - zg{E͘D`ZAp+ZDE#r}\r<‚ Y1!2[խ}uA*Yo;ۃL_.r#wnDy%Z-nHݏr/be/~{Q$?Cqxq&1E0!ݸ0SbWт% ^UynKWLaѻg/k/pKtwʉ0:3%Ӕas+8/rH֭_KneaYªNXVv f k/d 3⧌^Fr$ꪬh7"d) jRJ%/hF,HȠ{)y:NJGJFF:~F7~+uX"pP~(=H@|aQ#fDAF;%ÌDEmPYY{-teQ2+;|ǐνPQPb>7?pOb1FŸ >HӒ[zОE⃢1,UU|PW~_wxHK2]3jN?b6zǧ ̱-'r=j#ՠ+ۣ)kzwdd>jYe, !C&&CԀ.|>ؓ n5Q3 0]әO(0LKH0I:> j\?Lyz#n*a2c,Ku'o?zc|J~JfrlfJN|OG8A'pcAKNN{'vsNAŝ|= h<4=^/CrjHG/| SбnBvSYWO|irW~z2fO&kr1Vt#:[T!3gkx0oA'yE+{; TSu.B `\tF,d}zFRPx.kK ȡ.^up0$阥 =?z^Rh"c t7auFϞ=N,1 dƄٺ4m~.UNu%Ѐ rt>x"LJ`J%Q\=Ly'C8uLe :cn`#`%^ #D6ÁpXRKi2Sk+PBI.0lT#Xh/60C7S=ehiX%Mf>v`K<.%ۋqj{O;@'OptK2I%1<:5 { <96ŀ+\? knX7ׂ,Y,!'ryf&\OҊv' rAwѬh3khB<`/iDv'it['=Sys-u`֩o_]b03cd3VӀӆSbKXO>/\A2X;P_O[R+ )  VTl '0l;JNwͣAk=rQ91:gRjS{pmN<ʡ]ڪd|q6J9H'v7yUq*1vs̤*Sګ.Sbmj좱!n*S9X~j.W o] Xx9N'>ZJsKv9I^pμm. ұpƃq 6 a08i* aQd W뙠60W3φr=%V3j9pA͎328#ЖcNOyVw?Eܞgira}5^@z|/|bYLܜ^">?h쾆Nv'jHt4k&,ʕȇՔ=z ?eݵ I<+L̳)^$3dxXRêӾqO.G9^50R"o@Wxq}u7&r'S!M2trY~^n4m_D`<_23aan*[V-͑g:4ŖKv!p|<VT'!7|$֯pphNxMH]BPfa{ 4!xNP0?]aewCxFOVCa[^M' n<3M`mQ,g蹔/@`=}uhPaA L!f`l0prSzx}qg3d,vVH8hh Cح^~h4(XiW.'CP$ffQm̝<1L,JELdӭRI%v=LT-+G40|Zq$V01{A"'bf3lt&1@6!1|ߋ5̈ӯJYWvƋf1f*|uz 00DY p:#Sƞj9A`lz}?k2L12|BOF&SXv ±|g6}Sѣ $ma(8v>91Ͽ ="Zj=:I`5RO}ù꯯ɳH'е"ECWk¶u yY#@ DXs) }Q2>Ƃ{o L=]!@B&G*~}RXf*^.ek{n/zAK_Nz7uى:Z9rR M+JFY}VNnn*s5Mɛ5x`w('ʡYW[4Vaota[Pt4vwowog npRxe{ ǟ@&?_KY[˜P4HI3 ̀i=? ޴{Ic_Ia/Uwt4'kO]#P]Sgt:w>+Yԛs$O|2v;B7ρ\:!d_<7H&7a@o7ay41F~NZC洸BG\*HOy4:!M`Np<zqOC$Uv_%+IZ+'o06ж u:}$GݗtRNt`⪿Bkxv0Yeku'~}t 4h~Ypxo鵬m(=9X?cJmH5{$$&gTM5S'+VzQhT#]?qljDA$ɹknT 7 $<=_Ae#Dޫ)IQ2hv,ZC볩. QFs>߱r'˘QXzwt?(>d\.Rzנ~Jd2F4IE UX@t1d+jf w.ݨ}35iIpw}zz?ۃQ;q{vltM.x 0G;өFI@h!zMtW7Ұiyafv(6iH,"%G)d.'(~<x!sY|a>݁gǠ=T*xwRǺiѡTd>7YS;Fϙ̽my0R6^FAJ̞d#6Ɏkm8FQf#.F tKnwgkkK)Rce [ф 꿩WF 'ѹi -+FU>%a-TLԹfl>Mܯ vIxyÆ'BfѵLvQΔK=ʦ[j]%ↅsb &! \ScXIwsIX!6١3 kҾ>*h]QfVu5R>VJ'z $4/bHĴ&((I׺ &}Lh}VURV#E otT98з:R[Gb>(`q8+Ho`f`,!^\܃qh%R q^Iέ`: MoY!Q'9`+3MlkW QybKVhG{,b S=Q^} B2 ͧ{Zl%pWj]X`q\ڋ~Ѓn"yPMTs>-@=8 1#2LnV00MDD6k:,;GnM\ *=2 ґ;z#9۝(,B[G5T7RvYxXO?[pw:H{6Չ{'0g5}vw񙦬LVD%"> Jy(O'xC )\Z`%3x)9't/,a~qE6,'GE)b54-Hds3:ZLO[}iG4i\1AԏCk'15i(#μYS*;6ު(PXR rGo/m9XRD^( Mao_M}EW) Ѫ+Qq̌Q?}&odm6OAa?ey(Ʒ^f9p ĴcK9"J^\dKydv^>:KS,a4`y+6r/zY=2G" yTeMvSҸC%SA^ŷ3XBefܶl9U^x>U|Yq}bS:[>IFGUR>-tFCV=%fW:NDˀv[L$K }8q_ ,؃>x5N Rh; 2!S-çtK& 8'SUYmd<_ݿhQ5AR"%rƪ;.V}Hj(x Mr3#[ԿLz~+qe@/Io0‹'0 ӈ xD0J=J|Ew 9`:\s~zOnh?3ڊxՓH7Ԧ',JMd9֣ҸDKLJ{kt5 CckX+b85:"*fI:85Zv"85zBAyTV©#b bx Vh)-.ТxM^;~Fo\x_ˬZbgU~&>Gga?NM}oj~=~Eqz龯 @w? z׳@ NHz AHOk Y* Vwq `~ɼ d'mkt;sHdy1luS}U_W5.U3Jj+#T?W2''tٺc ؏ ll(-^}#KJf(IIW9E2 &z+d },U"nߵ$?_QY= Eo#TC)$:dc3,V 6z 4tu|5Bt,U:vh61v;)ݯ5wj]]q36@Bs6c'; ng`2hh A^@v<5:TQ%t{fX!Q|;Yѕ'D$;IvYb1〖,1;%ĬfVT+:PEkcV$#ˎlS԰zxVg2ue_UFrߡЍ S>e%+$[ 8‹\f fI9='iv N#kb'$f@ &yYu%@+8qƉ6ڦl\U>{|fqyp5cp*+eokԴǸ;2c!qga^{mk+"̻֒ndkν':|v6ޛm=&ux;ĵAP$ɸsyBiMO3"?l }G 8x!"m:Zwm=~ /,Rnlh|rWu_&qh._`|M-oB5!T+IWw+5 zYyBHh f2 + 6qq[|L6D T2p Z+֨&ĠRYV"bq02 oEIΧ-c D_XE,P{0:IT+9nՒm{vCCmG)~R}B/c-_[mkf>KhmC\r;.z`^z_GLoXqK:^s{_³ր׬k5A,gӢʀ'VdQ@`=hBHkf/$k5藿&b*fLm6B5Љ҉ݒ015bLzDez'83!6ͼG7CymCVS׆1ɻܜ\׾%{BG"1M#7̭#@09ZzwSc2f%bi먹#ĩ.`__NbČy?t Ħ<Mzy{GM?bF?lQl7 g>]tȝsGGŃD6Sm辍}',W7V_LI4W"(q\D*MhTJ&ʗzG2!."Qe2F}@ac+ eMnY<67(cuסFAdhr~/ſww젺ll6#7a0 r孪>oR4@Cds铓ug5ǚ|VjNbs.* ϙdv3Uq](hQi SD]\Ne:T"dN ړVm6U/umv3Ler#'B+O_@!(aP-{-TĄ-Ah$`9{pUΞx*o j>pY-W-@tÔ?bp x%5^eNLl˾0[Tbӟ)8z^:P^BWxCt>-{,|cQXG clGag9zXt,Yz弄P߲׫#wEvx%gךkkMQX=|*#WrվOB.o'so"BkFAs0TԁKMUrb$Ւb)ۡKTcUS՘1MpKOxJV$v45Y[&exg[r .%Ә 6=}-D;p|88[h@u<(UMo'\*_S^P>p9{~|P~nٗa g,i-WÎO[ B!'GS~k܁p9yj5|,x)3N-)1ÎrB3-jWrӾtJ;t\zq֥*E8)}a~E{%Wr-Ƀab_\Dx/RJO=,Ҕ ӻEWz1}9O+۟UKT1T@^ީ 9̇6_5^Nw٩w’!vjW$'aW6i&UdUei޴SA,c͍>_0nCp<#s9T_.{T&ZYkF\+S0_$cHTjiϵPφhl l ?pz{{v{e8iF9ٯ7Wփ9{ovWN>3J+|BbBbBBcQTTO"J6c6UYf$ABڱzʔ3KoD:E+_~YNK~O37[̅^G^o$@dCf}N}>)MsCYKP2 m3 TXlBPU꺌LbDT#T$5/rG$D=!-#ҜEzdzUuplqO @`f76^1[o2 n+iOi Qp?0#9 Wj 7&ݩ,bлvSzI}'Fujeo~Y"gBwxy6郜e >"hlGu)޿^ޟK1q`~$ +ڑFP[MIҁ6w0&&mR|E=G|,5UU0!_PwUZٴpbT 9$lC#/1tnEJ&nR{plC';]\Nu$c.wj6G2 HN[mٿѝ; WV:ã;vM2==c>E2(Y7,62TWpħd;H8wZ%cP 3C xzfxQBh<: >ͧ!b %)c&ӃxownY 1g@rk=ڀ&`,&WHH8iiSQtR{8?XtN &V?eKݵ4( 1:8(g iǭZ[<$?m6O*KyA;d(3qWMɰ!f#ԅƣkHCHInF_sK}wiΫW>Vs50f"&zrVw D.vms~7b *fs&r|%tyB('ʛ )'+*vN*;ZQ[GTtLzi&@:% ؙhnq@aIvK1 bhۧPBzIv7ӲJЄ:}>dET)Vd@k-6-:nI<#ath'9]tfm ay1j]tor#7Pt^" ]2'hqbf:O "K@ .ZBQbw9B[8]ѥ+jF>JrM[Y$LcJaauH+E=p,&)Cn`Lfjl:1Hw=7)spW3l񁩾 I`c)Ëϸؗ$#Mi[gM/^:B M<@< A$Ɏ4d'eNɓJr~)'bg}Bw)FiqbP'W[aʨ%rFQ)Nm6> Ե1.㣗JdYIzucd%i)hP? ~3fBf;LZ pPUtT~{cJsQ8HRF^8TW{zB%֩^w jLT FI/ENF"eLȲiEvHC%A3Qdp"\R]+ F~;ߜ (~[+mb `c#7/EqF9.z՟=?]DqڍO,Y]F[gO>}֚KXQ5L.Ji*9*4髴 $RHZf8DU1ك8Z9K sI"A4t^*b3jH Ậʅ|əyw7Kبu3F"ë1 owLefM#6<߃y NT4ES"\ 5k kJ1Uظ%U< UxOĭ#p>Z}e!V2٤a!BY꜕rZj0H;sMǙ*N%בvK-fn Τ`6 R`Sf웪T,e(3'ŢZ~kt^ٳ)君bޮ衳5p+~9UCu#dT BN OG}pW8ôL ?\n hc?pT* ZHM5)Suim:B0T(>Ӟ@:X 5 jbA^ǎ|bw>]>KH;]0Ӯn7ԁ5qG32fTу}GZAul:6bCx ̜NxSF պuoO ]{F݌}O 8O\ؒPnr+]Xk[Erx_37Sd6ͦoi+6AG`:lZ h3qIR&΁Dg/aƦ4!5":\ v =8ub(Ј\Q8N-Hu8E#  M ke7,zڏ} U! EEyQzIc6%fݠj7! KL]P5r>(iS;;)2fN@۴ ZiX7:BDM~)Gv&6^> bJE/*VNou/zex \*Xgxq)&E%?Tf 9-_³vXfΝ:ހK'}["q?Ȏ]rFn  %=z‹h)#̀ 8N|u[("su6p%+\ c< cU4=C9/npBCԲX{b`ٛR0FqIknqm6ŀ G,Z!4 ߅tXNqe8)ButdT+[Su*[P2ԭv143V/@Lr:lV<]gs毜AL{CcD''ͩ"zr M+"Sxv)G"Sq=41r[j XC_F:0*QZĝL !r7>q"KKHDDz2^e#Tm}gr} iնݧ{}T {1 `ٯ1Bh7 V#XBPK 0;y0X͠P2`: RbbfFEw=0 z09XaՈ1FB X˄w; Nr}=%5Hd7jV3B0D ǁ '`E%Ӕ L?EDNd 2`ЛCCdO9_r?57g'*Ǒ|)+|'GC/%0.%RRtBO0=P>lnbjX$8RM l1 &zbPN`(=eY-W(oaI.*{=V1 V`trVތ>}lV=WENAJ172ul[8e:${{YR=ݩf%S9uiR^:nRT6ԄrYPyUVT P_6n.a:l^\ Q1CccY/c= #9g? ~:U6JR-QMoJ-VGږWGj,QWuBq$)e;aI 3L yĆ $gi~O,#!||ZжtSns&nC1Jmzè.?1Zax@,p/5cwV˫귐x[KkYs`RZ)\ '1U>hr^| B2P4lOZo}oaצϜ~5f3eR2Iӭ֩C{VPP~_NP&]<*2MO --Lgs^ף wr%)R` ָ&,v)k:;_7b1ZT;çXrB 9uzh& ͜1#[RkokM!,f-8Gth+|T|=H6C()"vr_K }^-%F/ cCVjL7-!b # RiJDH]C\zֵ5П,3K$J?lJP5/l 6nضIoF?F}˅V3/ybjfVӚqx(ze~9@N,XDԂfp"`EGBg9h0mь>-Ut˧ 4*'$yTz @ObxhLhV-yF[%ie~IRo}J0x.p-n(sfE2Y8Wȿ+-m7!4ރ F}[M{wYmヌԸX/,瑥?=cЪ NҞt@z$K?u@+dpAa z aXVr8{EecѸ_D= @vfw5M{c.,uK,è?WmPjd5o!],Cb_93B3Wcta (XD6!bgl"6Id ? %O= +Rct7 -u9 p\D<<Ѕ5{gZuBo4R(Q}Z]UZWB-4{^PWf+O8`6E<'"dT2D6/>8w\,tuv엑YYCÒ5 L_ߑ~׽^~GS/uGyw?LuuNPa0#XEs5e8_CӍ_UHr$C^Sa Ʃ, B9R)ET2)%V*#%DJL5D==bK@׀?$<;!vy% KcfbhN.e//)`l.ѱ.HJLspC~xGGnYFŠ@‹zh //iǝ|q1ƭ snxSMpHyʼ U \{ûb*5J0kGJxU)PhJ6xhGUqW8|fy+i1<Ĥ!&^ ~)Cc@ gBssD=XcAc=?BJfԐu&M@,=˟UM0 1;⅘ zכTp¦R8+V^Vw~| rL`Kt gS^CL_zEvYטksfISz~;4 6 X^5~Kg)Lsqy VЧT´ԛ^'\_+ ԇgx$Z̭GgIIX'>tw_( d=l7M)$@^Cy R}Iőa|?R_.{Kz%/}0_qjIo2('|QY~XTi i8c[.c40]Vo Ap#tqvk#NXJ`98 2 "mH-׈lQ8XQl1Tj$Ft1/{=<ȫ1B+ hW' +X>cT`s uz,`D`ZD3A(X`0` + 0I^,\GPj{c3CD&>7 }J+H%(]SwC"6"G]A?saC 5}X AZkV'6M_.N>c+o&DwK`'yS'2*AIX E_-C t$RnhYFh^Ԟ??bp>kKl5YGRo=ݴ󯩠P {I'HG?G{Ng|"4=aG3dlz1"ᵳDӢO4#I(EEHJ`,w lnI7L`f ڈ#X\{a>u>5Nff{u:i@:,h -3ig4iʓ370) O)oSj30oY-?^`ή?gԊƒ A#TLj`eCc~eO`*߻i]c&2 ZԜݤǭtL12zuԋz YT$_G]4 p,Cѧw=3! o7e$zL(-ޜREws䠄Uug[~/ {b>67pS!(H(KZN'_*ȓ1+hB_W@*}2p '́Gp;*H7!|d !dr1KpΟ`E`$̋[B+<^1Q^0Eix 6 P&2-5lT:1M(.&,KZ$ z}^ANcV**)蛴9:H5 J^H,U1K1Kt#h.XȒD2mad)HWKvR9PotKa)QK<^|S.d{%J݋gʸD+^x4 BewǽXM @?^dR <=_K3B`QY^{B}\},D9,Ҹf$4NNfV?Ѥ×8MIa1NI~SHdNI()YISzJ΍u)ړe$bCA:B>Bnﱛk37'pDG@$D8GCFt$HɂI^G^-9Q\ `\$$)`7Con+. dVvQ|ֺݵi q{u_\K<=4*f7d>T\ \"NZY}?<ZecA[u-̺͈u+XLjcD1 ĈT49+đϦŹ\C./N_麩cL'&U'XNTd.`D\˔>af*T n~.)L jC6ϼMt\"3)R*2aE P!9u8E zw"kRdqǨpܩ=l<0+peoN+%ɥCrrJdcZ pR>x%Hb0V틥gwJq(/QvQ{5Nr-m(R ^|oQv4Eh6p-]|3 DXOdJ΀qqjԳFfQ:Կ ЃB?ſXb$3_|Qg<Ѓ}tث&_!r )qw78Q"UvNi[8MWo-,D=s2a(c_t &;0'6DD?~dX+"8~!DE>]'ı`:Z%':4K-P*Rć^iLH7SIaK$3xsotD1De) 2(Vo2JMTcBWYLwr2=(?fę2qP%o" TBD^0DZ蚐1 KP@o6j0ӯƤ3]ёO7}$g] Ldo|#J%q]̭gg;Nh@9 xNnp^a9e)<.+qhSSMV)VD?i+`u ڎuC מ>ajާpA=s=röc܅9TqoPEtb_N8<$7P2$%>8im}+, %džOD>rx3f?Ö@[ ^k ^^g?xOx )gy@*T ߬9C!

?vlg 4tn:lZ 3q߯R&Ё -9632ɗA+Lj 5":ԉ4v ]7ub(F\b8N-Hu >/0#,Lznac{% hNx_R#nWaSlHjh%zPST]=}"!r[XL麢G*;މ OTd*S M$J~a IYsZq"!KZuKhV-tœx6= ٖЦWړnNO^5I'mژmŀ5fS@yf:,` @)5à/W6">Q`5stfTChq|JԨnW5Hfạ`=B^i ti_i59-F1D ¸y6 "@":"d@BJW!4R$(20]>ezP_`ЗlKosht| wSܔXbU"*b*qX0@{bgqM=Mϕ>.K>5梐SIŷ-22Xi(Q At+t‹F|N "p`Y zq+t\IvZ{S#U1`Wt; rLYRIQ70reCkEZR(X@M|$7>b:{q1DE6 3 %70dtjdat lNnCaVXIH :)]S%Pr;dq#6 :^nPpq4Xi$qs: sD.J/Pn6=3naj54`jh|^-6ܩ8H: !5F+0 vcP ѠYiҿq+nc;{_# 2YN>CB88i)cVP+ X: V{ o> Ei.L ߢーnkZ /!CgbÈnw:eA|qz?;r*G~?p$T`x%6h I2\\L;Xmi䃗%0zUĒ$xݨʈ g_uE9 g.u)%bi0M_, *8)!$U a(gRDwQsx]"mV]38Eek'_TPU­Hx, *hǮe*omPTC]Mg;7ZxS Pd*1Q>YnCjkXaa!PYYmP U!# \\Yڐ#t`Ȃcġ`5LL$e lua)B H3dUX0Nɻm .0%Dvy'*j<upأUh=15.?qMͺdfU܉Ł'wqN.m"7{ wuwݚëFp` :0EȲV9 Ht?)INt554G2Snx-ıC\Ln O[Љ,՜]чhu&h3@EC~9/5_A-ڬ;CCp *K YǘNJW6g(Flty"BŖ($LY8Jkq@loӑcqJ*dN}k6Ie 9 0]W E>ư 5]9zFt=5 8ư8my[fuhQFem>iLؓR*)^?ŲbS9fo5 @\_q3 3g&•MH{1W.e,c%H mvޛL[@ 1f'1:g_izO7˧zy{X 6#of1Zea޶XEq^RovJx5(.(qufağz2mNio8~o3;Vi sH:'6j~7?ÅүYj7x¨AG؎HFx˛٩$O"&LxQFE nS%}'h=+E1楻bQ5CnfX2G`,~GWռϞ?<Ƌ+ T:BPoI`aFKPvtpL Jv4{9AKx&epƹMwB'bD'Ng&a2){k/]GxGE$, 63HǞtp(}>-6vyALybsq0LvA2Wd[PÃ7?:p _ϝN4*<^ ? E0PtxyI?,p1nh% e_j*\AP.ZaY}1euf5ۣs^s`Y6ͪ(4$xn3/k*8hya*F?-X6QC$ƛȄM4tyDMDC2p 'gBus1D=XcAc=?!VTB+gi6o=B??t*Ig8\aK*&Oy`{/;{^|\@E H}&%qt[ 12'SݔxF16F&^4kD>R;@> Nh2D,(>NFCi>WHj[<o7g (d>l@7My)8@^y R}I1a|?fR@F`.< Kz%/}0◈ `ŁI('|Y~#eTiٝ-1 Hw.7 I GY0PvV- y+C+V͂dA͊b9O堙,3  )\3ݣ pAmyk,Ya \6?\)z;[E˝ uzP.0a0]4;gØQ\h`XY DL贡O#2pc 1cOC'zfY~%BzHMo3R&.~aO\m>>h$|E r+Ahh* ,O3C7&;ܭX zE*seU{ǀӍ-k4k 2>hCq.ikA ?S9ď1wG-9 N^TūXG#֑a0opC1P j]:+y sOЗ~4J|DYΌ.+(9v8M/F%<[4:{&Kn~xOǮqϡ̛ B*1o5wSO,||bS ),C6p>|C!oKBad0uY8쬾ĤafML(>t#,<yG-22eN6q>xs[u˟k.mM(=@JR9x8ćA#\@1ğё?"'Mt[3feF98!DIc1HT0ׁR1R%ڌJVSBS˄Jɕ*ϯÙ{%!Hyt3}ףI)1A^vSNή@f`d`@fnU[;/}JҚ;٪C_`0F͠H(Db,f>ZN'_}bШ@{VL-F4եPEYŤ\}¨O}Va;<2of2[)ZP$[Cc<]1U`]aJ&)mJCaM gٳّ|"Jomux}>P%,іh-0uz9y4^oҶ:KJ*&K#fԨ~P;y?`[GݡŦ"\knfN׊?dfea4KbH acɇ:_~ħČd˞ 8x [Nc llr@6CQznq"߈F^x4 Bewǽ^I)?8^Es =_ K³U#HpKd$qWg(ov5)@`;=oĉ{KB~KU%+ KBpJ`<\xu>7`' R)@Ȭ#,IS:#'4K$+ If>/SI?ɂk@I^ P^9Q@,Y8$Y5W`R+cl@g/ BD أ1-{i93ʬU> gTkGwzj gwvn)~P3k_e~f$jV}lTFYθ.O.mwWw F2(Zk]Z_k]wZ\uku2t]&u0dڮٍlm7C>x4Huı;h=rg߽x1;񿃖ۯ7h*H\\cԹaἙ?m->"^G=g*:Q~4͖MWnDZ!0vkO%/H~pv-l6Che0(SنO bVL2Ng3Dg8=Whkj<*Sg3/xWy pmگvrG:n6 WFF"nGuS'-L[ :8Mpfw7,e*V&#t 딼yͰ͌2[҆;euk"REu&mIcDoNu8 =:Nf ]r${b[7lQJ]G<^:1O8Jg+t ϦgNYq2ZZEzoݹM.g>ޝ;zOЩDsG#pj^4{H`8R(4u C .X; UYwjXҀZR'GqT†\SQCrjǝ3;Ѹs?&K߈$|aNwY(i* aT㚤p3@% {q =bF')lȁ V2ʖtL4wV0hЍmVddXO1"%!Y32-zU/Ғ{XC+ODj 13Y$rPa_@!w!3L )c,7)H%F!8px8F폇#[H9i?TbuujӗSrdR݉'у]tϘۈrv˘ Ϧ'e"د730$hlVJc:s*XuHc}jf4q^V5}\i |&ʮd?8u4MY4-68 m:*: ^?k$ Eo>!x~i_MdOC n Djּ̈́S5/gA㇗gr%F}Bćk6,b%Ǹ -;:ّ@N܉c 5+d#![̓Rd P2#r3_]^ɫ|0bW A^s#oxM9I/0Y&EeV]%d)sLjT11+YJ_@{uI%BaW5 8fH/]u:*wPt2Q4ͫj&1 z ;+t&FƓrN!.WCO/4Z0xӟ_v@[|+xpQsQ<’@SS'Yl)$RsXC/x0su&ۦ/h4بqni*v9ɂDXJotsEfgSsV rhd#_dllh0,4BkqwWj BȱILcH o2`U,Ӷԃe&82A Bu1ˍh% + *6]L'8d"q1+6t3~67Ol:$*I7IFUb^L :bPeL6<.h);oJe m p ͭm98}s=pup]&~ 3:.9 N*Ev3&&Gp? e 4\t(6a`i51 K7OQ;}i|_d!DIbfnzJE;*[%tRnȾx refE:G~ G eؖE!mK"2ۜJ&ؼ_a?a7TæL2 Ap, dT/>:gu||syQA@kUᗂП;P\?k5g\Wм\5s LQ?Ek5s ԯo ?!?s "LlӀ.+\r kI5s\='c*dͅp5mT? tmO@~ƫ)*oOTcp.X5[Xo7u7Z ?:`;PfBP|Am/Yrk^S'YSv(Ź hI,ΈOĩܙ?Bŷ-wr:+y;,X&*gy1蕦$P=9 w^pnͰJA~[6;|3|{? r9AM۾~ul.zDPiS=AЭ_HP]s1PQ]:TTa.ײ$t"~^Г:Tno3P45nmFFUkTtT,,5Ut)TQ1 :UhQA0O;w&~\6iWtYkC;˵Wm"m&F's ͽLXYJrgR=%m:^php_<ȲAiY*R 3!VPp*wC Wtrg9އ"#|sX I D^&pMGѰgp޼h- t~}3>M N[S }hl)V$* G|rZfdFSk&ִMry\|S zCbsG!G7+G["79Uˉ3N?֢">lp8ODAfS1"fs z;}.'}zh:o;pUg5ch)={g'|젳cC⨒/o0EOrjXݧ ƹ`@±:k:lr{fmRB>ĠKZ =roiW#p"q^LS$?3"gxNE}?gvV>9W1vn gB',>d4w΃x&= ;aW]u_ %?B0En ^q.GEM3l f 8]TF 4Z>$[P2.#궶.6?i0єyF.S8Y.L^iЇ.nGhB5A; '/BW71E\|M:;GQ3jȟ*u"6Sʼ蜏xo4 rRNap"7V2޳:u)9` Hr:ک>[-lGXtPƬh5"{=7yoSX!ϩ4nh+#w(0۶ȼOQo掺l]c ?6KI0r@H߳+t5V$ܡ6c=_ w?a885=Nv5|%XOBILZ£4H:"}BnMdO(|h-A @|ݧωvw,3HQ=Ju'@,K.]C]uh2q+Ss8%zSPmT F$rp-8F!a`Dž.ix5k8!!ڜIȝG[y} aۇAaa}dzwb̚&4k6ݩt)|dI>UR%,mRP5W|RkKR@yYDqC?/mG ~2Ov'93/Ym/^}nG:jcڈDm uN3ߦg]veAMo}`<.)Ac/GCkp\G!&+'ӯ;v4 !Vy I(iN+Оbp:] =HP{.ޘ3.r3{I*K$WvzĨמr##$m9R`7>a ca9{]Ƶ;bLޮqt4WSAM W.F;&EԚf\f;FПMXn\2}J63{ L(Lt2&bMg0@/FtPfqs;1 = :oO /--UZ/ykt!pu9A_t.:9F8zx0=Ђrt|\qMYgm?g3tz"G HVcUIIGUAnw0j|s(AiX:p/ *CKY h݃qv6QcW}OG$'dRʐ2E m4&)|r`Y_ƨD41LXU7j<:U:x/"flϑ1p;|W†%x>/KHɞ7m#ikOZso=ʥ×Vc="O`,Z|xa[/;5(^Uu[k ]9vG dI1rz^"%7+\n3oeUNUqgj~0&d2<K0*#BjO5uX{6ݵWͫ*n *~IW-!:/ѹo2?ଢ଼C7xE;ո`0Nؽ9tàL)chxNW}U cyh`k4u)z! AsrK>V,xGAG~Ȩ'~v\-Cp9١x7nmwރOCj<sSTvj"itкËAٽhQ Xmu31~&cͨv([߸/͈)&dxuPר15e2{+'}}/4tRԩm~_x-D뙗.18AxJ޶7=3+T!1cXCG?>lo[Kȵ\/?F c_7[+JZ[5bێcv_uw/;;~>ϳ3t}9?s\'?ޭуuw)lZh K8G|)6r]b'&#Wk ʔOnCb],,߱F4tt(z޺.$˅N<=M5ݾdڍ޶ :]@C[ ;m֐l+ʎ])7quDM֋yQeϞzdkkGy b-(n9騎4dn08>RTl'>ÉX9S޺Au6na>kL'eD:NGYBF[dJ % dl4wF٨v6g#"w]u5w]KBk[NjWs"*/:+ X'Jql;Ǚ쇰?m (Rcchu.¶2'uִ&H]35bیAyDر(}h(9uSF@z4#ӈfrw ߠyE5^)f=}悧IR}"QKc9Lg&ZCbǛz59e,0n'8A[7P q^7H+^wT?7ߺjZGNͦ8)tދn%*N5u#K$>J֊/-ѻBұ>zDDcII}¢*g_ўZDV)UXfxUw|gdMXy7hb|!A%ȶ .B酗m: \r s"7 _ף#ڢKYSD|*mJ@ѷb֡g8Na T>_p HZ%~^:(/gT8 &taljԑOvGNFnu@4O {4Z(@:,s~MLiMxtu`I>Ooq5FҸg?Yn2jP K86qHL 3H7 vw g-Aw9yP ./ƭJ/qwyy@<>}[=뾇|\q'~>:~MUw$ꈈwE5گ6Qtq"I99$FoUe/%"z_w[>cLtCIzI lQV}X}`}Ayi[][$>!A\}{?0d0zm+U/XlX`KgB'Ed]UhB"8]=:u*,N@"\Ҝ[^wɻEPPEWZFb1Qs#]-<7\H7܊%?-%$dɈȗ(Xf_R C_C=˿^?/?e|X?r럏Omc}Yo'']Ydw>?·Jg}_鈤qb~;oHۉD}o% xoկ.|Pule_!2}#kw_x r|D.ќ6$r Cb>U1,#Hu$Eu҂xez] ^`WCJ KV TC)%p`C2( -C e MG  GUi|#s.3!],+nXZⳅ}Mнt*S̒UXAt$` S$47jT'QzA㔇r,3XVtsqQg^ғqK- Dg.O34˝;9~+V!ϤU #4M 犯WWG3cY0DsӪTgT!6+ 4g.5RZ8Ba>{Ӱ5U<<''o*Rɸ2qnĚF3$~R:HX!s(;0RUN3?Q7xM{B뇾3jq7 ~ѧ$AiQG˽wf>Y1.lZȘ&Rv }-ustza+9+%w3fӉyYTˇ+ LG&F^/ <xNpA\3bn_m |P=Ƃ(^*Sc6Na;ǨutO>%JZތP$oQ9! kB1qdAӡ ␮Wk(#YNiٰf^Gh-u!E:U3E&ZhBeU5wSI(g.#"eOXxS'51 ʚŅw`ap$G !eA" BO$2 1yGqQ8 JɬCRl)"6E ɡEugk7UZ&1/隳L!@8N^.Ve*C*R-Vwy| ˕n;Jlj2kVTabЭu݂[Gں_dC?\>\T E9.t x[]6*z.gUv#tV@d-;K \6ƽlZ H\dmi3wdn2 %q^eC}hJQ𥉉̀8j́,Iei?<لLb-ǖb.gkd_|lݧ{@v?;\ԯ~k?$䲄فkgڳŞ8%`T=gBá_;<|ez/|i~Ym/^^9>q qv_;g\rznh~BK}Q%}-?t<‹,SaMgɸh eX'WG׎4|Wеgx=gh%w(CKKm;: j~lwwwtlGoZƽ{z7ҹssz\juSg1^Bd?-XiqPQ -'m|G$rNyPѬ:,BZ{!x]> yN~[gJZOx~+D'h Lf^_%JUZhmXm$oNZǑClH'{Zx^nMvːS ҿE&SqMEjc~)lƍ]HU.k.U#P d }JXf%M k6#I`=A A@ ^LGTS%p< ɂ2OmZ+uQ[.dt8M+Hz3n)ݵt34[rn4mSZSU9-ń Iyd.|\nQ.|W -υ|.|[ Ob\q}yxQH0C2LxZ OgS OͳY &<3agK1Gg{¥CrE}a.|<R\~!.\ {e|I,Q="`S27GF_,rp߲fdi02.膜[)GuϋgS\nFg98ν§z4ӑŪiN2E?b i~F;L2J(x~uEEt1tdBϞ߇+on.ԑRPG2BܑW A~NXR o lhQFV3P_O bLY#(ͣu 7xb\F-M4$|al gfFVE M줝KCODM?*dH{ܜ5]'8ޓß2iFOwv-yos=c#Untmm8ss)Kn&ºG&CYX:^Sq>#Y0'LT {=A[턮;WG;T>aע=$1zUL^㸍ٕ5-nyy sŊ%.aGI8^!#9& $JʷIz)gPVs蠒S&C#X#ZoJl9K;`B%XE]v[IƷsk)sU,Þx dLn7ޅ( .aiš3M‰VBD8ŸZ ҁ^̵YGeq۔5 )??DT[Mh2ΗVްA B؁y;a]dqɏGjcD%nY{V #0 fE{]}l׃EkLIޝauP QH+,7?.>B R m%:Bl"RQvw}@#N>k{ncP3|;4NAZ5*T@rrdמIAgBnٖ{GEfyk:ָzꩃv ~7V-榒xl3{QPu=h!ؑIOIiFE(Mx<4^zJN;pܩ*/$ x8hc܉L7A EOa9M/n&PLys_k`r>Cy&"uM`ovnX;a/~ 7&ܩ9}߫{8/? ̱)juLD%7( f3L ˮWo'D3AA* 7{ 췤Ծu* ffsk*e0uNAr~:${Ļylt!&*z0 U~mG!߀9MH2s-eQcjZ+Jxmy~s;# _8Q:ŨeJln%R]zj,lOZFUr}^`)NB6㍃ oNV +!YD1:CwbCu|08FEO6'}ў87ʦq8lG7DxT4ߘNv/iw`TL)Ņ] Rv:3C҇x0=3;tTIVqR== zv'PQ$_G mz? [-c-m ؤW ~?gԂrMhf]^{ '-$q|2i0l5hN6ķ-UQMϴŧ~}9,-H{گS:\m+ uu:~{OM4-zoB8 x+'g^㨮 6|#Q2V?v0U@Qxs̖DPD2@S(Ӱjj{l)~ս $!b(~BǞnyn;PT ,<4ݜZ~%Flڅj~WjyB~M NI?Z#G1jSYJLg=TRů,#++:kn1,' q%V߻>>u.SN͜g_6g?,n՛\P ??.j\[e:kfª"F^LFIPQWq?Qѻ=fQCUyL țp߯GQ`ݑ9ޮ-V\X񙕰0Q{B4UJ6tX`uZ frJe$8aMx$>kN̽< qDsdg܊y0 Җ&x>ADZ`eJJ9UҜ^ΪfiB(omoe:ף ig`0G7ISGIhM,seJ^1c7n`vf4~N/M@id6}x&#ߤx 3(K{9"$E~XpmwW6mJ^si$bpSg'\ëywm)f|cJ']k:1kc27BՃiô瓫n^7F>]q_-mIŷ k/sr0$c&t8FqaU +2.QFgK_T I4q~zNJ6˶sR 5H!1d\&Gk.g3,avlY+i Ü愖 "V>'pB+2qBk!N 2MY4_zK)z 8o%ɳNtJ&pG'{Jy:0SL221TBHatRO퉧X/؁(9N'S c-nK,E:e0]YI;zYj+Kt'Aɚ &@mZ^L?,S2Fȓ|("Sy25Lm,$SKpB; 2 Cٜ9]yvNhqBFC1Nh/ UEwE3kI]jțAk.{c]Q{vݵZd?/SE\gwG]zwFw׀KoFۇsz l]]Dȅc*9[D" 3~.)SQKA}6h& ɞS06e9}_|$/0\w:I?bn6zǧmbFāv#GQo'*cRnmtn{&h&s!mm*6)h6h.$ wKC)S "ܝIF} '}ѓdHU%%ᚍ,jӥ ֦ċU?𥄉<)J`_G1fปWwc y0> o$Cǿ~MLhJŴ|7=N|OG`mq/#>yzT%'~aZ&FMvz DLH[\`E:*>%x:XsɃ+ #dfQWO|irW~z2fOa$r~ Mz; 6yav&s2b={[ fz:jzIW_VMrr#Y#Ֆ4&M_'YfeĊHZSCEv2*XSfL 1DeT|SezB)S: Ӣaa@?CAhdP3R)ŰVMGJ8 8[pA,d 9q&C@^2;'ѫTcpϠ>M0Txe:Jӯh'ebK·N sz5Q% %n=P7Z>&1E[;[ Or3#-('QPNjom)ѭM!UwAu.`'Pz [9#庙YSH6LD_ۺוG`]^J\Fڴe(wQ¼24L4GF+1ړE' en%RgY"^;k!u".I>4{ź'sg;XIzT57U Wd2zepˤK~tiU ]ХH ܧKۤK~tiW޷^K{bemsگp%Af *6K:_O T PeA:}/ImJa2l,?=>2Q"c~;ZG1Nt zg2Ihݲw <"6n&).:qY#yr*W%Un״MgL)&MKc&6گYԙ/f"1vz b&_۞˓)^LF;YhLc$v:)`*$١Oz39R͕ۢ ɿ/u d>3ҹ/ن,XL20VN>nr^`XZ󯩛rXf^JF.k :%% 5.mUBy- ֡&i)t.5CIsɨRff2?QO[(' r㥺.͖VyN: R9ưO@9=C|e36]9uɤq.7' A?E?LU 'ŪQR,L͌|j~'ޑ Όs-g$s4xuY6h|D8 L(KD5< <\8ÅS޼ <\ *97rR߼s-]f6ޮơ` AQ en_T}NK#%wx1%vǰ]9<N 8p'}@w :؟Oayp5Z( vt5$nhBn4FKkB'L:K@ 8Y)僾Ag%vuPjF%5.ɭxG޻ݳ4 V|l s=Zwԑh@E&+e <{2nyNơv DhgNX!9qv3{n~YүOs}K2f^W_&4FOHo3@l 뻊 OFM]~F-Ňs+6,e,^QC_ U)AX,Xc(6'cV@?Et,{SIՅOM#Ҋ0|ؒ'լ^n]V_`_-П=`?V8e"}yIe#="{^((3sw;R=vD7tͧzKw컵ŊZvOhݡS1_WPIlj^u{ē{){?mnzl9M#_pl516\<}U)Iɫ9ߞ#dQKut)QZ*KԋUb.eRЌ.at| UEt!LF-vK)3~PtO5?O?j$fY<5Ib&y&KL^L$R=>G=lĿ0Yv,Wy:sWJKDz$58}%by!^]%aOonl'CpHg)I X|փ ۪}tߤQq  ־~ iX$8ҩet 2{Ml47^I ʞ<xf= T% -/HE%C"cH(dH ,SqI}aPS ݆{0Лe].uIvY>6O:ї0魻rӞ#Ovc}pKLvcu-X`''z'8h ˜"*30(bɄ i`=;Rdo}M8?]M<Hk,D~8@jU8I;\jw"X##ę:OL Dm\A pi8Mh袦KjjFM#bZ@\Q$p!9GF%UֲAǽ. 7EWŔʜ:F4!OJy&z:Ãoc1%͍Ka2pLOVG'\g݁*_:!h@[fIݰY26D.Q#%1uXM A:ֈ[<-&_FC8S\!DcO6e\71CN3Isph* 9mmʈt.8$H%/Kn6mt upAT'7/9:}(FٮGUAjXkHRt =ǭ7i~`̩>#>>r0av/RXy1=p'3#ժ S 5zHfpW|ݐf}e^SEzg-_v"`JAPgemwe9yaP @u)h ASNP;&Nǘ#N>Z@[wIv\mN·weJ9y3bO;o1#7ը37A_spmq EtH^߁y9`r$B.59D|hH93vY?Jvp|9o ~(coz'&:iފ.7Zb{C~3277%hEhmd:B8(x"i@Gfc_T<@Ry0A>D`T:Qr X6/nlҗktOS )hJKm%m)B]}^xυ#rq$ThɠNF|Vp轁qoN{u1,4洋]w ؃ACj:ȡz?{S2&_ 'ʧZ >/cKNV fq27^z~2KqM[ pJZf00r@F3lNnɗY@zTx92tgs sLgnE]aiEZN@-}!\Pv_pET_b KI9S>[Thmd%P&aJA!NyVD\q{*Bs@Ih 1;x'gbk98M*~PJM' \,OIkBlr0_6@_ތ,6)zެ5jU%tJ4 s--LYf,LjѼ,j!;d$tʢגOBz-JcR>,5t9pZ~ZH\st5R\=JGw?J:pIh='GNm&ۤȖ&P.Z*tz1˸K!X&,CȼLqu,'@"j1 7wAlZ`"EVD INB-Eɉ[j3g"8UK3u3M `'s,&gW-ɈAΖ焳 W:, D|ۙ-ԜGAY]q@ivz?AD4bUF6wc?p` V1N$z@`*8_XkzvA(Q.)7f3R^S;=3e43`QD=Q(y k l#43IZ4NAY9QIһ/HF:4Bzw@(t2F+/7CP<^#dRy6WGZap!ݽ(-+/r,Uf~$ 8:~ԏa~#4ltZjqv2S8вQ7>4 ˬoI#0^Q]urψ^W>o RQzP\Ȏ$&iȺ hķtyI&{b05uՔkG/o7]}#/_V^Yr3tR@\H8QQC'mRq>!!O`),BZ~LM?䢩 Fٲ@6Et-WfY 5-(ș*#Qٍ =L )-I*D*L^ 6A^l'Jiǰ᠒)ËRӛ7*e6o 0hj S8m|i%1R81*%@CDCDa Cojx QQ7nom\ƇEhܻW4QVh|XvR,W*ͧ dU4NŽAO:\bYXDDq LZbiq&r11'xqI W164-uRL̋Q+5|o'iNwiP^$/-RڵûHmHm,;;U2m{2x2DY嬢g+dƸ=giжtfNMӦpҷJkݶWMEu5tԍ[4ES^VP'pC|V G]8 vKnD2F)jS±kdROEN.dM] s9LY}K6)S/R8%p:o&!릅|ݱJG(8K$P"چx"p4!sǀ 6RcecGzG05ڕd}iFt`A H 6F0$arYB)$#%#^Io&rQw%vWqKmwʩ ύh`͝;(& eS#L5wJ eZOD @wKt"0灗v$?QTd.nг%}E~wh3&ÙP$K? 5%eU_Y&FYY]DfɌuD%UrbdWI]nIDN-w c_cp߰÷'>}1RN `zذ{ua8'ZRCy7 /orl/o*\FrR5mM`?N+QCw. Ĵ:2,C?`SNޫ%%atDU > ƯDCWd)~cu2P֕SĉJCɏ) HKR$Jt{|5}wFگozX'= eoA<8VD||%.ke-z21|~:v-ivLuonh!5I<' LWmNʷ?OER7\ ФR`*/#AGD-ExHxquSTts{֪cB[Fi#hV+955Bҍj']Z6˻7m=R(98{0Oڌ)?[%rs8\wpY3έOݨsʟs 2=鐾%h[[%w\ ~Gvm9dkˣ U9pOsycՄZlX "-_b g V#nӗGPUvH xwMCOTS#jR<ꄊÚFqR"XU:ɥJ$:jCFaX \N߇A?pBTYc Fq1-(c\7EK+f p)ݖ5WpX+}EhbȘRFx"=xJWE#-HlC  wU"tR {N&;` 1sHKAy"H)}F7 >;,ҔE8 Ie+-͎N0}!`kcR$oʳ0#wL<7a4M Esumlmt͍B!;v ;d}muuu[E ~a ;_2-2HսQ$UACP#ɨ:zD$A._m ތ x ƻ_f%P*)'23eȬ@JL~Dd ̠$~|#dGQw1B-̩5R}lyp^j *ha_>xG%kDbĻJzX䀽'dX#JURl2Oje:B\F+Jt %PZУ?&H앆1d?c߯l@J_l/7a-$=tJQ#y0QO` ܸ6ڣx2jr0(FY aKKl^F!H C|'Y~O*TėOJiDNwEwL/t&t?Ju}v\F&Ա;>?Ҹ:2X部 \e 1:vNC5.>/y W]awoOS3eȦmGf|O긂4\? ~YfM҇AU(J)tQ6ڂINԠ3.ÔO|aX Ab*j)UOxoBPM|@G<"ݶRO`'&|jeUYZ 4 y_v Cɹ$6um[t?]d,3cz?ݔ!=:4p{xɟFu$2j gI~5%3^6h[ߋ '!+|h[JM2rz|R;RÔ$7 3u;_$w\Φ<ȦQ&!=~HE^B݀vЩR'Atc1G1GE,ćݨD;`,|@K1 vb{ wLf%VJ͒@%J&B_2KFh"Rqg3EI.|$j u 5e 5N.w^x$vYo)JdҠԣZĨ։脝eub}zB-?/7ƪ0TQ(}F;ʢk/}jeN6k*8upGE0}ӷ> 3j2 p+\] vtތ~mrh;kmY͉]K\M]?`ACظkr [ʢ6Ƞ)p-^ 4_[4sLDMCh|QÝ4`5@uڪX5'(v<Ϥ-MA*鵆ȱi@8(j@ qEl\mD6p@q qH%- o܊Z8Q'[+|6P 8za!!{zU/t,ݰ^U0M7ꓳtUT S^ݰ; W7z7?d ?]}3YI71~HfZ]TgPRw-5syçw7Oﷶrv?-, (lx5(ם=?6{G@IvƁHS-~쓉\*Lo:~n.[WkrMJeG&BI&O>gti:B#i`|,8|:<[`8Ghjr1xJ%h*6%/xOxq&8Y fk|?_VÑH ='ji53K-W4( 8i0ƪe`4'!L"ϓkghm8gqŗQUw''FC5' 'm5ֆWף!44:+h|tw`4Fduzǧ#`'bˀ%w5^p4K`{]_cXx8S3MƟhP>+ r2O`˲~ϯy۷oOE}2hĭ+h^S4m鼧qOy\w÷3\ Bj=pK|O"9C$&ۭ}߰s ċy<ή9p *YdpS8m|mnU@+F$5%$ݲ8)~GMcWḳ!p NN"ӅI|y9<B ,rRmPùwCt8bL7j0'5D20z^-eq8ui;9CL[hC 4(@_oTN֖~㗜Yj Z$-7ooj1M|ko#eٰƟ#`(Ee }W h%[ZeZE׫{Z>,^p.{5gi>:7O,2ݕ9Y {=>F DZ"Lj$9u}\x܀M_f׃89ґ&}yS&w(^XַRԷ%Xa4_L|`p`nGx2q,[.ө">ur}8}>@4GZ5~!]bR l`&fWqu`5s8ĀTL%fs`Pgp"UW*`SmȄΕO \G=f-e!4[Eo}L<|Ho> vA5UDoC;`np b>-8t0FTz|yy T4ᰫo1I2AŽLk]LLQЎ|U[.\{a!g/"m'q ,p npҰGel^7c-oثWh %} Gݓ~䨗D.{:nAsqynGeHcNH^<%9 0"nv?Nvx VeJ{~%UnuMFa .MDFp)ʋ o,)('WkS]TɃÓ Jݤ_ 5M\e:Ɋ*eԬcWŢ_fRfx89%yfyM:zU/^c^7G8hÏi5p% }4>bkUulvm'5wB[yg/}h?T ~w:mmg[P(^U5:=Q2}8V 43}$avtOȬWѷRh| ^XanK71J7G3^)ږ&m-L0;#^ ލr2Mdg;Rnm=#w%2" + 䰣0<[V9R_ uMhA3'lp G+-&/( 9?:ZpBfCm`U{75_G>"F ">ʉxM ը5 17P%[\[" [:)ʛG-,$<ݟ @ ׄ+PX W2a 0i"` U0tHlMB.r;>kwdǧع`dx9 hz q1Í&@rxK7h8>b4<}@3@,m PpRonc]Lt:mq#4w zp(zo/w]"xo}qY锐JR ]imt7HW4`a{HudՒ RR49朒aQp>7˒trVîy([ȫiZ0=1A{[DK39mzbWjWp;iXLۓn~X-Y$9#}M۶NWr'z$X#@0E 5AH~jSr;=M KxqLȊDhh4fiDBg.Y8{]Sn ˏ0vk~Ro]!^Hu1nTko8%W9q/_n#0lMmJv8U U2`I ӿ6M-Yh_ND~sefZ%%kE0 #v;;l1wHԎÍz ںqže O˞a;~"L-QBġٙWLqzӾ+G-w?';kxlc6ǽkg3;p(w83  Vt4(y&!-&P&@Oba\'cV h;V#hc~_uq66: f>c"-:)fIhtc Į¡Վ4T~d@9SaƟWpjx%ޤ[G.jPĄ\j3d"iMJ>J'aM`֌[^iJQж8"`w=Q hH老B 嘐Nh⾨o1pFQ\d<"d8KKX`kӻ50ߚff綷dv96gFI*/c' T)J]ZQ+=?1LOS7(_8| iAmIN ?lhaH;hB}W?*^J%L:ehdJ gBp|A?7u5l_4z[%^T%za&|Gh\%Ē((K3L( G/߲MBQF8ӼWҳH %2/ӀG҄|ߗ- m[@EN(6} J "Бk-fY7(^Ma{[j~QJVb`m cdy\A(Mڵ11Zeȴy0[kLʗ"EcM|3cķ ND[Kxl>x^+0!G_U`'7́ljj ; Y'rwl5M45!ʟ$ RRӐ|l'{L a/P4",?jU@r9~ؤk3BbU ?y3)Dy0|Vfj N0*62}>we>7? v4ߏ$֎ AJE sAmc2A16y[m6A\R/sSL@ O&I>8,; p| ť8%hGfZ ּn OH7#oK +O!@.!Y4,#*+]1bI+,b|"Cw4c+[rIႷp3'>z l5ڎm]Z<;opxb#Ȉ'z@udP6UhXRM]`ऩt6RSfҊߡcD 23r,O ǣB_!X|uk`,Du,aV.`Y]<x.dslwfEh O;(*I`lemUDnEzU9p'u77O[ *z<`#SECLLbin|ػx'͆˔` @B( iJ 56r:JW[TD-QnԗDyDbd.+LE}& S0r- &Zizn5 kӌcw'r%Jҧ[ZfT*ͅI!pkbќF沶Ihn~W3镫K ƙ`&>y?t:p&72EљĖ5/KE/+T m0y~ Iޜfv_O>A,߇o[Ov"=XqorSE'[\QS9"T{Vpkܭ(~*[RPh9[׼ލW5Evycb,,]걟B=>_Ekf14cwhK'GyvROxD zȑ3#mn+X4 VkxYX!O‚rgUH4򎬟5,a1"֘$+ S^-\`s;(K zϬ͑xs5A?q=#Gc1o:?2t HwrtBªUV޵~`X-N=+O&(hpӈayG1pqlȷYD҈_ a'Ю#hlVʌ,ɷxҺ2hQ)aB,]ټ9˜쭲oFfa G߳ L/0edpmժ&G2>4 #Nd 3g#whlp6YUȂ7~hbMOM \ )nءLxFRP=ա"@ LIK{%H=G^gHg}5KFFj4nw5W#"qƭ6ZP =Gt':u-fPnS!ٹ5dNSuRtW Dϵ; SWiOT>p1' j'u >#:b`^粶[XӰ"!\X5It|=+hq_g4 oEtM<PJϬ 0УbHk3^\Oh@2;BjFEK!g2ƯeM/$~}@1`1^-N EHx0]=(8°koZ _{8nV3Flo.PCRڔa ;02N9'C?ҁo[Ť Yb 8zAiBp^hVIN淴f$D+4N \1MwhePj1emhQ%  ,b*_Y(3^F"c/sveQy7Rwyr/e8M;}YEi55۶뢽b5Qm...kHn؞uzNFnV~CgXpG?M*@];؛KBR[!k9k 6LSipo1)$jPgż~mMY2"@i=́=9P\iupN($مwšC˄'r^T3MvYS\@dFEcG@ $uҾr%%0⑋!'uGO%Jq P۽ GN['(`4BJ=qK\"ƱyimՁ+]b>'x!uGU ,O F^̓K[vQAf)@Tʰ1n2m"'/"iN^`@/xaُw%- d "ɮ~!IQu|# }#yT˰*&{&W?R}J=`m(|% W(LIq"u?!BEWȅg Xq'0Z0̈y04p9.k7",!ֵN{Vpp^k@#wV2%WvA8,/LoC\Z5(a2Dc0:O`yڶhcٺlӋKbR 3PoI\=pާwοrVI UyL\VŜaCf+?S")6d֧ -x3xƾ@6 ^"Ʒ/p@Cc@2slA{f7CC; VЎ]ߐr[\O;#^OFۺ atNUdIq*yxy.$aUSzk+of#:'cς.ߓofOTу +wD "mmT̕  s R e nZ#mL`Ai" n WW%F-B .B=Maqӑً c3&ڡzSjZX;Kqrsd xE7RJmcG^P[ok!>}>~{;[th5kZL]7Z׿uu]?/51]Wlh_* VT"Y/q ]sK+m:Uӹ`2Zhgŕ㦪ٛc7ŪjQlWET7]ǟYxY].WwGdq/~Nߑ;D8Y uȵbhJ|%[#t=ZOxyC2ˬ\D#*JŊ_0 g)z1g 5&D(ZZXW7T'ݑ6i)etI74n/mRXMrnCΐrz4yAB/-t$`:D'#9q'=۔8h>dҌ0CH8Dp+]:[TLluk|>L9D&Ue }'j"38_75P#R䬆>uo6*SFs9 VHɥ=EV.5#{ZP]JO<,Tvg$ (s]:iWY,B!VM,+4 {h {zd>ʳMYqVΗJNp+ܔ gԢ"¸IwLeˀ?.>j$K5孟05׃ u'sqInt5ENU,2%@`e>sa=͈ @ m/İTPʠB2AOQ:?֫W ZUЭ3")QCN{Z4[Q9/mG-@%\C̲4 ̬s|%c P\?@2tZ"tR'"KR"{H]k(ŀWYtkJjs::0Դ] `;yI'w?1:)Kr]>5q\w2H$Av"PJi%MakU+kluŌp9nz 4,7hIKb4`nDww Z^EɾNCBCBl8qM1)HjFKu]Z v3x*E|T83د6VQ4JwOw׉4!fzX$V:ZDMg[#&Y'Px)d,2'yk*;}KIϓc(x u(c5BԮx`V>kk:;Თ"u^V_М,0ߥf{?~M~xZq[ߠ}es/=H+Ĺ 78WqaToqd6&jɸ NMN:MW?"p2gfP :Z!laVrlf@'W 7߯|>pm3\#!yjڢk?ϵs9?Oە粒v\i4M +r*q\Ei=.x]2Wtȴ(Q"x37Lˬ>WJCt*DiM:.wDy#tqOΓnۚ$MV3˸Mݱۤ)#$=$ atvC'\GU#=?[mk5ނaf(B_3D3{YR.wvY}6SUo1IJe [Ta@oL@l: UOairv&4.U͖]q\HCRs]Lg 0_4||=kD&䟆()bpE;z:H(E//B(N8Wav9DXa[Gtm m-]r!cD) ij%yuQ}EI]߉Z֯B#_}YXc{\wKjl~F+O4AvD-}d%ey$)(٭Xp?N5O'ϟW"6$}Lᴼp Q$MJLu<~y끌\ W2Gz,q75:po`y2_b2+®> WՠlϟJP 6ޠڣFשjş&;y8^c[x0Fpp6"\VsL'xYu>[Du6Mafڭx2&в-1͆qU9"Qŗ0Nlp+&TI?Z׊[&1 }ߺwU/ff2aM= T͢w 3nn(ƿރҽatuڃÿ~F1wq'#Y nC-ig9l|d'w{Æ>eO0ݺZ7.] ˴fPM|'|dG$*B_Ի-l-[ %]ح,Z[hp˭WdUa|M8)5f;(a#M]hF%#Q9g~2hUӫlou {)`EF5F:z zt3P0K@!鎄qJ 25Dd>\H#(й[庵;bə&f7o,-=#Jw/_ޒ/A1CLok"]~*N^2= x2}B#$X#id]@9$9i@;f#ξ%^) 5<ԚoBϡ NaO/eK2O4I@yj7S#ǵ_ J>ՕS5(g2WS{2kؔk?<慏h9SmJn7~O]zB3< MRi=7ZmEO](ZԴ(QUx.-"ö!hfjK?)rɉ&}>kt2A _}AfUmQݔ41'>-^q45,JI#Oh{'z[y$3|Q)56_UZ 4 WoჄ0yJj&dux#GIRNW7C`{RS{6Sl@^VaZoi 71}1|iRa8RB9qv'$dQb7ΪA4+Wz }\ w<Ŭ6ǙD !q4T\j GhSﰓχwN̊~0*$WZ(N\ >` aȸmρqf!*"8NG%q"q'b%e4si| 96-\c6m ʩeťpmci݁a| f)rn20f $wѴiuOTW-Fgut jǙM9^m\|xe 3*d]y`YΛZO4QdO~hA xp5J;U>=DI?Ф{k{nj'\بVFI/i0f=(Aw3O))w#k9R~}bg~Cr,g|ձlxSYA՗Uiα i&mAM=>ix%qOyHi\>HvPkf93MKƼL<ӔRR*h͵?ZGc!o-10#r^j@t44@O3$9 >g{U}^%353nw92 >?ҽ%{r)'4нuk[th5l;ޢ?;#861'CS#h?Ms"Ò@wa~ w3V]@6th3ʖv;T|7"׸v3͟$N}F_$3}*5ޒk_mIt#LZ:ݩ?:־|rrs[;+M6;/v,Isk/r׏( d tʢ40 )@i/r-:~rD \mpN쟶V8!M+⤃wgCoKEIn.J$Wt90?;c\F#N`Rvq10<)"zUo o"|͍lGhbD91u+qlx5d( 754*~~Z&A2]P1b=P ;@z<$rRɦ4"tc񧝡6glVl=%\c9[L Z~jU>:  9ۉ'nʓC\2K澦+{j{P96m WV gs40~Pt>ԔxLI*/^KoM+:_w}.yyڐBI;Q= vZ6Tr1]g5 _zīSh_0CZU::~;f+7Nޱ4w2W*"M_i-IԀ!`# g$CGV ?ԭzscNww8 `c'HbZXFl*60`H5`%땭E͟RDED)_m(+?Ѳ V13FFWP4[g$&AdPsF# h3}iBUFXFж,9oªVmKduݣD\_< ½P ʔ;!m(lx˟K ?z(ew~*cɜi Gc0cbz)IZV\xN/0~ɫoi˜dw?1 Zhny9s0;=7aϚh{0ٷbȯW9sr$) db~ ZqYu(T݇LȆ?98J<<pR5_r\ rX򜎶d {;58 聱,S~Z[*R4}-s0YiR4,矧ŧPGl&JK֏; g%4SG&Y;Ĭ8ə2vQK&ꡳi>/g~NAHH;y~4dBn}yIC#oBzXԒ/.n .e]:9XE0aI#NJt.P %g &^&VPJ'wX ?CX 6cāOmsrD5*lzZAr0ROg5~^)@ʱG[&;n"S=͋" ->6  _r!xQ!1.K9t}+r3t*sTkoޑ8%E*4zRm7 }G@CɈ+51f-SLzE㕰o}Ozuq@ˀ:D1SΕJ>-Aڭ?Y3"kF*ձmO,zS);G,Cal=jq^nA[I)6˜L(~3%иH%V~ iSRP.t OeLC,,d g 6KG"K$}pӌɨ?:Ϸ)D%ؖ֒(=^XsX6 5gLHdpնGTaBV/3%Gpo*x`۽jK%tdnWN2@إ@wXxy4=HBf3r8 vb: ZOPQڮgbC>-k r=tò |ݮS&J ćcniu.U;N+RSCE gIR֮rdyV8{sݽN_uxѬEm~Ҝ^N ސ_]] n! X<+- fw FDԄO8~͏}%jg}DP(?k/*[ZW{OckNYuYQfc )Aʌb,z+w-KUCUVH1{oմBqTS"&qT8vj" ETX{`QUU5 isjZW'*&+$#Pxk3\ij!kd0LXD6uq `s!90e] \<%pwQܒ#L2G: b(TKl㔰]I8n"+&U"VX(VbNGĒEf+8*${+]wV nv \7;5W])\,^*8g1d[xFNǬfD]c,m+-YL{B$+$6BVGh6"mS+VWTXŃPRi^cFjE%Q_RA<CâZ&S6#w~YuDqtv@ ?+nz <%f]6blZYN; ilE6n)볽6{}o/V6V $zry '6 F"H`Ʈ"GMi׎I4mP,[p@n] lEU'GȀH 9guP InIs3 }NbjMݥCɍdz=.MzY1vs&\X$/7^yڨ67¶G Q%$뺣C!%uUD 2Q<{>ylrCl'Q33kj!71ȒbUY {+䘣ezd\r"xOW6}N!׆*  tS@۬fd M,Rm/ n`3e+ſR_ Xz|3~J ^\b¼7rMC!0 #9g =bBӉG' z?ʷl!V.!QANl=;=ۻoǏxwwwoJV*VF7]0@C4Ǻ5|Zw?8~kwdR, %Dc@ sC'X%HlB^0+Ť6MٍzEt\;t{=& c6MB$݊M˔% D an!<%WfLaH& |Ұc`"@&zoߡa򎤅 SWf"1KйΒ,-f,ЌEțVYi(FB f|`!W0Tn,ECi*oE1ʜ d;VÐC'R$"ul"ra;*ic CʤG1YYcBO\Y:Xr!`;qMyRd1ProR%clOK_ gƏejM6M~Yb|jmJIQeΕ coZ_h!I1JgюM2І A.Ӄ:{DO^"* &*{ ghBΓ-bG)i{S ƄSʯ5X)RoLAdrvb#51';AV1ғlXQUJ <}Wܬݓ0ɯ ؙE_K{.TH-ev`'K[ӛM^Zi٫h,Mh/UYT);W4VًW) ~˕1PsESϞ$ 9"hq(v4+FZ{ۈJa, dQ&RD:LϵGS^M=kYi,J?lUW8ӭCErVDM"9wڈ%=KJ5g@c@9U B.={$JJ(*IU$#cx\ҕH魑rǘ׊7$d{ȱۗY* o>괻 AU_#q]pl6"$l~(I^6"ĉ?s Wv~,wxsjHPʽ,8^:tKD| =lryAaJWף6F'R49!X^Z(!2|a .X{}NٳZ>€ٚޒ%z<(^a{(69dt q/H1t\505ߌ~,sa~HF, _>UV([+yZ   SL~Ň6# A%"Y@M,3+g.~cH/5f1; +HSV 2^_rNf-8b~C s+u( ^㖭ҮǿP2 f H_}K-ڔH9iXXD[fkGݓ)[Y2%B(sR&L,JNE莶'i3_d"qq cuKaukI:b ǜO. bn&l;)t^2ʞD奱,v jebƚ3Zez} Y6u]]yD $vT_Դv|JS2τR]!m8ʕڣLc  ;ϕx<cX(ySˎ:vC`ߵ7&'9q< qx~DZN7NbHjNjNĵj ZÆyB U8l'Vac^QbQ2~h"˥| (āYi'h|'_C(*A}``Xo5aI %:۶Z,fD>3La45"Xs{bRo-Ξ޳bá`5vg#FҀl:>m` A-Eu MYs vuټ+{om%I!;8CHR-ӝ]HNLS -2z6[<׫{ȵ_^-cʶj_x᷆`L waoEIpxxp9+0;0 BIXUfyuVe3u[ۃ~=v˯.,un.lu㢟LnLk{kbV,U 6`޽ivW3+鹟,?R# :72묍F`mjޢ`o45G,l fߘͳ:K\[h[QL՘hh(h6+tn! DSkXyR޺ՙ4ӓ<줇v;󋮍fgK5>ˬ}g:P]Ab[6zX9m,zCCk;g+S'<}M lʲ)7]1'[ir^N x1V(1e~LK;0ز0t3 AW{e1kzc_W *AЄw`6|6sۏ:;k{yxZ Aao_ v:\ |A1N'x=}O.{QyeiPSTay*i9c?F`3* QR@Y9"_EYx2q6"!fi&;2CUOi(L8CHБL3WJ S!rwDQWD=Px09J0?:h7MnzuYo鮑R:.DJnΒnJQk&5gD=ό5RW^u۫ضBGcXƗ!I01e$YM9E^&Pdb /K5WCLko"A<+Pa(VH0' 9 6V6o ,bl̄'sظ3W Pv @z{t]X ;mS]0m-RF)j$ÐVHՄ;*>/yb۠tg:8dϐ=FCgY 2 жUjV@zpe I_ؕ}C\i"<*uȲX9݄$Y&&ORrض+Um o>Z@E2+ @QN*.=lBҔ1 {V lgw0;lr%$|7 }$t&P狱XBqA@ gӀx23>-Ya')EJT7nwn)" \)62b0/fBHkKGx6C&,=ْ㨖z:sLzDtáj0HY̒맴v*{|]v76޾7< d1B Wi|He;ohV7' {#D+GW"K?qh ;ovP5hv(1DBEBkOZ!Tք98Kj|GU?<#ȧ-96PHqdrMm97|.kף8.1^,FbFì?xJD82}8Z[@ uR v u3C.^IJZ38d [%?yxV93GtX__44l-,]~sw8m]8=+:`DyY.Qː:"L4`C"Oio7 l|2JPb:Uc"DWspYG5,vg~m*)erSA"zBJ}(::qbڪ(48DG[-H@Hb J}ȓlWq82\[8hB+ p*t6hGMQ(:Sv,Kîԥ3ffB{ [U3)e`^[Kjk.6F)]"'W蒄۹Nf0ԏ.8d qEq}y3vpZo \!x:/8A#6\vբpd5 ܊$h96+~. Eq$묄Igoct>Tpo2Wz>CI_-jjPcr0ƍ|ril5u֙NiEi ^^$)ԷOk@%*%f"DU ,BdJ4NmI|H&in/hulj1.$I`OޤU1=4EXBQeړ*-26*Qx]ފZ 'mS݋]smq3}._|"x 6ͨ'jmegMkf{s-jUI5R \G@Ja Vʵaǚ3sWýf3j혹}z4b&J:%JeA!/e[+W$'$ڜ<00F4I5yk,X$SZ߈1a_a) Mr n+}q?跿^v-:~g c`{ZfOx4fϜeBn=ns4و'׮[܁5n?kY|9w笑NGm>Ģ*sƆv>A^?J;py&XI]4[otuleXl[% VL 8r*xfW3d,aȬC=۾!b!t0={/a?1F-KBxZ>^p%It,B %V5<4FF ٫ D_3  |djE~Ё//w롻-WDCo:< B'0g֍̺&PyOoZ9 ÂرEemLXlIh7Aʆ2i-lŚV9~ D\QP|fNneUfs'[B"ɞ2*|8QP`Q¼_b&D{~{y0SXLuy1o5z0bA|S'qRKNspd6'0U}˜d6H(b ?mYC;L@2>G ^h,&qK$-BT-Ig- &F蝛{DwAfd_Qʎ$V +@ A GT.,uqr3S~Y=%Dz51^G1buw$ H5t>6PyH9.3x1iEk$6A_FW3+7Z}|-TPvpSheba-wøMcn.@`Sj1B2!د3N>fzz@]$X.,J6Jjt ?2{$QhfO @3 !/f{=mCo+ X2Iq"p^=r\ZN'F,/r ksۘV 8N.q<uxL90Th{-BiVSe7ASB+o`-;.:v"ܮXLo}7vJ.Ar1?~ Pdkxh +1da,,Aq߅p" '3bRn _G(\tE@Q.'D0yP ٤Z5eq/O/uɹȷDt򺵤+/o]񶮮&A?z?Ha?kVsӏW}q>w_K?a]^{>hF1ɥ(T0jԮ%"U4Q߲zH@$G;S%^qhbmm)W[1 vB_q?ܳ_ORh'j&כk'ﵓT&C| i4fMhz ',zG9NBVC>D7`,X>%K&V0w@|5858&E>iI-^\Q<'flU~]۱r.e2~~:y͵L3QxIv#uB7li&C3;l ;ݤ\{=F)ڝZ Ա>tL&:FD7\B8]KI}eN4A´.t %8~ Œ'M-1W4"'jHYpI65ن* "@e0Lx$D_PKbWO8 0taokZ4pȎ>񹁟}HG&8X1\ x p.x T3Nܷ?25=V橬DR+ҟ<<_8o/zyqqkx=4#4jjcJC9 g|~5y`;`"Or*Hnn`X&+U3tgv;^d048pUg))C _#0לr?ցsׁ!Db;,vv.{,ŵӘz`; ~3N H+y.90 FxU2Z8W?)".[kK^-?1ݢӃY1r:NGmߪ4 2ʀqU5I* ]6Ճ ?BH񡓈. tgHy伋u<5[,Hp=GY 4`w J] ,St+bfCWe|^Hq5GX,:`ţJmJ%NcD&8PMhO暴A E6qm'h4=!j HI4EjRzІg1ҟ:]סnI#;< s6NF*Zǩ8uN{N>xuYFT20nq)уJ3yc84"/5.ņsIзvF59\B=oݥ㾉MvܦHpTQvv6 \oH0s [,\Zx(&+ډ(xGkz_ޠOśܩ鱺2c*9~2KN!]\ bDbaylR1 nbIA?&Rj\߄rb(0?ۭW,,Wd>S֎,m9oh1nvQ }̰IX]%hqɄ-v)wc&a B!&ˉ:Eb +U} =nw <}=YZY;yVw-$``<0)'  [ʪ/E}$ F;z9Y 0C4סTAn蔿hbJuOδI57s^Vh*)hr lfT%M'%-,Oe䚩4KZkV^T޹%>vhØa+`*D+ *gnVqSbiurtR+pB篃ΠYZ΂N(J_4.S28|6M--Dn3"~ IW xqud|ul|t[78|#5:f5\hq5Ni*4{( [6}>趆U;^R9/e5B~/t_uL-&&ln2:(ʬ4` 9ӱW!*}e !?f SB flR櫰.ZGcii׹W*k5V]85V_.Zq/f4BK]`]`5pA!4{hH2ݕf{7`. ]Cc.ZCf4Gp\SBO Cd%ل6'[$V#®粶C/{fJm d }ݰ)zhL61@M[2.7qvzXzߩg&Pו= )2F@*M9yɟS r6(X)9^|_^TRi65y*8ALvWlIζ4x)ʝļь`0 ߅;Nlٳm5T2 5G`G"XL:>!A„Kh+H&Hi[/,NS9W>B*2Q+'LF/>Dq(y$n%c_(},JC h2Lb#㻟џQ&@yN+Nk>tmm^ꢹq#Ĉ'._ϴ5x.DG|:m TC=:2E< %9Wxw%QX5nN%iBFx zzD37=4P}6q1L;~G 3t@s=2弉H pD,epEV6p%e\oT)ՐFC?çTtXJݣãw@bW,]`I,۫oYL镣r]9ކ(9g7q춖t6+l ^{cOpn~pڻkhiwgή;K8ro/qTd9.nG` Z\QL@Gx- 8I'UԵO7Ϧ$ i7:{̈́0)=Mˏt+ɪڅa2,%LT*'հcz1)GG{`]*>!Ok*j_h:j s 'J$)W'Y'Y1Z̎ѳ,nҷ:r6U6*ЕH/%в^1BFFq9jmKV.Y1ZKgvuPiĵ!WxIKtaJ|[X?V< Z GMu1Gx6t=ȰibGR&?[fD!HgZğM VF3m*?{0K-6JmwF+f\Y6Mr% Um8ɋTĈf(EĸQ<_G'фW|g Hj?TM|GiZ~İA{}gdYU%eawt%/~oåOyE |eD;Q%' ^WW(TT7? )(e DQqL1%&Pl/nEKʲIWJxİTK1|5pfT255 %/# $ʠ$!'Ak:k͖ hHҖEDY53]OQFjIJ ?HsIƆ(j9&~QjC5D.c%vI3$H΍ f֥|SDɅDguHMQ ͛AYF-VN)+u3XHc UAG&H:H7I΍A8 Yֶq*ȰhI5 qp#h48gZ p&CINb,͛`iXZyX Ţ$HZ7 5fT&[-+]s$nyl:c}3=kZ`V5db|Ђ_ʽt8xӡ vn$5*3U%`frU4` J0kWIޑЬ,*f2D7Yhl% $0L ٴcf`l{#)ʖNj=!pX LbQϘ*I]zh@ * ; 1m<52fA'm0MUj)vjdzayb偕A/OHU>f:% sB’dq/h."@FyiaD7׫,qqtakX3*=5W}`"` "5H0g!p8-s\/2WKKlq߷V%NT!25Ҩ?,QtʟĢ_6(YUvUoK5iz[F;vVT (]l]{ \v܋[頕104 ?uJ'G6^6r80(W3T.it m-U{g*#{@蝪;Z>{V#QdU=4@F8Bsf˾qHebeؿrm;}کѢ]Y{" { $"D \mYpV J[0_sW"&7y;)D%Kh_O.b!džp1ycdM(IxKjWJQR*ۇjUmj:_ftb;>GE\T/P=XVi *#J\>+i2@i0?* Y.F)H*򦚼E0yK4-QOꪁf ح%4W F'o) J^Jp p]Z$G~ F3|9 i}ެܞwܞan6iy_Ih@oF/b4RDv9qN{1dA3Mރr_7݀Vş! LU?#Bg^O@f5[nWhEpv/$< Cop6}ub$%:!h1WXb<#ܕzAq7P|L@$$tQǃ4R4cPKdF^?Mbm4 QyeW ֦KՄwg&CJ:Q~ ŖݘUS"wZxӐN;I $z?1r)u_?Jm=*S*_!WYp.Q x#I,.iarϿű<K6kJe @/oC0l:sŋ3?k*|) E;(~=O1K`$H_+0R)!"DчK[U+*cPaU#abTبL"8+rf1n:p{u(2N*YF0| 8;2h1P#,)hkk;+ړ TՋg0}hi8GOK$U;7矁OE*q'\Tc)>V}hbcL3IJ EQ2ڀ iDO b)kam-T2eKS,j[x0qP0K`FL.“7!V+t8}}_`G_ȤFrCNTT26Z%YxP Ə%^Ԥ6&mjJ->R6%^PԦ6Tmj߆ '_mt1G8 ̄mzk=C;92yy?Uԗ nY,4(WZ]_稝H!ґ ߝ!JG̊yC`JvM|_d` rwou X~΀AA+[2%Cm " e{g˴;bri TÐ"FZu/JA4\*Ե5#N|>papcD᧗'%-dqvzQQ'?D8; dǾqIPD-v|b76W*{x #&rEᵌDž%k{6 fl[;j3{ \v-kìhU[%|tFTzH-̴aDQȴ*g锯 jď U# |-[)Llt%z՗u[.+'}ܩ^ܜ0RX8O|ѿxd -J~& WiDLk3 Q =/˱\zKЌ/}l$*I%߀;)S^\f \۾iT tYFJ-p3Q}RyVO~)wf3|}9ܨ':n%k_5 VCǪv B=o1<)uj-j]΢cȽBl!1/BCDUP^=1-0 P+&Jf;!D/WI3Iq0υ!.]$쓃fF6QCG\ 5x"+::e_w|'-z_ B!CQvNhϒ b4ڐ1&eHTsjSMYgPP~NRUokՅE*@<*X ?hXRŤZiRME:W[TAs8;q;^3i|O}@?E ]&Ќxf'ٶI_WθqZVM|ϭG_3ļ\dһNXQ,C #mZA{N(TF^ضn NLT/4O-`JG'J&Mq`P IG,V,a.^u(#@~!)+F*+@+,ljXb3zx)ZI]6OLOT9oH'dNPotQJ.᧫ٺ~j6l[ M}n|E<ɗ>{>Tߕf"nFfd }HeCB^T@[쟗stdee^-n=DrXq!2tr ]tх釧,^, !t>g6!wmUVMl؄u2h \63D, L EHC!G~[a݇m5N"U%E/޾sO?Ge$JAS)EvJ6P:RZzPq7~[`~ůX f^2Tݽћ^Tv*z(@]~/ޫ(Seøh=}8b~8>nEDi㚀48!>Mk'4i:ּ^z͞+$.)Z <ɻ#6{&slK_t?@5,%l VWBTnLCtK{䨣{E&*@ٗҎy@]7(YUjlKyټzs-]-7v:dp[d(--m=^ IA7<1.~:̿miFR##ͤd[vh,d;\a!a`ڡbڡ`Rp!'؋1Lɑ>Ti9`XGF^VYfpJgq&K4e7>v3n:Fd;"Bnܝ|ƾ_~ыK1fJ}4@V/0\-4PxĦfsnԔxݪZ2ag h`qX"aKR}Sw͍cu4DT)q"8/+6X/3&|K$æܧN+$nW8Sџ;S @ڸQ#pq^4-cLNUe{ rO;Ǔ/57@Ky.(EE098QZp,&ZaqÌyD9}lfr,A6DCǮ|;lZ4ZL4G#HP,m322Ges-\5hm;77 7r"ƞXC}{ܛoҜ\*HLe)Vit}q.(Ѯ8vʵNT+-jˤL!X6:^VTB.Ԏ^=RNjzDzܜTVJɈX{p(UIMZ) IOj+L͌0TBÆ@0X>CJi,4W y${PKOɯ=ݢ|e"],R]?RO5^_Dϋ *$k: ]UH"}mƊ Ƃt[WƫdQ3eaުG~]$cV6tkdCw9w8^A#]%E΍Xo0$=?>W]nz's:c:c:cJKYyƓxz[ 0|c YPn`\ o9yedL[t`jnNJ B>ԼgY:_KxjER]ӳ1W1"#,'I;.J2.-)wI\(7I|Uc2V3"DDD:::r`Y'2^'2DU6*0Xn^<΍xwǕхL|t>ֹ/tVĬ 7fn/k ȭ}d xyQPhǧPj"v`h?x#XLEfN841IPH0Z"Q -f}uEGhЋ6*vs;to緑c̽h>9){r=q—&{qpOoӢ鎟ZYؓX7^21qi֥"<'DX Rѡ ;1M)epkk"%RB m:U =L`AQjF\Ol"-b?'`jş5֮nRzVPROOR킉U٩t7j_e^R~Wl76\W۪9g4f~41оX2x 1XBWż XC@,g :j [=]f 6xzH?mjT%#giOe 岼d-]%׊Bgvܕ7@GN'>i'j]&AM qه}L1jOSz3^xNC-]Zi;x3^]}vGId31^bQ dV b%aZuӰ&;<^{v|bpx^$;)RgIjqe)9"%Bͤ ߝcm8khș`"F{,cXnpt iA$[9bj1l)iȚo tm'ܔ7i2i¼z{N4~3J5J5f7Z.#Lx  dNs!D^/ϫG?0Sr++-Eyr r|QZ/q[U ^[Y\"VFF 1X6E.rqBW ZW$8Ԑˢg1FT#SIeg7K/%#KFڗ/_WӿzyJ2\.򶘩bn'S_y;9]+1~̲>QRk$(`Mi9Ĉ* +R<s_Ӭ*(&"w<|iLTdOdSƞxݤEKapS;o/ыն U~2zrco2P6UNE駈<ōV"зP#ISLr#cvHRe@"-d j!@1 Uǝ1X/kB"X2S!vhĄ2M eM!~Yd*)ݬi9%#I^DqHBhBw9SN Q`bFFDSM%6~%J#2HFi2\#k3oInONBDՊb!lF%,tO+z-#NZEK΋K2tȁfj<# ݍ2&8OMU32hKC\\`|h! ߲$Gn&Ig:Iq-I.nђZ#\䍕ǯ3/>~e> SH:VEOU4rzM56E c-Z0NL; 7SD3I(ߨ[u/# e7_C<[Z;R'')Klz="W(t2V=RnEMɄ^#nUiUiW9^:'%A 7*pǷ)Vּ9s^%BβLA Y%{ [,ot'p:ƢA2C{d".T=:1O y\é 4Jh$3/&$G Ek@so9̲3B3r021x5ӈIc^`"ڭY&0ohuY;FHJ7RBnBmCk F!p*Gj ]h=x'⥈$insIc њ)@m>[vz׺zfOe,\EvX[Q[U]Yޭb ]%Րw3͜!zwv*\Dxgd}+`S1 %.Q ;*:~dZGg4" G6Lt$xLb, dR -+X;copQNI!F]5^;k1Zit} i֋vp4CVm) zG)3ze8G,1,f-d@v% Z۞Nr>B>r^DwaGI%3r४ xY1@^cE ~L|_ ЕE(ФK09 }g6p"Yobjn715a%?rH,v?4!2 %nvA~<]Qݗ68z ԮDqh2P U ϲ>L;GfVqULc]15$(ð}V<{(4W3T9YGC T>Vpц{}jVV'[\tL4~Zźy([R_S8 uI_)AaLCѧE/i7ĥvn]G[$l[m\rΒ0q<1ΣzIN\!Z@@kDSf |R~qaw$+bo\wnB!i+oAGpF܆wOpәc,ߐeUɼd*;>rrD^VJ )^ 1s(3BAN^4=򓯥Xr%:&gK V11߳2U <$. rE*`f HCXJP*(-{oڷs|B'9A[z:zx<Pj #%$<Ғ)} PeA$X6AW;\]K#x@(]q+O-jYW BMňjC`Z>qo=l{B$Bl+y2wEB&.aI2="ڤt:57T&o(#w-˖g,:RdT.$v¥Dfs ٜI="=G|24?B뗷CGChfc9n j5'p&{'~?; Ir:=lQVc-yk1/`8%0=Q.83{:s FqƜ\),e<_ѷoƋdш[=W261d&"3Wlfc|ɬ360ZF3Ո?oO96'J"Ph\#gJ `@NjȯgSA5DFyȯp)NIL69/͆%eb-J0 JHeḆRm`0OW`< %"eؚpce::)w\w~0-g)*526Q^.heZQA_asJQjC5#Vl̴v95٥'D/4*ǥrC Yv֣#NdRwE%BrFB%T{bb\›ull{\]WF[ujjEm k;QYl=F`mcM S" +.rj7bcJI׭}u1C̜) %ĺ cX0~|~l&'IsqcCbZ8lɐܔudl5~ 􅐓Kݨs#"gw.f @,>jih :7⅄lm)Hr&!*u3XHc UAG&H:H7I΍A8 G$ZF` dFЀD+~±8^\a.HX,& 1ҼX f XZ+%pRQ,Jbu3PcF%j2^#4ڲE0GǦ37Xv:H6$pFB<|LV}J]/T.3sm_wIrөL棔$6|:=TrJVµR=eDv`JLhxrjcpѭicA?ߌ6*J3s^c! oW7'㇂=>4 QdJ'Gaզu6U3 ([[+oՀ3LN`lb84l 2BJde5uƸ14'Tz"Dv$x!+^8XɻpLLl^yiOR0IU嫷GaWʗ!:$P{QF-KV?=O[T/tcY\E{ Uaz.O;yLzq.N 8RP`a;Uf;mÿ'evBPH;F})il%AXy)F6z5n2PCr|"_hN*&}e9)హē;ypa/;)nT=MqdOEpOmJLgb;Nʇh'scoĨ8vq!ܔPtj oЩ, yCfpk ׃W-g 5Ta}V$ݥC8U|w:@1'$c) ҈Ш_D/].FDW*ڰjO >~rH?tNxw8HF`4u5R(ЧpBSJu'2]sAJWwFʓf+)B)1KNE팝P%@?O`G>w>)֧gBގu8PE2?to2c.'7oC& v}7d(8hO)su6j"hU߸@0:mAi@0U`$L${ f4={;M( Z72'W?/Upi\tU,a4J: ^ϒaWC  n,frLŨS):p3c#tKI#=yuPw;Mt~g s|f4noM}dQ 'GVJ<H~79C~ ?,-[ꥎ0,WrՀCb,jހϟ?IF8|WSK[N .4<"zGx<OJj8گ"e ?E_Si"Nd3[U='h6Fp1>4:ɞk]!\3vv{i5ǻ-BĽ#"3z+A Qf%#tHCJ#M#[LqG(Id- {xإB$©kfGݓ~䨗@0O!"`!Ah\[' }'UtC9چ],$-j\.\I(Uʄ-Ѯ<9{! ;Qlg_]ou Ez ~k6<=Yg@'=Sâ6> 7]}4MP2F{>`kBS`d !B!_RR. C^xCa])O;V:Go#Q#(Zs/^?bMz|w|'|dgWv*UgyOR*v|/i*NzbTSJ3sJ 2[Ɂ7 9 =@hVEuSky έ7!J6pAULDpbU:6߉D>y7TiA12<Gc!c$M<ߖ"jP#AO/"ۑm.YуnDEʼ?jpL8Q ɟ@ErmbxjEysŘz"4)]ֺBp;`ut] R5{w(% GބEm>QXˌ@)`jPl\# \d6)owo7)p1'$cMKK7WQW_8'_=|e8#[22_ $×.qLsaaB"K6 [ R,zE$Pp4oh[Z0@-pȝ7T/L8_fl *v\n)'*7p'c:.P99FnhN+l¾I0̇S1+G7Fn?Dó`]W u39:S`S:9o Njb&% t@1%#gkd9k5v>rwϿi"jrr(&GY߈ne(M_}* kז{UV(R?\b*keQ5EE)yW, >|Đe֜az/P7{/Q4acgE _W٣g qVދ+^pe2~p'SN1]L(!I7=}ٻ/Nhg>>Vt"'Ya`a/&eIodff&X*> pLP߃lqVb$cRXqa`_,@%l1[9 gԕ<_(\L; o.F u4Qzj^8yg*NFT'2? E V3v }00fuue $Duo\orx>T*݆ \K3X R##ɬ#ɬ#ɬ#h:::L֑dv~hē$?@%Ux:1Y8] u1a:d !;\;ljY2p\3M ꉉ4co1zf4#0!N_#G鐊E/DhnUyWeֱBֱB~tDށ)gsv:*`=} ēU;8maV Z"Yj~fVC+Pͨ 6&|P!JbnœQL'%,pYlWx6#FiKH`&kBナ-G+Иlc}*o=M)Ĺvprg2-V- ɤŇV('`X<a~0A&Al-4L^dSAJ$]ҏ^\pӄ=Y5ZMbD4uGKF͒>ݿ]4FqW5Qld&Un;Jդ/_!N񻷎SCo1dn/ QblBw=3ZԺܺ͢uFC^Y>Xm2>M{@,^Q㶤l%p+æk=yyż¸Yp|)=#@]`jDG@#pGvY ڰP)~;K `KALDf6PaFjeJ¬FMt2pKQg"IfZ>E*`Mq"ba7Ҿ}檘z}(=QzGQ~LcHE%J Jt1>>,NJ(bB4#~p' n''N^ywH:{\Zi4:Mڈa`m,fVeh66KYYYYYYY,00000&$:$̍BHuD"p n2^JKq#pJ~:Mf<O?AhqB8Jap3")؍AH !{E8 (u{eF~XR;CYl&=j.ov lj-!ګ瑿?p6 nw-56tQ z[zz8^:[kxxYIKq,Ym:9A#9%CH`<2kK%K .|/eY@<]`i/u??O_қϼuS%~p2=]9`tr_,p;#^gJi’gV|[KANMk( N.Ə ٛi:_N lq݆Ϯͽ8n*'XY./45IHyS`/\hܖ?Pg9-?9"?\bQu 7:"b$(nfun1f>@Dt/h#m0(wTq'3/4x"y,bSLQE l80Ywp)ބuwIBqA7&bExXD,̶hf8tD4ͤTyv\#zJWQMbԂv >.%z+ήD:MfEmyŝ 4Rzx#\%pBtF#(9Z 8x*L:p]D=h,]]\Vmi<ᬆO?=}\ϟG7w< ;Dfe8 NNys}= r  yڕ0BySHfbRU:-3WwIq@7uS}(GPDP^ε**C W} ^o=@E?ϱVbSF]M6^HoD9dl5W8z"DY)V!觰]4{A@'褷'~P 4"؊z38g,sDq <'cxx-<LeDŽi0%SE+]~QCM>y[׶;6&Aa%%rlC6WV̶O 紷6 4(;vz[e>>$bO^~FZxNoYo-|~D  mz48כvjoTZeJ+ `FwCn'Vv9+LMJqxW0:G0SC\#֝u.*M@Z;JqgݛH)xAL7۳;,@O̞A:Ga̬%.sCufDU>9nUcJvQQf-K ۇm2' UD׊= m3 LG7};JRD Tw2]l~;~~2 ݸ{^1+:uUJ\c9ttryt)]eKY\7u ^ GLNn:㡡qcƈۈjCbZgj.@uN&f4 v9>tnUC[=›UGSp0- n]bu##y뎤?#|cV$n+ׁ5֬+Q|~&%sS"F.e#eڐf0"aU&=quJſak3ÎZk@56R\u\iOp< Qsp gbs\ʒK^If W׻d27ǡ2ɰFOR:qD88;Q| *latuuKQ\hYOVeiFKh-9s4A--շ32NVאGM kԛRPwfϓ=ҫv}YJp&2QdMM-39SDht,/f[q6X3@7x~Sz qI>EkuAHxokmWu 2><_qIYAN]9EYG4P3g$"U`E [M.b hO ivWWE= O.^5s;bT:FI7m pc.4Id$><r*/R#+/PԪ6o(-;Sd-ה3ҩ5gbK1{;^O^d϶Ծ{Wi6.D7P9V妺UI݅]^6PDcZz4KN)z #8Zw29ra {0UL'Jd$U"ݥF|1L44X[w㩨t$A&M\[N5l %uBm#pWCHŝ_Kh 萊#a َVslg wɩ:")QBF@'ڍX_d-ef[ $eTKS[ ݻ{;z,t ࿽nd']d9>-Ec-v VDǼ@@@9l2+`@:vSR TtW 7Uwa|ÿOSipkHDuU_RݗfX7}b_E:N$ҬZHiqQ}aS{14 )΂atm /n\JE4H5jyN1gA@9#=l|Ț0& 喛0\`²12f,.V\dV/ MZI[nYe*F{tycU]hro*s"gM\YfMf)0J֩ -qVfaH)z=*^e4  I??đ#Jfmlжcd'Lg"=W/4^MSק#pO9:fkhn|9_'WwrakZ(fufz9ҏ/@5&v83a+ ӛ L^ca";OypQ*V4QP+} }Ae90qYJ?Sji@9Yq9n`R Z Zc_dS*. "b iy%u; ,U<0&A{P'?&HdфwE01 &\0TyC F&İ[xG0 5KO]}+Fq(^>pѸPOb]D8ܺ*@tυM o;_GA+T"pUцgIKFEĩ7%Я[!G!l(#^zMs{$dxJhDi2ʖzf3Mߙ؄'Ag5iJb,zkc5SFJm!q HҴhO{FGS^bMM$p݆W斛UPz_ɴqN-ZRYIO""%ej X_hd($G:\"AVE{ QOɚ9t _ZKGef.u7[#آXgt6FB  Q^.^6i9YGH¿_~ CaϮ| .?7Y= X Jny&C`Q hL4RqxNn9>\yzA Oq`Ղ/q/q/q/7b6Zj%K^/yLyW^˗_s|OW<1Ӭ/I=)_rro=sNq0 gr#Ғ^ͦ7J}_|MʂM2~![1A?ޠ74^m[O5hO0J7;kaYry/Gڲ^!}};}ͣv3[zYb2ʮX_*P0+]١z !ykQ-x=r9޻M,+xCeū*^,Bo)h~6gC^r?I.: a-n0^/ϑy4~ /?dlFGw&pr7c,73^R˶(5}ק%#=qP0#A( HqM>Zb&zb(Y$ Tj_;*Y7K8NG'iNSTc\y*۞Ybg a2}>?ʺs | L_lmJ_p;n721Q:rc=V6'mlmvPU,z'vϿ ~~Z|m0(ʶPG'7ӡ'Yv41ZH=Qވ']1-<}#oeφDR x_J0\v7>Cg)6ӦUz~k*rT,=A:Ӓ)RUNOZ(+nV#ҿO;uU,3AVȻOzn[o[[|O{&eGQ!"LPȂdxnM'7}RZb%UBJgcXHkl%S.GXIE'Zr\Kԩo~F]@jQ UݘĚwOC'"gZkJsrr=fQZۏPWܹJ$PSZ tAB|4BR F R ̾5NAql?FMCޡ{j1Η[/QM9F}8650oɺ|IlXoz4$֔nS/>7 ~е۷V)P&@ZGg )ؠYH=XLgO^q;&SNU{svFBVx,![\@gN’>+ %ԻRihs~Ԗ_ l|Ev],;; x\[Sbmofq%k(f6 !D(0)]J7 ]>M^xYٗxcK]Mؓ54| V$ӻC8 'Q$HoBXb1HN`a7ۺS+VlCB'&.O|\`'^ؖsc$:8 @J>![ΠL?H2^MςlBXZDWRܚ-JD_ pķ; 9Һ+ ~mn3 jMJZW˾u:޴-^]ʨz3z˲Ŗ$~k_}d"(e+bs&s-'d5ؑŘa.Pih'H6l -h.H\&I̖E!7 cŪY+=ZfhmO^z%;vlR$9ydY~3$AM]u:$`+K`H@x+Ƌj͊jKOV-/`;X#b]r9lQ <28+ֽ*pDI $IAs䥈r}\pQj=.+=^JW7ռvWzϵҼ07%WX⛿W `Y]zaHxez{:Typt lZ弳nuu|dZu [&W:~fgӠ`N[;Ln:P&k@)Tf$Vnci{Civ&U~FO3t^{p)Mɩp8|=3B)`Yzo{ ;Ybʼal@?] E`RآРu,0T8c#/e :x=9\%tv쥫D]fxpPތʉҽpy.0[Xp_ ;IqN}SUs9Y<>8Vzy};] 8$.@JLf(Gzf1_G Ku#7FTi!I%mx{%bf'tɦ4tPVF >xA ~{[왃ZRxng/[<;iA0pE l ~6_3ឆYFM)%]eEloUX Zgon? 8r̭NŽ+Map4><1B'h8z9_`Ŋ뜑laԼ 7ьl [x ZqFƬl|]k PHvXzU1HcS8qWxt'a9C@:[nOG ApǹPƈCH^L-qџ:qZD'8dCVi%\\/Xl`V`VYŰ)xĂ+aN1an s * ؏IIU1e_,V?&^FK`$&`ݮaQDe';l%.K6  i  8TKI V k+`;`;v ;icRxisqbs>g8*![xCI5(\jMzUC;i22p# Y3 l愰SC-B(̆BQ0' f!Ǵ?CMzďlV-)+@*/S<*ۃvodP86=6ɽs !8g2 #0!;atc\6G$^z`tgz(vlv,O~-F_Ֆv!> ;{:8 !'B6(]eT% Gv'զR`;{=ί]:+H"BRAz[ NI =1^ܚA9TʀŵcrZ/OBv򖛨Q3|aJuݲw͉R]^!<`wa,@Y,`'s^ϴ.)Z2}5i4"TWQp3sRmR/Iպqz)7PaO^%W~2;qJI'HG;n?nl %w)oDw"6<:7JEuл&C7nds] *EPtЖB_KH5?C~ , l\1rdWT=Dm:'F7m(h >Di0;-d&\Ӛji>xbEX3v\ӦHSk>S`"18oј5*2_?No_ośnoZVo*:=i ['lwl6@l{^9><9Y38` ,?/'wjy*O R | >777اVm݊j´ף68N.G3jmuޭRjxUhxZRѻ3эs|!F1:*-k39i$?l4o_J1i܍}vcQ29Nc۲jINNv9Se*P/?>'3R\~>^Sn+8✦S +X8 /ˌXV)y< i$i𘑡KC# @0- 7<2j3G1Gl̹33J_AjvVZA.HzDW鰝`i^̅\@HܪtZB Ϟzx>54{RR$,/]s+T١\:~<]Kȹp` xo~ 2`ȶ \Jg>r=+6?Z߾/` NRV{Y$_ͨY-oo|W/1Ŭ}ZjcDb{/^iF}֓6d5`Fr#@4lߌHCO+uR=colUu{?×b%/֣Yv$[Ѧ~Df-I1+;Xл8}*BQ 1i01V`v>quz+O}O,OޅX`~ O1^K6a2}G[6Q/0SKް&{\&`SMܧ%gC P1BB*BBS <&5BJha{fT3a h~kf {E큣`\ߗ2 @iwˠ|w3b휞pjQ`|]y<5lCEYͣH_m4\|CrkT~jyAk8<{ `w_rꟁ&m9 i{ֺgw䊝taP@KVk9;c;͇V `a8#j)@" OY=c^8e@[K7yl@FTix5-ܰ W61LNA4Y?:`Ua_*Nv=舐-JA;!xvQ6RA60PdtJ۠tmL4},tw8/'8"Go_CUC3~$//a5!Gir)#X~A t\/kP21TJ"lHT&*N*$IU;b,(˂9hDH(Gnā]}5BVZJh,0]/@+qhK5`oL?\xi\QDJH}*bmKt߯n@*,Vs|4-VbKlh[(Vk*nG}T/3@y[@KBn&3'F1ŌFü\1oPWtg}r\άt٢$3d.Mbv=kFǩ1A; @+K\ܽ,1[E" &gl&W3(SJjǤ8F8@1}YmҲ10 ҧJZE$"ߗs^W듨+uk ;x0rw0 5YjT*V6;$4iDci >aYT XK>Qmy 8EFtd S]a5H|tei2.y\:/!:67]SCDJ@cQI"qf,r3,Wu_3׆wk{4q(WUM7JG!FNO{}k-Irtq-z67x R7 wn5OiJ &݁e&A aI`סĎ}AM-TAԸʒëHia0֙0 K#KZQWjHb2`hWGQٯdjGpu~'jK1(i׹`mU@RS8k>p O6'%# -uXF-2w>.kKȑB" O,cq"u[ ֶ̋p>mgeKgL>y)/5MX&3tbiD~IT*ud'2'Ac1ܚ=X>jGzdY1GuS|hq m+ioRenAZ؝IFTasQ!tPAWC_LG3Hp6]Y@v/x2' zl5}KnԶ.#Lz맟-^l^Xn'0 E=.ܮ_{dC9a}<<X^ TXVd 41 V=joѽRQ'L4y}&ٻ/ޒ|vRw(gfw83P| x`y2ߌ'T w;`%;du{J%~Us_Dx0`YNJXv[i$m\lVCNͲ!I".hw+AhYFa$7Y*s#Yx+[nO}Xҙ} 8O^,_' EEl RK(a"CNpܜhg3=E=Bǧ<ҦʨC@ QclWh3*kڕvߌ:b^P N<=l`(# %ā_rHTxKO'##`Ly ڎgANm1$-͢*W\x e |I|VpQt'y»k.`K/6B3[2FNrzye_rh tady;b\Lr|V v7>+ƖYDU 4&H!X!W"_BwC'MdI􎈭Zy-z 3.⽇_Ƌ+$4Z2SV]Ln&FBn7_\۵j~UV ERͣR')buЂmj)z`(u{lB&zыCgvx^aEVߏ371ƣG0ɕiE6Y:Դ wgEԶ"NxYerlP)4/Fq93fF3^njZL1V+F:ޖ  uyL wE)='>j.b%2283:;ycS&~^\$ށ?#^ {`:eo:= ŪҬ"1q=<;8<(3IK2!gE>S,*H€saΫd=$ $^6ϹA eUj\SG,E-LX /e\VХ_7ٷ~h1"8&I-7Q6$!Mg/HZ&cijhpT"JN\%*@D8^ËBhok䫇z o_s{"2fn"\AP77+|?Bh(]I XJ^34e#{&FdnW ,;닱ikrX`*PjhG@ ~dؽKn/^N""7uuwVPzlT_sn9`U"F\ݬtp,eDT+gbWvd@ +cS1UOU ]L90h ap̯`;BqCT[48 ;qtN?n0 l=x#ac9rfAc"#B Yﮅ a<`bHB㉎I0B34 4vz (Y.j&{\77n B 0&66hB${.jJp 0 {@Cv/7/Ǘ\q/ =K z@v#;یs^0l2ڔm|I x@Ce:>rb6LW5?%?bh*L2 M]z-nOgvRpVٔn|Iw!00npŽ4=hjq5ew^ p8Ur{;4 N> ћZ$: QezCu ֌ʧݓv8n]@URpyy&H\/:\RZ*Ed|N@-W1#+`AA2*X+ AiXYpϬ+v+SvI8knVz/_SԣFҗ}}<@_Cv:tMrȺ&L~B"zn4AGn~6&SK<䢉+r>#4žqA޹V Cv_ܞ't3TG₯5ѫ]7Nڜ6EUeGWu5wց60`)UhMo\)Pz8McmMG*24̵YN>wQ\q`~."_{q\pok|rFUʯـ 6B\:0s|g X+HXQH bl51@;z0TɁ<9KH'< >F-E8[jKɆĐ vk^ِl$!YN8`t- H ~v*w;e?qSߜY[c/A9RA-|#BI |pEݖ Ǫ K0fGfp1/TxL_iY3Ű =wھ:0w BL<3Oljui~h=əV+gÖ'ث74wgD4R+}z#8NYM ;ₛ4|a6/'T3CH9Zbjg^ L` mK(OqHiDDu#NW64B0c.8;=Z%}y#:6YCFH;1qtc폅6n9і,o[cā.T \s։ Qg,P$fX>@QlNZtR?e?IwbPrn}[6ڬ wwk,߬Z1gʡյFd NjY'fmnd?w$wXOę0c#&Huw 4)/wʊ͸{S`}9>)Ge;l߀sk?W['W[K30[5Su Z {}\YxK)t vs6"[ ٯT~N()҅*l* b|uMWS- Sྒ&*j"&Ćf *bZZޯzjL.ue'MiL@QQJ~ |_??; s|hZOaF()RٙĆُw$|-ehCpppp(/8``.?/~Ax? ͗^cD#7p UbF1ksa AX* ep`H7,!f ogx!:tb0DM`C$-$EB 4a6u|9Yj"g1z8J~TIoRT[KVb==:{fNLe{6  61B]3.\GYƬOez32Ug" 5b\ȃ ?>:T:+QsR<:y*9=*1 ؑ~$2\Ц-?=Bd]Ț"j͡DLCD?URuڭtjwI8P+|$GV:x ǐoۅ2?^ۓMjv{v.gR4=[:XI=ǯl#Ytk SGD RĨN NtL #έӘ+H kv_A(:1)W842 _/pr^GsO5)WzY°Iph٤%O՟K?lRI,O=,*RI@Il`7eH Db}#(!o51VHkm,~I@ :`B/aJOw$?s#7xun3XV + Fp+1^.T~_ND }j'tF_a#Tz?[';vh4װPLXYpxey6_D*Ek֐|f[FEkn|ݩF{_Ui@Oyu$^AʾO-D4|! .f[|Ӭ''wLO:ǝM/w6^9Ÿ ?Xt Y`}p@VYᕅ+@L0F1 b1UD<㛥 Ǻs5B:e,@:;lwuv+Ư˔}?8٫o6F|rYs#O%cyQӖM%+GQCyU(=Nkoܲ k-m+ZVadN<$;/\XoqD@ujG~mgI;.owd_ëINx_L(W2M@8+q١x.IIEsl2pL1hPt7~ րNQA`oN'car<w _#3J&|7Yn*Nv`Tm½|LjUXUx9L&֊ap`htxkI1ز3ZEPY?@Օfm XՎ5]WJ7x oE]H![Y#'R}Q޹Ś@Ёerz${z=%ȫI06>u gҦyX+VE'Ι022K qWNTO_bIBӊ[.X(ײcUAhg9)WDƓh_RrIa/d2L ^tf & W9d1N (/Ba&X5Lx\BꑮBiƳUL譶"[ RȞ-<&>_ E2XsM%L;dZwC mkjV[2oE9*–:e[ cHe~/t 2>@BO?Om>3gO*ݮ)/Ȱ A(.RyuIӹ8.́b'<xGC"qoxJjf/ɐ /Kh2>؅ZDpWϫ‚2v7Q&@ê)tXHH=t"y]H\*Bۑ\ s4mFlUk8[x_/THibr7P8Jb=PwlXT;6}$ uyCqT0H3KJsdDy^9Em011y~y-  F $-+.^C 'lu!Ot'{ϕ,V yOu?.`0OHJf%J@rW)j;LJ0VȌ`3ysN݌t-dNڧ.9qT9w.<]{2˄F4g ^d<ޅl 'rQg5l#,U^XnUҧ7+Hq^ݮaCiuo\\SN5*8ϰ+H_2heALt- 03rL YpE*J:hj0Ox+l84pϸ҂9v, yv9;3ɟێe(x;;#|[7,t{dz z, b Uh۶3[Մm m`ePgtOq6{|,Ǔ4r!l ,2j $lgm Ɨ[!0 I 9ʂTq;[x`bv3;\0 f1.pp͆,5g:ʄy-2QB y5*DG%H|n+EX&2_1DBŭz;=l2^5 !G>&yq .g19N)o`RW9K3`A6JP4dx`M,<@HUxDI,:p&&ħ,J}:;%K@IVv H[ }UaLhr3Ir ^iTOJ+`KIb~`:4rPXR#9.aC6ݗ,({G\R`RW9@?:Ro,ɿh:Y}r`O2{VCЗ>>;(\iKoX07}DqlKe6_1 @,F>аM {!tJ-m=2hQ7+]4 j{ Te !-;BzYNH FUCuQS0>t*X/qjD䂕>(dWmHO9+7_ސKSY*I(t.nG*zNpa"!Px XR&?Q_9b$8^B'|/ZXS]1D C@ c2ʘG>f|i*܄ȇ1Y-^FTQ՚ 34bko=lӗ_6 U8)9%k r+S H28+$&LPzC~koH\ݰ+˘L|/UaYh!L .Y!RW5?i*JWnojeͰL([}M>Kb4Py2i­-a\cikay4O܁uu1EnV<[t&Ϫ`Jց[bFWY5 'A/2S؈ 7RR vMvO0- * d )m뺍;YIBՠ:Dn:^p.ؽ:Scю7Rh[ɛ;f JIwnsn)!pPyxSxL 19q[ )Wh=czVP^/s+'_T&(; k;d LA/Ymdh| ͎I&^`>/k ?s2!(c@r{"%r$ʖ,tN*{V6F_ ~A0ө?zfĹB4' pjKuq=kd\ه0:&:qxJMg%5=vR$81'~M3`|sJn!xrikt2l=I~pUk@V`Wg= `RMhQ`bX=z:G4e32 ȑ v\9I%C |[,ZM6bs?6'{,oewƄ8%W2bΓlW]=28YfH}P/}Yȯ5KJE7=-"I!"X 9a|nx:щt!̚ff1vM`"h!}3>;芧v|!R6C?Y9ɳ'sX?{x;q?l~N+C?J l]"r5DVJpEv~88:8Zb</y^<Kl,'0% ?l.fŨ:"R"}M5=bO̞-;ZHcs o!'xx h#FJ^_o$jXdB@<$8$I L0VxEȍ%$Z/:nUُj3)c/!>t&~SPJb@LLo`b | oX{6i a4Ԇ2A3+rԛe`ڈ]i tZ10cGA4ވcFJoar[lM.رDu5c/UzUl;WL%-KZ/$:\7d. b/uj:,Ǡ򛼀??hL8V8bz eyl!KQgt!)*R}=uIlٔJGs- |ng)*L_eu|8#J|H Cϱdmڶ!Ph6ln=|lMaPZԣ7'Fl|Ot6^|-^:I2pqE΋d14.ZMUlJyRI5֪+s-n=ZYx0eb18"Ѽ4$*)]q1w Dg_'%`PUhhUq9v7$!^lQB8kLB*JPt]#ު0* s=٬A~^NR)uyrj'.$ 9$_~Ip!P]: kp δln`tZ޾a}! twU;EIp:-^ʍKO4aUPgYl4o|n^H<gǑlʏ L}q7qz܏$x@1k)}1p)|!k@Ԣ&dN*i@ jTaz-Pa JcM &gɂPʈtrU FV q8PL,QtU/zk ] `^s҆A9ɇٷw7i(-,JT4~#G6e~ϸoxuCMFK"Nj4g4jბ 6}?:["3NUJ_|xh%TxK=:@hZpk1nOY8Z`օQp#!\^n3 $$׻H*0 GTuM$Kf_3;ؕy1X&N2۬<40\-l>"EiHeVt8qb!j :i!RLp{:<1j8H#g4W " 12 gkD`j/A9K\ XċpBC YѷmIP` *EI/j~[ |oŞN+k&to2 .sMrrdJ`YfΡ9 ߋp]3Za-Q8ܳDB<,A`hIm>^Z"K3{?'5z6zӅSS9ɘBј'<#VWMxG9 Y+p*Wi#uT!ߴ?㹜" >7wZlU~IUDRӬ.d<4?v| ],+9AIf' X9p>q<ģi72^,FwEv@ f{h1X b,֩f&#@ uǂ/B;Ŧam8L" i dјPjWZCf<2p]K||$0n9hvA7ZwFrw[g(Sl$Iǿ8KNՑ ˬiz02cw},6צZN_x.M^@XTi;[0jec~5BӪB*,298 +(ҟU ,;@1m CIiUG0,` :x:x.;K#U1N! <ЬEeUP|O'P 2Ƥ+܏Iqhs5s]RA+CS|gu /g6T`gӌ_Ef_CPԵg zfYfυZ68-qb 8ZKp"LX`y_*\/x;􋽗_0c;wshp] ѽ uc^y`qsad<ݔZNPgz/k9V[9v/!O$B@82\M?p=///?ʻ ˿'hk%.cEpiG@k^ޛGQ3# Q݈B xx FP» cS@Lg7t% I&~79_ݛwau<%^" v\i`w!i4fl9æpL<;`if_6 xs۴tu!ʭI~JZ볷ϧ6-dy 7ĸ˙?zi֩x"t+ƉТ$SZ,(ˎh:qQ:^iWhra"w&%؇AL OOc l2/SSK")0zVaA"N[Rò+qӓ/6cnF=\U`!CMYG1QܗU<[S&ahj4ܱp,N1v*$X'Uz Eu%]& #Bݪdx}=ny~{SmUQo:qWri_U@_GmpKOETK*D]^-~Q3l ;}uޣ7*ig"ױE%}iZ@+2ŨIZQU)V5"x%hx_B3e]4EaV\[-3eo F]@Z+G)tMޛw}~w;4ej`2/K*=!h]EXPA :vq "Hӛ?Z,C^ CV#&,eg[IU!:@X:U~u~dγ_GWܪ!,;]E&Zp|ۛX"-T8ĝT&Ǫ+Qn5*O-3SIPVB yx<1޵ j J-wgV;+O[u.'òi|lj%Srҝy4 n\ e<9^nfwXK~k{j*(<wh19nSԡؘ{fu2]]'W.=_zF:P54~Dx-SHd:K*H/B1fZ$m M mVF*x,mXq~mОm6¢]rNsӘm4;?kֱh&r|9Lxdc0XH#}z&7ԛ3w$kq>a^;msIb{sl,,+50c&hSd[ k)Ö·rvcKTP{Q/LYM^k[ֹjص2w&*͸xo'LyƎq`OSP("zJvI]n^RVl&H2RV H=>.aFmy 4 APPiy(;#::VΒ]}_Cp!X4J5@ uJiP|ВCq89)+cCsJ>O?K!???E:+4l݃؏w?)4Y[OTEi(A;>J(.4`yu3VI !%?&=I\dbte(uG+Z#}زQQ67~_./c`ʯJ~TI,6:XJj CjY1 &>ۑn-3Ǝi{6t` ̔0:ɡ&Bn7&y.Ƌ]ޗbw֌ㆇG1ID9?v<9&'%gJx—J<4]9zȰ@bu1 ˡF2>Z'ƞNcN҆[c\JA[=TySèNxǕHqUjHXz؉uζWcv֩aXJ9_:OGs:9uTw)AAT?Zz1c߆.$Oօ)Z!_ u+݇e1n7+lp= '>ikDDE3L >w ,[}H"Ix(}iMCV"ZW"$OaǨlg(rsE; &dk#U:v&.Es-`,p&8 nz7M;ҪJ4Dʾj̹䁌ƚJDKt1E0PHp| L ?(Qdͥ?*2&ե X`e?PH>eC!tMQD77֓Bz׎l< p'x/r( w%EA{H {hv^3496%1I=$^_$^Q󼳃ŶKveCNb(f͇_t%ΐ!|κ]x@z|B?X'iͧt\}5+s7BTZdqRe+q]-ר'H IcG FY 85qԘ [ 鍊@(DnCI*S^?M h泙9sJswgf*!+͉[zhm uw 8nDAJ^"( GOD!#.NKUּv86܋OqoxXjf/cЮڌ(,WXXT.t\W ֖/ĵ rt{fdn*q/P+BJM3Y4>@~~*cynXvM^lqLMA=8wC.rN3^~ո } sɒbmdԣy(;$q2U_rcYA$v Ȩ8_glnzm~z-&+x@'̓0\IJMRIP_^^`2_\!wȰkZ3;7V1VW/2M]-UXK<#?Z/=z;w豻W艎&$dz1N rБ9^^p|BR ;!R%CORDcZM3IHeH@ЭYnA'ʵ(()!EMhH0*Ie/ruG;.!dTrφ eo6:aG_w8/eNql YHOEdH"ڼpf R{W;3cO ׌TЍ:)?0<4V^[i`vu䟮5p /u㥹f;88`Ƌs|h}Xli![ [`g濏:?}4QvXe;P8[J>>yyz<-ލ&`ͽP CDx2|uGQ r]jd_h F/J?SW-kuG5@h.X)q޼u7I9+T,ok$ﲯo|/6Bak/j7L^ыɺ9g4 { Ɩ4^wT8v\>J&/LBa BrĂIF dت5n,*0Ip3G_\Ӷe,m3]CZ67-ŒWz4˜ͯ#͛[&H\ R;1J *: FF&DY14,H/$ZH-GcFqY'jhT ۏC L'͔ {1$j=j\ҕVŽ'lϣŷ[p]K=whwӵ%[nϐQK7珜k]ؾMH8 #uD ; \98q/^=i#im1 wL&G/V-psɓJ iSg?9-1 a+\ҧj#ugn-FܛWHLqUyǙ=Ӎ-7` Ď\Լ՚(͗94Q.0ȫ+p6u}L\DBVӌiL \%ĪH^׌pRA2 AwklƘr{̗ᷯ`Au\zi$x@3F >cC]S)ss#9㡙g<22|$-Y]?Vv{};&8*ɟ8'\5qfE:1YﯙcA8Z_vN\+}@ ^zZR- .nkF`(6ԁ&o!&1y9ո6e0r:WUZvЂPXֱ*c$S44O>3wpjf@2Ɉq,^~ yƤՒ/rzuA Qg/{LGhoH#DȎ|tjCǂb>:e6GxiQ#q fL2<=h\=p5pk7Mͪu9:C|=}X*I{X<ǚtj||ǦW˫7=$?~M#wz2ěG/ݢC# Ekz q1=bQ#=PAP។,fn#CNNi=|NmVM /* {# [g] V\tg)Ԥ@z۪kO;N<]w +m$!")JΠntB;N'qr- Q8Hh#oEB%bKR_⤰A16e9|qEXC l1&6*=>H r$MMfC[27OCޠ +nyuԑsхXlh=K]@mję|&ppySD"-#ag|QYkHE}! I2 hʥ Ż{;füO47NSH]%#6\ ]PP/`ɚ9:OBZ-6rǜ\d>7凊?@ZjZT=)~n5YRq|Q}s\pG%$!Y5Nm\lJh[EpxLZRIȄ(]Ss(^*)@,B_PNKڒfU&ȭsH,Ƥ1n*` õ8,=E&ZC;ТXC -]k3T^Us \ĪųN}ծ4  UZTЖ;Qۯ""Ҵbt]Krr`҉%0kF;h(s2l3(݋XU~ġ~$I GKXQ:L O;ck܃yE=W%M挞YY\+)YAqֶGyuRYwKl;@}d/mUw,/#&Y_x!UG78R_ߌ'tk#nq]ުAL30@CF[~*Q5$GO6w}mF5gbﴍwt\ Kx>IbS:TIH! b S21ڥce49#~%s[I*@]6U^um2b\?qMR铙i+:u6y2x˯-m!ƛlV;襞 6n-+F-G#f @]'GA)JKM zTEM o6gRGSD qMCp`p:S6)қv7p%T ;t4o!kaC۰Uږ Cvwkkv \a(-JoKx+B}1$V;=:Q3#ݤiّ51t)Hx1F*|4:k]ΉR#' (*rwN7Y-vgUb3t͆-N$JA!%}?4{6$EٓB>ؠMfm:HE٩^]衣Z pb%򡻊2sf:e 2?#}v';x-<RS;s6w(|bN_JJ7NH6}|%N 5ucѕ[=zmFPcɶv7|9`D=%25Ftlސs3W;u)zLW 퀻?З\,NH1mǔꦦ=WT f#঒BE}=Ivhe&ǎkr(R[C-պϽS2 &v8Q)E g:f)܄dȾ'c\-~R\M>!5CCzRWw<mֵ#)?kXA3::E^I˝M0A΁.+$h,bNrdײB-rC"@nR29〳1A;qv8HMZoGl?7)cxw>-|j+Ogf*ciU_#YYC!I ),w ީUИ0Sq>v%9]}߇}s`d+[K]xي{n\siRܯ: ~3R a|.Z_ԯ24/^p\0OEd=@ 4S71*5'.QKUvˌo U֛-_zh2!@˻SCsaM(,a_2Z]Ln&| 5PYoWҴJe2X B@tDcALW^:j':թcfUΣNaiR@UNcXΣO0uDKW]@=؉zZuO&RFdW1椳05zMhIX>{G 0a]]:V{-Wd-weBf M!A)͕;s{`s) 4F& HA 靊p$>a9:xwv/_;{8CzGYl'@jx;./ɀ+ z~?YB=Nkcz5]AN"u36 ƆnO?잠~=p/zetq]ԇ;)y|t1^_ ]Epdw{6KneEzuSl ./*\8vqK g9TΡ-REoyUb ^U^K'vi&$X$cCvh)[4ŵ`#XÀF0l{:0,WpHU,뢴~Zn| t>ӱNO0Y!]22BHٝ4ri,2ko}ӗJ Dff4ݵl27`Woo7olqoyx`u3z`JD]>Vp]=X Ԁ8q{NZD?SVD1[t&x796>rۯ=-ow<}k?EXp$Sal>ćp nÊ|o YM?+f!RQ "N랮{:rFnc4FaJ^:(Xԃ z%HCH7ޓ8ؓʉ3Na&4p0$i knUcQ._=(@$%ѓ0H({x  cut' k2!jtEq O*}gKQT^4dNˬ1_D)'[DH^FYEڱVUUd5'q(Rf[΂󮥬:hy=ZJc--, Rܬֶr;P vzct?`.N\dibkOO6O9TJ%BkfD*WJm-g%ʒɸ“`o1YݎaY2-C[3C͘aZW4FǴOl/10Zi!MuMPB{|yA[)Uc[JР)]Q"ҥN-^oރ^̾z@&χ[0&X./N@#ӔVM-I&g[EHȻ7a4G2~m?ojl1>5,&lj#oj0+lYcscD S:Fgajgyn+*VoY%6Cò3N{۱m6?hZq җVv?7> ;fMh |;m^;B(nΣ$!}L{ؽ Mw+s#E v{ JW'*]VsF֮?}_kڕ뎺ԞƧ;fo׹~ T KƅqDJ6詤]DJb~&Ib]#)M ٲd !ٖ,=~5HڭGMEΫږ,4y2.?MKh4z_#q;)q"#IDzΛ\ˎ/S9v':9$htfT)YB> y=׮fN4 TX^wʚ~v]mHq?5SdsPIvvTzyیmU6w#)(:g:/d?8g VW63=0lM2X2G.CAiׂC(n֗"pEK@{K<Ζǜ \}/*lh%45z͈~xͩk˺g9kU'P} 㾥Lr!8q(ʟ݌IQOYEj;G wPWFO tóiݳ#x7wjSX|̗lG_%c[dq˻U3iZլg!Gw+8 \VZ60x L($=r\6[7Y7#58QXx\s" L.56g!2Ir]6~5vqIq_%o߹U? ʗ9)8*BM,Crڣ:S:j}d"ڔն:XX"mh NA7h:' mipJ2N PB^no${\jDk\\!OǙ@ˎb`5Um;^{ tYd]c cqf _HW|cG؍ X9"4Ugv\9%Cиfɠ-"g06 zG*)Xc`y#tDqM񥚱9W)RWy 2#lk]C-FgN]JH̡u,ӯ)axobk 0By5Ia 1dW^'y|0<;Ky:Om?,E e1TCUvS#+{sGi^ʉ4W Kv2lu6_@cvNW}bl_@#"Pc=-I_@48^P1C:ȭV%y&|h 5mT]Jgg5)BfՠEvʡFJB QX[`!=9Dg;\ozf&z "C[QjRԐj~ +$Fv+DaPsEA*VgdEl^7XTΥ]U-gh5Z3zC)ugMMM}fg0t+qY~,|@;{$QRvИf 91[R4`_ P[-Gd}sF̖:4ꪜEݵ6 z *XYmXhq wD b2q ?f~sԆl d1۟K{N%s|h{LޡQ۫ГoD/ɷ_o$^"$.`GQ Yףa0?DFY}t3L:Ae 0t.3LTp<$9w0|4U䶺= Na6Zz3܌'㛻p>G 2o\Wab`nz7- +HL>Ta8fQ9o_/4,`Fy]%P?P. GH9Xy=9\@Vᅖ1'ev^nuiD[2? 쏐Q?vOdE-=  urM{#M:[_-aSsjӐQUmjB]59bͭ*D6dL"kbMVQvݻ[Fw|4<}AF^GHGɬLT$`۴ 1ބJet* )ܭHd(Q D!`MQ2n0Q2䊟\sʷzJ)iL- O`Rϗߟ(Oh$idxiVś.{ o5QOD|8f> %<,T;"kڿ4}sTfom%Q𝌔Y ]T1\V`e\Y;ЖԼ2J-lq[+W5DPٞ4u'ozDҼj\2A9K_0WHE%:*ʳ2m15j&W 3;U8pU[́lD"aՑxtW Y^j_]ES<Ɉc7 #Mc\>v(4☻x۽&b1͙:TchUZء k~2c;q64oEy`cUo":(D(ʐ-[S2X[qJd2Pr/E ?Xd!IIJcZ*8hX gVҜ4 Fר32u JTLH 6(|OCoq)96ԭʝda[7(,FnGA}x*EJXVNcr [g1L'쀛N瓖?2DZo1#bLʆ'=)gn=Vzj/qΔl=p%ox6Eh^cjlB1z،O]~ ylAx I/Ԥd(G BI}T_A @mkdf"Dc3ހi! U7_& } o2_.jƯ ,\3EmkzK7d8| [x4} <͵:Esy*Ǘ˻ F{;6"Tym| liʽU7<ٜ:YUM_6Glqls;Gmha %do῭G/}&I pv 64oۦ ;aj}dL(Q"R: CzAR0_=?_h(dUdŦ[d$7\ Miۘ~ÙP >Zl"44w]1crXym!X׉Ԩ6iU֘BDZlrM"55#)e(B{:L hBZHOnl9iݓJlQyy fVh;]®GZ JA>}5^#)[0d *g$'#~F.3 hp\l!H2ڝLk\4G??{ƿQR0|/ @0d) R̐IgKvV);'Kް/Bg nNdﲇP{z)S_)^I?4SL¥zVh1)xd\^yĵ.r2X/`vptLѬy `;!YwFkp;u'y#t,е̮YۭU5'zW)-=Eξv32;8<p7_ғq-#p!h1]KY'[ j댼Iuq9t/VR~^(ǔ;;pUMO1mBrû!:0i L8e)S]w8c_{4539&߇٬?zW0ԈԺaA6byV tZvn7T^/}nYe>ZdH!6zD0L2M| K֍*{ƞ?C$YPܹjᤕX\QU֭z '0mTrB|Ђ`J2Wq5by+VE7L%_v6z :݁ i6:;ܾ-!Ev' n1?\[Df vãnf Y%^񉽕0Wjtב34%-&9*I̮>;3IZ $9 MйV4F< NkuT: DPZPΦȝmZ y_=*=-8xAs`0:oh|=v9~E۔t8R}B^si)rjfUxew-zumrn>-V`ař6C#ʨיǼbP h#5aW3eoCH޾p?g!K{5ueQclZ,gbK+=?OZf-*/z1ar h/tVvtIp8,g9Ou;kmP-8 rǝ*AsE}xjOt5] ,};W)YC/j Jm(X3v ڑsCcL3gw: !Cr(A~4wp)t-:r{+` ?%ѿ5 +sĖ%vQp4tdq $^(_7\b{lm*X :Sm8hZ7WLi@D)jT[٤59s6mV7d`Hc{'Wdy\͢(sx_uיvS_I׭3 Gt׌ַ͐Y>mb*r%?6]iY,Qj歮xԇv:@G>0M0g*ml kpѤ (G\e&N=oґ\!R}[ e(@K@FJn:>87.FWMX{k1ŁP7KN:,aϗZ/ףXodrF<9+j% T#NJ8|]_n[D _FݗZ;f~eI)C\SN݌.O2f>7}9h(;ga l ;xh\'ȎgC+޺%][눝@~yT9=|'Cōb}ZkIaV0u˟~(-?.7.*o6/*_w -U/j(dTA9傻`i*}k2S E tU}IY?Z Z1DDIQ)@^f2YF9])9TdsN7$c8XW&zlnBqWJd_1"CXfnRL1)+ *e7YD~<eԗ ~:^;ONS9jhxy9B5b>ju IUF.1eCVVoT;ZE܉IY™Bfm1{ zj ]AglIqUAgkiw4/0sob  F1n>s0C;Fkُ8`=UўtqSQ8b4 9&}(]|ts{=p5`Eƙ `2i ޸썟d[adzB(5FMR- )efnS=ʱ1.{1 B!-^үNװ-NfW= k0Uca\sRx%֙i *gؒ1/αw>TxU8tsɖl0a xƎ2NI\ι$,sk)Q}Tq,H2uL-C ""U|6{'tW6…ɯc\E,4!jLHdH-$Uؖ_M8xIYooQślO߾RQfUp5v5fU?k|͌bRlt6"Uo4NgxUz;'(dp8FzM [|) b5ڻzN]U>LFR{jݓv8n g"ЀYhr=k^M޴Nu1#PECcd Ϫjxu^A >#f_ u[" JKY5++ո/`mWU!䣝7_GxOd. ׾(7ǗUg# ƨ*q!qxb^q=q^P8`֫ v H{edڨXd\l9CV0⨀<}A6Ja+ P v(OOD^]Q*,.d+|] 9@_J[CVT`t JY\_@WJ.wYuxG z,vxX} 6h{l3ĺl ݽY+GVod*(a"pa8h8e*,dp r†svrpd EwOvy]eHR rygK8&9`'}]啸=(xX&[͍ݢne0Ә}rA%{S k2ԑDN@2a'nO̜-d" p~ NdJJvp)vON$GkڷlQh,nr*Qo,nl|xfUIxh>6K-E5>8;ICK@R6iõ{j~+P@ d< XmeeijQU0&H^1]3!Ω%5b:~єn9RcϬ!VlO/Ū|xߊ} nn%d +QX߿ElGf5/Dڪ^eܲb=JW#ΐJxM/A5YzYEe|XYn|,ל%dž_Q([Ãmdž }[)jYE~ѷڲP3]M0q  (@I%F5A7\{ݥVG_ RHEVHe{ID)4b 6@f4:}՛{uzܫnvn|VχYaW߳%؏}Q0%Kϗ$$0 ;U&=͸ffM;)v}9ϟzrlFO: xܪsuF\m*<\0eaW{I]%eHK=Ћixx/iK9PM,$O|IJ$].%/K^65kƪԭ1?3}_fȱ`ꄦ}ܪT7qȷz ECv<!_<$MTr yd^rm#UPGS81D_=Zu8Ӫ<͎O$ s}HlG>=2Y ! BHN&Px@8sN(_s{L9rvsL8|LkVMoWL)N0bUdr:gի +5?E袕y_ 4xL/Gߏ'a>Yh}:OTA+#F>Zh!9zκ3Wÿ.Py/JH/غ/غնO85)?vuV4 rj#A 2-aߥÃ+QA͸x!k/)M5VX;n2Qfa wRi^ӻ*w r,ojE@ -$X E <`tv/P)0ZƕآߦTM kۨEآ!_1^Z(#<$їCZLKH1$vhs'0Ę*5l*(諞,-] C1b{ V_[in.;#rXl]Rwt :W\mrU3L9eL^cZth!<}?eݛ*>džZtjȳ8^!Z {:K:l Q=9"=zd`Cϔ S ( |ȫU{-u[!yRIl*K"Aa 4[.8h+fr:~#B1mVÄ>^J@6$Ȏ—vͨk`2;6I\Kv\w zv84i]F;ZQ)y|4~[wz:<@[=y8p MsEPt [3TS 9"|Y!p⠚y PG{}tMg29ƿu"&$MB3H*|g汀lJ `}~cn6 VQg7~SGbn Nq6o봃ykD:3:: }L_1ZQx#0ªdow?m0676`%m4x2?6fR4PM5  ]F ~֥T)-I?@"dEo.YAAVtsG8сH 2★★˜>%0 }x`zfc.hC.7{_ xŋozF^P.ҧ4<|LCˣr|φ>\Ё L8{.S-ZᶘuzeDD2}vC*]1KJsvOVd(TKQ?u$?4:0 `|!y79WFHY~+~.>ɪZ5FK]&H,xV  EqCvԋ$]3=py4„LqHB\)BHb $n]l)ڜfiwc_FR8(y1D}llhh#6K臕;RdGKZ IKݍ[Fp}bqԩM8E`3"ht:!:FKq7EZ5w Q d1H&naއ/QeɩHwp"$ 魃a`2wp0YVvQ[)~_vzw-.~KV%C_n8ͻ%m1Fo6q޼IO(RܲDk2k7+--SjfUSG~)TZbu-RXw`lb*mB:ۥzDT: "\@v:"oA4ep$ZkxwҔ:jwܷJj~ ho f*M^kW2]!gt׎9n D-ڊ;rw {'&9n]xmR{ZkX:id gS},2w8ւ1 fjOC%L?¾vL}mw;lF q p`ߘBgѲ,}y)ORiSs8L_'B 3;|inR}9DpnKE{6Ϣ7@(AnqGњMGa3zjAĶ85ٿp$Yf|a>eo4Q#C h#[m"e󢋈#"L0]O>SP$g[HE'iz>ZDoWC;lV^=ܴ`5p 9Kу*PFЛƐUS|Pn¶ 6WHeZJq^;:qE R)mySڻ|>/kY\*d:S'׆<riD >1EͰi͞=H;%Cfת *=X -S9X'd! g ķ" oFkOq! x~IM O k?-||=yL +)lQT|J֢b$dd$e ;$yG{v `4K" (őz k+Ub9e:*~sT}Oݡf~;H|}Vcy>nsr:G;KZŖJ><ܵ[]f}&Aۏݖ%L!5#EQ2L _RR@ ЊVn|j3iSAqY"dE#RugE-Ͽ$SRPGE0Gm{6ˀZxj Q1յڷUv, ۞U7>I;g(}zlgwSU3:Z`/5>GYC-9[tT!}j,04oRG Et FLNP?mV#L=2k+Wp >w$V!'jAC:d#0sFum_L>y=Cv2"s*x2]Hϯ^}erWξk*0HRRڬUBzЮ!{/HGoޱ &[/žM.`qD7+)FMcV3>\t0_e5]Ëj^T[lA" o#Qpp%g:RQذ$_;>٨6NB5 ^h0`u~x^h}Ѐ^2-(FCT2pCb2 %E_'i8?v P}-EܗS3;x )3#$nIN bѮ:BJl2 gvH.Ť {oE([3O|~wH1cX-RIv ɜ&r[=K\v%Pl-K 6*1h-N#9YJE6`oR}J1/@Aw]I˖f<2U>`$Y%)YBf}0))c A91SҊNh_} pR>{n(%$^mRFƣ;͗iQhx";ds' c3@ Tp߄Q ^kmCNjF.SUܭ/"T/"_NNO㟵(2Ay0sVR@=R`!U+_7d2dc'U/$d`gʎP%m S%84G~Ϫ˜IٞUKu^P:kK0@_4$K8w?d:{`%6ghf mVvDpQ>Tњ ۖex7/9,p^{t)%#B, fIB/Ɣb|5vc}fgN=Y]SebI0KM?]C).;43a|V1g,:yy=r..%4r[r(G:mS7{}5nW:!;f3rzp Vkrd)_df%ru2w:5SIi5-Did;Ntur==k*hAiZt5W3"I*979Om)0PERa5 tjfrs ۱K1 뽢º EN>ax lYyWJrzouثS :R<3v*4xi[noim+곸_ Qik3WoӧJ&i/7#}0xi9 xaR8`ض+M]0zN^xG\e9Sr(9qG-j_j ^{әm8sCEp{ct c]^pCc]_uF*zO`ãv+ti 4:>3Įwl0ABtv?ZxΩ|۶%,hIW2iٺ᪾sl P[2o&S T+r3(%8i̱g6w͕>Qi^~V JF[Sc2c +9[o6ȶA:Վy=+ѳJF1GGIexqe%{k%.&`4JEnmMVH ͞_y(r@FN}'__";8Ĝ4 WLYI)WJ^;<;nU p^GWCn)Pvy=W#6`ĹH(-y縻pb=_ ә'p+ <c;FJZ3 #b!QOwKJ+;p}wLӚ_]j O|Iژ>1 yLc֭/WWb݄eٿz7ôުk ^E/T"(ώn_`W­T&9}h[~уmj} hWr+():ZR9H4/(*k?Djޱ+WZ?0k!%ZK׫w;ڠpf/\цtk6i,-o[yhjWe'S0~FJҮ5Q/[N1EG,|U0A!:5ۋ/N3s?0D$p !:g^BD=NkתY9 {lpt)c%eM5u ^^ui:~\sǗa_ ӏҽ"P翡Nw+€ס,wI^˹76t?nڕ}F]?T9cfBn$ܳ\jIww:L!!.*bro ;%k-z-KؕMԑmplv^T涩AZwG@heT ,Fͽ(8S%gT&Uj38JǴ8} ؘYZg1 x`/vPLLj&Drq?o"[̮9_`.U>kTбi5}27FNnb󗮱R/Pcʷ3L\!mv6Ҍ`9zxaױŠnG}:"*"=.jtӬTc觤)?ފ]r[9=A9|WN_ǹM ~6CD[?{ K=)=꾂sdQ!5X50G[;śZQo^}`gatLٽ_b7t4k0v_:I j qxϺ6ֵF=ڽ:ӻ;+Gleg?ë<*2XN`[I Hkc=5y B ˀńFԃ|O˹1^J5F0~o X#جm0Mml[?3U:͡fU?"^=dgax஡[8q !_kd{V+wѯ8q_ZGqvvOi0j{.2\#@Z"2cg'l1|imx=?yM/7Я9jsNSʝIJݚ 'D9#3Uͦ$*RnjM5+oWWSqpiI66p,Ǫ9QRb\Լ0_x }NFpvɢ9MB,36gd  r^jfNjl.K_(g(6NU2t)F7p6#0}+թʃ?z]sg| B^H0N7Z.I$+k1MZ2AVI<ҘȤ ,~Q>`~wALJMGkdXE]IT AA ?Z }'ó~dċ@C!(=n1.GF5}VݗFrxyoX$_F0*U(7;VI󰡺x2_چokZkwDB >ٌ *ut뢐z8 zB{c(2QGl$(  o~pOkm00C)i`0|/%Zm`>/J#fJT" V|{ ?Kʯ3psq]imU:ڛI]o4̆ߕbFܷiY=ԣMk b77ᶸh]2%xКMƅkk1Ta GαvݡpfzDPۡ*9WUJld׹cم .`x~'75-*,?w8mîP\Yb[a T/*L xpL#+¿ˬЙ d.!$Dfdh5Ѕ.X?~eeX^72F!HP*d z{zeWЫdƦJ1Ҵ#r &H)/֪QC P5 n| 4]mCǽ.Lh^ hrEre1Jl^)K9i58mfXtV a![r0ޖ0ATZfO2D˵ދYX=ZZ1:J?kp3>[YWVtYݿ^BR-%;2eYm*>"Wd]O-?"]i%K)Dd29gZhH!1Κ,m/d]ܽ74&l~eSQ_/}y_OnŋRy/^x!x!QFψRbC0ઋQF ;N+Dڛ/\ Ew3ڢ 0 >l_v囅(߄;Xm2>R&s #!GxFzPz3֗hLPl)ѡyަAđ&&x$<1 q'&)ɚ3s,V܊3C?S2ڄAلA1 w7aP6aP; Xj^J{pz_##jtz @ p kLCrxg,Szu|~㻌 Fm yʴ]78AZޠ["AwвR-vF 4|BS|u ٍ{΢~Qc7&D0,ûFcgnk ǧ+ŷ1!W:;' ~Mep5/w'S~!\Ϧ7If%!!؊ӤI+}cFf(֊ f<ˣ?$mH}?L?6ٰEZsa|Wa]FM<; aZ(CoAD R9 2NяM@6~(0_ؐ27鯕ߖu~>ԘPd?OaWE%XCIkg5:b"BgKUrmX`3c g0uhz4Իps-^?(szU3z$Ex `~Jwlzft*.%EX6ɓK, fA3LCdfsRDUu[1",8Bϖ(ӦbDDCX/Zl ,O2wadw؀U մ0ni`x@v"%g%8P52/6V6X lIm5pխ2lrBN1 +F&^e׮CH R!URqab-ul"\mVϊY霁\%BϾf;Ň74.Cmh5\P'GG#tb-, SATl;]^~mnR4jYt%} Ȉ Kt b|%2odJ6zI&#*1| [C>:Qೂ Y$3bu+H n"tqx7FVp"?c95-!*p !7hY(5C˝Ygx/Ի?3]#GM WR`'_X%I&i:S3zZ ]~xbދ|g/^0.cZ&| >{ Aܠ|nP>G(!=\R[gixKqzW8b5$44 ۟@VvNSeP !b`aHjc.+c2GeL@ӜC`S;>ȠdA %`%fn79 ;fT:N!F-i>=^ް$v Kg$< ZfҡьetN* >نt#R#5O%>2GrçLWA,$(wI Oiу*35@JRv[f\mc,[Yk-^:N'AN^9pzK1>O 7=:~K;ZRv*/v{^i/k>t}Fk'E{\F֫n6v_owU4~pc:~ NScRxuVTͲ=VcTkO+;ϫ]nS=D7Zk m~fIy7񽩏'~BbŸl$(wSkzJ)״y߱SB$Vꥵ^cg㑾#{d#}3g(Bzc|1B+{KD%%HuH&+v3k[gMxknਙkoçz!``QgPWuVzMmb3֊fְm9H=C҉^+DscLm dQ%U&f~:PIc!{}Q5{HM:'CSC@a 9Saf$no댠E"xxsq5 (ͫFr 0Ob3/#}hS a8ݹ~&Z̢J5øn5jv Aay޶G< D4b*薭pʅ!-xrq#F!E或= ̓7 _@48rcr)*dNGgSѤ8B\c41 !/coG涣B&v; jDiUA' v̐rԝ.vG| fqrTtU?x.D&higHuϣ'Sϧ##B30ǥ*[ն7A8мu@Wb{ OUh|sD)J͕G]l ŬVP)a=I1ȦI*GS:6g[Y㍧f:6hh<$&;/_RA'dvv`xc708?Ӟ~ UDlP4K:qN1+iP{!3PeF=-lvt}ާ @-A13;KF ܖFDV ly4{~Ê L͐"B[-(T0*$qJQdCgu}d"%&jM`Z/&0WΖ"e qI?45`{ÕA2 Ѡv>ҩHs8DWvA&jsJNfuF"sXkX'Cq[)>VՉiQ@q[e ۖӲ3oypZ)k`#r v?|xY{yj*kAJx@oLDT&[>蹌"5 ETX`%&NOj-3ʞ$)\ΦRk]k|CI,ٜg'vp-вcuE;?$qp~qgD_a ک&M>|EBᤫgVfQtK3e5lֳhAj~륅4z>ࡅWjA Y;!W#9Ti! U9W#rdx3yBFta墁1} *) #4#!Rw&&H vndmj$允+|O> t VJJ݇N{[Ij s]%,&l$ymx!"Q1%a3ZWbc}!&dW5%zңČVsmr<ʟ :jS4|s;KJWZkHBwe$ fblhw$jp1D) 4dCa9eV+bՂ_İڥb`H Tqj#!%J}9+~1>jNg&Xe`_qQGDWYNoEY}Q.ʴ((9zТTpWKϺZrVZ-Z-R;"<$4KD M#sž',%=BJV҈{-^5oplg.&ޘmF e5 lU| İcœq_5*І El1#G[AKGC^ gv˛,/ǵƠX c {е)FK}Pn8pz "bi;2}v˚kSfX$KT MQGWwJ\c=A9 ht C.;@0Pt:B-ҋ~7OP'@΃q3Bo:^V ׎%~̕"cb+jZޑ7p'OE ]^_\h*tux.8t޸w{# S yΖnU+˂ QuɜcnG?Φ_U7/uiY8Nx?V{u--嘚 Mi +(twNvV>kgl/j3,hyTwc/jm ( C~QűF@-!Q_-OT:nWە =նHI^A|z):yGHGR*VIRJ>?y fG1&StR,j4(@u ViR ]Lg@pq{/jtmOe"\y-X>‰q|Ssdn($U=`^{{ ゆ +r%ݏcprma LY'-~ۀ.DG6}C)WR?",<ɇX'k<0\)np5M'S8uuK#q5(V8C% :`CX63;rO w,fk(c?G r"__workC,N@QYy}F/fSr_bIRN.YATGHNWL~%v~ދ^G./5joaTJtbF6wIihZ_gODlOw\,WjBcB j[T@j9T?GZ{EDUZ?WgQ`4pC `A=$aV /Μ)9[_GbC"NԕZ4qZ-Ov$YYp{W2o[xj\$b a(m$ر'/- q&LkJ8KJޟnُQ_2jEGОIXd#Ru)QHR9 K)T޲<WRc`K-eX@$S cWpG8 xqtwSAn$;o*`U}C]7ņ͵"6Pa,-]ʧR̢b T{m F֖+h9^@Kߞ;1SPR,Xw$$#M2ꤏ4IaDlBh(l HBT! GgO=,TĀ^=V 蘇l@(?rvD2*L ~#FMOma _Ny.-)LӀ6fLd܇?-qdGmH^T~K m3E$ 2m8ۄ<(̓.{hM,3(Fx fjǨBzE.~IfN?@j#=n;*vz!0MbJ0ڕ"Pr`AY=w}bKv~A*(*Ohl!1oa"e6Ozw22&6?`L#&w*&0Q~Z4uKuk#&h9=xBf7*#oHHb8S4=?ž0V*/$S0TJ\dNYNA,G)]Tt Jci3Ԕ9r@O$wuD];c#veFČ!9BATKT>_[ 1i3钤h9  `r1 LZwYWS(0D/+@DmH4<#E gW)i!LFj0֜tbmr5amBrlR((h"sü Lȝ`ESyr։-CDmCMc:LeZCr~TDAF6PJQ &$^#&5O'eeԉb/XUlKFGxFll1O۵abŇM̵ЯK$4.LN4.lb'e\̊qX;.xsܬ~9^u5ܸ'eNdnTBKG]HmnK*cWJX^مa5:d]Bdzg_'ncD1߫$۟xْ#\pGbd#bzо!FWţ=WS-[6+\F^[q͉$e&W\bCKquA&ouajcںHzu]b9KAv֭tSRwN֫) T\ 0!HkVhO.eǘ9U :Ltj5EO҅6Xr]$> u;1d.sLRN?NgM]޴a%\|haEtbdńQkR+5? ;^ǹhR ٪IR&ex<FRO7iLވD,?-%Љ#Cd\ړ4"rMY=HmBHdM8(謂|I^0%IU4(1w*YFN2ȱ{MY'Ϭ(TM_2u&~j|]'%!-) Dhf5 pK,⦘F{\)P7ؘq`w'Q;RȬ3GdmlC9wTA3%TQ?exE  ra/yf04bֳJRrȗK^օ*|+;DӾlR ۭbk[-z]Tbn9怏#kvq}\{Jf0$aAﱍt`R -:'B?KeْZGwIy]]=/"$|<wb#TbjŲx;M6o]24::d{"s]Fj v+ˢ%.EyvBs`Jo%.ӢgC|l?Ƥ%,P&p9_/D mʐ<$А4ĐXcHi#Kҍ.zV:,XZ8 Ω혎 ު))qG#d=<Dŀ7}7֙Ȗ&'މVT66% }"tY=p0eL?`$f93`w|[/_?r;igɟzOR٫ةVv/yv_w ͢}î;Oў'~<{G>.y^{j9IW_ޚfnڗhR/Z5_"~M.D bf [clSnLo3w''Rh6Bnwg?DQg1n *ޑ,a F a]'m#1<=>p70*݁ ~|wk6j. HD)|>% 9>Q jC I!7\`q:}4.tVq?Moc6~n,Mf0V5dT~@_|¯ n55^CZn?`OZn4:8E5vzGUqeKʘN3E x1D#5`($gT9S( 'Lh8cWϞ}qrW>>sigm5Q/8;vLn&Ddف$~ mGDT~5%LDgg(\A6ͬ f0 _y:* } vp}Ҡ,}nVO]_/ڍGĔbY]P$<]ESX 21Qy8J1塧_PBF0B$JϏʥ}>>.&@O1G0LSO 3}а;AFp8YC0j\Aq~ǐKN!NqBWH8wqL,20nL27˯+k00I^#)h3гdQ'oB ʯ5dF\qB F]`xmlQ*/!0~ z@Z:ddnFmke,= >ml>5?X+oQ'c(qe<ڿx䢓_ JR5~+T p #/h1&, MGjfM.+r L>XR)%9qQ34ZJ[-h1e.$/)Yg5 sc|? kz\+,Lrʭi~ep oOr *0g *}-1e.$ND9묥GXKr|O(@ s$C֋g]PNXST7RP:#zM& Mx0${3̅wH~??\HTP5/"?`p-Β)$`X 蔣Vk'$}"*^y!T7SքJ5S_"CM}<`NU+U3 Rҡjڠ8T[8^o,lqUJ[l4/~9DN'kHU o'4T[MtfF{̦dt7'."X3@g }J]-Db|uffvLz:qs{"|.?b_*r\8ynN,["g`^Gc_h1y ^fΕMsNcX? iQ<9`HD;ªʏ)B\~831N>GٻY/y[?e9Jk;,&\}X聶!~'VLA9 XWsOR=*RBԜ(KIˍfqNoh_'n^6|P9})y7dZ)S8Ca K/" E}| K0V)fdB)y4iP)CL8& lڽEt3U-GSI,Y&nF҈UYSq~^{@s Awց[S%[R; p"I"nʀcpkY=lsTVKOS)γ_&mG pkÅPA:?Lh_y&ҋio&Ecq`r| aAbB8H$/S- @9fx{xmC  k{.L5T;wFfr=x[(JIZלUC)]şG"k7'#]JA0CWE'T*\ٓ,94J!b?lU6-/2e&LrReS矰+@c?>]N!:V^!Sp[r5BU6峵6˶{FU T?əwrmQ2逄@Š#i-|\1WHPWu(btX~oubnsE x6Cf́ 8[yq_VwJ//0(OFID_vۃ3δ(i]2(I!qlD/Mq/Κ1z%Y!_^er){EX eԖc7w_VJ?S7_CǓQ,]G5| ϛ{+vo3D@ܛ[BѶM hQZ4X!zI13ҝ|KT /__c헅]`MBa=C";+ \W_GPӠ 3B4Č*!7<|DW렎rt CVQ>I{y41 O<OJ1ΩA"@Bj4;YHAQ `pqv6љ{=ٽ i5Ҷ 8좘6nu}b3V E1!ZLrזYΕltCp,nK;|z ~Y m=Mx3- [vW/Ũvjy?i|ˉ 2ы ^ hd:@1U|31oA l9k'6| /lYYTn@Fpd'=NZLW꣈[NbXNNVY/eSLi_EI,JrT෵SĕouT]dcN12Nu>8>Jx_4%J,~#-oJnSMl*!Ip丽XhO*)ΥK _ŨcԚ=K )zrdReh$%VhZ];+Pr3IN$~0rb,qL%\mo&A⍜8"P}Y! %hrD,a[yp@13Vv i a즷p7DrD9KJK,f,QNR;nЮ6(zNSݩ(OZh=7= jd?Y!7h=7h=9rϪgA٣t6@jYpyi]?e+-=Zдi扌Z|FRJŗ|P\wEHzTe!"KCSiQ%qf̵l,fbl=ams" W5?&NA8>*!5*kӣȅ N($ڈ Z*aiK0+˙;mmJyDޅX[| VaFr!@fSӄ&8&\EI*13"WXgRK׽%3|b:M#i+3_ǓOnh dj9TZi^ ^ jw&+t-hNo^L^XeSnzj傕 G>4/CӲ(Y!06d~vVFzݓnh8("0ZXި8k&Eb:vU= eS^㩚MM,(O$F֭9P`[T8O;M]?֊%t4L=\38og {a%;ķSa_d=Bq@@*ʶw?dsYfl;ۥ{@'qf ӾwDTμ ^i"R"tݥȫE ?T+p*Hq[\ ȁ6BLF!&A:cWU MrHĕ$ti9!t2,0>QEG.s3!#^l^(L"5?{jO)^:47X rX_jF{W/FK94N}~٠AjeT5SH~k潴!DSë*IQE~5r] j_N3%3/p߬]4ݮ5H&zNAᅱ JYr'#^8qtRqB}"8ٯ 61PNA !iFDq ,|sfB5uT_r웑a7alVܴ"-_A̒`! %IlXP)pRt1S]wt(֯\3sc_cwE' ,ć\;#nC:t5IQu؏$lGqJk7;Ei&ɴ )PJJMM<ƧI4&ФTB.]ou:5t>>Luas>e0b5{ᢰ6j^q4NZ&}U(!|3iUgz/aۻ"& %:K #?UIE4?Ge|\+,H xupX#% K #$GYvjZ% 󬟙,|#_enݡ־=E NtgW^@&L%8e,te:}d!۶1Nf[0@9H ?08>tؿ{Tن|; 3ɀJ|JЖJm;τu K? 7# }㊣,] eOr }dpJ>"ɣmDg9\[G/O%a,o_F4b^6l- "Bu2IXkXmkeXh e3>mA%g2JiJy!{̜NsҮɼdF:Oh[6v#Or-&ij t}<ʵ tڒhXk(m~kkP'QCpe7ʝ"1qH;u:9DP&1KʡUeYTޤKʭSeٸu4 ƫsչWZQ`Q !v?A٠:.Ha:%+# X0 w\ko~wśܯx/"Jp~mǷ].گJQ2 )0o.7K~e8Ka/RxU\W^n.Ka?_R8;"Cn(=X%dlo+%džˢlp eXKͥV8{[a9_ 7 Xv;c<`~E'R1 <TVIYjB߯+Zu'[)ԛ}nQ- uAsԦƧ8~/Y1(g Nos<˧'5Ag.K<^vL 0оZ^×&^~X eV$#eՇb)FRv"+r/558Au+z4 anRPbl$eMr$B/W|}K⨿Ťߢvte ՑH%EWk0,ߍ ,N 0"1qtRHXŒ@j 0٫t |K !HL$eg/!pBTj`tls 3Hq" !th9͹C$43w! 4n'IlWvm=6rmiV f`po >ٷ8l_>!nϓLNV&&hxvJN!Sw 3 \3'E5UrE}KNC֝h4 pP{t 8$mmFTwJ;QN u;UQ'a$Q;_ĸ(,is: N.iZ tSfbH?*Xro$B΅2j+,QVXj耵WXӛ^ae┓B|er9G#DWs 0 *0g *}-}('u#%1'.F'9'lzIY x?yStҩRPւ!M& Mx0d3̅wH~??\H z[I?>WvD݊S䒃I\,w9%j8eΦ RYi@ZhG0 ҳ M$H6iH4XMsl%FgXKX."!֏"(>C~:}~;o0@gô!Fzd%E. @-wK6\Fܶe|d9VzQZ{nE[z#stVnjB΃-Ƅ{#oUl g1Fa̞񽎬Ad',w*2@FKRld:%=Pz0~$;Żc$~*nU>;(s:.h֓ e^cѿD',wcfA'*Emv%\ h/LF&-Fj^L?z!Ãkh/e7Da`}@x\ֶ.TVԱM^]^]=XWA*UgLT \țu8QB=ϫ}wWQv*z&*I? !7#XOOkMhgp +r-GY.0jϿ'0ZJsQ7񱕍Ĝl=!BZթ7Ր*Sn;x൳nPL'Wfnj8)dQo(ٝxyf%ʍq*UfJħ XCʁ֑gxdRk!' Ee%8F@#R/ q)Vӽ߾+x>MWwcv·{"*6;g͡MCyt h|+? a8ɨ]:'hm-R;4{FN )o9i\xway#rC0 6 t!xx7YСzma!Dޡ Iյ>YGn0+Z/> >-_ۥ_FS:hӕMUv BawEs&J)?{Z薪a7lW)T[W~YpV z^8ؾtH6N%b>pǥ䊴"$ll'+]-A;"j(&+r2.J8&vAW1/E* TR~' 5¯EDs)Զiex2MlΐK*j"V'JXxWjДd:]S^(GDg2P^>4mC?`2")bt}1},;|GYdO[NޕSHu!_~2DQV gE۳6??= ~e hM 0lx\:>,{ſ(9t*ʈ=-J 3 1j®*tk!~^FLuB%vB&mErN(Iy2<[eig yS{NЅ)sĤl$䀅N}?%6qB0脵N _[W?!0nKoqd.I0Nu붚F8 !?Q=\/%~i.jbkۧ$pG.(R-:hS8*YTѶwrL-ДҮV L``al˓\5{vMw`p q yxeHuFG<#28YNE3.tFfm2 H$&*E>u$ED@'᭯> 77pz@/FhAչ0oH"+W4#S,wGبt%9*+(-u'~8 F)0-j*F% ,A ^H^n˝=(u;GxWhFЙ 2@ܴX0` ̘@-™J0Lqf#Fyp-jh:O؁-`N&Ꮉ!vraZ3 XP|\-O0 M59ah.8J=R8]K-z4%+%YH]LƢR?v}Cb@0<)x6ao<4=K.N+ܐ 䬜^_aB%fBOZEEMwT{bn\eLB"2N Z)2t` 6&cȁѮiOvŦF܂8. ̇|fh"\ S8E(~[*-yM5N CW Vl3Fn"՜\R3 S/;ϭx L.\a1<[z%|Ef d 8U"sz"Ƥ< Ӝ#+e~-KL D5!3Gi4 K9ZaQ /Jn-FKKhp0#O]^<}d֣#udEuŐR7JBѥmVg0%>_\'W"IS` P u4YpkEmWJ-裮unVz eA.a^[sG3 u&%4ܘgS(:JXsQǤT㫚9*|*@ ė =!FNTp5uJ]>EI r,v={Ɛ'w`C`'<˪dUt M$$i GV_o3[ ^X_›yŨk>Q?sAbh.xDpF/izuF"TBq/R?Fjcלw?-{ա#j+!hrfa:6F=?$KBT@'A'|DC x'CQd0-dщPOPZd?%ζ#h!*UjTˌHoHϞQZ'P(_P?̌NY%B婺4q%V~ePoT՝lTZG7G!j-C`(!sQdQ V K?ͬHؐ2+bH}~5l8{C{~n&4h`s+&t/?㿾h^M'yu㿮pO*6Z7Z7ZGJ6Sh!z([bHŧpQ騸BR -! BBMEB_:hxEQT!1ɜ/ 5BjlD7r*0X&tМA]#e<'~e,EH9VdU[)2^@jLǮ Bd "E/GXS]ɺ$Os:* \HYpe*:qVPW>ki W,H }{3(]'|[ע9TŰtJaL|g$fi?D_~x5u#I,.c„cR(C:׏8:g F+SВFZZc( }@y!xcuG/I$G a1 uǡDd`, k[G(r%O29y1mpCrB2  P"!IE y8DJgbKgEm[JA0p.CQ6f.xߘ}l ιԏ|+1UЍ9.dȦTWx9K7*Y$ :DX#ۢyͽO ,0V6$" %A@"ɔE@YnHUoNA r 2 s sy 3L@z~'Gyo\ACyqwVlPwdhg3/E}&ۻ%ث&X/lc@cKP& 熘_ҹF@!HSC:Y{Ks0Q_Еp-t'J#@|A B}8] UZNЩA"}rZ:jp+p;ê*}xP ^LACy|3P;N~'HXc;.`xbا j264j7 1N < ğ|1’K@Oō Q#k?;s7jOD *k6 roۯ`K|6H8@;auԌ8;r,ƷĵW`(s t#@Ds5|ۆ!v ~$ =D v(o&qP}oۡ_:x}6PB([4Nʡ޾seFP!_p܁+e6 ԋ9p[A+oV$'C%L3vJ4[pE6L$(l' ~9RЄgr:+!'KLm)4FJ[0V_p͗'}9.>R<g77aGJx&KZI0Jk˘eQm͂f""ǑsɉyCgPJqC,Sk!XXTc i@QY5-gSaNR 2E+t u 0V8ZTL+㬐kG 4zm)aluޮa^ y7+ora!_#sLWνg@MCXQOzZy/3G$G@ffP+Y[T˙ Yj(CZ#}ګY+ |-kk. DtDQxX8qi}gE75J3}-H#YXj(QH-jkegBCc)/ƚ_D $r:c4 x\iLީL?P4/ݗ2O=ڥc AJtvd sy@[EKW9l\W:-nQ'x92rLlc6 N\cWTSk 5ߡ|}x/K"^/ P+OZz*wKc*z*g"֩ze["_٦\Hp )%ڥBnǷҚ>lw!Uk%U(` n*Vίu]yUь-ʦuFc7$!os_x=\+ NokZkS]+ڿVJi~v!wJi-ȼ~TXq %HLY̴9&&V}蕗20:|EUjN&k(7D<})Zv">s_Eu5եP⊕5%N%_BwpC:WIoT;nqNk[Ʃ־kJ~JIoP E:uK_e)2lΒx3Mx_=q{{w/{/6_ ȍBld}w_./w=M_5L u80L3&p00ҎBWa`I6 R|enblblblblblblb+P͸`IkjejejE6V< VVj@+@+y1V*$9x6 &>'}~S^96u,7n/$V |w5٪(;6̵An7L}`=F!YPКL1H0~-1JgO@6 1ZhtroaIxkGe,~$5,ȚarS՝4f|eF)$  :]/1j q%,0$ d0zdi+p##,Ʋav7\cb|M)DYp q(걡M_gP.E훝X\Hάί~':N&,z⃮j=Z%SJn̜MY RCE?ˊG27Ƀ@SɃ,Ƀa*ς}1˼PG/iTtucG갌1U./~Vp<o&w8L@^u((F&:x{jTkʶD6 [yΠu/;[w8*9o=(Bos l?tzZ 5vNpzq Y`: u H/`H!*/t,RuB|fvp*?ȢB54P\4[-߿ p2=J?ˎ/9So9:#ۗP  h~$ê/d @Q @|XPA* 3Xg> û9ǣDb Cf+C)Kt)]G UO*):'ca83h2o!銅 6ѥcH0<^s@ .E|UcH wtqz6uLbTUQW/P“F흇6Jt0akmRb[N_;5w5rlwק= ֻ %UʖuA P,@8~Nu0 %|Yփ\jbn_'܍|?Ͻ7x\y7G|T`A#Ạx>YS{i_aNGuanG52zD4MԂ0MZjLIMo6US62Uej!T]&3_Ĕ AXFQƥT3j~R,xVyUzvr dlp1amHBV|ȩ٣3TORao >A?]ĮYx'Iȁe Li' Wjth(ܞpLCRfj[RN2]yQצV8E[-+L)g?D"y,L#f?iٰ"CR$E8RI5v R{t! %->7uWr2MA:)Nt c:*S\).+*R|N3bĈcOf?9sslOB՝zɹfQVUQuAtuƹ(*1͕{pfd@i7SMkZmސ $\7k[VbYa\䛃CtLjvXE3ah\Vppz8Y+USóƒutZfrQ[k-1J z>=b+>-GqϬK;gִ6uGW8pP[*&[M&=^ei/&] %p6.}t7/"| O87ȣ1~?J:q]M.Kl.Anz7/-F7e9n:^K7rij(뇵~NxQz^}Hpׯ9Wb,/g"ZcPC g86ovBm5bۈ}Oq<]Z 7e*@G9vp7q-mn(pJIgTWb]YezZȸMx!^? tivrfF _ gD1b0Qut;Nd99e4yȉ%1v%g ڃƀHar2.l#4aH,`4R=)\輸)c-X5NAI |FMp+Zs^$_e^k3$X j͔abMjǷ\_u ߿5ڃ3(g'K[qq"'h[RN_&*/k9uO>PQ#k`R|0D-*x{Gek)nÊ@ :bm-R, D|`D>PIp5$PQg\OI$:b<@k1@B. " ijXFu#/brֱn3 S 33+ %S G$qQB>rz;c_wS׽tƊ6W$f#WfL7Y6zllה*VQrQ%tKUjyrcH?#}/-}KX/6J:ioOwx~ Ǐ JR_ko;; t2rHM 4J'Np  ~RV?{'ryr Ε7 Xxr2+{N!"yaq&>fHVR2#9.,Y}*qB[mu)ӔCr^*z&kJ~Nky6U?OzYPCgtf*(ť: 4E7m]@I:i':ا|: &H<@z;oZ3wHd,o8gpY{bJ{dSjggŹ˖Qd쑕ݪ={/P{ ;'ro61% }jFI+LM=['V48SBhw x8&̲߱1ZI9rKN.uh}X:{+{kW"YkϩPjP `1ZxEbMu.F809gXaYZZRiZiZF2nX B6oaBLGQ_y󒥘Xw6/#Jҗz NzvDP'tTfT+ʶ ourX_kk<IJzH.zH2DzH6%9.gίMLDz-]^K BV(Ԓ@!.Y1N*+f*&~Pnzh53~kIb("˨c9S*p?#ɶ aCf-D;C,%]H(K8jWu*Kɇ<! q<.Ԓ#R||Hp IrxPd!/;>4cr38|*Ī*Ȱ<+¶5p"HШHr~m_Tte)%(*O`sbAHIV]&I} G6$ N+ )rZ^9@9٩pܛ;ԅJ%\jzJJ{'y#"H@HE*w^PuVSK M>6ޗb?Y4}(#:k'ΉHo9 PMQMa-\5}<EIX4vs͟ZnI䍓lJ$ATU{(=m:q2ZdŻek1˙˷HHbDDureCd-/'8~T'B{֙oIgO)AGIb-T %#+QlA6Q=:H%t O!̣yHR${<~3VԖiJȓ*!}굆*]e(J̷Q mTBJy\:!G]Gʦ55V%촢浢 )ӯR,_tIR,_X%K`uv%M69J #_?ZNU7(tPiE EЪZZ֣Rl ̼z7S?`̷LVSМJaƥ S A)<߷|-/_+ZgPJP(Y> N9r.!;(mb @ sql krѷD sl^I{@9=(ap]XVLX"+'ۑ{9ؿx$ xgQTSvZϠj5eICLQ)c珰q1?'XഃU# &9/-_4dXvCAۉ`3./yf"I2i rBdbhh`Fiq7_mMߗ]YLP ̹`b!^\ H*bJ2 :iuw0G=Bx7l;Bid9$Fq$vd&;$$j b:,07)~|$f'+s z,@5J ,hOE fAsT@dMUPc=Ǫbܲ`A*;9qزs2`(;^ιYٹ8ko!v{ʑwE ӝ~vcX=e}Y~}^Tnus{Xt4qN1:&>k@2lHEnns`d3jR4++h0AcxKOjK#W.jD֙r:Cu 1}gPA%ʣgiK u`#Pu2!On?_-ч<9n|MD$5_x9L暔¯3^ؼ~EqTOzb8.ǨAn=; LX?#1P dbtI d|֊Xdn< B>尜?'Gilq)8+ !ƣ|1knjy`u]'Wl#vHj5 \c/ruж#;D0}54br0?ѧ -qQO/cp 1_#vgeN_kyC8\ ¼`vzJḿIGY&Z-Œnʴf|FO"bb?O'q7cLl_Nt8bxwS=脙mMO5,S˟? [ ~ĵJkr? 3e"F@@j'mDa ZpRy(䡲RQb3`dWlJo0ղsj'Z~Y^Dg͵w̄ʂ?۲c4 ͣ!t;hZ@PeA6Wۺ8J"SqHlSH8ޠJ冱v? "@I4M(%V9g$0@kTEazZ$S UT"%4c ) #R5N8Ft,/LO0,/ģtzKB خA|Š𧲹~!Kj{:{GR{* VYc:<ʠ@:~F.Fg&kd{a4E$Qu ]NB Q8ZI #6LL>Hd 9=-wb fznbOD:3:!>Gve{#=ّ9()6|T0l.n)}xj$!2Hl$a5XM[Kû*~D-B4rtuR V)虭Zׁ+ü~6ˇ,YF/0Rn<Q)1n5y;f ]0@9R=?r yd, p;0HCN3O)Cz"0 58JL)P7/! tK*_xXCCl`O/I˔DƵ:i&r OZ̔¡ dTz%8LmPPJ&`v*x+~1$ZlM1f#0Mp$|4CU$o{|Fd}>#+o=6x{=(Bhx(d-PzMk]ǥØ Z;;0xa`i#m>CtK<:9^Հ˅(}D,%Ա_;Vv:BI~ZTu9"2 k@lzx88{S=%{=οkC"Ċ>*:J^*rMT\.rݺrS?Oe㧒_O|G5=UvU9|gﭒz*盘O>uݝ]y}Tt?^3j5-(`Iy{Z%m|6>DIAG@WhTM ذMmYIr-ܤĵi'"Iq ҢJ*b<]5G# ~1U8rQԢJd9@[u|"H L( hH' <7,IdhFxExЮ <4l3 s%>_C Q̖{ؙ<}WFr4KэpU԰/gJ3a@s"0o``NX47G+:Dx}hv9]錫TryOH*-nՓ>8N<Q`b\<P  oFsS" D^sw{ 3LcO/?6Co}rwCȈKq NQ9.STv?@Gi:?/ r5|]fƪ"ixhgZq6]2Sd`pN10hÜ9bB8&ϪA#cq#: S`Yݔ":790!Z[:xr nPkj2`Xk \@ݚKnGdfq4AN-d ( 3-o=0CXѮc'"+rSSs!P9 Xy-+̨HVp~ |Ogj2DMH6 kq#$PH}o=--r}#T"{YGh>c2[JѻD$dWX0 ᇻ Ӵڮ+*NPMt l <%WQ};y7*C\ Rs{,`]<u}`v;"ޱI&o}纖26^a>nb,rIy%1S;W^9!Ԡ̼WL_iMFovA^78VJx"r&gttrVE;7nyiѕXcJFtƎ{eg쥮ؖ#mz5lh'AЮwjЭ *8E3atK@؀y5c+;i@Brl-Jo!Yݛ[ 0bICC&}{%'bӅ̵|W?lv8ivLs^}|ѱa6- VӛJ㮽Tl?͈ afp JVXmvm ˭IvC,=%}w3 [ӑ֩V ʩvAK.s];ɦa8pD+H]6p]72썚8#*!D~Z8aZ@r2=_kOb|r--+OFp<@TQdr!j9Ć!Zj91Ԕ(6G-IB $4:?`,ܣ(-0./!7:֠WY&EA|B@,Vg _y*`偀O6JY-ν߷˫(s!OF ӭEfh rE+Viگfh#k+5Rb&}5 NԃGڋ{:'2XcS_*#~=Yy,wnƝgγqٸlyߝ)D6r<6$} Z1rz  Hn9 OCnr6N9)8!g㐳qX7)ƽv OzHĞ7raO4k\up2ZӍ#ƑfHi74GiY:RO!(٩b-|.uݐ2b[L(c=E.JPGJ\pbwfQ@aEZꍁ6^i]{y wt`~]x&7DQ w7KEOHihz420*ۣ Vԩ-oMkD~EOGh<-*ox{GN) SS=/C}V8 sexl.Q3lk$Ep}zo\Z<F]y_< |% 0_Z.0 5@[&ji2cozZ.#s֘M;ү`&5H6,hL B"AePS3phf <_ˠ\Y 1h 8l*7`]dע 5jΙpx,-&HC@qUZS [dN:8p sȟ(*QAVO2E^?ΏL"۪([j_[?[o0$@^}.@٪.k&+[LFU2O/:w}NB*0['=Vs2>If[1g g NS$РL PòJ&5,eòu $"}O\m-u֮!(NmJ-ᤑn<^Vpte.}|hJG[AVAGfM^Q̄v:Ì!(öa@b6d',8XcSNc23Eq}bTBfhߕ_>O7Q.׍N># ռasM) e81qkzj|]qNC2l6-dAX>v|'?n~|YFrpOe Z-ˬw~-}Tu6ǏIѐڎ6nt;Vׂ> v=slanm;P؄n]϶[㩳("=ٮN[(1/ohV{n9[F+!v|@b2jMFq.o글#WCA_~|RM캵6\2#~/3=Bkko@uD~&u ƐͶC= <#]ESEy0:Gde % >!EYX6c9\M?NL x\huF\"v%Ğ`s 7 뵫j=6xʶ.t[z.?\n\?\C!,]{Yn{GAz4H쿻OoӋ&Ó\o}[?1@φǦxyc[K_;6bT\wR;{(`n-lo ^Քw`:V߲sz)J(Si¬w*_J1L7&YM4N?&|c(hۙ61.iqjdƺK ,O$624.dJr4Gq>cڈ[alnӛ$+drv 'WV!TE􎙉3&҈i^%iI| ؊7Sm*~0XIPPoޣ{+)ld -<{#g c\\>/ף <{xB}^[@r--ļNA oG[B0ݎ7Nvy8-3pBoU?2*VNra(8vDb#4sIliH¢y03JԺ D SS+S˦0x=|DHgH 'JYO(%uPNՌ®$;[b%E)6]S:u0eݍTo ]ndPY$cU#E! H=&?ҋ{\:š1w3³9Ξ%|=i:R8h>EvJz) 'I|bREBNSL(Wh+R.|\ O*FoFT$KWGEۥ0 \`>7O"!jCkSrNm 9j1gÔN>>M\+{Mik _ M[Zp-/38,lmD%/uEc w-}nbdz) *7 %Lge+WLj6y/GŴ bTk/m9T*Jg21yL {`yGjmcULR=m0-ϕz(I |[U”/Sqӷm$Q&$ ZR):* Eu7}if.!F.Sd)PV8 N˭iӅ4%9٪'P6Jݮ(1)/}EczeE9+7L䶘RT RΤt UZŰ E$Nt@f6C }c^¸!9D'ThڄyxVMj. UTòUA#V7VyLBz? YCke>**ui2 CYz4~!Eikrή2SwE_k_M?ܷx0Q%ǙKH\B\5ݤg[R5]4Jc$`~S-JB DngKfTCM%?,i§9t"+˿$_㨢%%"br2O=-Q"-uB=y_'|)^~n}Xu1:mk}|ou/TUDٸm\DS'ۦ Jq1YLc! ,xs0."qQ((l*Jjt䈲$ pRn)`+OYA}=0O̪jbU W0z ԫE=vȈ~rr5A܌s#~Yu r5G~  ?r3zfe"f󲺇匱Ľ3_O,qo'VpoFdvoFd]pϚd 2:WQTZ廓Pr,|.Zga@ k /Kt- Xˈ1cO኱X;۴rP l@@#u[Ə{^7|SL"q2R2ٰr."6כ\~¡AP.z DFJmujwBw+߬SjpNǸkVuoq+du^ڇqxBܰ-QUmJP *7 \-}FU@'SV"~pEbSGy1_)UQ9-C2wK-xCTT" lp~BllV"v_ugi8:,e SvRXttj35D* 66AM_7BiPF&kXfA ^c=Iӗ^RrtdxZ).G飘v4E6ne?QU?6o) Cqh_/rw!}o/?!d .Ay(yP}|IS&Q${yZ./vSXI%Ж894mkR4/؅g%>RWh/G,l9;ǨDC=#4ꧧ|_Url%'\¯]^," q!REWSh RplU5T .62[HaL\6[jeiOjsXߘ)&O$ք F(UVsKuroqD1qðlMn~ RI(Z\/á\=4d Ă<Pm)va$8D`3Y7i4rHj`TUlT'؆q<o>%I4WO82lhcEoœf괍)֙jc]63瞎bJ-__.GZ{|tKzхv(W !ߡ('>p'6sK"8a.(ozWǧEABOokHYڗ5n]&9Xֿ}7M5Epk {Etմ<4 dڼ@2aı*QCr\U/I.$bJM,0qJRTv VHݫ[n[/<9q9Mq$$V=d9mE# dRqI f1-jq$T].j9_EeM%s8B76_SfHt>&lr~VSJyFr⹐<3=E $'IG)~̗ĝo[6knfjή8l8=0iA0E: ]֘L' P+W g#٪k yZeZ(?ڽhe[QkÙVRƥJ_n$zwaow7%pbE[o-F B8M>yOWr` +bh(FDWzTRϖvD`;[ٳiQ!:97`U2! v/ rE81˨|3&'4e NfFse01 XX weY$C^(~F ꗑ)=mg"ȅ2H.=+6rWW¿ƥĨ]" =9.@6. ,&7ϿB9@J~3~O,T. xu\JHZqb7mLSR(*x[Gv+fUH[5W9{ξ]#.gML!ge/r`o$+'^gɎ[_߆:oCl PSHY p[Q\o4h9G2_u <˧r's+(Q30ިWᕳRs}`sžP 2p5dN!ĜT.5ԚX9qpq/,`Gi\ ~WUD++ E|%h1mI#9wJГ7Ҏz·!."8\ HMG- D`jᔱZpf5ę&;؃ 4*$E lL'5_ER0HZbTxZܠTQd5X*I҆ ʭd6S$zQG$$ ┒@/Mm "$RIHtz ,淫:(dppY*JÓ84v6 t;Ln+#kSLjX̯|.RELmǔ& 8%@G>0\%)Vz‚ȥnFi>]Fr}`Ѵ;OjgE^'(h`iUM1͙Ņ`S4bHl&z'だ_]i 7 ц=1@8{Gd^ @ 2k={Y Qm8 n3C>j(!2wDkȶbMz27T$}?ƷTbJdKptrTgv4# K@dDZ2d!Hh":M{ z.L~2UGʟǺkκ,L$#0L0RޙmQEYݹڝָm((rO!VєzG{x8 { 5.H8ŨS}ŋqfuƖIgl:6R&rhY1{9z :5pW. >ѥ)!`KV15@#vR xjĝӈ/f.!9Vee+sOVQVvwJݗ^wg;x:_:e8X-kNy ITG'cH%[FtPBҎBah8ǰ.U6M &X²^ DGآ6}o9r }_8IґVs;/e 剙x~*Zށ0D/^tzx}O>MpvL"ְy g^ju(rM c6aз>WE= J C!.[]u8?P4sR.#Bmk!17jX;-eOzE LsFO5])}CM O@AHDsƨy'i(kBe E%~ :5?Pi ~iIH05*Ipp=w E 2pO*b7IFD%h P+H%!Xϯ r d~`UJCs zK=Ŀ%{n_y3#fF츙iU-"J5YTTUzP Oę6XBmaB6͑\5w[s1:KP  ./,+b˰s>Nb7pb's|tbK_L1܍ǪJ-]RW$t3ˈ=lV2ZWy0CnSh֡Yǎt{Tg-r:S$F c.2' }joƒq s(BQ"A҂H܌3%@_`'=G sJbzWrLTdWǧQwT7dҢ(kS(̡2"^ lv9rT[>R/⏣ xWs_quazfz~RH'&F2\3%#5~N6\升Bn2^ ] ;;Wr >jk PsdZJs<0R7pSԖj>iӮFs# M4%f%JHjHЄOnW =(@@zN8V!M2sT JOHj01VhI'f]ngxH!~\{#‡ 'dzXZ E,j*@ ZC<٢N}fL(Lj{ݥ^(M,K:`zz;rgKoܣ=\])G9=E13-}6*¸ 4aa"moC@wm}>cb|7OFRBۮ{#к51>Tq w7ʂݢuu,v!a$3P@ 5)o]r7۬h~_2 5.*Bb[*=dYB")pm!t{#-[)^lj#e FuKxVgxj%fu8)Ɲm(ut'EqF"h͛ IL>+F cFJc03f*bz<wMs/dW D HjcZ4`c頻XV􌈌f ۇ8AL +U g(~  i󅆗F6M0kxSX-p`yQ+Xx(RެxU$~V@LʳK@f7 1F,Q& 5Le8.JcLEI=;G`{E\^1Kk`XÂS/o̔SY@TbV³%*g;mOE4GGLwuH42ltexumj0^uݖ*U!!ǁHˑvrx3e;qY9iԷ".t%^L?h>sX`<'-, SjPh];B6=HV*Ir3CIs)sX=Ē1g}M\)8yf9~ κJw)+ESHۣ_b\4EbX))$" eJn!lWB* b:hI WҪ㶆AVr$^rdGaO<5PgEza@@|.Q,-@!Xm>zR[O(c? ȩSveq 4|~9MYiXWx \֛۔?u 80|y? HͿįp餉M 3LmpREk&oZhl Y8>F1∽#)to@`P(gխ?X:;c䗁ԙ胭2ΕRЯmNR:#lr֘.UOq<^:VOڄ/Xޙ+Vo"d!P|CL %h5)ʩJ0O@<}vnHd$5]Oho/((~͑Ӏ" khzMgXgpS[Q&?B^GGDov]m5b#PVS \E&4ߧfzq|El6p}wLfrJTm)ڍN[5Hv8gwbt#;eOq"4K/`ϳz(TP]6ݽQ|qA@@ ` I{ٓ{u74dB'MNɉcr5oMﳮit =!e:C᳐<ˏ{)nb8L>*RK,~'8ç׵XɉvF_R *aVw; wqoIq}׍{g@EV[ޕ qaŁ7gq's9rr!<ϳS+lvs7{=y=y-vVsy?sfoDmc~tj/Ѩ>:Y]ES8e7ړա\Xz>m&/h bۭ ?6,lYEk7B3lWd YtDRTʾٴWVo5e_[{ _(Mjj@:.6!MGw',R$)T$S(EV Zy T5'd({S\M>TcjMn 妫߄l)oba FcE +Ș͖?r=OT=z&V~xJ4=oYϓ Ek&H{]ɑoHVH+u 줸8kmTځM4BZRJySXa0V3_^Ju!%Ӫ"z^g"IHBX} pg=%QƌM1LfT2mP+\b m09p vOu2UU rI&JO;ת؎gc(0argz~v]TЗgﶿn{օ|)4].c36LäDLmpK-4iqUh'!& ,Om+!@r~ 4@p*˝niܦF-.xp2{ }_hDIdb.qQB[\ibjvgΤ~m_>,dD FJح8j$Xr@A={EBמMDntD{\o+u?pߣ5þd:mM5~[r3,+BG]7Iъ&$]}lJi5me"18$)Έ kT}Wuγ@bޫ}.H1=KHYGC' M{3f&K?ׅsnU6,8$.kRGt%cU]oSs1r4gfߪXO8D9(l$xn q1skOU Tr3҆^IGJM-A2ˉz--?8gWNc:ilLP94GsnFEy9ր:RBk~+4sB3hci3V4c DnndS^|T6Gg9Dy2Y{e xsjV%DmsD\Vb(go'S ޶z[+2FdOBsqĎn|,0s FS\GS=wಷj6'S&\'d.^vtea\!URvPKC7dN8ʴ*Fxpx2dI&zw&><1Ouo秪bo/t烏@8p@I|l6?W|I& $8@FLTQ,&@7q'< *;6;Q+ 7<ܕބ0pi.Η{lk=9+ܧ">YXN9K!WrH)yC#›no_ҿG|gQU9f6Ox{R'w=|=|=𾂷|@Kt+yxBr5͹%z6"+>1V ҳV0z+K2jpҋW`rxj{@vTlDd & ?$,ͷgkH_HCXi8 bces1#j--9!R`x65Z`(l#4@WP} 1 $#k|QCi:&FP2,ΦUDiF̗9!`Q)caڀz D OBz$GV=[ eQ #J 5eú?zy< ^>>~}wNERE`ZLҢݘS)a!W|tMAMe&jw$X[Nb[:ZyQ mKIPE?{oڕV=GP5J1hL$6i<@&TIlV&ISf~o2sؤ C$锐NoFcxZ5{!++۠"53h+ PЙͣ-n$rsA<+1{oosiZdsq֕?p\kAE oռ6opY: 'n؈q<85;!X'"V (`h'H@<WY3dz~y3^Yk~1^wm  w iw޾@c璣qr<F 6:6m0_)B6&R ވrʋ_O\r|c83;̮+°VEY"8ig×%!& 8voG8vʆ&ʘ*3eX36\/ffFI(Z8]Ka֓SdQTwaݞ+p<0l,``QhVXN8&@tHv0nB%[Khm3e=}Cr>[i׿Y;9O?xAFdzU~LBNJBQ1H66Yu~axSZ~Vۚ'K%N+Noĩ\>\ .hrNwyf>wsRn7n&g%k$7bO99^1=\w"pv/k3=-@Mv@z+ߤs50Xc t,訫]P2.$ǔ<*v$;GAp;5 |{kgKp|).# $NXŐ18 [O+|+̰T0ȃC|^15f6-,"ۚ hYFcm6UOVИ*~C:qAWxn&Mw0,L܌L-YeBgAh: m$D9g%.Jd a#h~J|T 2Me &`,EI̡*s?l;1[l$~ЌViEץ,PC)ɿM:6'?tb^GOmI]5|ΪZ;n&/yPXȋ*D󨇯NQF֥Ui/8-)U֮g/Ý-lxȖAzXĮ2 Qò 1./yf״<84~C{I_6CQ=O.3a5̉Dw4l/r$U fwʙ^o=6r%AQZ0\ߜP!!vMf@ tᵋotܤӻwr %?ץT,[7wvh]tn_~`/>3]nKG'ezk}z8.~A{ȀhJg*{~bNYܣYm6e(fٚf)Ao BGpNIka7vƆI$+>we^!w;@/ 0Ed3`,#%sw?N55vn[2,>j^Y}LϧuY\ǻ{)َJE|E~1d$5!Eho#Tr9FCč j{nxHAtWCe}^hY\p(J,DB RQk=!]8 qbI: %a ]x UJy8|9I-_`5 6 /J"ɈH$wpZ&C>Z*$|x)qz}jtZ'nMK-R#.)1CU6p T[`,/G QtjmUy?/5^oGm44a+3oq0v%M4 J3䲹@ʾ)WEԶ㴡(aw>hU^nV}F;nռ`vA|r*baXׄqL+:Pm֝Jt~Gaƍfhg|6T"BC9u``jj[7`Fg)ԡ6Yp4yZeRf9SQp$/Up,Pk.gT@ H?~|_g$V_ V_+Kʕk_+Gjv{kOV_?Wκxe^^9krt˵Zr=}cۗKIʳJ)AMPݧ FeuZ_WvZ_VWu:{ :[_g++cWg?AuhWg|xlZ};o(/&(C+Cʡ'ǡ'\}Z<ϵ<{Zؓ YyY߈}̡Ib=7>E=r~+I#'݃^v+[1UCMX c"`Lc8MQ{c}DٰP O> -t6ʞ <̓>,C`^a49ƺyzgCk>pOc&?#zxR"CRՓ2O/$>戬F;l^7u0Lm8˓Bi-e0dX>5/XiSw*/V<>1dÒ gv;[#a|/O'[~NmoGXtLR[IYI㴒xV惕`e>pW1w nшzL78P҂9\k>N7/p5`.~>kX^q&F҄nv>-kK$ǰzkY(|q/rv1T7&dd9MYk'vdKg۾ SI,E^qr#:!~PޒŖX?J&v]B}ěΟ8BF#ȅ)nDCr$wbuoBܝ-sc΀Tb(@1<-I@.J܀x ʿ%_fR̆"ZRwMuI Z/JLiao0O#Z GL%" }Y,44-<"& Sj)$j+OwjːS:w[< Įՠm ٨ip X_[j:a;L{G{֞!54;h'_*IڭV~:W*MKt8wsґQlg FI43> <yh  }U& yT6wwoO 1$׃) 为o6Л"\*#B mK!Us9i%OyZ[}}O ?ݪ#Nݐ=[4 t5jp6 ;&)=ѨB*YsZڬm?ug5Dd Ʈ!eUB)H$\cp`zP.r侜3/Yqzlgk쥪$(8bB*l+]ti -afz2Ե8joJ2joѳxqB0AxC:fZN-?tOZAu7]'GSl߱TࢇgZ70ZOПɘ#ҐLJ.8p߾__X^JaMl|(ʯ6ȯ(={98G {_:jSu-J9w8z!{@,}uzso{Ë 7&Lۛ ˪%)>BcmztPB5-}o tF¦{kYP4H\صC$)7<77QFm%K5557Hq$ rfJ(>CdAfRK Tj4) ny.tUC)#*K%4Dٜn&Cxےh6p  jF9dri*0ky&o1Rs>Άʂ;^mQiO;SL#9hV52bޕ5] io<y҃D1KL'Rw ϑ7"5r*EK)Y:%j$%$p40%!R`!NJr5,IJIe ꕁQzJn3AzO|BCk/UBB8S4%X%^OMtap|]m:~1Y1V۔T66]D.s_x!s/$ŔmI){ 31iU#s- RJ`X|nSYփ;5tomX=bh݁9H.bMi#GCEp6^?Hx^Z/ݶw5Mo+kAg#ٜjq{QDM;{ڣs9*&sz |+ gpM*S9ڠY 3R4'BFV7p7iZoXC\HYU`Fa+{|$Avn.l$ 0QݎlC.Ҧ{qitwx)۱oR.|2ǣOgs/]=tF@Fi[Baەzpuڷ77:iM{b X`) S1F,Ph9͇]U }*m\"NjEIOSz.npSO!LG$i@BҠL<. J5U`݅ddCbD iCU;/5&e~v@8ʯбD;+:tm^L4fKVv=#{+nR/kT!Ǘy'u'٫5b+r6W+z'-0fmf&ƕJnL7#eXӍm1u;Oӱ6I\AI9N*G /+Ho CU5jTj-ҫkVAIחx';_گxFmu*ޛ΁|߽#dPMp&3x `mvEC `G#(G@k7hd^qm UE5R4+8ռw B'2VGO2qf;LQ̦ۏE_;zuekY E,,U.K xp X­$X%{E 7z<2'OR88F#W:H8nJWi=9T[X "˜ c>ߟD$ ځ3anܒCځz@TbVHEpD-#1> p?0l~⿋kxZGȗؾvD'FpNJQ;4J "8BhOoe|!B4`t 1 !8LZSeе  ĝ('0;U6g,㏚!܅1SZ@&p#\F/ /—*QVASAr3@*@/ن$qW˨kWsBmPK(!l}]T2L(ogpreOz(? vqD5sw2܊(W?wpR3^PT+^e}`OlO<jiv{^V=d< Zf^SO1ZKv4a#5 g`lejòArSEmL+ #FǸ<ɘ0v^RYO"biL!}.VHC8 ەVo{d{ wAOuo6O.=Ѧ|dkPj[ d:db0 'U<XEh:0ҡEy_&Hc4x2pNl>E$H2Bk*7Y10n>8Wl֥E0lQHpqݻ]ݲIPl5$El(SheQ6s:a7uE'+ps TGGZ_e!4^u4w̕86ւ.w >0t&L; Ŏ 4ΝPj&odSɎ5?$- 1ȿGy :ɕ¹:1=HQ:#>>9[!uhL5'"}1;d*zD쫵cd"껄&B2U?m; td4[QDؠ+ Ȗ% yM@Ck jr!^AQ.e&0t$}qR !R ho-_AKl(B}dnԌ|.н U&4PEw>K_xP!4]^yf&(|ML2d` TT8ӠGK5ޠ1LfXm9T9&GI4lrw tFяA2]7v*=޾=$cOv*Eo7,Ok=Cպ"ӆRuJBh Єiˠ&8&8H&&h@7G(tJc F-B^./A h~I}1YPa/^[_{PG6jXuQLAhP.]pTהjC[ ^IX\YRvh *cԏKL=sVlݬh&n<Os(/ H [`8c!QƿaH!K ڹR5@XQ#a/MY-r,$%wL^cnћ7+w&VƖEǾc(Z8b,K4)'-¢ˢeGZ&/%\tHZlȲ%w^fk>'j9 V}-vCn:5E[5KkVͳDJ!Ӹbۖ<Ɣ=d1`Ȭ&oTTdjj޲YL;w`w2Y"b7 4[Vo,eˠmYڵ>d>ƍ=ݢU$4331MI]T7v15M t)#QcO0{ B:{o&ɝD&t/)i:2wuB=r- BK:B A#wEڇɯ[& ,E"VNFWu |J2$ fOU*_Te1P+m ->7oCx(Nf8%OY;+,私2W|ttj+r)V z;%[2$ƟٹYʿ&kEId`S˰0-]Q y>S3w<C {.$@j岻81ew4W˰+:x4mf1`bV]r7&ޗ8yg&%'&gw=sZF!op$sER`{p)6?HB,)FwKɬ=E` Ż W<$w zh8vT!UײZrn%st?*t卖 |clk-~;D>shޗh7¿6E3tXg(pWc4(V1*/m$-X}R$?@*eG٪xlptOAI9ꋨ5)ێRaueq6sd1xrWmīJu6BTZl,;lJv#՟lxvWQrDGdtwsksksȹu0O\3Q6UKI>O5!xl//Yˁr"Z٘ 7@*q#e^)*Nܢ|wjiorXĿ g&$4Pi:(.!gJ](L);57`:}c+Х+">0`RFɧ{ "QL6Ԯ?Of06azR8U 9>eaЁ|O˱k =kDl+T@]QX7.sf?( U W5OM*lpYĻy#UKDYjqk5_j-A/@ȷ `.fa}F)>"ZGa_Q eIrL-n/(Sh}M鉁h);<{t8jv"g"f/c/'6\@+F󗢦՘)DOF 0<'9JwDQj!\qm X3ATO#FAGQWڍ"@W$qq 0T,1|ڣafB:cuH)y+0 mۛq}\q 6>껩g\D}Q IdyxĐu+酃4QKu BT𗰫;ERQR2%~Sx Cb#XufY?C?YFM;({mVjԣ m߷p0OCmoFx "\H -Qm# 3׷}3;%Cn#G&8`ȽdI{yhE x^eR.4-NT.-KzH 熯;䆗E_nLHu;4Hk8K|o~'~ g=2P~Vj 6OV )Tڟ&.0$^0'I/r En+R6tXs.3ViutEyy=\ZUHZ2'??/62vy)}<# 0eWVqΡe !e BrX|CdO2N:[<8RTXԁK^ ֻ}Bi:}OMmc~ᓧgߥ{Y/*gNS|{mfLؚ:7WQ48uu~Fp`=IcsXbbGYf kɫöaNti"eè"=k`-j.)RҖt0}.y@^0&}pH,~7C?M#L -B.b]Fx .wĹEyjFң@!390}YDj8b2oT*lVNYH0g:gwJsR D QCփlr}lL)D5\q^ѓ.$I%8*B=QpVJݔd9Q=+DqӂRĤ3|b'~UW`Tv^[XWa;aߵ$`_׳JrR}Wɍq6b909P:;O/> LnޑK~sR|1wmFoZDe~VFo3HˮJ2-ϽQR1(y?Y|٬p"Il%bJEFrwGZ'{90gfH8%4gI2*i$fqhfT1[15tyX|rQ4D52,j;o:#=F[q,m^JgWkCEڲDe_jBna[ўĻ񿏍Ymo+Gy1񿋝y񿜲Q;z#9iKb.HU@* 6qȅCӉ4c[hSo%wEfӲ0KK/e:'i9j!+ ZȵyOɵ{64k#HS 7[暽 ޢ"f I[;LXC|޻VH 7Dc>9ʱ8/Ik$%ǒNw`֔IN zҎ vȦ[/.ٛ~R6VO-S975Z*pj'uDQf0PmMyGul6Ҿ|wfSfu:ܴt;8cv(VZZO{2*"g[ >J/g>rjϩ(O؝D?B¾R6[Øۋړ'%`IJ'K}ZIx.-[ w- X4ڳΙc\>P(?XB 7eCYq%\,1V[0f?m$&fq$gui/0s橴© 1}.9)]% o&RJRX+ cB]ߞᷪ@3iig - Y7Ma6˵0nmQ(:k3L"-Wh$UTN[lјjъO[A֚͂`Sfq7:M]K[pͽ'Udd!ƶ{vfk>NMLyǰi3p,n-?+[0z! hI 劒ƁaQw< :#SP eSdNʧ,k"Wb5B6蔥iP $sV[]ѱ5Pq6 j- ZW]WSΎJ5> ۗXBаa^sV. DF WSHfY"} rm ]V){k&ոRCAxgsR/kS+a:I* n+ULH5rZc%hgA_P0% 2'U/(Yu``c;o7CĚpPoBn`U 3,zC투RP ]XZ.v% H梋[@YƒA<ٲSp=lΪNCUZo05ȅ'oflon ykrdGj>v~cx#9_M[{x;${oN;f.Z,׭;?m~u~ ư>|V\p_P*i@\ lzV;#L<қ(}ЀZ2L@{RVۙ@`2SOUqJ[&/"ЁEzKq?N皁yTwFbVNji:i \;EO0$$+AMze:A'蕥K `tJf]w@6fh'DD$ glv{`%=%ta!AX gN5/y+ٹ6:8_%UZ Q  MG2a*1%t*@)^1D_>z=I8:el(&.'DPD55Ĩ^tE+I_jo Jr3%jpȬ` {*u㿟dwր6 JWb{>LJLi*|>!d-ĪyTaha9Uw8f? 5ϐX8,D gtarRԤ2Ay-|۳rQ;%XדVMt^s3jX.?4"Y3۳K/_/[Beܸt4@`%ٕR LlL%p>qQpHq%)ѢHZE~14`HB/Y)܁+:xE"hwNyJ 4Q6o8 ꄯ򥮗/i/ bN^Ve@ 9v}|0k.kBo/k{emWeey\'z/ox 3C8uX1xk;s) &ؤ|t% . 2@;eW??Ru<,v] zhr4(T}LQB׌+NRmPÛd?N-TCYn]oV(j0 ]\@QMXcи>*a]A*o㇡rS»S<:`K U6уLZb-`~(0k'x/[kIC!/)B[tCai&Wi6&p7fC P^ w}&.?T&^x%B)7b@<d:k`jxa71Ahvjq/9FJDIs 5 tG&JCBF=x$ϐzHcGP=ADaIJ{e/5= ʷp;Κ|Iep>'Dhom$ ^_i^{͑}5شK ] qpm` i-qDa:6X'ܵs&细ܢNv<~F0O )(3dYǁe"n:7b(M83HuK;h8v-qPaKEfc`'܈Է:2IdEYKM[fjr>\LDqYa ji{1>47d+Tuu(Wgwg q\~Ђ)ZZ`d a@3_bTs%C |MU3"Xx:|BnK0NMH~g] z*wg 5n++-WA0CE[fVuI;@nk3ClG )녟#)u;]K&TrEb{~'|˽3H W2%|n37fc_4YG"O% !DYԡ4.P3[MNAM;Xxk랱Xް8≜;۞ti:stj_i"*ɗɨloW<$77դVoojmA2t8^FGo& Kzeթo׷фsLRy9d6ʷ3Θr8=xН}qzt ayA >ِkbO2$Rz٣}\'4ԀŦ{a+\N {2(O pbpQu!Gw$#H&B)ϸhU{XD) ]shubBC{–yҌJ%4T@;(h}j>S"H^?#DUfL=bQ_f`5 # ,?q^MAS/z 9$v %1f !齌g;q5HxVmmY0pWTNWI9JhqstzFs rPo¹9nuR$FD'Xa]4kՙ)?jֲr)5Ѻ_F;N/Հ\`kX &|o-3i$'i$'ɮ|N&/[FuēOl8Ѳ͢ek,ěv9JJI yCpԢ-_$ODjBE]jRpC g 1rVk$tf)* [ !ϵ% H|^ IY0qg\>'z" j@,(n vBP=S5*̐5fDRZ@"3gX1VYן"~V*츨j)}&e2.u`JWwQŃgS]gI vl8=C3>Nb_Nvu=laډmLтrB 0EII>ѫ -,LZH" t _LB7x>˛{-tS(jiB J=u4_U;,WA 5C⨩}Mz%Fzw1w{ 2x ę58拍#xSYRbC0bEaQ2s" f01 q$ؚ ._;vi:Gi)^ }8H\tB$ ?+ NhjS:6[.0hΉ6Aahzݐ9"ը,R-RQq+daK6m4t7SWN^D&;EJⰠ׼+RdvG)W$%!EQ"J~C]6z Er19|WfpGq$Mku_ WAxaR}D|JaKIhI!!-YHN˿^d]VWX_ aEӒ$D kqג QA/׃Wn82>K =KK l*y}8nWxژGu>{֒({#ӯ?:͊Գp/N_Fhb6XWUb"؉S flj@7dV&tM'&Qd>k1ٯ={zUӈb/瑺ە:|WFR\G gW7/߇G3ϠR3nܤ+=W+<^bbʃd`X 3[ Y;=3lA'<1d ];iۅW7IVBލ!ݹ^;?~'횇~o5rW}> qyԼj^5@*$ۦCJ9/4 Nm~ 4mYe _z4:Xz)j -ԣ TBzű dSB[K/,U€xEUg%P73B-z8LGqs1دޚ 'XgLzY B@fL{MV>D Zr- %K">T9Ƀ *Ag쬒E%ZғTX2zb>fvK (f8Dz2mѵBU醆WkX{Z,@.d? Y?%Zc/*lGW/f_sF'@"HXFDRAwG 8!0Z2$$PrBk7Wڑ9\Ͻ#wYn3dII⡚䁷xh2 xX1 ÒYHYDu\j9J#sep|iInvޓ7% =J~:J|})O>GyȮ-.tl| %9gœ{?KЃsU>0unt:eI^ղ[kەx^]o8C\W+́69Q?$ lҲJ~qQ,WV~T~Xpˑp.~vNS"Nڍߩd~sbNSbNʍuP]ĩ_{ŝô9$pw FrN_|টsmO ļbmJqZ1]^ *O4EΝс cq;Z"bw1QLa&ntΗtZ~L'Y{{wo3sN6cƒbWbqDl^{#1 lcHNT(@k{䯙ff-эgvfOʇg{W[=Ƌ7g0ȗ^JrF'PXVn^!;[Q)hAds14 Zy22ERNis D=?IxaXVv;Ab4PXȻI-|v4kYGs ~t^J; 5@^?!粼ޟN.?LʿsZcZRMs5+r?*tTư5ٗ}Bqo6"O<p+hp<35psd!J;+hm$fx = g6\/fN n,"f4+k{r45% iQSUN l. z[>t[98Mmw*iM*mnՏ-&\U@8tLM[qwsש% {t |n@¸#) ,<1D5k6,_ ZM` C2c3$52qx\39U ] &?n?"᳀?7>oe{uG ׮1nCW};[bE`Eę"~VlYhԋ#fecm)_͎ )*Dts*.躙dw11f7/ܼ~;>j[:0sq w@4dSMWH`pQLϷS^nd(X./06LcqZN5D};]"pPog{6IpSKTqbh.&U'ޚhr;f?NDҧ"B@8o;y5ٯ&-LX>U/Q5ކ9V'榚jZ pvn@@4ii*!aO$W`Ι6QpN]fpA.ge :mtJ:;Vqws!`Jrk/-1~e8^MT! -_ jXÏBUEpHΗIk%˚֢sDS|gGnlĸ 8Ez/?>.I^`*_"hum+Yhr g^z95b.D~M>ʺvpAk!.?rMY\SKHgWQҹ ;ܤS\H&Nv1@0Vttq/ZSB"ɱǁz02 V,cu|ц={]6iƹ )( bs]C}̀8R>z|zp[³huJk@q F|Rc葬ة(hv1[]0XX'P.O[ubM_XL4IY~6^>#GC9ƻNgs2iS\yhO\~9U eUtޯ̪zڞߞ-g_NtGڗ U !^{C#Q{4bḿjr9zJ'ӵbh o}$E֒/Ws}kS^ |.L:EGņQ;PŌ^"DϴI&KI*j€x? 91_lyŖZ+կ+Z2#H&y"$^wє~Y: )5&cj/N%&@44Gg`T>f)@4+r1 g w:hxźMzP&Nƣo;`}44Ř}8 11><>x8TL\o l01GNju׺rsCw5}5i{Pӥ)N}2$UzCl8'sDpӈx Kԡ$(|Zyr}\U];&mac܁hp> Džj2k5.+b8kyG'2§ȓԳWw3}v)! )ʘߵJT *†xP ӏ䖈DA=WAx\4] ZW,C $s=-b tk l9PkEYhPp3{}Ahv*4 T%Sä”4rLzڪol<Gw-4m/+:Ӥ^K;Q0BS G}d/a.Y}Xs7GFl`8b!0/) w17F`ڒo~' %;:=p3/Ex4h8e¶)ZpM謒[}#T2xXqJxtz2 `9=Yfr/u;]KPШu1cT.m"^R|(,Bַ{d8KtR׷xxxNVmK/Eݲ^{ 7D(!~ɩW `[%]/0vɡ\L1`sb8TxW"XSKE.;5J`X(m`͝GCo+ wEQ+⺞vaXs `(~h?{GGo2\] y;i5Յ{КӟZF5L9P%yw/U `B뼬cp۝7"=J]:nI'Q* :?Q-mlH休?|ۆIBʣ&й&Pt pFx/'DBy&`׎Q5 =npޢ*U?.h0sRg,Zn- ɤQe7iIYa -Hpw.F<NBs%YهldLU&R;Ik͛®(?5\jN` T&ċyS<1g3GGR$ A.Ⱦ+?r$ $&Z 6@$Zf' b+ڇ[{\J+![F:We l$$3 / !8΄VT5Ԉi$ڴx!/aّnP"F 'l7=]Ѹ(' ֌(TyQj9Vd'\kb$*ۑJ8Au2ѕnZb`>s KF6Lb:w[:d59ChE1gQz=`!0a_bXV/WZAn6U^x[7ODߞ!#"qG=#Q8R7¢6額C8D9!ߌ NJV[%sH[qs@7xTKhz\x\-> foԇ/d#5(8Z{mRiPεl+0=!EQY҅Z-g̮Hrft7SW0y%;1P$c;J)^") ,&pDNpN.mo%\"'77B%?ҌC oZ~UG|;6"Xj%"E3*RYRHDK/bg!IWGYGR]HV+P+ŵd!-QB[WE$Cts*S)ɀ"`BѓNqIo^]xٽ$附G[-c5%V1 [b!ׅn5KxS/m pGrzхXU>߯$OHත V\cl~_WM`ʸ8 Ns0lo/x8v#أ\F+ۣ= _uzo8h㵬^WX+WJ^?$А oHSIi ;e,bSr˽k@M=O`OJIISۃQfXÊ_4*LJq*^9[| l,s,4նφSn ѩϦP0jxn|a^! x_6$+a|2rfR(ɉŃjd5Lw S _yq2Zd47pb=əH-Yn7אQ4ǯ_zEZRfV2tpħ3 rYBG[ z`<wqٻ/8̓8vr FLFq%6XS >||7/c5Ϲʧ0dT8=N' D8ECon+9Xz@q9ͽ11|9=6֛㩱´_$? MG=A]3Ӏýdlhf'Zmjhv{kOВ) b4D87Gsd<͙S5ޏѹ<,"!j:wi*#Z]y6җ T,B0@3 e^˫ ȉ&#Le[-p=Mal S()u %!`b:B2A@6 Y"(8,"̍&7/9X LQ dܭ_Z%l MIN-Q?<8)aA|( BV;7<5/{_H#p.c BY aP@Tt*+8\~_2axY˜19DNWPEiShkP Z˙QYTSt9ZLTE[)* !WȤ!`y/@NϤ!AQ^%{vdI1WU%g . yr@o҅z0ka {Mw/k\5 bt-h#z`+iZ]]PxN=.ᙠlNp&VR2Tu3{{ fBWP\ʃrXE[d8P)/eT]8^n7lmE=O]ΉaVpX?O, CCH~Ōӣ́p;IǗhhՐ1rڔBr(iL/ Ӽf]!w0=G,}) Ly5 q慒ÏޕAN"<&--G?jMN[juF?wO2"K)_hDzu$X5p s TCd4Zyo[[O*A``7B0ۙzj/-2z跧II"4b?\M5.k~D[įtٖ%U ɗg8NҋOcD1gPp<]eW>O]haf5CjZ:[ҒV. {hIH /lHnju&̢eLJGtvPB! @%*/.e}|KC-  ł+3/54nv+B.ԝQ/`v+Qۀ¿-]##ܪU{r&+AxϘ1m*}CZEQ<ef~sJ73Mz*]^Eƒ6QWNIbћXh2Q 8h(Fg7|Yp`xonR Yd)^TEJwNi$hn\MMZF>XaK,KPJu-ky_l^B4LXeԣp63wD1|D42 ,k|Z\PŲáVI.hw֓&۸fR%M# lW|0!#ޖ8ؙI砱LN+HMb_T"/[8ZnxfҺ*lcp/o%Q r. + v'͍?PG ^U3k灀? ;IJ23 (9:[Lza#wT`yamȾ`ΘGؾ0{[XkǷ6P`aD>X~:(EĄqK!ndP'Մ.VEIS)@vIiBZٽ/ҫ>^uk}BFa$ūebvkW@gN‡gA?ZD^k!oVpYF/,f_`O饫G}]N?Or}JZ7]4ٞRxhB3\dO@,]7H)#{q !psmH%N.(Y.erl:0Si&vvhI%rAz5G<2dY ՚ 8k͑;iC^ܘ']jlǟ']Yr^L)]@dYn HK`[e, lFXaRv#Z$mj;-wg9-&3bAcрK܍ɖJ| Oӵ0I s!ּq'._)/Or~KP0-)|7O 1xDՂs_@ $ Nж>Ȯ\bsɫD^"I+YTSuq?7q# Z? A`̍ߩ!}ƺ2$/GQSxXsF6b+{TC:3J!Qس[䂆!AJwk [p (ۤ+SE'P*k7SBiq o%uŀ.,={ L @2Ӑ)%7|_,:f'N?Ӌ)&D2LbiHB" d0'Yȼgi&%CnNJH hœ!'71K}'j{wtW^7$AԀ_H9aulܕ`iMaq5oC(B8:+y2()0tՇh9T3&c7> K9ϡVraݎQ 7j[k5<9cNm;xvK/jG]3rFz(WtniZטtBH^_6Wkv_'Oz_;+Gy1@;H̯N}~p &3n`oT7,Zq`\$F(1÷zbf^ %%$ͭ*ʫ#|DK:&HPG+q -dS&;"nPa+ZgE9E9e jN+9b( zo=A:"JڄO"~AW5yM;m| *H,7 K]-<`!?\L+ˍ!J?)2\=}w K Wհ1jϘ`(N%q*CrcFaю!xaH@KFLTVMn\|zhl=S `_Evo;<Ĥ!8n]E6'i$&5<|sIQ=NOSK||73Uc4ј/KMM-Kaۖ? fAsDJ}ѕJ"ܕEzGNf@+jU2G}VE'wVpp=`kab; LA| ܌?Ьyw@2zu<< (1DI+-->rV>*#V_w.e 1"< D2ǿOkN}VuuCˇ!aw(ԯ2bL0/!Éh#ք}IZi>]/8vKuď=:Z(*'ɋ g¥%bJ Ls]"'6&0;~nf0ɓ/ݑzv9UQ[ /J"U;X}!t9"F/4 Z%p:pH@{gfP.¶{"+F)'рWG A87g,Q2IK^8`ܞqJnZ`t붮9 '/Xs PdG[/铌 8J_QXNM _6Pb!AC/]fDɊMC ?17D}EyӪGî1ˁ8y9U۪?ݕ1^LTߣtx-i" o; ,^`pr89 SvUeٙJ %'+AY۵tb+ ]f0Ŋ9:ze[|{3lBA0$ct(Y瞗۔C/e{#/DB<#~Aqs<"a*H$ˀwAr6ɛ{$䑞(QbU UVJBX2E}nͺyr|UROfE5m_0;K,U( dIDdL9A!a1fkA{ GߒDKgudafB Y=hy~]^~@oy7 ]k(clOюS*ǍC_l@:f`EY~swM7gv"d.cz _9FW^#a^jۅX23x{꓾z89Kd^~U 2䳪.Jú m씽/Ϳe\ie9 i‚GWˉSkL7]"_ʽJ̓?M.z1kSIC"V^&dԤre:YŎsȇp+plNzt葋 w1WauQKΟO*Dyz#rA_|J/>ZjB }԰:ɫ}RB"-lJf5|7M />͒Y:B1-6 n׊媬Wj֊E;QMJoc1<*.4編SHm*+WlWCiR\Cd:V{a 7/1G"Dw8mL]GtuǗP!ꭨG^S|0bMaI6T퉟At|.)?*˥tVMCgxy[Y+{()pf|$7j4U$>.˒5Vbhkɍ+%le?eqt9|^']Wt2 ·#́3 yP0CT 379DCQvx|H7oodhuInk%JښsXH-BT,J0d,;uLatm: >bF_w2_?gҬVHE_Az:Uw^=յS/'Ajc=$NJ,IhM)ĈfpoV&)-X* V49|oa& cZ}}MGOf]Zَb9ɜzC[dg96iGCoͭ_'Bp^In;$SoZT 嫨;M0;>옞H*'#nHNxG1f(r5; DUgs!,QռEyI fPQ@B5IR\zIֶd'ڎïi\zȥx,Bvچ@{YJ,eQ=%"ؾqjL^. ."pϠZv9G٠~▻äa{/ȝ횠꾟fVfKڎx!Ñdut5 (fK<أ.P*cpYHLަd3jH.2A564/$r%Mb ϊXc"үd!h7OK J)qXPq`!'N~ _#=!y)h)+5_ik=gbザLSOSq+Ns". NCuu3yWɂӦI"Ħw+rDΒ㒝HޒkE<&d$4EeȼW%BzJ?XFӨ7qߙpu] &i~Ks#|ֶcpFYPʧok~)P \: )dgsѸ~}Bَͥd!њ:=g$k_Vu|PBM% '_@Xt>Tj%I6!fJ a pEzF"wC3: -Zj5i=-pzVP(9Nf١ lWʪ]~q|?ɑ!!؝[O7$f$`$,mR@ AICyE &nDHMȽG=G! H&4r@ANf}o؏4p #hҹf&J)ʚ‡r y9A,$޽錢;LEy16hx!z uy&d 1l__ԓҋ렍Oćg*M褶>,;_>&oC}&D4GG _^,ln|< u{/$ceGW8 r-Y7*twgt0,:7yݚ~.`Mw@LuB!`$MpA߸dlbvX8W|.ҁ~ @Xs!<$qwň=v0D;dE٧3 JeAaP32ZDu;Ap ȆOUKU: l:|gDu Ov8N cw˟Z @"C%W ڜ XOl ݳo'+2 -a4Rb;R%`kXg9Xg2h. a ܀SE'CX̍sՂ;>,ݦӍ5v8bp# }ODŽÔi*`2BhϜ`WL~X3kDm;r1GU쁕\ĸq@7#uY7],F?~`u4wῪOpa#+دe.d_bԟF gNFPbi Ե7g|23:u8Ai7ʌt"Nka$:4YU_1>Z4 leҗ dN>](P%UG1،W]o0oz}rD!q1+@Z{ð%ZkB5peD+~wPN;]?og/&3hwÃО9X3e|Jr`.{G|W[*pLD K\%#9&fHOqYlKz:_1toVZoOS)%tgƙ٦&3$FwM:G d > S8!VcN51VC%%C"z>Os|j0fNN g@^5$# NȞ8}+$4*=W/:ǃDjf{E1iwDY̏rs{x_3j(1k:fiT`R,mʓt)Y{޻Cܬri5-6-#OȧA_*҉{ N.\ "KMq% 2BSE @8)J*.RQ^op{$QTDԨ/fCTɢ̨CB*&Ϥ{w<]bWM{ؠoy]dv'"}^zKh py{iA45 oϷv"'ۥ豪$x>/Rm=9asY F /(sd|#1FL0.j=K8GJ()Oy\m*r o-aTFv("eƦA*@geq*}LA+(NSREF bFeZ&]a_S] 8I]bjh$xL li 8vݐz1ġ4h)/Oƈ=g^u]I[ʓ^|X UHdXl*~<4Al[ QJqJƍo{dжבc w1[+>wZ J'Ass{m|^zmF9(W"S0) q#eׇ.L;"0+p]E qI[kd'z8 +M=ݮF?`wC“T% e)тi )"'A_@u/01۩ъ @moql0h6zY[)5)E |3D O F4щϓ57u ,CnE=Lyr(Bt.w­Z{F~Hg QB# j)qa4hmpELoa9``diz QJ* MtH̃Xk ^H+-RSF\ uG/oa  7JovySgDW^Bv10xDQXM'URNˇN-Հ*l2$~ResNLx]a{ w8*Dh8"sɔ3@G|8Mׂ_8;^nIO /05?nSqv),61([^$9rs0X" FА J(OF`$Hļ?'<9dA%وU_AWh|]U]*@&du]ve,`bL5r "K>d'{W?>93e1@tX{겧Adz%W"_D YpH*--uwD3 (%Fq΄)42+p30iK?FVʟGUp̣ѿp].ۓ :OD(Z yC *FsLwsLwܰ )8'3PX>5(Tˢx|XȘ˴^/z-L=Kht^E |'`dT)JDGf$&Pf!Ry8*GvOA1 #m״a.h/$ h.Rœ`-(⅟ o Kh`cʇ'σ );rQGdWϿ\/2ً_x~T_*=kCF6%lPc!#ĉ_:( 6;eLѽ C Ic- 3;2{hj!aaīr[ t f3y1lH])a,֣od"H}X[y0uGX֏_oꋊ)3[6,y7Es6RkRސ 1isWC.!__܎FT/37 7j9"z&7[f!,%o.>Z%z+b3HP`1t277%0H(X#]QġsaӃd0f{^C; jϵb>,*s ϛ(huR*ma/pM%Xms*`V&OYok' +60%Jr3 ͷ73b(fq% 2PsZQBsiGV\“,BR! B_ĕxaܒY[%Y.w,%,dS o$ 3 XϪҤz*|ey-X(A$Y)IR20t颸?<2omgkWwg(/&r7, Ge9Sĝ`ga*zfH8WޖYD+< !HYcqRr6Gk՜]}`z6KU$#"`z'seV~ҍCӕ^VawIGia:DD27\aKZh\^hpM3ojؒd#P$Dk(dB߿ڬiUҢ{Nv:ԡTslr|XHȖ:|_RTs1$ 7H&U&OLӯȪOĕ4Ar0P[f; _,]YY]|:w(q 7"~г"44u3ԩϬ,G.VۮH&3❹eTI/)EږHw{z}a;N\n=ޫj,쀸хu/+q>R5ѱ&3a:ǹ9[Բa 9 6zw-3_0jpelp$0Y)3O`׊]nEZ`xduWYF5qs=թԱT?@=z%?=SfONg\ִ8 k kK&*d rZ%F,8abt1*%ȪR;|pde2qzyxp}~?*?<^6ã\&1o$N:zLAl~CeCl7طWLD+Xש,Hk_:vBA2/'5pFXI!-b"9 ^ڳK68@fIk1xbg5Ͽ[n*V2 mKƥ?m4,݉V[;jLcZv=s{e{ouc4R~އU͕m_+B68RJ]%j5H'{g՜T"m[miuqfzѶRwJ|WHD:.iKp>ZI ^¹jrųgB$R-';dJ,d(AE H%J6h24?'ER}Lx\/X<: GA3Uy/cLg˳&̜9,2yXe:d[hJ1]NԷHlp"K[&)_v@_T`h=yW:JױJױJ!Ua0kʐc[ΙΏ(3##XO(gFN~`=NΌl` : ѲC<T*BD%=:;#_8;Og+rD,B-Z82JG-BΩ#b(QE(GDDsDmq6 -+IJ %[(ĒIZv*.avyLN:7òъGV#'eU~ec(EQ@ xaTJ#qX893as=4$z龔X} SP .MmEvƲ+OrJQd{V?ԉ?(p/aƷ5/-*M,\$~uQW. v]?P ?4y8Gև8w7ZOޟ#݂1M1ݪe,)ŏ^;H " tV4`y~Sgh}oU:L`kx O JNj93?'<யp DLl| n]D pbQ {A>/|dӸ(il%=~-=I{FМ%fFy߻]ooxߵUcxc߻} OO'QW#\mdU`*0{mfdeA@J""Ao a^ M4ϦoIIJT9yY]+-p~{)Kn> T7`kb(IkQ4ٴgv{87jb1rS @B_E®N% ĒS5>XX $9TCKꚉenV%`%/J<`^.3kdcwJc9>rȖk9(nEҳC`n"65L_0-DJ'yP@dXX@A~n<23GOVhuwu_/bNL0zl`'  :8d'zqPYg:6:.nts=u5EEd17Fo'Q}ӳ"@,lG _ŧ𢂝x91)MTAEz>E~Ysg?, ֬mBcR!fеUΆ%s1+bYI:/_Twp#PIzߞnׯHBOC[~^Upk|u>ʭ|]A~9\ng4 ӻޜ!Mv\CSIrSI:W=}L(3"khqPI q_;Cwt_=8+!2orn"^ڗN1\/NBm&Z1aqełQB Iԧ; ytrۦG 9-UpgJU[YzNxG;8 G@y%vIv3ۯ~g:֑KtlXreQNduune̶WRbűX7B@fӱTG9plη0dù?9w"%k}!'U\XGEKڼ)__|+ qM5V=kc@3%Uǽ7U:'#gB6`@z4B=XxL7[-?UIk\^juW]<Nlvp;FMPsp2,Һ>v #^֋2D`(ĹZu7ڷ)dﺒ<\PS_d}M0)V.={wy=ZWX#Gݔ+ gtVdd q3o0ҍOP7py5u5gKk,R+ ̖+URNLV:#wWsPS@ ئWʟ=!BW{-M e}r \9:[. 9J[r2Rڈdts8&@Ho& ÎϿ\M,k؀Si W`${TcF) vB:g;O m$_sL|"vOf溋 .,!?M:؉ W*(JV\bR?z@+vKx1 zcu//+H ق${TE&YNF9g2c'BKLF;<>ස &8nvl06fv|J_!VOJC֜P:pe8!{ <-At&.coIbN&=[K>f;ewT:u^% [y ,c(=tZ:\r mJ F.DioA>8y7ߒ/9&G^d-c ~?]>HA .6|k_Hjꦤj0uVZzb#7:c{q[:nj;qmX*< V~%zk1ŐEO.t9';|JT\|H\(xk( f및zٗ{.y[Q(w,Sc//(,(PE,Lt\d HaoJaP_,'-CQf;1*Dh:y? meK"(h’d 9QB5& Ϣ.b8i*s&N(<OЧGA=d}+Ppxl[}V;=ݎ4#t5sFrY+b4 &Dʇ㉄ؖ' S$zLI_?o:w1^Lc?F?q ne_Wǰ23r0  qŔUBp31t|LIrRunel5p.TU_Sd*3R%I •gp쌥q渂apEѩ0)dZEKYE\o܃51<:|Y9O;k bYSk?*1vVdhUIU? VE~7"eY1&wNN`]>[_〞g"YLd|QP7!l.IktY,bjIA9kz ֲ[QC۪++c_;B[?XF4)JM 5 MpJKjW(źgHɼ\ϲ]g\|lRu6gm3>[}[+Ib^ gy|:jߋʯsǺYC4zq rCMW~#u7 ѓM ǖ;.b"Pp͂?^%ۚ wv0cI2v; iv_5>hLt?1~ӘYҥ5HZfIr>Ifʮ4|$x>hJa :9zaFHt\^]'p mcNTp15C1_J@41 p/:tֱ&%yǰVJ*@kA0y/CRƈG<{^)ZB/x(߽\XT}߽a C)7[a#@}X&#(Jͱ=.NJZ2ͮ:R"4xSS`HTt# KS_sYMNCsu=,9,'/NK׆ljܴR:ej&ԩm ShY$R + F0+4 w1^ͫoM%1Ѽj$k'NWi,)iŐ,FuxK*° pr-N,# `/RxʲGOYd[VUQ껍^b挷?ŴLcXd8.H˥f nGRa*XgT")It"q8hS"DN⊝s)M 2O 2r$,٠,>Ds݄ BĚ a%zΆC`L#jưd7:ԹO{ ̒A@8De\Bl9BKc3]t[mtXƌ>+'K…3-_+lUApcųy8N~*#=yAQk&Ŭ’.,9mE)GGJ9¿|@a=|i[[E7?Dt3C²V1le [;^DžΎ._Z/ǧ[v}V?C'E/gE"G?RqqYvtrO'DlEnL1/ T#E< AfTORt<˙dzRVPEU!SrOؾxI[h`F$/ǘOO(xu0|~K>i-F|O.rn者 ;=z6&faC@lpfc(.I% 9-N1IBa!WE;0$fz i~<6g9.]K*2X~D4G;Q!>*DRL;5M2ql|ŘM\pqLqEގW]5^p#==Iψn6.9R}%^ Glz,n{w t 3h^~, {`˻`MyRx@x'3xhgM D>z aH$߃:A9 .*EЀE~UpRK,)IR)>'1^b_v ah@U[(yܠRy&_ͫt6cws$䈏( x*|7M8?R&Z'㇌WFO.VqT*N'A)qz}c%A8O}'@>> FW̽i6@ QPl`&U |kUXߞ=;,u֫[Vmq5y U:2bTeC7+/b\HL YńF2LUwF!rpX~dOK%ֵf~>Em~>91Ø\Lcƥ5S8<Ó*WZm_Xe xq Ɖĕxq"9q%^D^\nENHȩ媳l|iqt_ֻ*ܑ;˞GbԎ7oIH@"YT:4O FaWFS#Ifٺnf4MoԢֺ{r9< n/2$.[ v^cv}'+xq۰_!{LnB|V[+߭bnD?ڿݸ,96.Q-6z͚"-.ժrFWuhUwA}UP~$ @\#Y Me6SwE ?fMjoDЈX*^~[۫[iguXLW&p!3Yj \;jr8ػDZȍ7Gگ0OiXF>iRY(}G4Y]4.eh}U s+%^}\r`w$Ͳ;di$q,TsatF?z5 pz6LT1X>ҞO`Q¢I{2`W܎26#!?- ֺ YDīGGu?H-Z'4!G8!fNϓgߟ|2|$csf < JHJ)_͞%|:)SX:J \^VFe?fxTOhلZ6o? RG$ 1Z :jOMƚ{x3y''@~sva}e1^ܼ/e}EQO]WԁcyheeK%a Ck1chQu,kZq,Uw%G0>q jʔMkZL%B`T_O^QJ{ 1@%1fڈ2r"l܆Z͙Y +*KM_ v23G6x 9%^s3gle!{Z}U X#̆'(]<)7Qg NM"{sXXV`Goo= =ʋW|+}Mre`^YZTrz+@Wv@-o p{5𛵲~_^D׭JzaIc'H{^T-Wɂ ue[('+Į~tB7HтG,XZe_X6m# M{4#!jѥuw+w>u0dzI4*K6Ά*?o득_=nmeyi?- .d+IaheYVto3~|XDA#uK2P:H \W@%WIj^"u2xAa$jZ4;}'oRȨk.CF vPccxC=4L:pkz8>+$UaE3V6 6#Ww\>s9+Fmߋԣ`qbJ!\y57 Z|kHS }ӻ:.?ćjnaxt< OWWË!8cx7-o98T1Y%bDZ(M+X$OR_Vv|#B}YkHKSZݹ)"~k2+g:! ,|ИBu+j '}? off¹T;%])"ڮOj' *ar6Kl>%ef e.01g(`7Ih; LDqp }c$j^-F'WqmKK%*)(LURueHlv%ǩX{8Zz>zfr| @0yj ΘɿջynX?S#Sb~6r[{͊^{!b?yg?cHi$贑K g+ ӓ%L0-߉y{=KeHf~xXnX%|^yF{sd<Ωyγ,hVKPiʙpQK?]xu8.i=AF4O ] [cG]" rP#+i}dZeL9&l:لK5o~s M\{HM!) ?a )A?/P̼彀yя;O.Oʋ)_dB.UN'^co晀ވ. ]Ci~JSzq^ӌ {\m5muzVft ͽ؋nnK=l$fvVCK[4y6H9J,k F3NN9u7~/f+ LԈ뎀Fj!3HiZΧ3X V0J6U>EU=2RbPZգ* Ô |F^7Ҷ7NJ~2^Ma$&#AOxTГnW%jJw̔ *);nBu(&{"_ֵG*Cg| z:e6g.Up%-]0.o\S rx|np1i  K 4 ~nֶ-5oZy):mz(у#l FZm(˶V[@B"#Z,m:yѪ:AHenFHݰDׄUsZY:KgL) 'J-lԶ-4k@45Z17%RJd=-& ʯ>mL +ŧ(a%0TB kym!4Bx7"uw:[[|wl˭Zۿ<}Q^M?@)?D*S +5_if3*pp J+G# zmu"ܤS3#g F|$x)x?ߟa*u6٢oT{vt|""f DAo[jl1AQ71F(]e LF_RG<[(u6 LRj@nOx=o2E/p:]>x* X1gO% +}q`CQ/*iʩ!˺Qćt 1IH4 aߤSg.f-bLvv<јV#@4:@xBÚxUd/mߍ#bB#p rGѺk<-n֧[0/Nt7Pp,ZcY&Xk#M, AT\%-uJze\3\n#5y '/HCD=x\le[Agm{I]]Opߩ¸W?&p ݕp~{IQ Q]AG.2Jg qcD(\]'\~Y)Qq軹p@NK$+`Ki@E͂gR6%އr:0{#fQWaYWT\ۃmUhV BwUNYn~2 ?!Pfg=Q4M 2U:M u.` k|5WfO<}K ףb%=t !OC6^:=MH{-#vr:`˸ǯAIpJ?vnlLO]Л n$ 7(5dp:]\I$.91)sN{oa ԩPW g&W8Ji'HɘmҚN^Nt|>@7||5[1I/^q~58ͧ[h ?:xLmFur:ί%/o8r#mw@vn> ^ۮUL/+>4Ed/Xt"%Be܆aJaNM5'oOр\۩mv eAG7Z}æax/S qH6`k^Qr˛U:UN\uS03k'>|Kg˗͆=2 wR38 36Xt H oեoheخxl0[]kj]^r},?P)[j>EwT[Y-y8xllDްѶ\?B ^4Zl}Asl&JmنkSNitI?+zccuIm'`mӇVrrK\bK9ŏS×Qڑ1 s#ޝ0x i>~W}nvaTwpoQG_X+T6{'ʃշ 7.>{ _6xE<Ļ\ؙ(vh]-lRkvKpC4: &ǰ]3@pxr^E8*ΊhxAФx!AwhhC]M:H0e9{ThamgQ28)-'8CܿXKI$bѴe kKXTj׮/ZV%= ,z:[ـ\r=Xvhِ,֘p^yYŏ5|c-.<XUqz%pzEZ$Wpvu:#y, F/C#@BH9v0(Hu=]Q:ssf3K]Y k3F4k-Eu>sG;Ouy^mn}Cmn13e Oi2`G.ŅmpQ?(! NRrh$=t)E|i SO1hh[یjk';|.Yp?/VlgeV+oh"O_ 7z Cj:c|g j;{)QƦP =G"y7Rb2#K&΅ڈynhgdtARc"#@<+sXzû~]I*w8-Ec9gqثWhVܢ[vջTYSFK6y|ToqAT >?v,^&'p"?2 [3tĝE DD;*u"k|F/Z* qXҋ$ޚXMs555XTg744$mHO3PoAAIP5-I|":;jjT]=I5H1v WBeͲ]ᣌr/ c^a<}iJ#!2ń 5fdq̠:O\ 1$"H,xHH2OCj|,"QPڎھId") I5-o qbߔ7ApHs;rq |! .j;!oǨAOqHU%l3s'ެ%0 ͒͞D?X_IN0#bas?Du8c-N񇽼*YHu:a`$b>f9lb @ Lgh$L̅ GLCb(apZe+}$zy1_e>@%}x41=qˌMa(d6UVd1 Af79!  M`|MB`D+OWz}'W*-1(Y!WQ x89Һ ټggKYl b ΊY58[| ; ۦ8dzɸ-g!p@L"s4NQcT©KFp)pgNm6_)d:M|Χb[˃=ma}٨=UxS F:lY:.22B,Mz0<.Tddov2bϥz'*9 HOz;\yI:g*rN~.N:o4œE`pR_r9Ose> !ht:y(Ȟ^>dO. ܳ{|0ij$pɉ$He'P/Le}GHhfhF+5 ~`\]P% \^#Ka! /F{50D Pz„`yXҞE5۫)ظÙuJҸU⨘) ZW틸g4%\,dM[w2WZޡ&_@Z5l6RggogUC"KWﬡQwL[fE˙.gY`=v Y/+Qخ;SY֝;o{"0R[;|9m9l;2$ȣZD]RP|vFs9̩ŧ֚ҹ:e=\Qmy-[V3NMo^e^YK)TC8lIh;'K Z^ۢôq*{ I! o,GԔE.hr9 2~~x ! .͑$Řp@RK(9x"+MP4h$^lN ڳluh1nNUR]OE_'ph-{t Ʃ6gɊĉ06<h`x4َԙa\\^ߢ R8!vNl=pS4iBnKWi k?<{rdot)ۘxc;Ig&.oNH0ƘtҜ{<o't0x'YᯪJ=1TJRWf#O):"N`oa+RL.t|{QdJKXޣ`@D9;Ih;)z~= d~ojc>᧳{ By%S>04\>,k5k,ɗ1r"3=@ /0#_3.?k ]$x;vGQș^}p//v6Qvy5K [Y0H⵳4/i@rd6*鋿 υ ݧ?x3󯧷4c`2#Z6 OaOL*P. ~cQ L ~1ivN#ސ5/GhI"D OpKJKi[f&:`, ˦m>.`[L)$6.J k[9鍂HNGuK 2Ji݃](yKfAo=yJbi<%|;S 'l~=C]*jVO:ogw^xM~;o#Yӯ8wNl/'U$Jݧ]`>C7$7h5Oڙ}6tJ{~iq~9C)ub`}~:Idz)p|Q1^n:0 6IQXi 1/)8oٍt&k"YhY| OYڥ~/r#pv'@B1 10 ^լ*&V 8ȀԶ=ZX$+h=WQdlǟSUEyPr]yڣUŢ+1ISͦv{Qm'ɽ%Pԋ_P?j?#X<̔R$͉gȖՐmQƭQ鋬qk`ö3-Uq1e7lR /PBφ0 OPaaַSG&dLߓZ%ޤrTP?\~o?rFK~,Vn;6,힘f&Bƶ0tJ;uwo8.GkFoɄMir['uD֎! f^O¦^T"7y2K'MWJ.Q-|MK,,ҩpf5UP ~wx һtX&2{8;,rQA2]p)U7w*uЗW ߥHwhȨ,X#Jb&񒿆gѵXMO5hDMEJrН-;IxwHRkb!VZw.硍@R  %L ZA-l%^y^,tk0[}O"A+_տNY 0cq n|KBk0u0x@=kv]4ܐ\r("UN3"_;h5 %**lJ{5>&:le|szs5'/_E?sUR.R]5Y7ժrBEU!uf A!j/VV[z-Fw [b7_\0o H%ڿ~=;iIJ6#1Մ7\1 {^ŷ| ',֭=g3b%8V.V,V/3s'2σ /_7ϟyr9uw?I#_ˍݚ)@ƺZ|X.euo u}_=TX͆V߳^<]nE罍CyIXz &t%};ßAuz3C{H<4/=z^?M=Rix^dzC/?&oe{sco]`͹nj!`;׵;I;NOO>']ViNypryv5@TQ/JB^ h}]U\7=XJl[Oxqx^Pƙsy]3*Y:zB ^.éẅ79gW{+;057f <027벨/A܅I 4g?&ga~n<#NK6NEKͳUg?Wst$,CQ:TJ%i2A(S-˵|PZ/xLgMMoϭ {5ك5<,*?i hJjnZ7PTfx/c 1X={ضx๭55_\ٙ9UlJp z%<䫰olNwr@w5L\4>!T)@C'.܋[cbeKԥ lO|˨E#_hKik:>@d^~ZIG'2(EAn]i[ev^YtcvU0sp_IJ '܊8;9m}&e3Xx-u޳d2Cc81sIzn')u0D;1^-tlLrKN"qTؼ'֊|2973=q|:|@vhuv9LڔdO.[}DRqtH2#Ikc4pJf1ږ_r0QI};BqĻoznBO޴7vYihkJC]oY}72WgƼ?S(vPl8 =]77`d>o9[_*p4D=+-g~}=Dletid>$l1⠩W[(69ӕԤi+Yge&nhIFpg=ϰw{j䤀Lܩ\O.RGZ եz-NM=y$G7ʞʢE,lY]"w]ғΝԓp8K'FY}CgYL5VǸW%<Gti=t6e; e[{42.(۪<) 5-p"lߡXXx}`4KRM74):KO gL6k3)*IYjJ*KJ3D/?%mVf#iFD&gWcfpfa2xvKsc ߭}Y"yg󙒱?3%{ΔZΔRZ-^sFlI[GrhJ 1R*ᕽY}Hl*95^E奎(**r^3^koo'Xg~C\LCe2sI7ʤx[U^Q摟eE,8xgFʝ?ì>̲o mNē>=ʺ%ѝfEG?iV(+yҧeֽ6i!Ti>6>=_)@JgQMܥ"'nԸ$J#P%H२AaL(`zգ6sU'C|Z~0|Gx3qI+/w@r\^ 4L„6AA7AA7AAc!4(~u dG \#@v1f\5f&#1g~>H5KvQ,KM]jbɖ)''fҝQb4t-`F>HC@0KOdDqVyEpvH:gюQ|`^CyG;}??k".bTzޠ2&tt   !b?<01}8q2&|8~/V>7b7b1Zd("졣 خ|Tϼ1ypT{!?lc'ڙLȌ2EǍ ;EF8yoɐ}ITzz;?MnP7c.TBixgvZ8"s=1]ݝ3})l#y1pT?g 9\4y' X ܢ Od䵈~ѠER^\V=Nq2,+{[;80"cqLl`rSZXUQcS{vS[ŤNiZŹ2v9o2s+38۱UHH s <.VYy!<2͎Kv;9$ۇ- x.nrIkacD.PsG`6g .o+8`Ljhڜ> i@v]c=5Jkdo'F9Uzp&SA{ !kWz(d-Ъ% ZK)8jQ_IN:qڏBmP+ճX\<; 0w l8z.3lq2Z,j !15zC['nU/8zwom穯&DQIP4"'?ABmrk]t=@(Mjl.C6E2u5bZ4\:!UC- |wU~>zm #D|ggq` x [RZc%/I#x hI5ʇBADen;> H(Ӝ*`IIC{kF:m'ڹE¡cG׷ LhV!'*?Tm09C% U%m%#dA$l'|qc[OfOGo\F1)rfYN-/ q1 gh4НnJ*da]# J=ny{ 'l# Dfk4(ʖ%,`kdfj&8i>@X)x2X>&~e`ƣj^uӝjbO;j(.L]x6@ؖ[Rh6|h:WXcܤu`vV(kZ]SH4x{E&,s?gG6 `POh4BL1hRlQvx~mU9_ ޾Ű#w{,bg#r[*v`iIR{z++u KzǴyW2vV깳lG9qn'cXxxY&@Q^v,m#ɈЭ\X" 9*K1ļwdf4ÒZ՘n6mFsTȠr%Gxd ee~\&9luu{1x-&mB EװPS@ț8R zrZ-ivS*BT Ex*m[tR,%RGF#>(!Cw,hIJ%ؤ:lX]H<)L%I>0وI%/=,\O[e:n;cӀ0`R '-8DcAĭ()328j߄ &&4Xdly 4NabI f$9$vӈCה^ѥzt]L(P3e,w4X( d42GdVg^Cџ,=-S!F*BJT堲tZe t VnnMa!mv-zofnR YF}#4w≘Lȣev.w@QuDDnC9xy ;OLja0@0@0@3jc0>bf8vL?W @D Jɡ rY ^)FCdh莥<@0a[;MdMd 3-2P\(cm- (6qUet,7ۄ[wz'c2b&M<,̲<aX;X;/?FO=}+FO=X=%bobt2c71z61z[o_ollM|<>RwU=QvESG. rnw4|ryxvfS0 R'ԱBՓ@@}oܠ鯼hψ1PEܠ6JpU߇_"pӟ8A}w!@8Ȧ4V>AM <6/rgab.gI/Be UfM.2c3a񒘻!֦߲B]}_JTr-dwM0upD}3Q_fʖ;Q.N%~rzZ 2OO18ikH)'LI )C+y-?k $AKW{ 6g\Wpc J\ɱnݣgB-em5ۈnb!<}KKr٩ްAʌehٻ쮆"zi)#ۚ+e{,|pLcW;crsc1=z]OGNMxhZ^ Wj4Aqa:nU۫+Am?m?m??iApb9!RS2hQ0%ԎB*S\`աvFnmR?WHU&C&l\DBkCVa Aҥsq8,VPa VM,&;Φ1[.!"M<4kI Ɖ!r>Z2=Tи腄*>tKWrͬj]2fI4ѢxSC-@Y!5 Q1o G52 s9:0=8OoV*%vy ?~ދ! /5teIFaNadi˲2kӃ[i_fl|MMg@1JVԝDjCE20ORv F*:c?!YꟆDiH fhߕb`3#K(ຄadбC*PV5;=3]m/9,ʃ34Ӽr@MFҳ,O&5NIiI?}RR>IȜ䕇Oe EE)#Z씉 䳓S|wzi/'IQ+WFqB|HEƈ2,ykԊ o;w >K |mth1 o`\<5Ml_ճQ.|G' 5xu^!O"1|F7ě@|TVl͌GVIl$e2hX\IX)@\7u:v { C&5"[xgJM!A:a- 35ĢY<,r["Ȣao=oE[eOA&̖DD"$_7p1i#2ArX;h~^I>s&a`kJ=DzK=X|·(s?ؾ,>dGpLJ`τ: J ]9EfG\u`bmȷb-yc[t0:$Q nR.d2Iv'q*yF\: ^o҃膽yLO1 wi4:E̕ t9w͝d~`:M^JEskt1i||PO$QXcH`)B$1E &byGܘ0:%_0d * iRk9v_Qc"9##_&Ax;AN E{}Z7|*'tW*_W|6ڵF߫Ze Q*3!K]JМ{ԩ*3@5s}{ϫI}ٗOĞ?k뻽s3n5\5=}a{$L"`-\Zy`2ɱGb%;\P>P.\`r~܌=js%Jȅܒ~?@srÕJtAMFxx3sӄ3IpٍpΪV~Nv-).h 9f" /dX Wq1*R6=N2'p)"18|7J<-x⇛J섹8;OHԘupp~-x@pOW;.46= .λ4˭-&CHnOkz2e2;!lk6ok@86nLT cc+++7"D{C7'ԝ0/۬\0>&&Ӣ mVbb\lv:gvkgv?gvk[)QyyFnj`]"6ROll-uVllw0UN }`$vɸqiM9Ћx8W⧾!Ĝtq\;t׌91ԾލqHjIAd̓&G>RX@[!P2aº! yn1 N;6uCVU;tFTF P"8C!I0~b4~ۧ}YTbL\cP&Z =vNÞ[2A^qR՝t  ӰRT|]<0C>{?O7??,{ZKFֱ/!7 '5p$ ՙ s%D-Ac(pدHPѮ V!|o/|(?XJ:=N@ZtC^Gn7^%סL BۤP(F F 4Hű)$мf?\G]5ם"5(b`<ȭgíSr>/Em2-+|EQx~a:.We)%rj0]ӱd4Bz% ¥A evL AaaԪ= Uv47\_PUW[0fj0ɗi}A,I[ L8DiƋqA qA.oB PWdzu5|4ǦQTQ(сby%3BY jv,X膇"yl-P *~Tm[4q|98qmg$(D6pQrWuxͫ #mS OF-TjGy+^(ln5u]ž"Zͺ0_]&z7"rjQP/r$Š@K.@񝈸r(Ӈ/e`*~E+@hvN[DȐGe~v~EYՐXkȂmfR$䉦8дz+ ]+Ta:<0SwvKXbv cɊ7{aܼӵs6XtmӵwV1T`;ꅄBsiHzh(֪PH-]'i50C@F674{8LĦrMÎ[ $-4|I! Bk2BҪ NIߙu}I B!iDH#BCgm(IբeVI >a`&]Q= GY!wH8Po< .|64Ҵ2pi,< AӤӴrNl˃R]TNx4v3=TTM &&ڇx%?0z`22"΋nƒxpV6:/ "R…4Ĕ6_iNJ qm5X5M*f ;IHCWwV枡j< 0 lpg|UthsMއo 1$nnDaN(Ե2ExȰDӅ@]:E8sN뜷7xSzwq^,`HقU~_y0pqvRE;pίH{,={LwOJ@*ׄ뜁xYȨϺU65Ad ͸IGy42 WD Cor MD5 Z;;Wxn,V~w);L̓shNdvYr5C ``̾rWY@oYZy=o-i P]hWdF.zqѣ񚳇^w0⬉;uW_ ?pNLs0b8:'ؽRz c(_6nt˄H:3$L5'JXAf,o! D ;XXj̪**1/6>| qb޼W߲K!ƿ1l,+Nºyu @WӗhiNqpXL5XxOp))Yv -w%2}1*h;x]. ~0>jQF/F㋸86@6dwQBĝcs7Oat CVz*77o=/&Qj?fWs O۽^3,V1KdѶ0qZ Up\'UU*vZNrW{"T^@DDoIC"'bdž 7vBrq ox;)T`jŠTh7dfWNQc@vIW0:YH`݈ qHuiNu~ՔcibkhNڮaYŤb^s]ŝu.#tx!Xym517-S Bs>u_F_w"8Mǣт !M}ݎؕBTzl.魐ǣ0`tg&. Oxm9}w{؉$h} h64ހ$rKD~;Q3HWVY?'m$cG"w"񐓰mPX:ޙLVIo`W$kHO2Tʞ{M/ߡP̛@ L 0::)S XJ:3:y]OKƛҷ<;JzpkR(sv_ $o40]tD2-t(N&:O5QhpN1eģT JRn+*"E<$>sU䤵2p+\e1(E5Rafc^T{WjqiR:d[v8>r:wJ78! v`  W pLB T J,`WwʞQ?ON:K8ėMgѪEb?n^N'߀M32TvQζሒi֢:YZxp-[STrAÛmu:5Ϻk{VwIqKK?֗+C9 юs%Q;a|kG+. 8hA< nƀ̗kH $ig2JO)e}W\hn)c6wȎn$AO-fBg|bXLLV_?ݷV.27 &#ڱ^w_!UkiFZ_ANϟ$!s=o wӢ=1ݰfXzG&ZrDm*t#.ijkĚWcHy ?z&æ\#DN՟aJdY+i g)3{) ،$44~^a^@^ <&L{a FհqwxHS{,|-6Gþײfbᙠn+&ITh|n+MD>&ۢyRŽ֮idX@P h:Aȉpp $+C!xNMԌ@H/@<ɌKèBqa:6a 6a 6a Ml2yL܆{ac`X6O)dJXb g?&wCPy#D3*XKSV:uS.S&)" 2]:#buZMeZbD lgmz1g_j8ug $q;IU"'.ZEhS SP4,4Sd7ѩ˨bPE0 8 ѐR !B)o R 3L1(s^*ɿOd(@ϡJds#jnܔg2e2}QBHQ$dd hNz/1z-kvzYN7<<3iƈ zm""80,6 )С Y^fYLtl#]H/)~,AD#8u &*$* aQQ;ʺQ#D2rA  Wޛ jd D S! B[Rҵ?O$k\|vtNQ/g**22@EF O<$ZQd7HE>C "$[7P 9}*]ѷC3P8.28]xFl&_kܢ>1E.1A`²"8P)eM[uXra8)) f dd˦]:Ԋrٞi#9$`S';A!{\#A8Kd2qiP`df@ 0aQQq jS5K+Z6ZT*KŌSizeKOۏݞQF9 tq* صvfD\J#- zPsO2!Sx-Iho; I@=4}CJJ>aRC6'R@PX["M 2( l(OksY0Er%C rV]fFx~# ߸V#83"8BFfKƍGz ]iY$S:oB:t9]XkbۮI{4\ .y LoH?|\bt@Zyc;T@JȖBs:scRJt0}n2o쯝k _Kv\OqZ$- 0T5PL "y[~peVǵv, HBC^!0HJ܉2rͺ#nBKnBK%K^I| \ɌD|'iQ&=!yCV)!"X1i|<ɈQ ҘBr嘏n<1&.Y󑾂0~w;_&&B: J˃|gq 0F}*р$D^SZ/K{"rh߅ BXK`y ef10dV|@3S*&9PbJv0 y^4 @޵$ 0LҧtIgy9$lM+vOh ;:s GG%:cd:GzcH9ъVd;!B'Úё P7Sibſߌ#4ZW8Є7:h 6e0JGZEPyK틓%;V/q^k2G*Gqz C{z-~k,c22Y1b"̓?#!4._{r8{lVj.vo im@7 gy:5TM:c將catn,sw'LẙY6# %ؚD$1@o9ȟu</G:aԁ.D̠}@BR9$E&"F# 3xNxD/v>2iAtDWhUGJaM [')60"GARZ̑+x?3 8KIt)i2"TCl*Nל7_]R=!LV)Tl^" '_D6f#8@3 "̹+(\\g63ӮMhI}+hR>b8Hk!:gJ"*O&m1XI5lP>]m(.73Q [J8m> Bs$1I&xG6Z6EP/u[_)70lytsc"lՁ•۹ {7IОpGH鎨HgFTfQRM`)EXB^z̘KEotOE,%JF;0+e`Ca0MCUZTIlwNQv;UA(%/|pg QУfb}>t sMũW{uKɀJ x{C' =ﳷO i`J:ܘwrop$;'u#O^,XG,^דH_[N ;j5 Jcwf:C b%L,CRښұ?A'@$ :F3r1NDUq)xWpX/qI|Zw |..Bf2gz\듼5fޮB OvNZ_֯5ya(,&š+_r[^Pt.,(>$^,L Öȹ}GG "Ch&9!1Z|L~?bGڷjZj4P"PdA\ |`иt`ٓ_!׼ok:b;۰ЅtBc) |)LIEHE m Յ9ds!d>{*u;)J_O/\#s%J|”R\$ `uQ᪑$W&̐ Tn tm7ɥ#ϲoP)̞Ln%ڙwԖl)nNmv)LqsjQ7)n|t&fY 5tuYK=HR^ } ]K|k;t@ekLD5MZf3WM0D1eY=Vh \Ouz=sߏ6S/ֻ-"?2 Riu^Woj6A~ oߗG~'`#ݕ"<.Q3sWۅNc80n|TXlk/?6N O(wnB('&~~~ fvܚL FuwI@Vqݡ Saਂ$*|m2 K KO%mΣ7v0i0k|H w"Oj' <l fCVmp\Wqk7._cEǫg{uYJs(c ?COXl[RzLR}pAo)a#xwewCd B-(FsSHt3–5Рpv )Qd;[JDwk&WZiރ A{dX130;^bnUఄ*?@%j_pZϥJ# Y^p #WaBoga =Xaֈ:b4- %E`ldhsR0Y,~X 4FW#ϲ3C~ۍʯ( #+ϥoaSbzrZl󷼴4XkZ{FU׼miIp6%\ m6SkdE,) EL4>̦ ~׀V1M*L%o"k-vmw>c[tҘ?f|mJEBLe8\HR",l,S.=2AB2'2y0s&bxږ.NK@f)-`Z^9KX@:K'@}% QEc`KG% jH,b S8}!$#n RmUx}[vUdpƧz כ'v6̉L'9W:@U뽒~-*/IpO''q^T(w==d,֧a>x]O3];9EV5ͻFF쐁Q`f %?ȓA}yyS1*yí~vIL aWXxPQ`״dk'ⵣ{kw gIj.kZ=eEcZ ƶg~Js3:h*c{3rKJtX=K|+Tȓ,%=PAXk$ČqD &{d%)~]b1x2ɘAR+ Da#" y~ sƉ@ @H3ǩ |;B62q E?"l ^4PBޖ|%nT92C9L F 9&ߌuѕLP) -r"T, P[\kޛH$\[DZoSxΞM 3XIUyh48b8蜿txSsAC*:ʊ/g +EB7[\g'tI.lY>!C'U 4 @נ>E9" Wщ{hddR /Ip w=X{ -#\ Cf" +Lȗx8J3߸LMQL\ \ ˄"YH83ID(h'7]4mK$X<:H#OR^zxuS>U $qYѩ+CbɟKloLUDŽXy`FKWf? WMc*c%tp,Ogr՝CArF:xD>/%Su e 5m i?1ydsGmZԎZU=!| тyPfdONuZ&/ooEDfp4uH#6~O=CI@ e IT+i3>#\gc h.a8"JMռMoDZ.c̹ r{pQpαPıH*\҃O* Eލ4d7ۏ\x:\\L27_r&IҾ+ޕ: %f* c f0A@5?`!4| vir=L[\]SvQhu+&..㉶#ZKDuO9K;1%L'Ki$m VkXx߼%|Vcܧ)y^Ю-[FCzm '?̡HЧ.#^Se'-H37)Ӻmk3zy}%Md䊽qOYX d\2$\{l:go3jjyݰmsD/j.R9U{Rţчbx0)|'-eO ɶ>П<ڞO~۳k?Ƚ>CԶ7ߍwc7_$߃GhtZ;ӍWn,J_6glZkB{9VЌxF_1lO<juC vcl-30Fh5f[<Ňֈmmň1wxoE!ۖm*+ZMOxc%XVbDFmeځܷY{=nٻmLB5jqLZ.m^[0[D4om"~۴<IϘdDP4KߋX8X ż<a[n'ci0XU_puCaW7ek9^aaw 8QiH+bh58p%\iMw\6g3Ϊ6Po; ?惐lN ƶ"i^PM?y8GrBë.d9ec>f}~g18ϋWyaD޿nKQu `q&iLZsT#a;FSI:$%s$-4PJJ’S$uĜ&b)ϴc'쳨'E}@w M>}nZG(۞C*|UxEsT{ w w)\<4xw]끾H#Csr(Nd"lgs91v_F1GpT:[m*/Ikͅ=%#&I'/vPa&J9 kB0"q:EK;zN|-օ;1U\-'A0b9E>3+j̇ P/(X'рkObrn!ѿ0 Ou8fݎ ,^GݥJ^4kNع ߔҢ"K3^(qXC&)̻g!u! 1h^*h1Sk^4zdݍfG'*,*w[1| fz?Ng|>^± .GQc.os=w>YB8,z!ƛ2BȼT͹@[4HhAZ#dJrt@MΦ'v3Cb> 0QF> &>z> q\.>\]1O4_Dn lŲ.C[W~g&ghVO_d;N?12e bݿAMC2Kjj25Q7Oր:P:BAN'CL}6y;XzތNt -§]N}{V>Tl:jGEg@ 3ޑfNnjfc8j<[:oElo'\Od3\=HD+9/Wm1^;zEPlmb1hW 4ϭWx<=5*8R-5^Jy_V;uo]Oiߘ4Ut<o! I.߯j6BO-:`GS+j23+[lm:#yAr˞DJʅN5Q,˄MB;3Lxq7ml@ j'l}A$)pUl1OmWȁ>4g^E岧ךM] hQ+U\,񯭆NYj۬C'Sm-M-Z}Ӫ4z';XwT.yKZ8Od3f;iG9<2dyZ6` O"sVgQ.F-7kzs}蕏|Q mQyP(M>iM+=(R*\89)Uc5:+/7³-F񵾥Q1S̔}-%r> "aj.B1e/wO_<5T;jkv\A%ZxX#cG=IX [W1l%^q2OX٦LCQ^R^wvyCI)wJu|8q h{X4TTPօI2&5BJ,w%%Lj5|5= C Gݾ{g) v+wKH"&=WxHgفwW ކfZES3-ގ.M~֫LnbS};wT 2⩊ݤz(B_Q6|p6v8Hu xvT>-V]a;}s-sH-WKNFFёY[\}w@JƏڻG'PF>çO= ;8ϟb4ÿDӨGs|ds_HyGkyTsuS 2UCvv3%=?*J1wJ%6`[8CeIyQ:l8ڇ(z';l3ѫ__ޜV8O1Sf{WOC:肀yjW)3_"-|/p>:sP*oB(FJL*aLx_`@ H% &oy#۹ NӞp[ E앓X|ep`LbphMoCڭ$ʆZ)V_Z YzaU'~'֧-~h^}u#:$uKXqsSj:~aKr;;}kv+%;Ќst"0E17"`HBv0-`D @r429Z |7ErV0f0AS-k-@XK*O0mvqp:ZIKDf&(mY=Eu+@;s F`@L=j/[G̪ߊ^KO|ѧ7f;OW5t(Vv0\LgtNt|&CCq\[rj$f~5 @UQ4ޅ b ; D `R*1;v˹-\08GGm.. Pv"ċNBO/%x1T,1OU>٢F2'`F@P- 7ŋx1P@Gr J  7H77%V>GO jI /טͽm) .dl5^ >=l0_*:/% _ԎszeN`!}MeB[%;* hQ2y )Ѳ:A&#䫚Lj@TɄ 7`o@c0Uϐb9Aޛ/L:=! =Uadj'nP@>;c is [Aت.oۓUВͻcy v+=8o~O'*-HNM9*O0 ࣌C\"б@(ao>–q VN<VY«@`mBXîtb#r0{Y\`] |#jG&Jubxf$^k -%KϑIic 8E IiF$ ӷ~&97d /3BAP ٜ ɨfr3ώ*쯐/g#E zm2ۦ+E=01(EODl5ce L/~ۧ/L(LcOfxA&04tڞ1!g:H jȸR5`xX@~ty1Bilh!,Wpt"&^K^Uvpj'd 1`dA;{IfOz;B%0|PL9-% (Z\#2K陒bMm>e5j3z%F()H8O訝CNšcBI=z]~{ -_nϜ1Ff 1# $sd5&GCapk ۠Ǿ< Yl̒dݪ=բ:=T@1Z\e> K(8.tkXLmanjݛQ@}\Cd "yx[&3ǒPLPI !f0lPYn4x!,P|< `q*V$'aN@q)X-0 diV┤]k ;fM`odCErJR@2 S(fF4ID2$7 ?7]B/XS`>gVޖ> 5&?"f:,UNw'*7p$ 6MX x6pe ifۺǎMEk"/C8w}Mm*e!?<gM o%ϴf [c‾7DS,xɳKL+9}(2ȇGwy`0BZÂ[U{*͓=2g֥sǩ@ϭ@axz +@LDF";d6B4VN-@=cIVL\ k_6 2E hZSnhEQJi#˶dI~Ϝ!!/P!$DO.XﶇP7)8[XH08QHK SkiWZE MO#3(Ӣ|%׭[:-Z얋\Ye)˷<:Ilj=]m[jXKx>} a=yQq3Ok1"V)|s|4.J2D^p 髩߬c޽M[ {റܧ[4lzwOZmX@mTa1\)6,4ڛ/pО b lj%v9b~a[C^/ ^|A~;ipb /N,?}]+RŦ#{H:\Z`U]=p G48x4;? ۠q01? Iv%^dSqs9?ΔChrhiԠog$eRH o1fxNG[a 7('\#<;1.$G#'{2Dy'/fYI kh$'WDZ4/+%(ZxdP Ik)x4:|s<}"OTiqk\.sPҘQFQHb ]xxusإ1B?8,ȴ1ƎsnܻzǢGAZC@s[׃2޶O EOUc{'#!ɫ5~:P7t'328#5ctz Ӊq5)Pȑ\wqvt8O/iSU|$t[#Tr+>E;?lX)cWv]m:eZzNYomui5JS_omVk^PWU8Gd{;eѧǨvNM.cNlNu:laJxt"zqEd#{ңhy4WBa7 H|FUױ6ot o ա]>4ٶUMK"/H]cX~lpVѮ-Գ%CB]Pzea,[` wvp۴v$(ٳIEqzYC՗O^jz*'5*KGjĹxd %F{ !4P)A/nԣho/:&l< IJ9 8rp=DZzz`MU8DtbaY:mOJ:_ߌGC 0AGO8C5nTyUc,`lN)}t-@bsh=N^V{ CF?MI@SL84UkgvŚh+kM'䔬zΓ[KNfZffJ͸ J=J=JY*EHIz \&h8JV?K\kOM 54xuYj%@fShi%n9lǼbs;k-GVeOS40A5g7MjHnHvV!rL4co7)o>۹kr[M}\Fw!ILox/m+‘L9*=ۭZJdd.1}f'$7%p  ZO=|( .u\^R xz.шr9,q[.{srĎC(=XaռmCy%4(K!0 0ZCxT:4V<[.K Gp: 2]gFR 5K6;q}Y@،f3-VυXL]ŷ|էiPyxt܀4B++H;lo$-ϬC 8RE HӤ4`HAHjytN9ڡQ(XP<r+u g\/xo:cU+9䬝9"Җ7 dXmɗlTN$AOvSMghT\;Аa: ¦ |s7`+((y9]$jK=LޗeIH %6VuB !gfYl?Kg+ Yd&*!`.e⟛J]ȜN5jh,ggh##\/ [;={Q=?5TM ~(i?ۡ9&XNj0}W-:Z CdM*$Qʖ]ջ=] ] i k5gPRM4 yU Tl7CL`xr $Zz.ήLw%wl+ 4Wu~eAW-S V|aWye'w[q#(c#܂N,ҞL떔^2ʷ.lKF!LJOr8J$alJgmg(Ȝ.=VkbkK"Vs[Ww&@z]WNB@rpgnxP[ewqݣ-r l^zfLNٍ]RTNonT@ZoyQ;bCHp=t_rLva"ȳK-F -eQ*%KĘsϬޞ fweB`m"[r~q'U,YI3nYD2c<'X<ۿ@;X_OO%L߮A5NowƂOx$,˄>@dtUu6NKVNO=tf4 |XkUyS\v.10̤Ws6de@+eڡfWy"_z_zKcz ڌq1َ=30kz&kz.k oYI,mрdI,s6QHGof3y,.P9 WvYvKy" .AWp6qQȋ>n"jzqGvʑ>C6$/A˟Q-$`ڒ(W˹Zjq9QFSXxLM9Kf{IνwL_['C lۣ .d8'b+K1I ۡxEUCJ; ~g$^^0+:GfEͭ<~{-/<) Fdu*ϝpwd(;g"=YlU3R0͂}盞4}.4B3Lb}Kr$ vʻ"|E@|G6v{YS_=S](os}s@Pr,ѐܠ*z{9Sy~:Ks6.Ρ6[U^/36ש Sx\){Aqe3K"(;4bR,gڵ}q̹_v^_?_!y/R埝;XkvCmdٗ_D #6rMػߋZ7`v and~)P9UMكz؃r؃_c|pʏnde-كÕ&Scr 6: ^55ceZA*|Otvpd_,G΢i`{K<OZpGBVէ z~;۱\uQ{b^`$RUk<@*b`QV~QWw6,˵1Edxv=̲B2WkG7l:W@7uz]> 4DMMB`XUUοc?'h8]<φr<\ZcygG/GO%}tx:b0c/_|䤤kO'Cw|n4.W&" E$LwN vU\?o+<%>[[LJh<Њ|y\@ _簨0ӫWc q4. dO&|ckLxt5MFVg~[Q{;Og) ەW,ʰ/1{,?Rb|q|1?`ˑ}d#%2P/W?X|u5tne!_5i}SxԱy+%mԚΔQ^2+HJJ[՗.} j$e)+:_CJC<~1:,weAŢ;彋o{o,WYRnCP>0=FG-@@`:[|]l}`]-Gk~;ADŨ\t?'s˘?ѓ}ŷx-c Wf^_b +K|{^UadPu!\!ʾ/Be'/e_N^e 7r.FUoY^^'3~Lh1SM3KL+)M^9}+BAg>mW @"lf<0^+b^WJvBrs@JF\*㼄VykU/\rWKkжzk=0l7 ["JeAzNU9e 7uU?AUWf]u :Z8%FlEV)X=?ovIJy{ -"2*lwHhDatDҾ|Ӊh(VҚfBA!Er_2g9邰C :T%I%||;-r ٩KЪ~qKv ف'gv<q=)$N85e-{; yxGh;:v%$ک~ҭ4z[D`_(w %Dʲ[SN :CmvO J_%";;KQoJ"1D/nKP_Чw˞4~|eBZ8ڕF!nP(PH#|;Jvmj%tnM\.}l7k J{׃q }XhGxY*-e9❣liC0býXZx*+(2 er`<͙ áxJR!I˟$e7IYORv-*e d1UuUMU8Q8aKKUKU㋸yURb$)In| n3a91'D _Ag۔aٵ|`t⒝; F 7rD+菉AU:?]l~ܩk1fbFb2qL \]mѷC:j1⻏>59{$K_:CN!ft28tKAnaL]Νo{@r<D)e|(9"艼QQO?u0;D@x#~Bbv}j|uZ% "GTe;Ga;p>0rJy]gQ=1v 8T_84.9ȟҿU=:*FNM@aGu6gM;GA .X3Lyy)Ln1\q!0k!|3%]׌ cᨛYUvm}-TZ.j 5^Ӎ>c|v#*rZ/V3z>ci*H8tSDrOR.99뉪U380a]yj9O$ltx )(_exlzy;aǓd n%`M> //>zr,ľƍ3q>yp%JIԼ"q~]m*o|K A/7o"*=x$ aț#jx>.x|jlvBAl<{-D\> 0;>S/{ D棏׃^&`qr} {= N%C)+\8;{Kc)6"pA9[8$.~0A!PLLlDs$'(ۋ=r[F4Ռ&)-T~֡sZw$#N;d1mc0_0+JV -V2pIN꧇!}`Gj\Z,@.uiUi_VD#G/\]yWm Bd2;M/vn4]>CC+!Z11&Y7NH ])eSs }!8esJiOɐedL1N GxLg$+rɇ?P70\DkaUTL5ڡjTf#A{-UU'^NdBGa2x.JqUsz{!z=.MlMhb[6f4q9'Zmt>{s{ڑߝ l+;7(I!.@LzvNwkp< I3çKHӸ*kMc5ѸF )yqǹ<.29-u<ㇶ9Un v97Pl~"cS  oWˮY=_mƧ4\ -t_SA[s5n]ߗ:4Sd= ^ڠH!A|_9AIJ?HC k5dVM̆*t-щrjmEOloGx!ރϼbs>cDnSq<ueS 8P\w9^W]<[_{?G3|SH Sft~-4^5NN/BNHUWq|8FڪxoQz `gd[*ІoԬuFW[HßW[䪛 ](Җ*mW_L\r!"AԅAI1>Y[?ʞBr4_]<U{p_WZAZAM=Z a#/NNṗBm:D^eH$K#3xZ<]j}$ lV 7N8@4+&Cp[3mvi !|4'g;Hxً.S5zg.{ϰo Ji Q5o j&^6Xagm xA\q`yWe+2x܆Sn%>pO/Y~3S6Tc;/@Z`2|.Y7 Y>Pٿ(.'2P*UJpwMsěK`)`|١R\Vjij55]R_[?@PE?ОavWw{I5 CK1}r|n~3q^/BW9׳R*'=H!*6L퍸vqv8wTU7PLHU8zk>tyU9ߒiK[!\tr%<HO[]BG"(P+Jljpb,-B ^`'rN<[-U*cѾ/w z%GM`c,w{mIщҕ6z/Bw3 frp6Ai^u&,*_z%Kd ^q4OT)QFȶ61}AmaJ1 g~K߽P&yBܪr%}qhhՔ#Me vэEEO*wY k|߫9Rn^VMP&ѫA~-NO)恫2k'D5>Ԫщ2&Na6sj>ZI1LnFTdڵ̧M|2>iL{]tzRcǬەZ"BKG-tSVPQzgJSZ[i }ZöP,{U zcNߋޮ*MgZz8kרѧn3xa[:{Zv[=t]]t?i6Qч]n!4_ t4w\)Րiz{i9&u&i,gd=5J,;Q&Qi\ m>SDUn_VQ9zOW9>|Ӑ\=ZB}L)L7ۡ6od|{n͵m8ʯuIS(♛4|=YC7i{ݤ<~8ul< K&z}Vsd88Ӻt7ot^nS9PO#}˛tRv7*sSwfk[ßШݷwPj"JGyWD#$eDԣڽ=qCy>W<|Dd1Q8-KIۃ,xcqGލTΚȹ{n9u$H.ot'~ sZOjոZjMFH&-qd1(r` nc7$̬\.ەsVr~~V7 rٮ#A/䱛-БP%T쨔Y )Ǚ#Uxp]r]OWKCtg-DxgkE";*zm]X@ .e9ZJykpLYEAKl/} Fc֧pi6n\s?:Q_?ϢDA᳃_Cv˗z='5& r9S4AOF"]±>*ųt6S9rQ64r u*F9iPVa\'1@h}f C<e `,p$+tYhhr5!rEmz,"-|8@x[1*(:a,U0[{ gzOp|gnĿP/MT@3fOZQM̻hO? Db n6ǭʫs꼭jV?@S'2]E4}.DK/ko+Ƈz5 |gGGE6C<=HD?e??PV__uMVK^Bx}Uw%! ;qr9]Va. a)|iEB͒wс:Z*ϨbmRm '{qi H1Z K?Ke"|&Wb?b)-œeѤ#@ZjO]?\@jv `+pz v@ TG9XFb9Y 6_k b,ڱJ ͘Μ/\73?ԒBo% Jh%<ZW>NZ}PӈkM1_^LF)yJ5P59*8<Ɛ}h\w[9b+߄<^~0=0ƌ W'ДAq|Aj L ^)@ٔ7B ڤy6. C C PURPOSE C C To find a controllable realization for the linear time-invariant C single-input system C C dX/dt = A * X + B * U, C Y = C * X, C C where A is an N-by-N matrix, B is an N element vector, C is an C P-by-N matrix, and A and B are reduced by this routine to C orthogonal canonical form using (and optionally accumulating) C orthogonal similarity transformations, which are also applied C to C. C C ARGUMENTS C C Mode Parameters C C JOBZ CHARACTER*1 C Indicates whether the user wishes to accumulate in a C matrix Z the orthogonal similarity transformations for C reducing the system, as follows: C = 'N': Do not form Z and do not store the orthogonal C transformations; C = 'F': Do not form Z, but store the orthogonal C transformations in the factored form; C = 'I': Z is initialized to the unit matrix and the C orthogonal transformation matrix Z is returned. C C Input/Output Parameters C C N (input) INTEGER C The order of the original state-space representation, C i.e. the order of the matrix A. N >= 0. C C P (input) INTEGER C The number of system outputs, or of rows of C. P >= 0. C C A (input/output) DOUBLE PRECISION array, dimension (LDA,N) C On entry, the leading N-by-N part of this array must C contain the original state dynamics matrix A. C On exit, the leading NCONT-by-NCONT upper Hessenberg C part of this array contains the canonical form of the C state dynamics matrix, given by Z' * A * Z, of a C controllable realization for the original system. The C elements below the first subdiagonal are set to zero. C C LDA INTEGER C The leading dimension of array A. LDA >= MAX(1,N). C C B (input/output) DOUBLE PRECISION array, dimension (N) C On entry, the original input/state vector B. C On exit, the leading NCONT elements of this array contain C canonical form of the input/state vector, given by Z' * B, C with all elements but B(1) set to zero. C C C (input/output) DOUBLE PRECISION array, dimension (LDC,N) C On entry, the leading P-by-N part of this array must C contain the output/state matrix C. C On exit, the leading P-by-N part of this array contains C the transformed output/state matrix, given by C * Z, and C the leading P-by-NCONT part contains the output/state C matrix of the controllable realization. C C LDC INTEGER C The leading dimension of array C. LDC >= MAX(1,P). C C NCONT (output) INTEGER C The order of the controllable state-space representation. C C Z (output) DOUBLE PRECISION array, dimension (LDZ,N) C If JOBZ = 'I', then the leading N-by-N part of this array C contains the matrix of accumulated orthogonal similarity C transformations which reduces the given system to C orthogonal canonical form. C If JOBZ = 'F', the elements below the diagonal, with the C array TAU, represent the orthogonal transformation matrix C as a product of elementary reflectors. The transformation C matrix can then be obtained by calling the LAPACK Library C routine DORGQR. C If JOBZ = 'N', the array Z is not referenced and can be C supplied as a dummy array (i.e. set parameter LDZ = 1 and C declare this array to be Z(1,1) in the calling program). C C LDZ INTEGER C The leading dimension of array Z. If JOBZ = 'I' or C JOBZ = 'F', LDZ >= MAX(1,N); if JOBZ = 'N', LDZ >= 1. C C TAU (output) DOUBLE PRECISION array, dimension (N) C The elements of TAU contain the scalar factors of the C elementary reflectors used in the reduction of B and A. C C Tolerances C C TOL DOUBLE PRECISION C The tolerance to be used in determining the C controllability of (A,B). If the user sets TOL > 0, then C the given value of TOL is used as an absolute tolerance; C elements with absolute value less than TOL are considered C neglijible. If the user sets TOL <= 0, then an implicitly C computed, default tolerance, defined by C TOLDEF = N*EPS*MAX( NORM(A), NORM(B) ) is used instead, C where EPS is the machine precision (see LAPACK Library C routine DLAMCH). C C Workspace C C DWORK DOUBLE PRECISION array, dimension (LDWORK) C On exit, if INFO = 0, DWORK(1) returns the optimal value C of LDWORK. C C LDWORK INTEGER C The length of the array DWORK. LDWORK >= MAX(1,N,P). C For optimum performance LDWORK should be larger. C C Error Indicator C C INFO INTEGER C = 0: successful exit; C < 0: if INFO = -i, the i-th argument had an illegal C value. C C METHOD C C The Householder matrix which reduces all but the first element C of vector B to zero is found and this orthogonal similarity C transformation is applied to the matrix A. The resulting A is then C reduced to upper Hessenberg form by a sequence of Householder C transformations. Finally, the order of the controllable state- C space representation (NCONT) is determined by finding the position C of the first sub-diagonal element of A which is below an C appropriate zero threshold, either TOL or TOLDEF (see parameter C TOL); if NORM(B) is smaller than this threshold, NCONT is set to C zero, and no computations for reducing the system to orthogonal C canonical form are performed. C All orthogonal transformations determined in this process are also C applied to the matrix C, from the right. C C REFERENCES C C [1] Konstantinov, M.M., Petkov, P.Hr. and Christov, N.D. C Orthogonal Invariants and Canonical Forms for Linear C Controllable Systems. C Proc. 8th IFAC World Congress, Kyoto, 1, pp. 49-54, 1981. C C [2] Hammarling, S.J. C Notes on the use of orthogonal similarity transformations in C control. C NPL Report DITC 8/82, August 1982. C C [3] Paige, C.C C Properties of numerical algorithms related to computing C controllability. C IEEE Trans. Auto. Contr., AC-26, pp. 130-138, 1981. C C NUMERICAL ASPECTS C 3 C The algorithm requires 0(N ) operations and is backward stable. C C CONTRIBUTOR C C V. Sima, Katholieke Univ. Leuven, Belgium, Feb. 1998. C C REVISIONS C C V. Sima, Research Institute for Informatics, Bucharest, Oct. 2001, C Sept. 2003. C C KEYWORDS C C Controllability, minimal realization, orthogonal canonical form, C orthogonal transformation. C C ****************************************************************** C C .. Parameters .. DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) C .. Scalar Arguments .. CHARACTER JOBZ INTEGER INFO, LDA, LDC, LDWORK, LDZ, N, NCONT, P DOUBLE PRECISION TOL C .. Array Arguments .. DOUBLE PRECISION A(LDA,*), B(*), C(LDC,*), DWORK(*), TAU(*), $ Z(LDZ,*) C .. Local Scalars .. LOGICAL LJOBF, LJOBI, LJOBZ, LPIV INTEGER ITAU, J, IDXM DOUBLE PRECISION ANORM, B1, BNORM, FANORM, FBNORM, H, THRESH, $ TOLDEF, WRKOPT, MAXV, MINV C .. Local Arrays .. DOUBLE PRECISION NBLK(1) C .. External Functions .. LOGICAL LSAME INTEGER IDAMAX DOUBLE PRECISION DLAMCH, DLANGE EXTERNAL DLAMCH, DLANGE, LSAME, IDAMAX C .. External Subroutines .. EXTERNAL DGEHRD, DLACPY, DLARF, DLARFG, DLASET, DORGQR, $ DORMHR, MB01PD, XERBLA, DSWAP C .. Intrinsic Functions .. INTRINSIC ABS, DBLE, MAX C .. Executable Statements .. C INFO = 0 LJOBF = LSAME( JOBZ, 'F' ) LJOBI = LSAME( JOBZ, 'I' ) LJOBZ = LJOBF.OR.LJOBI C C Test the input scalar arguments. C IF( .NOT.LJOBZ .AND. .NOT.LSAME( JOBZ, 'N' ) ) THEN INFO = -1 ELSE IF( N.LT.0 ) THEN INFO = -2 ELSE IF( P.LT.0 ) THEN INFO = -3 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN INFO = -5 ELSE IF( LDC.LT.MAX( 1, P ) ) THEN INFO = -8 ELSE IF( LDZ.LT.1 .OR. ( LJOBZ .AND. LDZ.LT.N ) ) THEN INFO = -11 ELSE IF( LDWORK.LT.MAX( 1, N, P ) ) THEN INFO = -15 END IF C IF ( INFO.NE.0 ) THEN C C Error return. C CALL XERBLA( 'TB01ZD', -INFO ) RETURN END IF C C Quick return if possible. C NCONT = 0 DWORK(1) = ONE IF ( N.EQ.0 ) $ RETURN C C (Note: Comments in the code beginning "Workspace:" describe the C minimal amount of real workspace needed at that point in the C code, as well as the preferred amount for good performance. C NB refers to the optimal block size for the immediately C following subroutine, as returned by ILAENV.) C WRKOPT = MAX ( 1, N, P ) C C Calculate the absolute norms of A and B (used for scaling). C ANORM = DLANGE( 'Max', N, N, A, LDA, DWORK ) BNORM = DLANGE( 'Max', N, 1, B, N, DWORK ) C C Return if matrix B is zero. C IF( BNORM.EQ.ZERO ) THEN IF( LJOBF ) THEN CALL DLASET( 'Full', N, N, ZERO, ZERO, Z, LDZ ) CALL DLASET( 'Full', N, 1, ZERO, ZERO, TAU, N ) ELSE IF( LJOBI ) THEN CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ ) END IF RETURN END IF C C Scale (if needed) the matrices A and B. C CALL MB01PD( 'S', 'G', N, N, 0, 0, ANORM, 0, NBLK, A, LDA, INFO ) CALL MB01PD( 'S', 'G', N, 1, 0, 0, BNORM, 0, NBLK, B, N, INFO ) C C Calculate the Frobenius norm of A and the 1-norm of B (used for C controlability test). C FANORM = DLANGE( 'Frobenius', N, N, A, LDA, DWORK ) FBNORM = DLANGE( '1-norm', N, 1, B, N, DWORK ) C TOLDEF = TOL IF ( TOLDEF.LE.ZERO ) THEN C C Use the default tolerance in controllability determination. C THRESH = DBLE(N)*DLAMCH( 'EPSILON' ) TOLDEF = THRESH*MAX( FANORM, FBNORM ) END IF C ITAU = 1 CALL DLASET( 'Full', N, 1, ZERO, ZERO, TAU, N ) IF ( FBNORM.GT.TOLDEF ) THEN C C B is not negligible compared with A. C IF ( N.GT.1 ) THEN C C If orthogonal transformations in factored form are not C requested, use pivoting. Exchange rows so biggest norm C element is in the first row. C IF ( .NOT.LJOBF ) THEN IDXM = IDAMAX( N, B, 1 ) LPIV = IDXM.NE.1 C Exchange rows and columns in A and C C IF ( LPIV ) THEN B1 = B(1) B(1) = B(IDXM) B(IDXM) = B1 CALL DSWAP( N, A, LDA, A(IDXM,1), LDA ) CALL DSWAP( N, A, 1, A(1,IDXM), 1 ) CALL DSWAP( P, C, 1, C(1,IDXM), 1 ) END IF END IF C C Transform B by a Householder matrix Z1: store vector C describing this temporarily in B and in the local scalar H. C CALL DLARFG( N, B(1), B(2), 1, H ) C B1 = B(1) B(1) = ONE C C Form Z1 * A * Z1. C Workspace: need N. C CALL DLARF( 'Right', N, N, B, 1, H, A, LDA, DWORK ) CALL DLARF( 'Left', N, N, B, 1, H, A, LDA, DWORK ) C C Form C * Z1. C Workspace: need P. C CALL DLARF( 'Right', P, N, B, 1, H, C, LDC, DWORK ) C C If orthogonal matrix is asked, form it. C Workspace: need N. C IF ( LJOBI ) THEN CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ ) IF ( LPIV ) THEN Z(1,1) = ZERO Z(IDXM,IDXM) = ZERO Z(1,IDXM) = ONE Z(IDXM,1) = ONE END IF CALL DLARF( 'Right', N, N, B, 1, H, Z, LDZ, DWORK ) END IF B(1) = B1 TAU(1) = H ITAU = ITAU + 1 ELSE B1 = B(1) TAU(1) = ZERO END IF C C Reduce modified A to upper Hessenberg form by an orthogonal C similarity transformation. C IF ( TOL.LE.ZERO ) $ TOLDEF = THRESH*MAX( FANORM, ABS( B1 ) ) IF ( LJOBF ) THEN C C If factored form transformation needed, switch to old C algorithm. Workspace: need N; prefer N*NB. C CALL DGEHRD( N, 1, N, A, LDA, TAU(ITAU), DWORK, $ LDWORK, INFO ) WRKOPT = DWORK(1) C C Form C * Z2. C Workspace: need P; prefer P*NB. C CALL DORMHR( 'Right', 'No transpose', P, N, 1, N, A, LDA, $ TAU(ITAU), C, LDC, DWORK, LDWORK, INFO ) WRKOPT = MAX( WRKOPT, DWORK(1) ) C C Save the orthogonal transformations used, so that they could C be accumulated by calling DORGQR routine. C IF ( N.GT.1 ) $ CALL DLACPY( 'Full', N-1, 1, B(2), N-1, Z(2,1), LDZ ) IF ( N.GT.2 ) $ CALL DLACPY( 'Lower', N-2, N-2, A(3,1), LDA, Z(3,2), $ LDZ ) C C Annihilate the lower part of A and B. C IF ( N.GT.2 ) $ CALL DLASET( 'Lower', N-2, N-2, ZERO, ZERO, A(3,1), LDA ) IF ( N.GT.1 ) $ CALL DLASET( 'Full', N-1, 1, ZERO, ZERO, B(2), N-1 ) C C Find NCONT by checking sizes of the sub-diagonal elements of C transformed A. C J = 1 C C WHILE ( J < N and ABS( A(J+1,J) ) > TOLDEF ) DO C 10 CONTINUE IF ( J.LT.N ) THEN IF ( ABS( A(J+1,J) ).GT.TOLDEF ) THEN J = J + 1 GO TO 10 END IF END IF C C END WHILE 10 C C First negligible sub-diagonal element found, if any: set NCONT. C NCONT = J ELSE C C Use pivoting between orthogonal transformations. C J = 1 NCONT = N C C Iterate over matrix subdiagonal elements. C WHILE ( J < N-1 and MAX( ABS( A(J+1,:) ) ) > TOLDEF ) DO C 20 CONTINUE IF ( J.LT.N-1 ) THEN IDXM = IDAMAX( N-J, A(J+1,J), 1 )+J MAXV = ABS( A(IDXM,J) ) LPIV = IDXM.NE.J+1 C C Check if next vector norm is big enough. If not stop. C IF ( MAXV.GT.TOLDEF ) THEN C C Do the swaping C IF ( LPIV ) THEN CALL DSWAP( N+1-J, A(J+1,J), LDA, A(IDXM,J), LDA ) CALL DSWAP( N, A(1,J+1), 1, A(1,IDXM), 1 ) CALL DSWAP( P, C(1,J+1), 1, C(1,IDXM), 1 ) END IF C C Calculate Householder reflection. C CALL DLARFG( N-J, A(J+1,J), A(J+2,J), 1, H ) B1 = A(J+1,J) A(J+1,J) = ONE C C Apply reflection to matrix A. C Workspace: need N. C CALL DLARF( 'Right', N, N-J, A(J+1,J), 1, H, $ A(1,J+1), LDA, DWORK ) CALL DLARF( 'Left', N-J, N-J, A(J+1,J), 1, H, $ A(J+1,J+1), LDA, DWORK ) C C Apply reflection to matrix C. C Workspace: need P. C CALL DLARF( 'Right', P, N-J, A(J+1,J), 1, H, $ C(1,J+1), LDC, DWORK ) C C Form orthogonal transformation matrix Z C Workspace: need N. C IF ( LJOBI ) THEN IF ( LPIV ) $ CALL DSWAP( N, Z(1,J+1), 1, Z(1,IDXM), 1 ) C CALL DLARF( 'Right', N, N-J, A(J+1,J), 1, H, $ Z(1,J+1), LDZ, DWORK ) END IF C A(J+1,J) = B1 TAU(ITAU) = H ITAU = ITAU + 1 J = J + 1 GOTO 20 ELSE NCONT = J END IF END IF C C END WHILE 20 C C Annihilate the lower part of A and B. C IF ( N.GT.2 ) $ CALL DLASET( 'Lower', N-2, NCONT, ZERO, ZERO, $ A(3,1), LDA ) IF ( N.GT.1 ) $ CALL DLASET( 'Full', N-1, 1, ZERO, ZERO, B(2), N-1 ) END IF C C If tolerance is not provided by user, recheck C the subspace dimensions. C IF ( TOL.LE.ZERO ) THEN C C Find the absolute value of the diagonal C of the controllability matrix. C Workspace: need N. C H = ABS( B(1) ) DWORK(1) = H MINV = H J = 2 30 CONTINUE IF ( J.LE.NCONT ) THEN H = H*ABS( A(J,J-1) ) IF ( MINV.GT.H ) $ MINV = H DWORK(J) = MINV J = J + 1 GOTO 30 END IF C C Check if controllability matrix singular. C If yes use tolerance given in "Matrix computation C - Golub & van Loan, 3rd Edition, p. 345". C IF ( MINV.LT.TOLDEF ) THEN TOLDEF = 4.D0*N*TOLDEF J = 1 C C WHILE ( J < NCONT and ABS( A(J+1,J) ) > TOLDEF ) DO C 40 CONTINUE IF ( J.LT.NCONT ) THEN IF ( ABS( A(J+1,J) ).GT.TOLDEF ) THEN J = J + 1 GO TO 40 END IF END IF C C END WHILE 40 C IF ( DWORK(J).GT.TOLDEF ) $ NCONT = J END IF END IF C C Undo scaling of A and B. C CALL MB01PD( 'U', 'H', NCONT, NCONT, 0, 0, ANORM, 0, NBLK, A, $ LDA, INFO ) CALL MB01PD( 'U', 'G', 1, 1, 0, 0, BNORM, 0, NBLK, B, N, INFO ) IF ( NCONT.LT.N ) $ CALL MB01PD( 'U', 'G', N, N-NCONT, 0, 0, ANORM, 0, NBLK, $ A(1,NCONT+1), LDA, INFO ) ELSE C C B is negligible compared with A. No computations for reducing C the system to orthogonal canonical form have been performed, C except scaling (which is undoed). C CALL MB01PD( 'U', 'G', N, N, 0, 0, ANORM, 0, NBLK, A, LDA, $ INFO ) CALL MB01PD( 'U', 'G', N, 1, 0, 0, BNORM, 0, NBLK, B, N, INFO ) IF( LJOBF ) THEN CALL DLASET( 'Full', N, N, ZERO, ZERO, Z, LDZ ) CALL DLASET( 'Full', N, 1, ZERO, ZERO, TAU, N ) ELSE IF( LJOBI ) THEN CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ ) END IF END IF C C Set optimal workspace dimension. C DWORK(1) = WRKOPT C RETURN C *** Last line of TB01ZD *** END control/src/TG04BX.fortran0000644000076500000240000002066412614620313014642 0ustar lukasstaff SUBROUTINE TG04BX( IP, IZ, A, LDA, E, B, C, D, PR, PI, ZR, ZI, $ GAIN, IWORK ) C C WARNING C C This routine is a modified version of TB04BX. It is intended C for the Octave Control Systems Package and supports Descriptor C State-Space models. TG04BX is *NOT* part of SLICOT and the C authors from NICONET e.V. are *NOT* responsible for it. C See file DESCRIPTION for the current maintainer of the Octave C control package. C C SLICOT RELEASE 5.0. C C Copyright (c) 2002-2009 NICONET e.V. C C This program is free software: you can redistribute it and/or C modify it under the terms of the GNU General Public License as C published by the Free Software Foundation, either version 2 of C the License, or (at your option) any later version. C C This program is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License C along with this program. If not, see C . C C PURPOSE C C To compute the gain of a single-input single-output linear system, C given its state-space representation (A,b,c,d), and its poles and C zeros. The matrix A is assumed to be in an upper Hessenberg form. C The gain is computed using the formula C C -1 IP IZ C g = (c*( S0*E - A ) *b + d)*Prod( S0 - Pi )/Prod( S0 - Zi ) , C i=1 i=1 (1) C C where Pi, i = 1 : IP, and Zj, j = 1 : IZ, are the poles and zeros, C respectively, and S0 is a real scalar different from all poles and C zeros. C C ARGUMENTS C C Input/Output Parameters C C IP (input) INTEGER C The number of the system poles. IP >= 0. C C IZ (input) INTEGER C The number of the system zeros. IZ >= 0. C C A (input/output) DOUBLE PRECISION array, dimension (LDA,IP) C On entry, the leading IP-by-IP part of this array must C contain the state dynamics matrix A in an upper Hessenberg C form. The elements below the second diagonal are not C referenced. C On exit, the leading IP-by-IP upper Hessenberg part of C this array contains the LU factorization of the matrix C A - S0*I, as computed by SLICOT Library routine MB02SD. C C LDA INTEGER C The leading dimension of array A. LDA >= max(1,IP). C C B (input/output) DOUBLE PRECISION array, dimension (IP) C On entry, this array must contain the system input C vector b. C On exit, this array contains the solution of the linear C system ( A - S0*I )x = b . C C C (input) DOUBLE PRECISION array, dimension (IP) C This array must contain the system output vector c. C C D (input) DOUBLE PRECISION C The variable must contain the system feedthrough scalar d. C C PR (input) DOUBLE PRECISION array, dimension (IP) C This array must contain the real parts of the system C poles. Pairs of complex conjugate poles must be stored in C consecutive memory locations. C C PI (input) DOUBLE PRECISION array, dimension (IP) C This array must contain the imaginary parts of the system C poles. C C ZR (input) DOUBLE PRECISION array, dimension (IZ) C This array must contain the real parts of the system C zeros. Pairs of complex conjugate zeros must be stored in C consecutive memory locations. C C ZI (input) DOUBLE PRECISION array, dimension (IZ) C This array must contain the imaginary parts of the system C zeros. C C GAIN (output) DOUBLE PRECISION C The gain of the linear system (A,b,c,d), given by (1). C C Workspace C C IWORK INTEGER array, dimension (IP) C On exit, it contains the pivot indices; for 1 <= i <= IP, C row i of the matrix A - S0*I was interchanged with C row IWORK(i). C C METHOD C C The routine implements the method presented in [1]. A suitable C value of S0 is chosen based on the system poles and zeros. C Then, the LU factorization of the upper Hessenberg, nonsingular C matrix A - S0*I is computed and used to solve the linear system C in (1). C C REFERENCES C C [1] Varga, A. and Sima, V. C Numerically Stable Algorithm for Transfer Function Matrix C Evaluation. C Int. J. Control, vol. 33, nr. 6, pp. 1123-1133, 1981. C C NUMERICAL ASPECTS C C The algorithm is numerically stable in practice and requires C O(IP*IP) floating point operations. C C CONTRIBUTORS C C V. Sima, Research Institute for Informatics, Bucharest, May 2002. C Partly based on the BIMASC Library routine GAIN by A. Varga. C C REVISIONS C C 2011-02-08 (Lukas Reichlin) Modifications for Descriptor Systems. C C KEYWORDS C C Eigenvalue, state-space representation, transfer function, zeros. C C ****************************************************************** C C .. Parameters .. DOUBLE PRECISION ZERO, ONE, TWO, P1, ONEP1 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, $ P1 = 0.1D0, ONEP1 = 1.1D0 ) C .. Scalar Arguments .. DOUBLE PRECISION D, GAIN INTEGER IP, IZ, LDA C .. Array Arguments .. DOUBLE PRECISION A(LDA,*), E(LDA,*), B(*), C(*), PI(*), PR(*), $ ZI(*), ZR(*) INTEGER IWORK(*) C .. Local Scalars .. INTEGER I, J, INFO DOUBLE PRECISION S0, S C .. External Functions .. DOUBLE PRECISION DDOT EXTERNAL DDOT C .. External Subroutines .. C EXTERNAL MB02RD, MB02SD EXTERNAL DGETRF, DGETRS C .. Intrinsic Functions .. INTRINSIC ABS, MAX C .. C .. Executable Statements .. C C For efficiency, the input scalar parameters are not checked. C C Quick return if possible. C C IF( IP.EQ.0 ) THEN C GAIN = ZERO C RETURN C END IF C C Compute a suitable value for S0 . C S0 = ZERO C DO 10 I = 1, IP S = ABS( PR(I) ) IF ( PI(I).NE.ZERO ) $ S = S + ABS( PI(I) ) S0 = MAX( S0, S ) 10 CONTINUE C DO 20 I = 1, IZ S = ABS( ZR(I) ) IF ( ZI(I).NE.ZERO ) $ S = S + ABS( ZI(I) ) S0 = MAX( S0, S ) 20 CONTINUE C S0 = TWO*S0 + P1 IF ( S0.LE.ONE ) $ S0 = ONEP1 C C Form A - S0*E . C DO 30 J = 1, LDA DO 25 I = 1, LDA A(I,J) = A(I,J) - S0*E(I,J) 25 CONTINUE 30 CONTINUE C C Compute the LU factorization of the matrix A - S0*E C (guaranteed to be nonsingular). C C CALL MB02SD( IP, A, LDA, IWORK, INFO ) C CALL MB02SD( LDA, A, LDA, IWORK, INFO )oo CALL DGETRF( LDA, LDA, A, LDA, IWORK, INFO) C C Solve the linear system (A - S0*E)*x = b . C C CALL MB02RD( 'No Transpose', IP, 1, A, LDA, IWORK, B, IP, INFO ) C CALL MB02RD( 'No Transpose', IP, 1, A, LDA, IWORK, B, LDA, INFO ) C CALL MB02RD( 'No Transpose', LDA, 1, A, LDA, IWORK, B, LDA, INFO ) CALL DGETRS( 'No Transpose', LDA, 1, A, LDA, IWORK, B, LDA, INFO ) C -1 C Compute c*(S0*E - A) *b + d . C C GAIN = D - DDOT( IP, C, 1, B, 1 ) GAIN = D - DDOT( LDA, C, 1, B, 1 ) C C Multiply by the products in terms of poles and zeros in (1). C I = 1 C C WHILE ( I <= IP ) DO C 40 IF ( I.LE.IP ) THEN IF ( PI(I).EQ.ZERO ) THEN GAIN = GAIN*( S0 - PR(I) ) I = I + 1 ELSE GAIN = GAIN*( S0*( S0 - TWO*PR(I) ) + PR(I)**2 + PI(I)**2 ) I = I + 2 END IF GO TO 40 END IF C C END WHILE 40 C I = 1 C C WHILE ( I <= IZ ) DO C 50 IF ( I.LE.IZ ) THEN IF ( ZI(I).EQ.ZERO ) THEN GAIN = GAIN/( S0 - ZR(I) ) I = I + 1 ELSE GAIN = GAIN/( S0*( S0 - TWO*ZR(I) ) + ZR(I)**2 + ZI(I)**2 ) I = I + 2 END IF GO TO 50 END IF C C END WHILE 50 C RETURN C *** Last line of TG04BX *** END